tuikit/container.py
author Radek Brich <radek.brich@devl.cz>
Wed, 16 Feb 2011 23:51:30 +0100
changeset 0 a35731b5e31a
child 1 69318aba22bf
permissions -rw-r--r--
tuikit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     2
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     3
from .widget import Widget
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     4
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     5
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
class Container(Widget):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     7
    def __init__(self, width = 10, height = 10):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     8
        Widget.__init__(self, width, height)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     9
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    10
        self.children = []
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    11
        self.focuschild = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    12
        self.mousechild = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    13
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    14
        self.borders = (0, 0, 0, 0) # left, top, right, bottom
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    15
        self.widthrequest = (None, None)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    16
        self.heightrequest = (None, None)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    18
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    19
    def add(self, widget):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    20
        self.children.append(widget)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
        widget.parent = self
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    22
        widget.settop(self.top)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    23
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    24
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    25
    def layout(self, layout):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    26
        self.layout = layout
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    27
        layout.container = self
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    28
        self.connect('resize', layout.resize)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    29
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    30
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    31
    def settop(self, top):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    32
        self.top = top
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    33
        for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    34
            child.settop(top)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    35
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    36
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    37
    ### focus
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    38
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    39
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    40
    def canfocus(self):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    41
        return True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    42
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    43
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    44
    def setfocus(self):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    45
        self.focus = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    46
        if self.focuschild is None and len(self.children) > 0:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    47
            for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    48
                if self.focuschild is None:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    49
                    if child.canfocus():
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    50
                        self.focuschild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    51
                        child.setfocus()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    52
                else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    53
                    if child.focus:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    54
                        child.unfocus()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    55
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    56
    def unfocus(self):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    57
        self.focus = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    58
        for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    59
            child.unfocus()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    60
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    61
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    62
    ###
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    63
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    64
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    65
    def draw(self, screen, x=0, y=0):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    66
        #if self._redraw:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    67
            #self.fill(screen, self.y, self.x, self.height, self.width)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    68
        self.handle('draw', screen, x, y)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    69
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    70
        l, t, r, b = self.borders
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    71
        screen.pushclip(x + l, y + t, self.width - l - r, self.height - t - b)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    72
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    73
        for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    74
            #if self._redraw:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    75
             #   child._redraw = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    76
            child.draw(screen, x + child.x, y + child.y)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    77
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    78
        screen.popclip()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    79
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    80
        #self._redraw = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    81
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    82
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    83
    def keypress(self, keyname, char):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    84
        # always relay key event to some child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    85
        if self.focus:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    86
            self.handle('keypress', keyname, char)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
            if self.focuschild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    88
                self.focuschild.keypress(keyname, char)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    89
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    90
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    91
    def mousedown(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
        handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    93
        for child in reversed(self.children):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    94
            if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    95
                childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    96
                child.mousedown(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    97
                self.mousechild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    98
                handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
                break
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   100
        if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   101
            self.handle('mousedown', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   103
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   104
    def mouseup(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   105
        if self.mousechild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   106
            childev = ev.childevent(self.mousechild)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   107
            self.mousechild.mouseup(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   108
            self.mousechild = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   109
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   110
            self.handle('mouseup', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   111
        #handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   112
        #for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   113
            #if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   114
                #childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   115
                #child.mouseup(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   116
                #self.mousechild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   117
                #handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   118
        #if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   119
            #self.handle('mouseup', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   120
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   121
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   122
    def mousemove(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   123
        if self.mousechild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   124
            childev = ev.childevent(self.mousechild)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   125
            self.mousechild.mousemove(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   126
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   127
            self.handle('mousemove', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   128
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   129
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   130
    def mousewheel(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   131
        handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   132
        for child in reversed(self.children):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   133
            if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   134
                childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   135
                child.mousewheel(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   136
                handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   137
                break
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   138
        if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   139
            self.handle('mousewheel', ev)