comparison frontends/primitivus/custom_widgets.py @ 1:a5c9603dac37

primitivus: added Alert widget
author Goffi <goffi@goffi.org>
date Thu, 01 Jul 2010 18:18:34 +0800
parents cb72fb2bfa0d
children 07b7dcd314ff
comparison
equal deleted inserted replaced
0:cb72fb2bfa0d 1:a5c9603dac37
83 83
84 class List(urwid.WidgetWrap): 84 class List(urwid.WidgetWrap):
85 signals = ['change'] 85 signals = ['change']
86 86
87 def __init__(self, options, style=[], align='left', on_state_change=None, user_data=None): 87 def __init__(self, options, style=[], align='left', on_state_change=None, user_data=None):
88 assert(options)
89 self.single = 'single' in style 88 self.single = 'single' in style
90 self.align = align 89 self.align = align
91 90
92 if on_state_change: 91 if on_state_change:
93 urwid.connect_signal(self, 'change', on_state_change, user_data) 92 urwid.connect_signal(self, 'change', on_state_change, user_data)
94 93
95 widgets = [SelectableText(option,align) for option in options] 94 self.content = urwid.SimpleListWalker([])
96 for widget in widgets:
97 urwid.connect_signal(widget, 'change', self.__onStateChange)
98 self.content = urwid.SimpleListWalker(widgets)
99 self.list_box = urwid.ListBox(self.content) 95 self.list_box = urwid.ListBox(self.content)
100 if self.single: 96 self.changeValues(options)
101 self.content[0].setState(True)
102 display_widget = urwid.BoxAdapter(self.list_box, min(len(options),5))
103
104 urwid.WidgetWrap.__init__(self, display_widget)
105 97
106 def __onStateChange(self, widget, selected): 98 def __onStateChange(self, widget, selected):
107 if self.single: 99 if self.single:
108 if not selected: 100 if not selected:
109 #if in single mode, it's forbidden to unselect a value 101 #if in single mode, it's forbidden to unselect a value
119 for widget in self.content: 111 for widget in self.content:
120 if widget.getState(): 112 if widget.getState():
121 widget.setState(False, invisible) 113 widget.setState(False, invisible)
122 widget._invalidate() 114 widget._invalidate()
123 115
116 def getValue(self):
117 """Convenience method to get the value selected as a string in single mode, or None"""
118 values = self.getValues()
119 return values[0] if values else None
120
124 def getValues(self): 121 def getValues(self):
125 result = [] 122 result = []
126 for widget in self.content: 123 for widget in self.content:
127 if widget.getState(): 124 if widget.getState():
128 result.append(widget.getValue()) 125 result.append(widget.getValue())
129 return result 126 return result
130 127
131 def changeValues(self, new_values): 128 def changeValues(self, new_values):
132 widgets = [SelectableText(self, option) for option in new_values] 129 widgets = [SelectableText(option, self.align) for option in new_values]
130 for widget in widgets:
131 urwid.connect_signal(widget, 'change', self.__onStateChange)
133 self.content[:] = widgets 132 self.content[:] = widgets
133 if self.single and new_values:
134 self.content[0].setState(True)
135 display_widget = urwid.BoxAdapter(self.list_box, min(len(new_values),5))
136 urwid.WidgetWrap.__init__(self, display_widget)
134 137
135 def selectValue(self, value): 138 def selectValue(self, value):
136 self.unselectAll() 139 self.unselectAll()
137 idx = 0 140 idx = 0
138 for widget in self.content: 141 for widget in self.content:
153 buttons = [urwid.Button(_("Cancel"), kwargs['cancel_cb']), 156 buttons = [urwid.Button(_("Cancel"), kwargs['cancel_cb']),
154 urwid.Button(_("Ok"), kwargs['ok_cb'], kwargs['ok_value'])] 157 urwid.Button(_("Ok"), kwargs['ok_cb'], kwargs['ok_value'])]
155 elif "YES/NO" in style: 158 elif "YES/NO" in style:
156 buttons = [urwid.Button(_("Yes"), kwargs['yes_cb']), 159 buttons = [urwid.Button(_("Yes"), kwargs['yes_cb']),
157 urwid.Button(_("No"), kwargs['no_cb'], kwargs['yes_value'])] 160 urwid.Button(_("No"), kwargs['no_cb'], kwargs['yes_value'])]
161 if "OK" in style:
162 buttons = [urwid.Button(_("Ok"), kwargs['ok_cb'], kwargs['ok_value'])]
158 if buttons: 163 if buttons:
159 buttons_flow = urwid.GridFlow(buttons, max([len(button.get_label()) for button in buttons])+4, 1, 1, 'center') 164 buttons_flow = urwid.GridFlow(buttons, max([len(button.get_label()) for button in buttons])+4, 1, 1, 'center')
160 widgets_lst.append(buttons_flow) 165 widgets_lst.append(buttons_flow)
161 body_content = urwid.SimpleListWalker(widgets_lst) 166 body_content = urwid.SimpleListWalker(widgets_lst)
162 frame_body = urwid.ListBox(body_content) 167 frame_body = urwid.ListBox(body_content)
175 180
176 class ConfirmDialog(genericDialog): 181 class ConfirmDialog(genericDialog):
177 182
178 def __init__(self, title, style=['YES/NO'], **kwargs): 183 def __init__(self, title, style=['YES/NO'], **kwargs):
179 genericDialog.__init__(self, [], title, style, yes_value=None, **kwargs) 184 genericDialog.__init__(self, [], title, style, yes_value=None, **kwargs)
185
186 class Alert(genericDialog):
187
188 def __init__(self, title, message, style=['OK'], **kwargs):
189 genericDialog.__init__(self, [urwid.Text(message, 'center')], title, style, ok_value=None, **kwargs)