tuikit/widgets/button.py
author Radek Brich <radek.brich@devl.cz>
Sat, 21 Feb 2015 12:01:57 +0100
changeset 118 8c7970520632
parent 109 105b1affc3c2
child 119 dd91747504dd
permissions -rw-r--r--
Add mouse events, event demo.

from tuikit.core.widget import Widget
from tuikit.core.signal import Signal


class Button(Widget):

    """Clickable button."""

    def __init__(self, label='btn'):
        """Create button with given label, size according to label."""
        Widget.__init__(self)
        self.allow_focus = True

        #: Button label.
        self._label = ''
        #: Text or graphics to be added before label
        self.prefix = '['
        #: Text or graphics to be added after label
        self.suffix = ']'
        #: How should label be aligned if button has excess space - center | left | right
        self.align = 'center'
        #: Padding between prefix/suffix and label
        self.padding = 1

        self.color = 'default'
        self.color_active = 'default on red'
        self.color_highlight = 'default on yellow'
        self.highlight = False

        self.sig_clicked = Signal()

        self.label = label

    @property
    def label(self):
        """Button label."""
        return self._label

    @label.setter
    def label(self, value):
        self._label = value
        w = len(value) + len(self.prefix) + len(self.suffix) + 2 * self.padding
        self.sizereq.update(w, 1)

    def set_theme(self, theme):
        Widget.set_theme(self, theme)
        self.color = theme.button
        self.color_active = theme.button_active

    def _get_color(self):
        if self.highlight:
            return self.color_highlight
        if self.has_focus():
            return self.color_active
        return self.color

    def draw(self, buffer):
        Widget.draw(self, buffer)
        pad = self.width - len(self.label) - len(self.prefix) - len(self.suffix)
        lpad, rpad = self._divide_padding(pad)
        with buffer.attr(self._get_color()):
            # prefix
            buffer.puts(self.prefix)
            pos = len(self.prefix)
            # left pad
            buffer.puts(' ' * lpad, pos)
            pos += lpad
            # label
            buffer.puts(self.label, pos)
            pos += len(self.label)
            # right pad
            buffer.puts(' ' * rpad, pos)
            pos += rpad
            # suffix
            buffer.puts(self.suffix, pos)

    def mousedown_event(self, ev):
        self.highlight = True
        #self.redraw()

    def mouseup_event(self, ev):
        self.highlight = False
        #self.redraw()
        self.sig_clicked()

    def keypress_event(self, ev):
        if ev.keyname == 'enter':
            self.sig_clicked()

    def _divide_padding(self, pad):
        # default is 'left'
        lpad, rpad = 0, pad
        if self.align == 'center':
            lpad = pad // 2
            rpad = pad - lpad
        elif self.align == 'right':
            lpad, rpad = pad, 0
        return lpad, rpad