1from fsui.qt import QComboBox, Qt 2from fsui.qt.signal import Signal, SignalWrapper 3from .widget_mixin import WidgetMixin 4 5 6class Choice(QComboBox, WidgetMixin): 7 8 changed_signal = Signal() 9 item_selected = Signal(int) 10 ITEM_SEPARATOR = "---" 11 12 def __init__(self, parent, items=None, cursor_keys=True): 13 if items is None: 14 items = [] 15 QComboBox.__init__(self, parent.get_container()) 16 # Widget.__init__(self, parent) 17 self.init_widget(parent) 18 self.inhibit_change_event = False 19 self.cursor_keys = cursor_keys 20 21 for i, item in enumerate(items): 22 self.insertItem(i, item) 23 24 if len(items) > 0: 25 self.set_index(0) 26 self.currentIndexChanged.connect(self.__current_index_changed) 27 28 self.changed = SignalWrapper(self, "changed") 29 # self.changed.inhibit = self.inhibit_signal 30 31 def keyPressEvent(self, event): 32 if not self.cursor_keys: 33 print("cursor keys is false", event.key(), Qt.Key_Up) 34 if event.key() == Qt.Key_Up or event.key() == Qt.Key_Down: 35 print("ignoring") 36 return 37 super().keyPressEvent(event) 38 39 # @contextmanager 40 # def inhibit_signal(self, name): 41 # attr = "_inhibit_" + name 42 # old = getattr(self, attr, False) 43 # print("setattr", self, attr, True) 44 # setattr(self, attr, True) 45 # yield 46 # print("setattr", self, attr, old) 47 # setattr(self, attr, old) 48 49 def add_item(self, label, icon=None): 50 # item = QStandardItem(label) 51 # if icon: 52 # item.setIcon(icon.qicon) 53 # item.setSizeHint(QSize(-1, 24)) 54 if label == self.ITEM_SEPARATOR: 55 self.insertSeparator(self.count()) 56 elif icon is not None: 57 self.addItem(icon.qicon, label) 58 else: 59 self.addItem(label) 60 return self.count() - 1 61 62 def remove_item(self, index): 63 self.removeItem(index) 64 65 def __current_index_changed(self): 66 # print("__current_index_changed", self.currentIndex(), 67 # "inhibit", self.inhibit_change_event) 68 if not self.inhibit_change_event: 69 # print("Choice.__current_index_changed") 70 # if not getattr(self, "_inhibit_changed", False): 71 if not self.changed.inhibit: 72 if not getattr(self, "_inhibit_item_selected", False): 73 index = self.currentIndex() 74 self.item_selected.emit(index) 75 self.changed.emit() 76 self.on_changed() 77 78 def get_index(self): 79 return self.currentIndex() 80 81 def set_index(self, index, signal=True): 82 try: 83 if not signal: 84 self.inhibit_change_event = True 85 self.setCurrentIndex(-1 if index is None else index) 86 finally: 87 if not signal: 88 self.inhibit_change_event = False 89 90 def set_item_text(self, index, text): 91 self.setItemText(index, text) 92 93 def on_changed(self): 94 pass 95 96 def __len__(self): 97 return self.count() 98 99 100class ItemChoice(Choice): 101 def __init__(self, parent): 102 Choice.__init__(self, parent) 103 104 def update(self): 105 # for i, item in enumerate(self.items): 106 # self.add_item(item["name"], icon=self.get_item_icon(i)) 107 old = self.inhibit_change_event 108 old_index = self.get_index() 109 self.inhibit_change_event = True 110 self.clear() 111 for i in range(self.get_item_count()): 112 text = self.get_item_text(i) 113 icon = self.get_item_icon(i) 114 self.add_item(text, icon) 115 if old_index < self.get_item_count(): 116 self.set_index(old_index) 117 self.inhibit_change_event = old 118 119 def select_item(self, index, signal=True): 120 print("select_item", index) 121 if index is None: 122 self.set_index(-1, signal=signal) 123 else: 124 self.set_index(index, signal=signal) 125 126 def on_changed(self): 127 self.on_select_item(self.get_index()) 128 129 def on_select_item(self, index): 130 pass 131