tuikit/container.py
author Radek Brich <radek.brich@devl.cz>
Sun, 10 Apr 2011 22:54:38 +0200
changeset 5 ae128c885d0f
parent 2 684cdc352562
child 9 7175ed629a76
permissions -rw-r--r--
New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
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.mousechild = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    12
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    13
        self.borders = (0, 0, 0, 0) # left, top, right, bottom
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    14
        self.widthrequest = (None, None)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    15
        self.heightrequest = (None, None)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    16
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    18
    def add(self, widget, **kw):
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    19
        self.children.append(widget)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    20
        widget.parent = self
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
        widget.settop(self.top)
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    22
        widget.layouthints.update(kw)
0
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
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    37
    def resize(self):
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    38
        Widget.resize(self)
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    39
        for child in self.children:
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    40
            child.emit('resize')
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    41
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    42
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    43
    def draw(self, screen, x=0, y=0):
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 1
diff changeset
    44
        if self.hidden:
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 1
diff changeset
    45
            return
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    46
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    47
        screen.pushclip(x, y, self.width, self.height)
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    48
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    49
        Widget.draw(self, screen, x, y)
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    50
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    51
        for child in [x for x in self.children if not x.allowlayout]:
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    52
            child.draw(screen, x + child.x, y + child.y)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    53
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    54
        l, t, r, b = self.borders
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    55
        screen.pushclip(x+l, y+t, self.width-l-r, self.height-t-b)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    56
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    57
        for child in [x for x in self.children if x.allowlayout]:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    58
            child.draw(screen, x + child.x, y + child.y)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    59
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    60
        screen.popclip()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    61
5
ae128c885d0f New GridLayout. Change cursor behavior (hide on unfocus event). Change resize event to propagate through containers. Change container clipping - allowlayout=false children are clipped without borders. More Widget doc.
Radek Brich <radek.brich@devl.cz>
parents: 2
diff changeset
    62
        screen.popclip()
0
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 mousedown(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    66
        handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    67
        for child in reversed(self.children):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    68
            if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    69
                childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    70
                child.mousedown(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    71
                self.mousechild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    72
                handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    73
                break
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    74
        if not handled:
1
69318aba22bf Menu development. New focus. Easier imports from tuikit package.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    75
            self.setfocus()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    76
            self.handle('mousedown', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    77
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    78
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    79
    def mouseup(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    80
        if self.mousechild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    81
            childev = ev.childevent(self.mousechild)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    82
            self.mousechild.mouseup(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    83
            self.mousechild = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    84
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    85
            self.handle('mouseup', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    86
        #handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
        #for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    88
            #if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    89
                #childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    90
                #child.mouseup(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    91
                #self.mousechild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
                #handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    93
        #if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    94
            #self.handle('mouseup', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    95
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    96
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    97
    def mousemove(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    98
        if self.mousechild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
            childev = ev.childevent(self.mousechild)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   100
            self.mousechild.mousemove(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   101
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
            self.handle('mousemove', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   103
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   104
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   105
    def mousewheel(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   106
        handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   107
        for child in reversed(self.children):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   108
            if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   109
                childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   110
                child.mousewheel(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   111
                handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   112
                break
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   113
        if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   114
            self.handle('mousewheel', ev)