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