You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.6 KiB
190 lines
5.6 KiB
from PyQt6 import QtCore, QtGui, QtWidgets
|
|
from PyQt6.QtCore import Qt
|
|
|
|
|
|
class ListItem(QtWidgets.QListWidgetItem):
|
|
def __init__(self, label):
|
|
super(ListItem, self).__init__(label)
|
|
self.__hasCheckbox = False
|
|
|
|
@property
|
|
def hasCheckbox(self):
|
|
return self.__hasCheckbox
|
|
|
|
def setUserData(self, data):
|
|
self.setData(Qt.ItemDataRole.UserRole, data)
|
|
|
|
def getUserData(self):
|
|
return self.data(Qt.ItemDataRole.UserRole)
|
|
|
|
def text(self):
|
|
return str(super(ListItem, self).text())
|
|
|
|
def enableCheckbox(self):
|
|
self.__hasCheckbox = True
|
|
self.setFlags(self.flags() | Qt.ItemFlag.ItemIsUserCheckable)
|
|
self.setCheckState(QtCore.Qt.CheckState.Unchecked)
|
|
self.checkedState = False
|
|
|
|
def setChecked(self, checked):
|
|
if not self.hasCheckbox:
|
|
self.setSelected(checked)
|
|
return
|
|
|
|
if checked:
|
|
self.setCheckState(QtCore.Qt.CheckState.Checked)
|
|
else:
|
|
self.setCheckState(QtCore.Qt.CheckState.Unchecked)
|
|
self.checkedState = self.checkState()
|
|
|
|
def isChecked(self):
|
|
return self.hasCheckbox and self.checkState() != QtCore.Qt.CheckState.Unchecked
|
|
|
|
def _clicked(self):
|
|
# owner = self.listWidget()
|
|
if self.hasCheckbox:
|
|
if self.checkState() != self.checkedState:
|
|
self.checkedState = self.checkState()
|
|
if self.checkState():
|
|
print("Item checked")
|
|
else:
|
|
print("Item unchecked")
|
|
return True
|
|
return False
|
|
|
|
|
|
class ListView(QtWidgets.QListWidget):
|
|
def __init__(self):
|
|
super(ListView, self).__init__()
|
|
# Widget.__init__(self)
|
|
self._vertical_scrolling = True
|
|
self.itemActivated[QtWidgets.QListWidgetItem].connect(self._activate)
|
|
self.itemClicked[QtWidgets.QListWidgetItem].connect(self._clicked)
|
|
|
|
def _activate(self, item):
|
|
print("Item activated")
|
|
|
|
def _clicked(self, item):
|
|
if item._clicked():
|
|
return
|
|
if self.allowsMultipleSelection():
|
|
if item.isSelected():
|
|
print("Item selected")
|
|
else:
|
|
print("Item deselected")
|
|
else:
|
|
pass
|
|
|
|
def onActivate(self, event):
|
|
pass
|
|
|
|
def onClicked(self, event):
|
|
pass
|
|
|
|
def setData(self, items):
|
|
self.clear()
|
|
for item in items:
|
|
self.addItem(item)
|
|
|
|
def setVerticalScrollingEnabled(self, enabled):
|
|
self._vertical_scrolling = enabled
|
|
if enabled:
|
|
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded)
|
|
else:
|
|
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
|
self.updateGeometry()
|
|
|
|
def rowCount(self):
|
|
return len([item for item in self.getItems() if item is not None and not item.isHidden()])
|
|
|
|
def sizeHint(self):
|
|
if self._vertical_scrolling:
|
|
return super(ListView, self).sizeHint()
|
|
else:
|
|
rows = self.rowCount()
|
|
if rows > 0:
|
|
rowHeight = self.sizeHintForRow(0)
|
|
rowHeight = max(rowHeight, self.iconSize().height())
|
|
else:
|
|
rowHeight = 0
|
|
height = rowHeight * rows
|
|
|
|
size = super(ListView, self).sizeHint()
|
|
size.setHeight(height)
|
|
return size
|
|
|
|
_brushes = {}
|
|
|
|
@classmethod
|
|
def getBrush(cls, color):
|
|
if color not in cls._brushes:
|
|
cls._brushes[color] = QtGui.QBrush(QtGui.QColor(color))
|
|
return cls._brushes[color]
|
|
|
|
def addLogItem(self, text, color=None, data=None, checkbox=False, pos=None):
|
|
item = ListItem(text)
|
|
item.setText(text)
|
|
if color is not None:
|
|
item.setForeground(self.getBrush(color))
|
|
if data is not None:
|
|
item.setUserData(data)
|
|
if checkbox:
|
|
item.enableCheckbox()
|
|
return self.addItemObject(item, pos)
|
|
|
|
def addItemObject(self, item, pos=None):
|
|
if pos is not None:
|
|
super(ListView, self).insertItem(pos, item)
|
|
else:
|
|
super(ListView, self).addItem(item)
|
|
if not self._vertical_scrolling:
|
|
self.updateGeometry()
|
|
return item
|
|
|
|
def getSelectedItem(self):
|
|
items = self.selectedItems()
|
|
if len(items) > 0:
|
|
return items[0].text
|
|
return None
|
|
|
|
def getSelectedItems(self):
|
|
return [item.text for item in self.selectedItems()]
|
|
|
|
def getItemData(self, row):
|
|
item = self.item(row)
|
|
if item is not None:
|
|
return item.getUserData()
|
|
|
|
def setItemColor(self, row, color):
|
|
item = self.item(row)
|
|
if item is not None:
|
|
item.setForeground(self.getBrush(color))
|
|
|
|
def showItem(self, row, state):
|
|
item = self.item(row)
|
|
if item is not None:
|
|
item.setHidden(not state)
|
|
|
|
def allowMultipleSelection(self, allow):
|
|
self.setSelectionMode(
|
|
QtWidgets.QAbstractItemView.SelectionMode.MultiSelection
|
|
if allow
|
|
else QtWidgets.QAbstractItemView.SelectionMode.SingleSelection
|
|
)
|
|
|
|
def allowsMultipleSelection(self):
|
|
return self.selectionMode() == QtWidgets.QAbstractItemView.SelectionMode.MultiSelection
|
|
|
|
def getItems(self):
|
|
return [self.item(row) for row in range(self.count())]
|
|
|
|
def clearSelection(self):
|
|
super(ListView, self).clearSelection()
|
|
|
|
for item in self.getItems():
|
|
if item is None:
|
|
continue
|
|
if item.isSelected():
|
|
item.setSelected(False)
|
|
|
|
self.callEvent("onClearSelection", None)
|