implemented deselectable list view

This commit is contained in:
Jakub Trllo 2025-06-18 13:41:39 +02:00
parent 65b9107d0e
commit c7131de67b
2 changed files with 57 additions and 3 deletions

View file

@ -29,6 +29,7 @@ from .widgets import (
from .views import (
DeselectableTreeView,
TreeView,
ListView,
)
from .error_dialog import ErrorMessageBox
from .lib import (
@ -114,6 +115,7 @@ __all__ = (
"DeselectableTreeView",
"TreeView",
"ListView",
"ErrorMessageBox",

View file

@ -37,7 +37,7 @@ class TreeView(QtWidgets.QTreeView):
double_clicked = QtCore.Signal(QtGui.QMouseEvent)
def __init__(self, *args, **kwargs):
super(TreeView, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self._deselectable = False
self._flick_charm_activated = False
@ -60,12 +60,64 @@ class TreeView(QtWidgets.QTreeView):
self.clearSelection()
# clear the current index
self.setCurrentIndex(QtCore.QModelIndex())
super(TreeView, self).mousePressEvent(event)
super().mousePressEvent(event)
def mouseDoubleClickEvent(self, event):
self.double_clicked.emit(event)
return super(TreeView, self).mouseDoubleClickEvent(event)
return super().mouseDoubleClickEvent(event)
def activate_flick_charm(self):
if self._flick_charm_activated:
return
self._flick_charm_activated = True
self._before_flick_scroll_mode = self.verticalScrollMode()
self._flick_charm.activateOn(self)
self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
def deactivate_flick_charm(self):
if not self._flick_charm_activated:
return
self._flick_charm_activated = False
self._flick_charm.deactivateFrom(self)
if self._before_flick_scroll_mode is not None:
self.setVerticalScrollMode(self._before_flick_scroll_mode)
class ListView(QtWidgets.QListView):
"""A tree view that deselects on clicking on an empty area in the view"""
double_clicked = QtCore.Signal(QtGui.QMouseEvent)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._deselectable = False
self._flick_charm_activated = False
self._flick_charm = FlickCharm(parent=self)
self._before_flick_scroll_mode = None
def is_deselectable(self):
return self._deselectable
def set_deselectable(self, deselectable):
self._deselectable = deselectable
deselectable = property(is_deselectable, set_deselectable)
def mousePressEvent(self, event):
if self._deselectable:
index = self.indexAt(event.pos())
if not index.isValid():
# clear the selection
self.clearSelection()
# clear the current index
self.setCurrentIndex(QtCore.QModelIndex())
super().mousePressEvent(event)
def mouseDoubleClickEvent(self, event):
self.double_clicked.emit(event)
return super().mouseDoubleClickEvent(event)
def activate_flick_charm(self):
if self._flick_charm_activated: