tuikit/window.py
author Radek Brich <radek.brich@devl.cz>
Fri, 14 Dec 2012 10:20:14 +0100
changeset 32 088b92ffb119
parent 24 b248ef500557
child 34 e3beacd5e536
permissions -rw-r--r--
Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
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
18
e6c3a5ee91aa Eliminate relative imports.
Radek Brich <radek.brich@devl.cz>
parents: 13
diff changeset
     3
from tuikit.container import Container
e6c3a5ee91aa Eliminate relative imports.
Radek Brich <radek.brich@devl.cz>
parents: 13
diff changeset
     4
from tuikit.button import Button
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     5
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     7
class Window(Container):
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
     8
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
     9
    '''Window widget.
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
    10
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    11
    It represents part of screen with border, close button and contents.
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    12
    Window can be moved, resized or closed by user.'''
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
    13
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    14
    def __init__(self, width=40, height=10):
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    15
        '''Create window of requested size.'''
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    16
        Container.__init__(self, width, height)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    18
        self.connect('draw', self.on_draw)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    19
        self.connect('mousedown', self.on_mousedown)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    20
        self.connect('mouseup', self.on_mouseup)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
        self.connect('mousemove', self.on_mousemove)
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    22
        self.connect('resize', self.on_resize)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    23
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    24
        #: Window title.
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    25
        self.title = ''
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
    26
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    27
        self._closebutton = True
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
    28
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    29
        #: Allow user to resize window.
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    30
        self.resizable = True
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
    31
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    32
        #: Allow user to move window.
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    33
        self.movable = True
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    34
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    35
        self.resizing = False
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    36
        self.moving = False
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    37
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    38
        self.closebtn = Button('x')
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
    39
        self.closebtn.allowlayout = False
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    40
        self.closebtn.x = self.width - 5
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    41
        self.closebtn.width = 3
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    42
        self.closebtn.connect('click', self.on_closebtn)
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: 7
diff changeset
    43
        self.closebtn.bg = 'controls'
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: 7
diff changeset
    44
        self.closebtn.bghi = 'controls-active'
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    45
        self.add(self.closebtn)
7
d4a291b31cbb New color management - named colors.
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
    46
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
    47
        self.borders = (1, 1, 1, 1)
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: 7
diff changeset
    48
        self.colorprefix = 'window:'
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    49
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    50
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    51
    @property
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    52
    def closebutton(self):
13
19ebde2fd594 Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
    53
        '''Show/hide close button.'''
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    54
        return self._closebutton
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    55
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    56
    @closebutton.setter
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    57
    def closebutton(self, value):
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    58
        self._closebutton = value
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    59
        self.closebtn.hidden = not value
0
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
    def on_draw(self, screen, x, y):
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: 7
diff changeset
    63
        screen.pushcolor('normal')
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    64
        screen.frame(x, y, self.width, self.height)
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    65
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    66
        if self.resizable:
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    67
            if self.resizing:
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: 7
diff changeset
    68
                screen.pushcolor('controls-active')
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    69
            else:
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: 7
diff changeset
    70
                screen.pushcolor('controls')
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    71
            screen.puts(x + self.width - 2, y + self.height - 1, '─┘') # '━┛'
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    72
            screen.popcolor()
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    73
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    74
        if self.title:
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    75
            screen.puts(x + (self.width - len(self.title))//2, y, self.title)
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    76
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    77
        screen.fill(x+1, y+1, self.width-2, self.height-2)
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    78
        screen.popcolor()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    79
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    80
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    81
    def on_mousedown(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    82
        self.dragstart = (ev.wx, ev.wy)
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    83
        if self.resizable and ev.wx >= self.width - 1 and ev.wy >= self.height - 1:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    84
            self.resizing = True
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    85
        elif self.movable:
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    86
            self.moving = True
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
        self.origsize = (self.width, self.height)
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    88
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    89
        self.redraw(True)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    90
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    91
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
    def on_mouseup(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    93
        if self.resizing:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    94
            self.width = self.origsize[0] + ev.wx - self.dragstart[0]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    95
            self.height = self.origsize[1] + ev.wy - self.dragstart[1]
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    96
            self.resizing = False
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
    97
            self.handle('resize')
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    98
        elif self.moving:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
            self.x = ev.px - self.dragstart[0]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   100
            self.y = ev.py - self.dragstart[1]
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   101
            self.moving = False
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   103
        self.redraw(True)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   104
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   105
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   106
    def on_mousemove(self, ev):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   107
        if ev.px == self.x + self.dragstart[0] \
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   108
        and ev.py == self.y + self.dragstart[1]:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   109
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   110
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   111
        #if x > self.parent.width-self.width:
24
b248ef500557 Add DriverPygame (incomplete). Move unicode graphics constants to UnicodeGraphics class. Move shared parts of drivers to Driver base class.
Radek Brich <radek.brich@devl.cz>
parents: 18
diff changeset
   112
        #    return
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   113
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   114
        if self.resizing:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   115
            self.width = self.origsize[0] + ev.wx - self.dragstart[0]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   116
            self.height = self.origsize[1] + ev.wy - self.dragstart[1]
32
088b92ffb119 Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents: 24
diff changeset
   117
            self.handle('resize')
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   118
        elif self.moving:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   119
            self.x = ev.px - self.dragstart[0]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   120
            self.y = ev.py - self.dragstart[1]
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   121
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   122
        self.redraw(True)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   123
2
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   124
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   125
    def on_resize(self):
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   126
        self.closebtn.x = self.width - 5
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   127
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   128
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   129
    def on_closebtn(self):
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   130
        self.hide()
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   131
684cdc352562 Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   132