From 25652a5f5ff0a69e9e5bd0a7cf362fbd325ab7a5 Mon Sep 17 00:00:00 2001 From: Rebecca Breu Date: Tue, 23 Mar 2021 21:02:13 +0100 Subject: [PATCH] Custom selection markings (WIP) Preparation for resizing and scaling items --- beeref/items.py | 30 ++++++++++-------------------- beeref/selection.py | 31 +++++++++++++++---------------- beeref/view.py | 3 +++ 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/beeref/items.py b/beeref/items.py index 5fae7e5..3c33b97 100644 --- a/beeref/items.py +++ b/beeref/items.py @@ -103,31 +103,21 @@ class BeePixmapItem(QtWidgets.QGraphicsPixmapItem): return item - def create_selection(self): - SelectionItem(self) + def activate_selection(self): + if self.childItems(): + self.childItems()[0].setVisible(True) + else: + SelectionItem(self) def clear_selection(self): - for child in self.childItems(): - logger.debug('Removing child item...') - self.scene().removeItem(child) - logger.debug('Child item removed') + self.childItems()[0].setVisible(False) def itemChange(self, change, value): - ret = super().itemChange(change, value) - if change == self.GraphicsItemChange.ItemSelectedChange: if value: - logger.debug('Item selected') - self.create_selection() + logger.debug(f'Item selected {self.filename}') + self.activate_selection() else: - logger.debug('Item deselected') + logger.debug(f'Item deselected {self.filename}') self.clear_selection() - - return ret - - def mousePressEvent(self, event): - print('????') - - def sceneEvent(self, event): - print('********', event) - return super().sceneEvent(event) + return super().itemChange(change, value) diff --git a/beeref/selection.py b/beeref/selection.py index 32cd50a..a404f88 100644 --- a/beeref/selection.py +++ b/beeref/selection.py @@ -34,9 +34,14 @@ class SelectionItem(QtWidgets.QGraphicsItem): def __init__(self, item): super().__init__(parent=item) self.single_select_mode = False - + self.setAcceptHoverEvents(True) + self.setFlags( + QtWidgets.QGraphicsItem.GraphicsItemFlags.ItemIsSelectable + | QtWidgets.QGraphicsItem.GraphicsItemFlags.ItemIsMovable) bounds = self.parentItem().boundingRect() pos = bounds.bottomRight() + + # The intercatable shape of the bottom right scale handle: self.bottom_right_scale_bounds = QtCore.QRectF( pos.x() - self.resize_size/2, pos.y() - self.resize_size/2, @@ -53,7 +58,7 @@ class SelectionItem(QtWidgets.QGraphicsItem): def shape(self): path = QtGui.QPainterPath() - path.addRect(self.boundingRect()) + path.addRect(self.bottom_right_scale_bounds) return path def draw_debug_rect(self, painter, rect): @@ -71,17 +76,11 @@ class SelectionItem(QtWidgets.QGraphicsItem): bounds = self.parentItem().boundingRect() painter.drawRect(bounds) - self.single_select_mode = self.parentItem()\ - .scene().has_single_selection() - - self.setAcceptHoverEvents(self.single_select_mode) - self.setAcceptDrops(self.single_select_mode) - + single_select_mode = self.parentItem().scene().has_single_selection() + self.setEnabled(single_select_mode) # If it's a single selection, draw the handles: - if self.single_select_mode: - self.setFlags( - QtWidgets.QGraphicsItem.GraphicsItemFlags.ItemIsSelectable) + if single_select_mode: pos = bounds.bottomRight() painter.fillRect(pos.x() - self.handle_size/2, pos.y() - self.handle_size/2, @@ -94,14 +93,14 @@ class SelectionItem(QtWidgets.QGraphicsItem): self.draw_debug_rect(painter, self.bottom_right_scale_bounds) def hoverMoveEvent(self, event): - if not self.single_select_mode: - return - # In bottomright scale area? if self.bottom_right_scale_bounds.contains(event.pos()): self.setCursor(Qt.CursorShape.SizeFDiagCursor) else: self.setCursor(Qt.CursorShape.ArrowCursor) - def dragEnterEvent(self, event): - print('OOOOOOOOOOOOOOOdrag enter') + def mousePressEvent(self, event): + print('********mousepress') + + def mouseMoveEvent(self, event): + print('*******mousemove') diff --git a/beeref/view.py b/beeref/view.py index 11fd436..689e276 100644 --- a/beeref/view.py +++ b/beeref/view.py @@ -290,8 +290,11 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): self.add_image(img, pos) def on_selection_changed(self): + logger.debug('Currently selected items: %s', + len(self.scene.selectedItems())) for action in self.actions_active_when_selection: action.setEnabled(self.scene.has_selection()) + self.viewport().repaint() def recalc_scene_rect(self): """Resize the scene rectangle so that it is always one view width