(self, event)
| 2812 | item.setSelected(False) |
| 2813 | |
| 2814 | def mouseReleaseEvent(self, event): |
| 2815 | if event.button() == Qt.MiddleButton: |
| 2816 | self._panning = False |
| 2817 | self.unsetCursor() |
| 2818 | else: |
| 2819 | rb_start = self._rb_start |
| 2820 | if event.button() == Qt.LeftButton: |
| 2821 | self._rb_start = None |
| 2822 | super().mouseReleaseEvent(event) |
| 2823 | # Post-filter for both drag directions: use tight per-type rects so that |
| 2824 | # label bounding boxes don't cause early/wrong selection. |
| 2825 | # Skip for plain clicks (drag distance < 4 vp-px): a zero-size QRectF |
| 2826 | # returns False from intersects(), which would deselect any clicked item. |
| 2827 | if event.button() == Qt.LeftButton and rb_start is not None: |
| 2828 | dx = event.position().x() - rb_start.x() |
| 2829 | dy = event.position().y() - rb_start.y() |
| 2830 | if abs(dx) > 4 or abs(dy) > 4: |
| 2831 | press_scene = self.mapToScene(rb_start) |
| 2832 | release_scene = self.mapToScene(event.position().toPoint()) |
| 2833 | rb_rect = QRectF(press_scene, release_scene).normalized() |
| 2834 | is_contain = dx < 0 |
| 2835 | for item in list(self.scene().selectedItems()): |
| 2836 | if not _rb_keep_item(item, rb_rect, contains=is_contain): |
| 2837 | item.setSelected(False) |
| 2838 | |
| 2839 | # ── keyboard ───────────────────────────────────────────────────────────── |
| 2840 |
no test coverage detected