view mamba/widgets/toollist.py @ 267:1e8dca95c48a

Hook up hot-keys in editor for jerith
author Neil Muller <drnlmuller@gmail.com>
date Thu, 15 Sep 2011 12:54:16 +0200
parents 74ae1645df6e
children ffec90bda89d
line wrap: on
line source

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):
        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.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):
        self.hot_keys = {}
        self.prev_but = self.next_but = None
        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 start_page > 0:
            self.prev_but = TextButton((button_left, button_height), 'Prev')
            self.prev_but.add_callback('clicked', self.change_page, -1)
            self.add(self.prev_but)
        if end_page < len(self.widget_list):
            self.next_but = TextButton((button_left + 100, button_height),
                    'Next')
            self.next_but.add_callback('clicked', self.change_page, 1)
            self.add(self.next_but)

    def handle_key(self, ev, widget):
        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:
            self.prev_but.forced_click()
        elif ev.key == K_PAGEUP and self.next_but:
            self.next_but.forced_click()

    def change_page(self, ev, widget, change):
        self.page += change
        for widget in self.children[:]:
            self.remove(widget)
        self.fill_page()
        return True