Skip to content

Commit db62a74

Browse files
committed
Add a temporary layout item type for testing
1 parent 86bc8af commit db62a74

File tree

9 files changed

+92
-12
lines changed

9 files changed

+92
-12
lines changed

python/core/layout/qgslayoutitemregistry.sip

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010

11+
1112
class QgsLayoutItemAbstractMetadata
1213
{
1314
%Docstring
@@ -172,6 +173,7 @@ class QgsLayoutItemRegistry : QObject
172173

173174

174175

176+
175177
/************************************************************************
176178
* This file has been generated automatically from *
177179
* *

python/gui/layout/qgslayoutviewrubberband.sip

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@ class QgsLayoutViewRubberBand
5555
ending ``position`` (in layout coordinate space).
5656
%End
5757

58-
virtual void finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0;
58+
virtual QRectF finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0;
5959
%Docstring
6060
Called when a rubber band use has finished and the rubber
6161
band is no longer required.
62+
Returns the final bounding box of the rubber band.
63+
:rtype: QRectF
6264
%End
6365

6466
QgsLayoutView *view() const;
@@ -114,7 +116,7 @@ class QgsLayoutViewRectangularRubberBand : QgsLayoutViewRubberBand
114116

115117
virtual void update( QPointF position, Qt::KeyboardModifiers modifiers );
116118

117-
virtual void finish( QPointF, Qt::KeyboardModifiers );
119+
virtual QRectF finish( QPointF, Qt::KeyboardModifiers );
118120

119121

120122
};
@@ -144,7 +146,7 @@ class QgsLayoutViewEllipticalRubberBand : QgsLayoutViewRubberBand
144146

145147
virtual void update( QPointF position, Qt::KeyboardModifiers modifiers );
146148

147-
virtual void finish( QPointF, Qt::KeyboardModifiers );
149+
virtual QRectF finish( QPointF, Qt::KeyboardModifiers );
148150

149151

150152
};

src/core/layout/qgslayoutitem.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
#include "qgis_core.h"
2121
#include "qgslayoutobject.h"
22-
#include "qgslayoutitemregistry.h"
2322
#include <QGraphicsRectItem>
2423

2524
class QgsLayout;

src/core/layout/qgslayoutitemregistry.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,19 @@
1515
***************************************************************************/
1616

1717
#include "qgslayoutitemregistry.h"
18+
#include <QPainter>
1819

1920
QgsLayoutItemRegistry::QgsLayoutItemRegistry( QObject *parent )
2021
: QObject( parent )
2122
{
2223

24+
// add temporary item to register
25+
auto createTemporaryItem = []( QgsLayout * layout, const QVariantMap & )->QgsLayoutItem*
26+
{
27+
return new TestLayoutItem( layout );
28+
};
29+
30+
addLayoutItemType( new QgsLayoutItemMetadata( 101, QStringLiteral( "temp type" ), QgsApplication::getThemeIcon( QStringLiteral( "/mActionAddLabel.svg" ) ), createTemporaryItem ) );
2331
}
2432

2533
QgsLayoutItemRegistry::~QgsLayoutItemRegistry()
@@ -88,3 +96,26 @@ QMap<int, QString> QgsLayoutItemRegistry::itemTypes() const
8896
}
8997
return types;
9098
}
99+
100+
///@cond TEMPORARY
101+
TestLayoutItem::TestLayoutItem( QgsLayout *layout )
102+
: QgsLayoutItem( layout )
103+
{
104+
int h = static_cast< int >( 360.0 * qrand() / ( RAND_MAX + 1.0 ) );
105+
int s = ( qrand() % ( 200 - 100 + 1 ) ) + 100;
106+
int v = ( qrand() % ( 130 - 255 + 1 ) ) + 130;
107+
mColor = QColor::fromHsv( h, s, v );
108+
}
109+
110+
void TestLayoutItem::draw( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget )
111+
{
112+
Q_UNUSED( itemStyle );
113+
Q_UNUSED( pWidget );
114+
painter->save();
115+
painter->setRenderHint( QPainter::Antialiasing, false );
116+
painter->setPen( Qt::NoPen );
117+
painter->setBrush( mColor );
118+
painter->drawRect( rect() );
119+
painter->restore();
120+
}
121+
///@endcond

src/core/layout/qgslayoutitemregistry.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include <QIcon>
2525
#include <functional>
2626

27+
#include "qgslayoutitem.h" // temporary
28+
2729
class QgsLayout;
2830
class QgsLayoutView;
2931
class QgsLayoutItem;
@@ -304,6 +306,27 @@ class CORE_EXPORT QgsLayoutItemRegistry : public QObject
304306

305307
};
306308

309+
#ifndef SIP_RUN
310+
///@cond TEMPORARY
311+
//simple item for testing
312+
class TestLayoutItem : public QgsLayoutItem
313+
{
314+
public:
315+
316+
TestLayoutItem( QgsLayout *layout );
317+
~TestLayoutItem() {}
318+
319+
//implement pure virtual methods
320+
int type() const { return QgsLayoutItemRegistry::LayoutItem + 102; }
321+
void draw( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget );
322+
323+
private:
324+
QColor mColor;
325+
};
326+
327+
///@endcond
328+
#endif
329+
307330
#endif //QGSLAYOUTITEMREGISTRY_H
308331

309332

src/gui/layout/qgslayoutviewrubberband.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,18 @@ void QgsLayoutViewRectangularRubberBand::update( QPointF position, Qt::KeyboardM
150150
mRubberBandItem->setTransform( t );
151151
}
152152

