author | Radek Brich <radek.brich@devl.cz> |
Mon, 16 Feb 2015 21:17:43 +0100 | |
changeset 117 | 8680c2333546 |
parent 116 | 165b5d65e1cb |
permissions | -rw-r--r-- |
93 | 1 |
from .layout import Layout |
2 |
||
3 |
||
4 |
class FixedLayout(Layout): |
|
5 |
||
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
6 |
"""Widgets are placed on fixed position as specified in hints. |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
7 |
|
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
8 |
Position can be relative to any side or center of parent widget. |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
9 |
|
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
10 |
""" |
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
11 |
|
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
12 |
def __init__(self): |
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
13 |
Layout.__init__(self) |
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
14 |
self._widget_hints = {} # Widget : (left, top, right, bottom, xrel, yrel) |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
15 |
|
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
16 |
def add(self, widget, left=None, top=None, right=None, bottom=None, |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
17 |
center=None, fill=None): |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
18 |
"""Add widget to layout. |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
19 |
|
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
20 |
Place hints: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
21 |
* left, right, top, bottom = None | <num> ; <num> >= 0 |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
22 |
- Fix Widget position to parent sides. |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
23 |
- If both left and right (or top and bottom) are set, the widget |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
24 |
will be stretched to fill full area minus specified space. |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
25 |
* center, fill = None | 'x' | 'y' | 'xy' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
26 |
- Center widget in x, y or both axes. |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
27 |
- Fill is shortcut for setting both positions in same axis. |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
28 |
|
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
29 |
""" |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
30 |
Layout.add(self, widget) |
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
31 |
# Internally, coordinate relation is marked as: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
32 |
# '+': from left or top |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
33 |
# '-': from right or bottom |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
34 |
# 'C': from center |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
35 |
# 'F': from both sides (fill) |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
36 |
xrel, yrel = '+', '+' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
37 |
fill, center = fill or '', center or '' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
38 |
if left is None and right is not None: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
39 |
xrel = '-' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
40 |
if top is None and bottom is not None: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
41 |
yrel = '-' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
42 |
if 'x' in center: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
43 |
xrel = 'C' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
44 |
if 'y' in center: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
45 |
yrel = 'C' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
46 |
if 'x' in fill: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
47 |
xrel = 'F' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
48 |
if 'y' in fill: |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
49 |
yrel = 'F' |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
50 |
self._widget_hints[widget] = (left or 0, top or 0, |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
51 |
right or 0, bottom or 0, |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
52 |
xrel, yrel) |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
53 |
|
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
54 |
def update(self, w, h): |
93 | 55 |
for widget in self._managed_widgets: |
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
56 |
left, top, right, bottom, xrel, yrel = self._widget_hints[widget] |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
57 |
sw, sh = widget.sizereq |
117
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
58 |
ox, oy = 0, 0 # origin |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
59 |
if xrel == '-': |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
60 |
ox = w - sw |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
61 |
if yrel == '-': |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
62 |
oy = h - sh |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
63 |
if xrel == 'C': |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
64 |
ox = (w - sw) // 2 |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
65 |
if yrel == 'C': |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
66 |
oy = (h - sh) // 2 |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
67 |
px = ox + left - right |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
68 |
py = oy + top - bottom |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
69 |
if xrel == 'F': |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
70 |
px = left |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
71 |
sw = w - left - right |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
72 |
if yrel == 'F': |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
73 |
py = top |
8680c2333546
Update FixedLayout. Add demo launcher.
Radek Brich <radek.brich@devl.cz>
parents:
116
diff
changeset
|
74 |
sh = h - top - bottom |
116
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
75 |
widget.resize(sw, sh) |
165b5d65e1cb
Drop AnchorLayout, merge its features into FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
115
diff
changeset
|
76 |
widget.pos.update(px, py) |