1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 from libxyz.ui import lowui
18 from libxyz.ui import align
19
20 from libxyz.exceptions import UIError
21
23 - def __init__(self, widget, title=None, title_attr=None, attr=None):
24 """
25 Draw a line border around widget and set up a title
26 @param widget: Widget to wrap
27 @param title: Title
28 @type title: libxyz.ui.lowui.Text object
29 @param title_attr: Title attribute
30 @param attr: Attribute of border
31 """
32
33 super(Border, self).__init__()
34
35 self.widget = widget
36 self.title = title
37 self.title_attr = title_attr
38 self.attr = attr
39 self._attr = self.attr
40
41 self.utf8decode = lowui.escape.utf8decode
42
43 self.tline = self._get_attr(lowui.Divider(self.utf8decode("─")))
44 self.bline = self._get_attr(lowui.Divider(self.utf8decode("─")))
45 self.lline = self._get_attr(lowui.SolidFill(self.utf8decode("│")))
46 self.rline = self._get_attr(lowui.SolidFill(self.utf8decode("│")))
47
48 self.tlcorner = self._get_attr(lowui.Text(self.utf8decode("┌")))
49 self.trcorner = self._get_attr(lowui.Text(self.utf8decode("┐")))
50 self.blcorner = self._get_attr(lowui.Text(self.utf8decode("└")))
51 self.brcorner = self._get_attr(lowui.Text(self.utf8decode("┘")))
52
53
54
55 - def render(self, (maxcol, maxrow), focus=False):
56 """
57 Render widget
58 """
59
60 if self.title is not None:
61 _len = len(self.title)
62
63 if self.title_attr is not None:
64 self._title = lowui.AttrWrap(lowui.Text(" %s " % self.title,
65 align.CENTER), self.title_attr)
66 else:
67 self._title = lowui.Text(self.title, align.CENTER)
68
69 _len += 2
70
71 tline_widgets = [('fixed', 1, self.tlcorner), self.tline]
72
73 if self.title is not None:
74 tline_widgets.append(("fixed", _len, self._title))
75
76 tline_widgets.extend([self.tline, ("fixed", 1, self.trcorner)])
77
78 self.top = lowui.Columns(tline_widgets)
79 self.middle = lowui.Columns([('fixed', 1, self.lline),
80 self.widget, ('fixed', 1, self.rline)],
81 box_columns=[0,2], focus_column=1)
82
83 self.bottom = lowui.Columns([('fixed', 1, self.blcorner),
84 self.bline, ('fixed', 1, self.brcorner)])
85
86 self.pile = lowui.Pile([('flow',self.top), self.middle,
87 ('flow', self.bottom)], focus_item=1)
88
89 return self.pile.render((maxcol, maxrow), focus)
90
91
92
94 if self.attr is None:
95 return widget
96
97 return lowui.AttrWrap(widget, self.attr)
98
99
100
102 """
103 Set title attribute
104 """
105
106 self.title_attr = attr
107 self._invalidate()
108
109
110
112 """
113 Set title
114 """
115
116 self.title = text
117 self._invalidate()
118