tuikit/layouts/fixed.py
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--
Update FixedLayout. Add demo launcher.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
93
c1e79acb9fcb Add Layout, FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     1
from .layout import Layout
c1e79acb9fcb Add Layout, FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     2
c1e79acb9fcb Add Layout, FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     3
c1e79acb9fcb Add Layout, FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     4
class FixedLayout(Layout):
c1e79acb9fcb Add Layout, FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     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
c1e79acb9fcb Add Layout, FixedLayout.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    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)