From: mar77i Date: Thu, 6 Feb 2025 01:24:15 +0000 (+0100) Subject: clean up modal and messagebox message update X-Git-Url: https://git.mar77i.info/?a=commitdiff_plain;h=231ed0847dc375ace784b2a0f9c3133548e1fd9e;p=zenbook_gui clean up modal and messagebox message update --- diff --git a/ui/message_box.py b/ui/message_box.py index 2483aa0..f95c346 100644 --- a/ui/message_box.py +++ b/ui/message_box.py @@ -9,9 +9,9 @@ class MessageBox(Modal): def __init__(self, root, rect, message): super().__init__(root) self.rect = rect - self.message = message self.label = Label(root, pygame.Rect(rect.center, (10, 10)), "") self.children.extend((self.label, *self.get_buttons())) + self.message = message def get_buttons(self): rect = self.rect @@ -30,16 +30,17 @@ class MessageBox(Modal): pygame.draw.rect(self.surf, "black", self.rect) pygame.draw.rect(self.surf, "gray", self.rect, 1) - def activate(self): - self.update_message() - super().activate() + @property + def message(self): + return self.label.value - def update_message(self): - if self.message == self.label.value: + @message.setter + def message(self, message): + if message == self.label.value: return rect = self.rect - self.label.value = self.message - fs_size = self.font.size(self.message) + self.label.value = message + fs_size = self.font.size(message) label_rect = pygame.Rect( rect.topleft, (rect.width, rect.height * 3 // 4), diff --git a/ui/modal.py b/ui/modal.py index 2e97f59..ef7bba4 100644 --- a/ui/modal.py +++ b/ui/modal.py @@ -7,33 +7,50 @@ class Modal(Child): def __init__(self, root): super().__init__(root) self.backsurf = None - self.tint = True self.children = [] + self.active = False + self.draw = self._check_active(self.draw) + self.update = self._check_active(self.update) + self.handle_event = self._check_active(self.handle_event) + self.activate = self._check_active(self.activate, False) + self.deactivate = self._check_active(self.deactivate) + + def _check_active(self, method, cmp=True): + def inner(*args, **kwargs): + if self.active is cmp: + return method(*args, **kwargs) + return None + return inner def draw(self): self.surf.blit(self.backsurf, (0, 0)) - if not self.tint: - return - tintsurf = pygame.Surface(self.surf.get_size(), pygame.SRCALPHA, 32) + + @staticmethod + def tinted_copy(surf): + surf = surf.copy() + tintsurf = pygame.Surface(surf.get_size(), pygame.SRCALPHA, 32) tintsurf.fill(pygame.Color(0x00000080)) - self.surf.blit(tintsurf, (0, 0)) + surf.blit(tintsurf, (0, 0)) + return surf - def activate(self): - self.backsurf = self.root.surf.copy() + def swap_children(self): children = self.children.copy() self.children.clear() self.children.extend(self.root.children) self.root.children.clear() - self.root.children.append(self) self.root.children.extend(children) + + def activate(self): + self.backsurf = self.tinted_copy(self.root.surf) + self.swap_children() + self.root.children.insert(0, self) + self.active = True self.root.stop_event = True self.dirty = True def deactivate(self): - children = self.root.children.copy() - self.root.children.clear() - self.root.children.extend(self.children) - self.children.clear() - self.children.extend(children) + self.backsurf = None + self.swap_children() + self.active = False self.root.stop_event = True self.dirty = True