QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgsmodelviewmousehandles.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmodelviewmousehandles.cpp
3 ------------------------
4 begin : March 2020
5 copyright : (C) 2020 by Nyall Dawson
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include <limits>
21
22#include "qgis.h"
23#include "qgslogger.h"
27#include "qgsmodelviewtool.h"
28#include "qgsproject.h"
29
30#include <QGraphicsSceneHoverEvent>
31#include <QPainter>
32#include <QWidget>
33
34#include "moc_qgsmodelviewmousehandles.cpp"
35
37
38
39QgsModelViewMouseHandles::QgsModelViewMouseHandles( QgsModelGraphicsView *view )
40 : QgsGraphicsViewMouseHandles( view )
41 , mView( view )
42{
43 //listen for selection changes, and update handles accordingly
44 connect( modelScene(), &QGraphicsScene::selectionChanged, this, &QgsModelViewMouseHandles::selectionChanged );
45 setHandleSize( 5 );
46}
47
48QgsModelGraphicsScene *QgsModelViewMouseHandles::modelScene() const
49{
50 return qobject_cast<QgsModelGraphicsScene *>( mView->scene() );
51}
52
53void QgsModelViewMouseHandles::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
54{
55 paintInternal( painter, !( modelScene()->flags() & QgsModelGraphicsScene::FlagHideControls ), true, false, option, widget );
56}
57
58void QgsModelViewMouseHandles::selectionChanged()
59{
60 //listen out for selected items' size and rotation changed signals
61 const QList<QGraphicsItem *> itemList = mView->items();
62 for ( QGraphicsItem *graphicsItem : itemList )
63 {
64 QgsModelComponentGraphicItem *item = dynamic_cast<QgsModelComponentGraphicItem *>( graphicsItem );
65 if ( !item )
66 continue;
67
68 if ( item->isSelected() )
69 {
70 connect( item, &QgsModelComponentGraphicItem::sizePositionChanged, this, &QgsModelViewMouseHandles::selectedItemSizeChanged );
71 }
72 else
73 {
74 disconnect( item, &QgsModelComponentGraphicItem::sizePositionChanged, this, &QgsModelViewMouseHandles::selectedItemSizeChanged );
75 }
76 }
77
78 resetStatusBar();
79 updateHandles();
80}
81
82void QgsModelViewMouseHandles::setViewportCursor( Qt::CursorShape cursor )
83{
84 //workaround qt bug #3732 by setting cursor for QGraphicsView viewport,
85 //rather then setting it directly here
86
87 if ( qobject_cast<QgsModelViewTool *>( mView->tool() ) )
88 {
89 mView->viewport()->setCursor( cursor );
90 }
91}
92
93QList<QGraphicsItem *> QgsModelViewMouseHandles::sceneItemsAtPoint( QPointF scenePoint )
94{
95 return modelScene()->items( scenePoint );
96}
97
98QList<QGraphicsItem *> QgsModelViewMouseHandles::selectedSceneItems( bool ) const
99{
100 QList<QGraphicsItem *> res;
101 const QList<QgsModelComponentGraphicItem *> componentItems = modelScene()->selectedComponentItems();
102 res.reserve( componentItems.size() );
103 for ( QgsModelComponentGraphicItem *item : componentItems )
104 res << item;
105 return res;
106}
107
108QRectF QgsModelViewMouseHandles::itemRect( QGraphicsItem *item ) const
109{
110 if ( QgsModelComponentGraphicItem *componentItem = dynamic_cast<QgsModelComponentGraphicItem *>( item ) )
111 return componentItem->itemRect();
112 else
113 return QRectF();
114}
115
116QRectF QgsModelViewMouseHandles::storedItemRect( QGraphicsItem *item ) const
117{
118 if ( QgsModelComponentGraphicItem *componentItem = dynamic_cast<QgsModelComponentGraphicItem *>( item ) )
119 return componentItem->itemRect( true );
120 else
121 return QRectF();
122}
123
124void QgsModelViewMouseHandles::moveItem( QGraphicsItem *item, double deltaX, double deltaY )
125{
126 if ( QgsModelComponentGraphicItem *componentItem = dynamic_cast<QgsModelComponentGraphicItem *>( item ) )
127 {
128 componentItem->moveComponentBy( deltaX, deltaY );
129 }
130}
131
132void QgsModelViewMouseHandles::previewItemMove( QGraphicsItem *item, double deltaX, double deltaY )
133{
134 if ( QgsModelComponentGraphicItem *componentItem = dynamic_cast<QgsModelComponentGraphicItem *>( item ) )
135 {
136 componentItem->previewItemMove( deltaX, deltaY );
137 }
138}
139
140void QgsModelViewMouseHandles::setItemRect( QGraphicsItem *item, QRectF rect )
141{
142 if ( QgsModelComponentGraphicItem *componentItem = dynamic_cast<QgsModelComponentGraphicItem *>( item ) )
143 {
144 componentItem->finalizePreviewedItemRectChange( rect );
145 }
146}
147
148QRectF QgsModelViewMouseHandles::previewSetItemRect( QGraphicsItem *item, QRectF rect )
149{
150 if ( QgsModelComponentGraphicItem *componentItem = dynamic_cast<QgsModelComponentGraphicItem *>( item ) )
151 {
152 return componentItem->previewItemRectChange( rect );
153 }
154 return rect;
155}
156
157void QgsModelViewMouseHandles::startMacroCommand( const QString &text )
158{
159 mView->startMacroCommand( text );
160}
161
162void QgsModelViewMouseHandles::endMacroCommand()
163{
164 mView->endMacroCommand();
165}
166
167QPointF QgsModelViewMouseHandles::snapPoint( QPointF originalPoint, QgsGraphicsViewMouseHandles::SnapGuideMode mode, bool snapHorizontal, bool snapVertical )
168{
169 bool snapped = false;
170
171 QPointF snappedPoint;
172 switch ( mode )
173 {
174 case Item:
175 case Point:
176 snappedPoint = mView->snapper()->snapPoint( originalPoint, mView->transform().m11(), snapped, snapHorizontal, snapVertical );
177 break;
178 }
179
180 return snapped ? snappedPoint : originalPoint;
181}
182
183