]> git.mar77i.info Git - zenbook_gui/commitdiff
clean up modal and messagebox message update
authormar77i <mar77i@protonmail.ch>
Thu, 6 Feb 2025 01:24:15 +0000 (02:24 +0100)
committermar77i <mar77i@protonmail.ch>
Thu, 6 Feb 2025 01:24:15 +0000 (02:24 +0100)
ui/message_box.py
ui/modal.py

index 2483aa056b575ec04638942c0064e51868225b4b..f95c3460cca3b4403f243a1a8a5b0ab3529e78b5 100644 (file)
@@ -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),
index 2e97f59841aee0b4433098559330d96ba0bce1a2..ef7bba46aee52c870f704646532347091852725f 100644 (file)
@@ -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