git clone https://git.lucas.co/hou-control.git
python3.11libs/hc/hcvisualizers.py (4.2K)
1 import hou
2 from fuzzyfinder import fuzzyfinder
3 from PySide6 import QtCore
4 from PySide6.QtWidgets import QListWidget, QListWidgetItem, QDialog, QLineEdit, QBoxLayout
5 from PySide6.QtCore import Qt, QEvent
6 from .hcsession import HCSession
7
8 class HCVisualizers(QDialog):
9 def __init__(self):
10 super(VisualizerMenu, self).__init__(hou.qt.mainWindow())
11
12 # Resources
13 self.hc_session = HCSession()
14 self.hc_viewport = self.hc_session.currentViewport()
15 self.vis_arr = self.hc_viewport.visualizers()
16
17 # Filter box
18 self.filter_box = filterBox()
19 self.filter_box.onTab.connect(self.listNext)
20 self.filter_box.returnPressed.connect(self.itemToggle)
21 self.filter_box.textEdited.connect(self.listFilter)
22
23 # List widget
24 self.list_widget = QListWidget()
25 if self.vis_arr:
26 for vis in self.vis_arr:
27 list_item = QListWidgetItem()
28 item_label = vis.label()
29 item_state = vis.isActive(self.curViewport)
30
31 list_item.setText(item_label)
32
33 if item_state:
34 list_item.setCheckState(Qt.Checked)
35 else:
36 list_item.setCheckState(Qt.Unchecked)
37
38 self.list_widget.addItem(list_item)
39
40 self.list_widget.itemClicked.connect(self.item_toggle)
41
42 # Layout
43 self.layout = QBoxLayout(QBoxLayout.Direction.TopToBottom)
44 self.layout.addWidget(self.filter_box)
45 self.layout.addWidget(self.list_widget)
46 self.setLayout(self.layout)
47 self.listSetIndex(0)
48
49 def closeEvent(self, event):
50 print("Closing")
51 self.setParent(None)
52
53 def itemToggle(self):
54 current_item = self.list_widget.selectedItems()[0]
55 item_name = current_tem.text()
56 items = self.listGetItems()
57 item_names = [item.text() for item in items]
58 index = item_names.index(item_name)
59
60 vis = self.vis_arr[index]
61 state = vis.isActive(self.viewport)
62
63 vis.setIsActive(not state, self.viewport)
64
65 if state:
66 current_item.setCheckState(Qt.Unchecked)
67 else:
68 current_item.setCheckState(Qt.Checked)
69
70 def listFilter(self):
71 text = self.input_box.text()
72 items = self.getItems()
73 names = [item.text() for item in items]
74 suggestions = fuzzyfinder(text, names)
75 suggestions = list(suggestions)
76 for item in items:
77 if item.text() in suggestions:
78 item.setHidden(0)
79 else:
80 item.setHidden(1)
81 self.listSetIndex(0)
82
83 def listGetItems(self):
84 item_count = self.list_widget.count()
85 items = [self.list_widget.item(i) for i in range(item_count)]
86 return(items)
87
88 def listGetVisibleItems(self):
89 item_count = self.list_widget.count()
90 items = []
91 for i in range(item_count):
92 item = self.list_widget.item(i)
93 if not item.isHidden():
94 items.append(item)
95 return(items)
96
97 def listNext(self):
98 visible_items = self.listGetVisibleItems()
99 current_item = self.list_widget.selectedItems()[0]
100 index = visible_items.index(current_item)
101 index = (index + 1) % len(visible_items)
102 self.listSetIndex(index)
103
104 def listPrev(self):
105 visible_items = self.listGetVisibleItems()
106 current_item = self.list_widget.selectedItems()[0]
107 index = visible_items.index(current_item)
108 index = (index - 1) % len(visible_items)
109 self.listSetIndex(index)
110
111 def listSetIndex(self, index):
112 visible_items = self.listGetVisibleItems()
113 counter = 0
114 for visible_item in visible_items:
115 if counter == index:
116 self.list_widget.setItemSelected(visible_item, 1)
117 return
118 counter += 1
119
120 class filterBox(QLineEdit):
121 def __init__(self):
122 # Key handler
123 self.onTab = QtCore.Signal()
124
125 def event(self, event):
126 if event.type() == QEvent.Type.KeyPress:
127 key = event.key()
128 if key == Qt.Key_Tab:
129 self.onTab.emit()
130 return True
131 return QLineEdit.event(self, event)
132
133