git clone https://git.lucas.co/hou-control.git
python3.11libs/hc/hcwidgets.py (4.5K)
1 import hou
2 from fuzzyfinder import fuzzyfinder
3 from importlib import reload
4 from PySide6 import QtWidgets
5 from PySide6.QtCore import Qt
6
7 class HCWidgets:
8
9 class Button(QtWidgets.QPushButton):
10 def __init__(self, text, parent=None):
11 super().__init__(text, parent)
12 self.setStyleSheet("text-align: left; padding: 0 0 0 0")
13 self.setFlat(1)
14 self.setFixedSize(120, 16)
15
16
17 class Menu(QtWidgets.QPushButton):
18 def __init__(self, label, parent=None):
19 super().__init__(label, parent)
20 self.setStyleSheet("text-align: left; padding: 0 0 0 0")
21 self.setFlat(1)
22
23
24 class SelectionDialog(QtWidgets.QDialog):
25 def __init__(self, window_title, list_dict):
26 super().__init__(hou.qt.mainWindow())
27 self.resize(900, 600)
28 self.setWindowTitle(window_title)
29 self.setWindowFlags(Qt.Tool | Qt.WindowStaysOnTopHint)
30
31 self.list = self.List()
32 self.list_dict = list_dict
33 self.list_items = []
34 for item in list_dict:
35 self.list_items.append(item)
36 self.populate(self.list_items)
37 self.list.setIndex(0)
38
39 self.list.itemClicked.connect(self.execute)
40 self.list.setSelectionMode(QtWidgets.QListWidget.SingleSelection)
41
42 """ Input line """
43 self.input_line = QtWidgets.QLineEdit()
44 self.input_line.returnPressed.connect(self.execute)
45 self.input_line.textEdited.connect(self.list.filter)
46
47 """ Layout """
48 self.layout = QtWidgets.QVBoxLayout()
49 self.layout.addWidget(self.list)
50 self.layout.addWidget(self.input_line)
51 self.setLayout(self.layout)
52
53 """ Do this last """
54 self.input_line.setFocus()
55
56 def closeEvent(self, event):
57 self.setParent(None)
58
59 def keyPressEvent(self, event):
60 if event.key() == Qt.Key_Up:
61 self.list.selectPrevious()
62 return
63 elif event.key() == Qt.Key_Down:
64 self.list.selectNext()
65 elif event.key() == Qt.Key_P and event.modifiers() == Qt.ControlModifier:
66 self.list.selectPrevious()
67 return
68 elif event.key() == Qt.Key_N and event.modifiers() == Qt.ControlModifier:
69 self.list.selectNext()
70 return
71 super().keyPressEvent(event)
72
73 def execute(self):
74 items = self.list.allItems()
75 index = items.index(self.list.currentItem())
76 # item = items[index]
77 item = self.list_items[index]
78 value = self.list_dict[item]()
79 return
80
81 def populate(self, item_list):
82 items = []
83 for key in item_list:
84 items.append(key)
85 self.list.addItems(items)
86
87
88 class List(QtWidgets.QListWidget):
89
90 def allItems(self):
91 items = []
92 for i in range(self.count()):
93 items.append(self.item(i))
94 return items
95
96 def currentItem(self):
97 return self.selectedItems()[0]
98
99 def visibleItems(self):
100 items = []
101 for i in range(self.count()):
102 item = self.item(i)
103 if not item.isHidden():
104 items.append(item)
105 return(items)
106
107 def filter(self, query):
108 all_items = self.allItems()
109 all_item_names = [item.text() for item in all_items]
110 matches = list(fuzzyfinder(query, all_item_names))
111 for item in all_items:
112 if item.text() in matches:
113 item.setHidden(0)
114 else:
115 item.setHidden(1)
116 self.setIndex(0)
117
118 def selectNext(self):
119 items = self.visibleItems()
120 index = items.index(self.currentItem())
121 index = (index + 1) % len(items)
122 self.setIndex(index)
123
124 def selectPrev(self):
125 items = self.visibleItems()
126 index = items.index(self.currentItem())
127 index = (index - 1) % len(items)
128 self.setIndex(index)
129
130 def setIndex(self, index):
131 counter = 0
132 for item in self.visibleItems():
133 if counter == index:
134 self.setCurrentItem(item)
135 counter += 1
136