153-
void QgsLayoutViewRectangularRubberBand::finish( QPointF, Qt::KeyboardModifiers )
153+
QRectF QgsLayoutViewRectangularRubberBand::finish( QPointF position, Qt::KeyboardModifiers modifiers )
154154
{
155+
bool constrainSquare = modifiers & Qt::ShiftModifier;
156+
bool fromCenter = modifiers & Qt::AltModifier;
157+
155158
if ( mRubberBandItem )
156159
{
157160
layout()->removeItem( mRubberBandItem );
158161
delete mRubberBandItem;
159162
mRubberBandItem = nullptr;
160163
}
164+
return updateRect( mRubberBandStartPos, position, constrainSquare, fromCenter );
161165
}
162166

163167
QgsLayoutViewEllipticalRubberBand::QgsLayoutViewEllipticalRubberBand( QgsLayoutView *view )
@@ -211,12 +215,16 @@ void QgsLayoutViewEllipticalRubberBand::update( QPointF position, Qt::KeyboardMo
211215
mRubberBandItem->setTransform( t );
212216
}
213217

214-
void QgsLayoutViewEllipticalRubberBand::finish( QPointF, Qt::KeyboardModifiers )
218+
QRectF QgsLayoutViewEllipticalRubberBand::finish( QPointF position, Qt::KeyboardModifiers modifiers )
215219
{
220+
bool constrainSquare = modifiers & Qt::ShiftModifier;
221+
bool fromCenter = modifiers & Qt::AltModifier;
222+
216223
if ( mRubberBandItem )
217224
{
218225
layout()->removeItem( mRubberBandItem );
219226
delete mRubberBandItem;
220227
mRubberBandItem = nullptr;
221228
}
229+
return updateRect( mRubberBandStartPos, position, constrainSquare, fromCenter );
222230
}

src/gui/layout/qgslayoutviewrubberband.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ class GUI_EXPORT QgsLayoutViewRubberBand
7373
/**
7474
* Called when a rubber band use has finished and the rubber
7575
* band is no longer required.
76+
* Returns the final bounding box of the rubber band.
7677
*/
77-
virtual void finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0;
78+
virtual QRectF finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0;
7879

7980
/**
8081
* Returns the view associated with the rubber band.
@@ -124,7 +125,7 @@ class GUI_EXPORT QgsLayoutViewRectangularRubberBand : public QgsLayoutViewRubber
124125

125126
void start( QPointF position, Qt::KeyboardModifiers modifiers ) override;
126127
void update( QPointF position, Qt::KeyboardModifiers modifiers ) override;
127-
void finish( QPointF, Qt::KeyboardModifiers ) override;
128+
QRectF finish( QPointF, Qt::KeyboardModifiers ) override;
128129

129130
private:
130131

@@ -155,7 +156,7 @@ class GUI_EXPORT QgsLayoutViewEllipticalRubberBand : public QgsLayoutViewRubberB
155156

156157
void start( QPointF position, Qt::KeyboardModifiers modifiers ) override;
157158
void update( QPointF position, Qt::KeyboardModifiers modifiers ) override;
158-
void finish( QPointF, Qt::KeyboardModifiers ) override;
159+
QRectF finish( QPointF, Qt::KeyboardModifiers ) override;
159160

160161
private:
161162

src/gui/layout/qgslayoutviewtooladditem.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@ void QgsLayoutViewToolAddItem::layoutReleaseEvent( QgsLayoutViewMouseEvent *even
6868
return;
6969
}
7070

71+
QRectF rect = QRectF( view()->mapToScene( mMousePressStartPos ),
72+
event->layoutPoint() );
7173
if ( mRubberBand )
7274
{
73-
mRubberBand->finish( event->layoutPoint(), event->modifiers() );
75+
rect = mRubberBand->finish( event->layoutPoint(), event->modifiers() );
7476
}
7577

7678
// click? or click-and-drag?
@@ -84,8 +86,9 @@ void QgsLayoutViewToolAddItem::layoutReleaseEvent( QgsLayoutViewMouseEvent *even
8486
}
8587
Q_UNUSED( clickOnly );
8688

87-
88-
QgsLogger::debug( QStringLiteral( "creating new %1 item " ).arg( QgsApplication::layoutItemRegistry()->itemMetadata( mItemType )->visibleName() ) );
89+
QgsLayoutItem *item = QgsApplication::layoutItemRegistry()->createItem( mItemType, layout() );
90+
item->setRect( rect );
91+
layout()->addItem( item );
8992
}
9093

9194
int QgsLayoutViewToolAddItem::itemType() const

src/gui/qgsgui.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "qgseditorwidgetregistry.h"
2020
#include "qgslayertreeembeddedwidgetregistry.h"
2121
#include "qgsmaplayeractionregistry.h"
22+
#include "qgslayoutitemregistry.h"
23+
#include "qgslayoutviewrubberband.h"
2224
#ifdef Q_OS_MACX
2325
#include "qgsmacnative.h"
2426
#else
@@ -78,4 +80,13 @@ QgsGui::QgsGui()
7880
mShortcutsManager = new QgsShortcutsManager();
7981
mLayerTreeEmbeddedWidgetRegistry = new QgsLayerTreeEmbeddedWidgetRegistry();
8082
mMapLayerActionRegistry = new QgsMapLayerActionRegistry();
83+
84+
85+
QgsLayoutItemAbstractMetadata *abstractMetadata = QgsApplication::layoutItemRegistry()->itemMetadata( 101 );
86+
QgsLayoutItemMetadata *metadata = dynamic_cast<QgsLayoutItemMetadata *>( abstractMetadata );
87+
metadata->setRubberBandCreationFunction( []( QgsLayoutView * view )->QgsLayoutViewRubberBand *
88+
{
89+
return new QgsLayoutViewRectangularRubberBand( view );
90+
} );
91+
8192
}

0 commit comments

Comments
 (0)