cell padding clicks deselect via signal instead of broken event propagation
This commit is contained in:
parent
b541f64374
commit
9081208170
@ -27,6 +27,7 @@ class ThumbnailWidget(QWidget):
|
|||||||
clicked = Signal(int, object) # index, QMouseEvent
|
clicked = Signal(int, object) # index, QMouseEvent
|
||||||
double_clicked = Signal(int)
|
double_clicked = Signal(int)
|
||||||
right_clicked = Signal(int, object) # index, QPoint
|
right_clicked = Signal(int, object) # index, QPoint
|
||||||
|
padding_clicked = Signal(object) # QMouseEvent — click missed the pixmap
|
||||||
|
|
||||||
# QSS-controllable dot colors
|
# QSS-controllable dot colors
|
||||||
_saved_color = QColor("#22cc22")
|
_saved_color = QColor("#22cc22")
|
||||||
@ -306,7 +307,7 @@ class ThumbnailWidget(QWidget):
|
|||||||
def mousePressEvent(self, event) -> None:
|
def mousePressEvent(self, event) -> None:
|
||||||
if event.button() == Qt.MouseButton.LeftButton:
|
if event.button() == Qt.MouseButton.LeftButton:
|
||||||
if not self._hit_pixmap(event.position().toPoint()):
|
if not self._hit_pixmap(event.position().toPoint()):
|
||||||
event.ignore()
|
self.padding_clicked.emit(event)
|
||||||
return
|
return
|
||||||
self._drag_start = event.position().toPoint()
|
self._drag_start = event.position().toPoint()
|
||||||
self.clicked.emit(self.index, event)
|
self.clicked.emit(self.index, event)
|
||||||
@ -320,7 +321,7 @@ class ThumbnailWidget(QWidget):
|
|||||||
self._drag_start = None
|
self._drag_start = None
|
||||||
if event.button() == Qt.MouseButton.LeftButton:
|
if event.button() == Qt.MouseButton.LeftButton:
|
||||||
if not self._hit_pixmap(event.position().toPoint()):
|
if not self._hit_pixmap(event.position().toPoint()):
|
||||||
event.ignore()
|
self.padding_clicked.emit(event)
|
||||||
return
|
return
|
||||||
self.double_clicked.emit(self.index)
|
self.double_clicked.emit(self.index)
|
||||||
|
|
||||||
@ -471,6 +472,7 @@ class ThumbnailGrid(QScrollArea):
|
|||||||
thumb.clicked.connect(self._on_thumb_click)
|
thumb.clicked.connect(self._on_thumb_click)
|
||||||
thumb.double_clicked.connect(self._on_thumb_double_click)
|
thumb.double_clicked.connect(self._on_thumb_double_click)
|
||||||
thumb.right_clicked.connect(self._on_thumb_right_click)
|
thumb.right_clicked.connect(self._on_thumb_right_click)
|
||||||
|
thumb.padding_clicked.connect(self._on_padding_click)
|
||||||
self._flow.add_widget(thumb)
|
self._flow.add_widget(thumb)
|
||||||
self._thumbs.append(thumb)
|
self._thumbs.append(thumb)
|
||||||
|
|
||||||
@ -485,6 +487,7 @@ class ThumbnailGrid(QScrollArea):
|
|||||||
thumb.clicked.connect(self._on_thumb_click)
|
thumb.clicked.connect(self._on_thumb_click)
|
||||||
thumb.double_clicked.connect(self._on_thumb_double_click)
|
thumb.double_clicked.connect(self._on_thumb_double_click)
|
||||||
thumb.right_clicked.connect(self._on_thumb_right_click)
|
thumb.right_clicked.connect(self._on_thumb_right_click)
|
||||||
|
thumb.padding_clicked.connect(self._on_padding_click)
|
||||||
self._flow.add_widget(thumb)
|
self._flow.add_widget(thumb)
|
||||||
self._thumbs.append(thumb)
|
self._thumbs.append(thumb)
|
||||||
new_thumbs.append(thumb)
|
new_thumbs.append(thumb)
|
||||||
@ -565,22 +568,28 @@ class ThumbnailGrid(QScrollArea):
|
|||||||
self.ensureWidgetVisible(self._thumbs[index])
|
self.ensureWidgetVisible(self._thumbs[index])
|
||||||
self.context_requested.emit(index, pos)
|
self.context_requested.emit(index, pos)
|
||||||
|
|
||||||
|
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:
|
def mousePressEvent(self, event: QMouseEvent) -> None:
|
||||||
if event.button() == Qt.MouseButton.LeftButton:
|
if event.button() == Qt.MouseButton.LeftButton:
|
||||||
child = self.childAt(event.position().toPoint())
|
child = self.childAt(event.position().toPoint())
|
||||||
# Empty space: flow layout, viewport, or cell padding (missed pixmap)
|
if child is self.widget() or child is self.viewport():
|
||||||
is_empty = child is self.widget() or child is self.viewport()
|
self._start_rubber_band(event.position().toPoint())
|
||||||
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()
|
|
||||||
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()
|
|
||||||
return
|
return
|
||||||
super().mousePressEvent(event)
|
super().mousePressEvent(event)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user