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