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-- |
89 | 1 |
from tuikit.core.widget import Widget |
2 |
from tuikit.core.signal import Signal |
|
0 | 3 |
|
4 |
||
5 |
class Button(Widget): |
|
32
088b92ffb119
Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents:
30
diff
changeset
|
6 |
|
89 | 7 |
"""Clickable button.""" |
32
088b92ffb119
Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents:
30
diff
changeset
|
8 |
|
89 | 9 |
def __init__(self, label='btn'): |
10 |
"""Create button with given label, size according to label.""" |
|
62
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
11 |
Widget.__init__(self) |
109
105b1affc3c2
Update keypress propagation. Allow focus change by tab key. Add log property to Widget for smart logging.
Radek Brich <radek.brich@devl.cz>
parents:
97
diff
changeset
|
12 |
self.allow_focus = True |
0 | 13 |
|
13
19ebde2fd594
Add more generated documentation.
Radek Brich <radek.brich@devl.cz>
parents:
9
diff
changeset
|
14 |
#: Button label. |
62
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
15 |
self._label = '' |
30
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
16 |
#: Text or graphics to be added before label |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
17 |
self.prefix = '[' |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
18 |
#: Text or graphics to be added after label |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
19 |
self.suffix = ']' |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
20 |
#: How should label be aligned if button has excess space - center | left | right |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
21 |
self.align = 'center' |
62
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
22 |
#: Padding between prefix/suffix and label |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
23 |
self.padding = 1 |
32
088b92ffb119
Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents:
30
diff
changeset
|
24 |
|
89 | 25 |
self.color = 'default' |
109
105b1affc3c2
Update keypress propagation. Allow focus change by tab key. Add log property to Widget for smart logging.
Radek Brich <radek.brich@devl.cz>
parents:
97
diff
changeset
|
26 |
self.color_active = 'default on red' |
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
27 |
self.color_highlight = 'default on yellow' |
2
684cdc352562
Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents:
0
diff
changeset
|
28 |
self.highlight = False |
32
088b92ffb119
Clean up, refactoring. Rename EventSource to Emitter, begin merging emit() method with handle().
Radek Brich <radek.brich@devl.cz>
parents:
30
diff
changeset
|
29 |
|
89 | 30 |
self.sig_clicked = Signal() |
0 | 31 |
|
62
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
32 |
self.label = label |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
33 |
|
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
34 |
@property |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
35 |
def label(self): |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
36 |
"""Button label.""" |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
37 |
return self._label |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
38 |
|
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
39 |
@label.setter |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
40 |
def label(self, value): |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
41 |
self._label = value |
2f61931520c9
Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents:
45
diff
changeset
|
42 |
w = len(value) + len(self.prefix) + len(self.suffix) + 2 * self.padding |
89 | 43 |
self.sizereq.update(w, 1) |
44 |
||
45 |
def set_theme(self, theme): |
|
97
0c2e0c09ba5c
Add TextField widget, keypress event, cursor.
Radek Brich <radek.brich@devl.cz>
parents:
95
diff
changeset
|
46 |
Widget.set_theme(self, theme) |
89 | 47 |
self.color = theme.button |
109
105b1affc3c2
Update keypress propagation. Allow focus change by tab key. Add log property to Widget for smart logging.
Radek Brich <radek.brich@devl.cz>
parents:
97
diff
changeset
|
48 |
self.color_active = theme.button_active |
0 | 49 |
|
89 | 50 |
def _get_color(self): |
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
51 |
if self.highlight: |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
52 |
return self.color_highlight |
109
105b1affc3c2
Update keypress propagation. Allow focus change by tab key. Add log property to Widget for smart logging.
Radek Brich <radek.brich@devl.cz>
parents:
97
diff
changeset
|
53 |
if self.has_focus(): |
105b1affc3c2
Update keypress propagation. Allow focus change by tab key. Add log property to Widget for smart logging.
Radek Brich <radek.brich@devl.cz>
parents:
97
diff
changeset
|
54 |
return self.color_active |
89 | 55 |
return self.color |
56 |
||
94
e50dae408fe9
Add origin to Buffer. Use it to simplify hierarchical drawing.
Radek Brich <radek.brich@devl.cz>
parents:
89
diff
changeset
|
57 |
def draw(self, buffer): |
e50dae408fe9
Add origin to Buffer. Use it to simplify hierarchical drawing.
Radek Brich <radek.brich@devl.cz>
parents:
89
diff
changeset
|
58 |
Widget.draw(self, buffer) |
30
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
59 |
pad = self.width - len(self.label) - len(self.prefix) - len(self.suffix) |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
60 |
lpad, rpad = self._divide_padding(pad) |
89 | 61 |
with buffer.attr(self._get_color()): |
62 |
# prefix |
|
95
05392e369ede
Refactoring: Swap drawing operations parameters. Coords are now last and have default values.
Radek Brich <radek.brich@devl.cz>
parents:
94
diff
changeset
|
63 |
buffer.puts(self.prefix) |
89 | 64 |
pos = len(self.prefix) |
65 |
# left pad |
|
95
05392e369ede
Refactoring: Swap drawing operations parameters. Coords are now last and have default values.
Radek Brich <radek.brich@devl.cz>
parents:
94
diff
changeset
|
66 |
buffer.puts(' ' * lpad, pos) |
89 | 67 |
pos += lpad |
68 |
# label |
|
95
05392e369ede
Refactoring: Swap drawing operations parameters. Coords are now last and have default values.
Radek Brich <radek.brich@devl.cz>
parents:
94
diff
changeset
|
69 |
buffer.puts(self.label, pos) |
89 | 70 |
pos += len(self.label) |
71 |
# right pad |
|
95
05392e369ede
Refactoring: Swap drawing operations parameters. Coords are now last and have default values.
Radek Brich <radek.brich@devl.cz>
parents:
94
diff
changeset
|
72 |
buffer.puts(' ' * rpad, pos) |
89 | 73 |
pos += rpad |
74 |
# suffix |
|
95
05392e369ede
Refactoring: Swap drawing operations parameters. Coords are now last and have default values.
Radek Brich <radek.brich@devl.cz>
parents:
94
diff
changeset
|
75 |
buffer.puts(self.suffix, pos) |
0 | 76 |
|
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
77 |
def mousedown_event(self, ev): |
2
684cdc352562
Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents:
0
diff
changeset
|
78 |
self.highlight = True |
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
79 |
#self.redraw() |
0 | 80 |
|
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
81 |
def mouseup_event(self, ev): |
2
684cdc352562
Menu, Window and other improvements.
Radek Brich <radek.brich@devl.cz>
parents:
0
diff
changeset
|
82 |
self.highlight = False |
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
83 |
#self.redraw() |
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
84 |
self.sig_clicked() |
0 | 85 |
|
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
86 |
def keypress_event(self, ev): |
41
37b7dfc3eae6
Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents:
40
diff
changeset
|
87 |
if ev.keyname == 'enter': |
118
8c7970520632
Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents:
109
diff
changeset
|
88 |
self.sig_clicked() |
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
|
89 |
|
30
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
90 |
def _divide_padding(self, pad): |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
91 |
# default is 'left' |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
92 |
lpad, rpad = 0, pad |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
93 |
if self.align == 'center': |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
94 |
lpad = pad // 2 |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
95 |
rpad = pad - lpad |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
96 |
elif self.align == 'right': |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
97 |
lpad, rpad = pad, 0 |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
98 |
return lpad, rpad |
05500124d7fb
Add setup script. Add Checkbox widget + demo. Updates.
Radek Brich <radek.brich@devl.cz>
parents:
18
diff
changeset
|
99 |