tuikit/container.py
author Radek Brich <radek.brich@devl.cz>
Sun, 31 Jul 2011 13:04:39 +0200
changeset 9 7175ed629a76
parent 5 ae128c885d0f
child 13 19ebde2fd594
permissions -rw-r--r--
Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
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
9
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
     4
import logging
0
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
9
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    17
        self.colorprefix = None
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    18
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    19
        self.trapfocus = False  # if True, tab cycles inside container
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    20
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
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
    def add(self, widget, **kw):
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    23
        self.children.append(widget)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    24
        widget.parent = self
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    25
        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
    26
        widget.layouthints.update(kw)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    27
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    28
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    29
    def layout(self, layout):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    30
        self.layout = layout
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    31
        layout.container = self
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    32
        self.connect('resize', layout.resize)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    33
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    34
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    35
    def settop(self, top):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    36
        self.top = top
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    37
        for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    38
            child.settop(top)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    39
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    40
9
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    41
    def focusnext(self):
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    42
        i = self.children.index(self.top.focuswidget)
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    43
        while True:
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    44
            i += 1
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    45
            if i >= len(self.children):
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    46
                i = 0
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    47
            if self.children[i].canfocus():
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    48
                self.children[i].setfocus()
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    49
                break
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    50
        log = logging.getLogger('tuikit')
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    51
        log.debug(str(self.top.focuswidget.__class__))
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    52
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    53
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    54
    def keypress(self, keyname, char):
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    55
        if keyname == 'tab':
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    56
            self.focusnext()
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    57
            return
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    58
        Widget.keypress(self, keyname, char)
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    59
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    60
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
    61
    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
    62
        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
    63
        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
    64
            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
    65
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
    66
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    67
    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
    68
        if self.hidden:
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 1
diff changeset
    69
            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
    70
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
    71
        screen.pushclip(x, y, self.width, self.height)
9
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    72
        if self.colorprefix:
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    73
            screen.pushcolorprefix(self.colorprefix)
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
    74
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
    75
        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
    76
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
    77
        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
    78
            child.draw(screen, x + child.x, y + child.y)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    79
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    80
        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
    81
        screen.pushclip(x+l, y+t, self.width-l-r, self.height-t-b)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    82
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
    83
        for child in [x for x in self.children if x.allowlayout]:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    84
            child.draw(screen, x + child.x, y + child.y)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    85
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    86
        screen.popclip()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
9
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    88
        if self.colorprefix:
7175ed629a76 Added ComboBox, HorizontalLayout, TreeNode, TreeModel, TreeView. Widget is now descendant of EventSource. Improved color management (color prefixes).
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    89
            screen.popcolorprefix()
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
    90
        screen.popclip()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    91
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    93
    def mousedown(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    94
        handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    95
        for child in reversed(self.children):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    96
            if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    97
                childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    98
                child.mousedown(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
                self.mousechild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   100
                handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   101
                break
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
        if not handled:
1
69318aba22bf Menu development. New focus. Easier imports from tuikit package.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   103
            self.setfocus()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   104
            self.handle('mousedown', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   105
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   106
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   107
    def mouseup(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   108
        if self.mousechild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   109
            childev = ev.childevent(self.mousechild)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   110
            self.mousechild.mouseup(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   111
            self.mousechild = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   112
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   113
            self.handle('mouseup', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   114
        #handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   115
        #for child in self.children:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   116
            #if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   117
                #childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   118
                #child.mouseup(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   119
                #self.mousechild = child
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   120
                #handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   121
        #if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   122
            #self.handle('mouseup', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   123
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   124
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   125
    def mousemove(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   126
        if self.mousechild:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   127
            childev = ev.childevent(self.mousechild)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   128
            self.mousechild.mousemove(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   129
        else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   130
            self.handle('mousemove', ev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   131
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   132
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   133
    def mousewheel(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   134
        handled = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   135
        for child in reversed(self.children):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   136
            if child.enclose(ev.wx, ev.wy):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   137
                childev = ev.childevent(child)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   138
                child.mousewheel(childev)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   139
                handled = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   140
                break
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   141
        if not handled:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   142
            self.handle('mousewheel', ev)