git.lucas.co / hou-control
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