# Copyright 2017 Canonical, Ltd. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from urwid import ( ACTIVATE, AttrWrap, connect_signal, LineBox, PopUpLauncher, SelectableIcon, Text, WidgetWrap, ) from subiquitycore.ui.container import ListBox class _PopUpButton(SelectableIcon): """It looks a bit like a radio button, but it just emits 'click' on activation. """ signals = ['click'] states = { True: "(+) ", False: "( ) ", } def __init__(self, option, state): p = self.states[state] super().__init__(p + option, len(p)) def keypress(self, size, key): if self._command_map[key] != ACTIVATE: return key self._emit('click') class _PopUpSelectDialog(WidgetWrap): """A list of PopUpButtons with a box around them.""" def __init__(self, parent, cur_index): self.parent = parent group = [] for i, option in enumerate(self.parent._options): if option.enabled: btn = _PopUpButton(option.label, state=(i == cur_index)) connect_signal(btn, 'click', self.click, i) group.append(AttrWrap(btn, 'menu_button', 'menu_button focus')) else: btn = Text(" " + option.label) group.append(AttrWrap(btn, 'info_minor')) list_box = ListBox(group) list_box.base_widget.focus_position = cur_index super().__init__(LineBox(list_box)) def click(self, btn, index): self.parent.index = index self.parent.close_pop_up() def keypress(self, size, key): if key == 'esc': self.parent.close_pop_up() else: return super().keypress(size, key) class SelectorError(Exception): pass class Option: def __init__(self, val): if not isinstance(val, tuple): if not isinstance(val, str): raise SelectorError("invalid option %r", val) self.label = val self.enabled = True self.value = val elif len(val) == 1: self.label = val[0] self.enabled = True self.value = val[0] elif len(val) == 2: self.label = val[0] self.enabled = val[1] self.value = val[0] elif len(val) == 3: self.label = val[0] self.enabled = val[1] self.value = val[2] else: raise SelectorError("invalid option %r", val) class Selector(PopUpLauncher): """A widget that allows the user to chose between options by popping up a list of options. (A bit like