diff pyntnclick/widgets/toollist.py @ 555:c0474fe18b96 pyntnclick

Copy in widgets from mamba (currently unused)
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 11 Feb 2012 14:09:46 +0200
parents
children f9f04cb35697
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pyntnclick/widgets/toollist.py	Sat Feb 11 14:09:46 2012 +0200
@@ -0,0 +1,85 @@
+from pygame.constants import KEYUP, K_1, K_PAGEDOWN, K_PAGEUP
+
+from mamba.widgets.base import Container
+from mamba.widgets.text import TextButton
+
+
+class ToolListWidget(Container):
+    """List of other widgets, with some paging trickery"""
+
+    def __init__(self, rect, widget_list, page_length, start_key=K_1,
+            padding=2):
+        widget_list.sort(key=lambda w: w.text)
+        self.widget_list = widget_list
+        self.page_length = page_length
+        self.padding = padding
+        self.page = 0
+        self.start_key = start_key
+        super(ToolListWidget, self).__init__(rect)
+        self.prev_but = None
+        self.next_but = None
+        self.fill_page()
+        # We do this to avoid needing to worry about focus too much
+        self.add_callback(KEYUP, self.handle_key)
+        self.focussable = True
+
+    def fill_page(self):
+        for widget in self.children[:]:
+            self.remove(widget)
+        self.hot_keys = {}
+        start_page = self.page * self.page_length
+        end_page = start_page + self.page_length
+        button_height = self.rect.top + self.padding
+        button_left = self.rect.left + self.padding
+        key = self.start_key
+        for widget in self.widget_list[start_page:end_page]:
+            widget.rect.topleft = (button_left, button_height)
+            self.add(widget)
+            if key:
+                self.hot_keys[key] = widget
+                key += 1
+            button_height += widget.rect.height + self.padding
+        if not self.prev_but:
+            self.prev_but = TextButton((button_left, button_height),
+                                       u'\N{LEFTWARDS ARROW}')
+            self.prev_but.add_callback('clicked', self.change_page, -1)
+        else:
+            self.prev_but.rect.top = max(button_height, self.prev_but.rect.top)
+        if not self.next_but:
+            self.next_but = TextButton((button_left + 100, button_height),
+                    u'\N{RIGHTWARDS ARROW}')
+            self.next_but.add_callback('clicked', self.change_page, 1)
+        else:
+            self.next_but.rect.top = max(button_height, self.next_but.rect.top)
+        if start_page > 0:
+            self.prev_but.enable()
+        else:
+            self.prev_but.disable()
+        if end_page < len(self.widget_list):
+            self.next_but.enable()
+        else:
+            self.next_but.disable()
+        self.add(self.prev_but)
+        self.add(self.next_but)
+        for widget in self.children[:]:
+            if widget in self.widget_list:
+                # Standardise widdths
+                widget.rect.width = self.rect.width - 2
+                widget.prepare()
+
+    def handle_key(self, ev, widget):
+        if hasattr(self.parent, 'paused') and self.parent.paused:
+            # No hotjets when pasued
+            return False
+        if ev.key in self.hot_keys:
+            widget = self.hot_keys[ev.key]
+            return widget.forced_click()
+        elif ev.key == K_PAGEDOWN and self.prev_but:
+            return self.prev_but.forced_click()
+        elif ev.key == K_PAGEUP and self.next_but:
+            return self.next_but.forced_click()
+
+    def change_page(self, ev, widget, change):
+        self.page += change
+        self.fill_page()
+        return True