cell padding clicks deselect via signal instead of broken event propagation

This commit is contained in:
pax 2026-04-10 20:27:54 -05:00
parent b541f64374
commit 9081208170

View File

@ -27,6 +27,7 @@ class ThumbnailWidget(QWidget):
clicked = Signal(int, object) # index, QMouseEvent
double_clicked = Signal(int)
right_clicked = Signal(int, object) # index, QPoint
padding_clicked = Signal(object) # QMouseEvent — click missed the pixmap
# QSS-controllable dot colors
_saved_color = QColor("#22cc22")
@ -306,7 +307,7 @@ class ThumbnailWidget(QWidget):
def mousePressEvent(self, event) -> None:
if event.button() == Qt.MouseButton.LeftButton:
if not self._hit_pixmap(event.position().toPoint()):
event.ignore()
self.padding_clicked.emit(event)
return
self._drag_start = event.position().toPoint()
self.clicked.emit(self.index, event)
@ -320,7 +321,7 @@ class ThumbnailWidget(QWidget):
self._drag_start = None
if event.button() == Qt.MouseButton.LeftButton:
if not self._hit_pixmap(event.position().toPoint()):
event.ignore()
self.padding_clicked.emit(event)
return
self.double_clicked.emit(self.index)
@ -471,6 +472,7 @@ class ThumbnailGrid(QScrollArea):
thumb.clicked.connect(self._on_thumb_click)
thumb.double_clicked.connect(self._on_thumb_double_click)
thumb.right_clicked.connect(self._on_thumb_right_click)
thumb.padding_clicked.connect(self._on_padding_click)
self._flow.add_widget(thumb)
self._thumbs.append(thumb)
@ -485,6 +487,7 @@ class ThumbnailGrid(QScrollArea):
thumb.clicked.connect(self._on_thumb_click)
thumb.double_clicked.connect(self._on_thumb_double_click)
thumb.right_clicked.connect(self._on_thumb_right_click)
thumb.padding_clicked.connect(self._on_padding_click)
self._flow.add_widget(thumb)
self._thumbs.append(thumb)
new_thumbs.append(thumb)
@ -565,22 +568,28 @@ class ThumbnailGrid(QScrollArea):
self.ensureWidgetVisible(self._thumbs[index])
self.context_requested.emit(index, pos)
def mousePressEvent(self, event: QMouseEvent) -> None:
if event.button() == Qt.MouseButton.LeftButton:
child = self.childAt(event.position().toPoint())
# Empty space: flow layout, viewport, or cell padding (missed pixmap)
is_empty = child is self.widget() or child is self.viewport()
if not is_empty and isinstance(child, ThumbnailWidget):
local = child.mapFrom(self, event.position().toPoint())
if not child._hit_pixmap(local):
is_empty = True
if is_empty:
self._rb_origin = event.position().toPoint()
def _start_rubber_band(self, pos: QPoint) -> None:
"""Start a rubber band selection and deselect."""
self._rb_origin = pos
if not self._rubber_band:
self._rubber_band = QRubberBand(QRubberBand.Shape.Rectangle, self.viewport())
self._rubber_band.setGeometry(QRect(self._rb_origin, QSize()))
self._rubber_band.show()
self.clear_selection()
def _on_padding_click(self, event: QMouseEvent) -> None:
"""Cell padding click — treat as empty space."""
# Map the event position from the ThumbnailWidget to the viewport
thumb = self.sender()
if thumb:
vp_pos = self.viewport().mapFrom(thumb, event.position().toPoint())
self._start_rubber_band(vp_pos)
def mousePressEvent(self, event: QMouseEvent) -> None:
if event.button() == Qt.MouseButton.LeftButton:
child = self.childAt(event.position().toPoint())
if child is self.widget() or child is self.viewport():
self._start_rubber_band(event.position().toPoint())
return
super().mousePressEvent(event)