From db62a745ebf0cf70051b7b4c599dcacec09f46b0 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 4 Jul 2017 21:10:52 +1000 Subject: [PATCH] Add a temporary layout item type for testing --- python/core/layout/qgslayoutitemregistry.sip | 2 ++ python/gui/layout/qgslayoutviewrubberband.sip | 8 +++-- src/core/layout/qgslayoutitem.h | 1 - src/core/layout/qgslayoutitemregistry.cpp | 31 +++++++++++++++++++ src/core/layout/qgslayoutitemregistry.h | 23 ++++++++++++++ src/gui/layout/qgslayoutviewrubberband.cpp | 12 +++++-- src/gui/layout/qgslayoutviewrubberband.h | 7 +++-- src/gui/layout/qgslayoutviewtooladditem.cpp | 9 ++++-- src/gui/qgsgui.cpp | 11 +++++++ 9 files changed, 92 insertions(+), 12 deletions(-) diff --git a/python/core/layout/qgslayoutitemregistry.sip b/python/core/layout/qgslayoutitemregistry.sip index 4ed4c2dee98..98841fcbcbb 100644 --- a/python/core/layout/qgslayoutitemregistry.sip +++ b/python/core/layout/qgslayoutitemregistry.sip @@ -8,6 +8,7 @@ + class QgsLayoutItemAbstractMetadata { %Docstring @@ -172,6 +173,7 @@ class QgsLayoutItemRegistry : QObject + /************************************************************************ * This file has been generated automatically from * * * diff --git a/python/gui/layout/qgslayoutviewrubberband.sip b/python/gui/layout/qgslayoutviewrubberband.sip index 3e420bffbee..c04907b5e8b 100644 --- a/python/gui/layout/qgslayoutviewrubberband.sip +++ b/python/gui/layout/qgslayoutviewrubberband.sip @@ -55,10 +55,12 @@ class QgsLayoutViewRubberBand ending ``position`` (in layout coordinate space). %End - virtual void finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0; + virtual QRectF finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0; %Docstring Called when a rubber band use has finished and the rubber band is no longer required. + Returns the final bounding box of the rubber band. + :rtype: QRectF %End QgsLayoutView *view() const; @@ -114,7 +116,7 @@ class QgsLayoutViewRectangularRubberBand : QgsLayoutViewRubberBand virtual void update( QPointF position, Qt::KeyboardModifiers modifiers ); - virtual void finish( QPointF, Qt::KeyboardModifiers ); + virtual QRectF finish( QPointF, Qt::KeyboardModifiers ); }; @@ -144,7 +146,7 @@ class QgsLayoutViewEllipticalRubberBand : QgsLayoutViewRubberBand virtual void update( QPointF position, Qt::KeyboardModifiers modifiers ); - virtual void finish( QPointF, Qt::KeyboardModifiers ); + virtual QRectF finish( QPointF, Qt::KeyboardModifiers ); }; diff --git a/src/core/layout/qgslayoutitem.h b/src/core/layout/qgslayoutitem.h index 0ad67339e63..957b436fc45 100644 --- a/src/core/layout/qgslayoutitem.h +++ b/src/core/layout/qgslayoutitem.h @@ -19,7 +19,6 @@ #include "qgis_core.h" #include "qgslayoutobject.h" -#include "qgslayoutitemregistry.h" #include class QgsLayout; diff --git a/src/core/layout/qgslayoutitemregistry.cpp b/src/core/layout/qgslayoutitemregistry.cpp index 347b72aca52..465cf1aa4fd 100644 --- a/src/core/layout/qgslayoutitemregistry.cpp +++ b/src/core/layout/qgslayoutitemregistry.cpp @@ -15,11 +15,19 @@ ***************************************************************************/ #include "qgslayoutitemregistry.h" +#include QgsLayoutItemRegistry::QgsLayoutItemRegistry( QObject *parent ) : QObject( parent ) { + // add temporary item to register + auto createTemporaryItem = []( QgsLayout * layout, const QVariantMap & )->QgsLayoutItem* + { + return new TestLayoutItem( layout ); + }; + + addLayoutItemType( new QgsLayoutItemMetadata( 101, QStringLiteral( "temp type" ), QgsApplication::getThemeIcon( QStringLiteral( "/mActionAddLabel.svg" ) ), createTemporaryItem ) ); } QgsLayoutItemRegistry::~QgsLayoutItemRegistry() @@ -88,3 +96,26 @@ QMap QgsLayoutItemRegistry::itemTypes() const } return types; } + +///@cond TEMPORARY +TestLayoutItem::TestLayoutItem( QgsLayout *layout ) + : QgsLayoutItem( layout ) +{ + int h = static_cast< int >( 360.0 * qrand() / ( RAND_MAX + 1.0 ) ); + int s = ( qrand() % ( 200 - 100 + 1 ) ) + 100; + int v = ( qrand() % ( 130 - 255 + 1 ) ) + 130; + mColor = QColor::fromHsv( h, s, v ); +} + +void TestLayoutItem::draw( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget ) +{ + Q_UNUSED( itemStyle ); + Q_UNUSED( pWidget ); + painter->save(); + painter->setRenderHint( QPainter::Antialiasing, false ); + painter->setPen( Qt::NoPen ); + painter->setBrush( mColor ); + painter->drawRect( rect() ); + painter->restore(); +} +///@endcond diff --git a/src/core/layout/qgslayoutitemregistry.h b/src/core/layout/qgslayoutitemregistry.h index 05d031542ba..d44177feb31 100644 --- a/src/core/layout/qgslayoutitemregistry.h +++ b/src/core/layout/qgslayoutitemregistry.h @@ -24,6 +24,8 @@ #include #include +#include "qgslayoutitem.h" // temporary + class QgsLayout; class QgsLayoutView; class QgsLayoutItem; @@ -304,6 +306,27 @@ class CORE_EXPORT QgsLayoutItemRegistry : public QObject }; +#ifndef SIP_RUN +///@cond TEMPORARY +//simple item for testing +class TestLayoutItem : public QgsLayoutItem +{ + public: + + TestLayoutItem( QgsLayout *layout ); + ~TestLayoutItem() {} + + //implement pure virtual methods + int type() const { return QgsLayoutItemRegistry::LayoutItem + 102; } + void draw( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget ); + + private: + QColor mColor; +}; + +///@endcond +#endif + #endif //QGSLAYOUTITEMREGISTRY_H diff --git a/src/gui/layout/qgslayoutviewrubberband.cpp b/src/gui/layout/qgslayoutviewrubberband.cpp index db5b3bd0646..c2abd6ba416 100644 --- a/src/gui/layout/qgslayoutviewrubberband.cpp +++ b/src/gui/layout/qgslayoutviewrubberband.cpp @@ -150,14 +150,18 @@ void QgsLayoutViewRectangularRubberBand::update( QPointF position, Qt::KeyboardM mRubberBandItem->setTransform( t ); } -void QgsLayoutViewRectangularRubberBand::finish( QPointF, Qt::KeyboardModifiers ) +QRectF QgsLayoutViewRectangularRubberBand::finish( QPointF position, Qt::KeyboardModifiers modifiers ) { + bool constrainSquare = modifiers & Qt::ShiftModifier; + bool fromCenter = modifiers & Qt::AltModifier; + if ( mRubberBandItem ) { layout()->removeItem( mRubberBandItem ); delete mRubberBandItem; mRubberBandItem = nullptr; } + return updateRect( mRubberBandStartPos, position, constrainSquare, fromCenter ); } QgsLayoutViewEllipticalRubberBand::QgsLayoutViewEllipticalRubberBand( QgsLayoutView *view ) @@ -211,12 +215,16 @@ void QgsLayoutViewEllipticalRubberBand::update( QPointF position, Qt::KeyboardMo mRubberBandItem->setTransform( t ); } -void QgsLayoutViewEllipticalRubberBand::finish( QPointF, Qt::KeyboardModifiers ) +QRectF QgsLayoutViewEllipticalRubberBand::finish( QPointF position, Qt::KeyboardModifiers modifiers ) { + bool constrainSquare = modifiers & Qt::ShiftModifier; + bool fromCenter = modifiers & Qt::AltModifier; + if ( mRubberBandItem ) { layout()->removeItem( mRubberBandItem ); delete mRubberBandItem; mRubberBandItem = nullptr; } + return updateRect( mRubberBandStartPos, position, constrainSquare, fromCenter ); } diff --git a/src/gui/layout/qgslayoutviewrubberband.h b/src/gui/layout/qgslayoutviewrubberband.h index 91ec419e2ab..f7f96160f21 100644 --- a/src/gui/layout/qgslayoutviewrubberband.h +++ b/src/gui/layout/qgslayoutviewrubberband.h @@ -73,8 +73,9 @@ class GUI_EXPORT QgsLayoutViewRubberBand /** * Called when a rubber band use has finished and the rubber * band is no longer required. + * Returns the final bounding box of the rubber band. */ - virtual void finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0; + virtual QRectF finish( QPointF position, Qt::KeyboardModifiers modifiers ) = 0; /** * Returns the view associated with the rubber band. @@ -124,7 +125,7 @@ class GUI_EXPORT QgsLayoutViewRectangularRubberBand : public QgsLayoutViewRubber void start( QPointF position, Qt::KeyboardModifiers modifiers ) override; void update( QPointF position, Qt::KeyboardModifiers modifiers ) override; - void finish( QPointF, Qt::KeyboardModifiers ) override; + QRectF finish( QPointF, Qt::KeyboardModifiers ) override; private: @@ -155,7 +156,7 @@ class GUI_EXPORT QgsLayoutViewEllipticalRubberBand : public QgsLayoutViewRubberB void start( QPointF position, Qt::KeyboardModifiers modifiers ) override; void update( QPointF position, Qt::KeyboardModifiers modifiers ) override; - void finish( QPointF, Qt::KeyboardModifiers ) override; + QRectF finish( QPointF, Qt::KeyboardModifiers ) override; private: diff --git a/src/gui/layout/qgslayoutviewtooladditem.cpp b/src/gui/layout/qgslayoutviewtooladditem.cpp index 705f52edafd..5684179391a 100644 --- a/src/gui/layout/qgslayoutviewtooladditem.cpp +++ b/src/gui/layout/qgslayoutviewtooladditem.cpp @@ -68,9 +68,11 @@ void QgsLayoutViewToolAddItem::layoutReleaseEvent( QgsLayoutViewMouseEvent *even return; } + QRectF rect = QRectF( view()->mapToScene( mMousePressStartPos ), + event->layoutPoint() ); if ( mRubberBand ) { - mRubberBand->finish( event->layoutPoint(), event->modifiers() ); + rect = mRubberBand->finish( event->layoutPoint(), event->modifiers() ); } // click? or click-and-drag? @@ -84,8 +86,9 @@ void QgsLayoutViewToolAddItem::layoutReleaseEvent( QgsLayoutViewMouseEvent *even } Q_UNUSED( clickOnly ); - - QgsLogger::debug( QStringLiteral( "creating new %1 item " ).arg( QgsApplication::layoutItemRegistry()->itemMetadata( mItemType )->visibleName() ) ); + QgsLayoutItem *item = QgsApplication::layoutItemRegistry()->createItem( mItemType, layout() ); + item->setRect( rect ); + layout()->addItem( item ); } int QgsLayoutViewToolAddItem::itemType() const diff --git a/src/gui/qgsgui.cpp b/src/gui/qgsgui.cpp index 1bf09d18eec..eac45a2a482 100644 --- a/src/gui/qgsgui.cpp +++ b/src/gui/qgsgui.cpp @@ -19,6 +19,8 @@ #include "qgseditorwidgetregistry.h" #include "qgslayertreeembeddedwidgetregistry.h" #include "qgsmaplayeractionregistry.h" +#include "qgslayoutitemregistry.h" +#include "qgslayoutviewrubberband.h" #ifdef Q_OS_MACX #include "qgsmacnative.h" #else @@ -78,4 +80,13 @@ QgsGui::QgsGui() mShortcutsManager = new QgsShortcutsManager(); mLayerTreeEmbeddedWidgetRegistry = new QgsLayerTreeEmbeddedWidgetRegistry(); mMapLayerActionRegistry = new QgsMapLayerActionRegistry(); + + + QgsLayoutItemAbstractMetadata *abstractMetadata = QgsApplication::layoutItemRegistry()->itemMetadata( 101 ); + QgsLayoutItemMetadata *metadata = dynamic_cast( abstractMetadata ); + metadata->setRubberBandCreationFunction( []( QgsLayoutView * view )->QgsLayoutViewRubberBand * + { + return new QgsLayoutViewRectangularRubberBand( view ); + } ); + }