Skip to content

Commit 0f90e23

Browse files
committedJul 25, 2017
Refine item widget creation methods in layout item gui registry
1 parent 72bf292 commit 0f90e23

File tree

4 files changed

+33
-24
lines changed

4 files changed

+33
-24
lines changed
 

‎python/gui/layout/qgslayoutitemguiregistry.sip

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ class QgsLayoutItemAbstractGuiMetadata
5555
:rtype: QIcon
5656
%End
5757

58-
virtual QWidget *createItemWidget() /Factory/;
58+
virtual QgsLayoutItemBaseWidget *createItemWidget( QgsLayoutItem *item ) /Factory/;
5959
%Docstring
60-
Creates a configuration widget for layout items of this type. Can return None if no configuration GUI is required.
61-
:rtype: QWidget
60+
Creates a configuration widget for an ``item`` of this type. Can return None if no configuration GUI is required.
61+
:rtype: QgsLayoutItemBaseWidget
6262
%End
6363

6464
virtual QgsLayoutViewRubberBand *createRubberBand( QgsLayoutView *view ) /Factory/;
@@ -186,10 +186,10 @@ class QgsLayoutItemGuiRegistry : QObject
186186
:rtype: QgsLayoutItemGuiGroup
187187
%End
188188

189-
QWidget *createItemWidget( int type ) const /Factory/;
189+
QgsLayoutItemBaseWidget *createItemWidget( QgsLayoutItem *item ) const /Factory/;
190190
%Docstring
191-
Creates a new instance of a layout item configuration widget for the specified item ``type``.
192-
:rtype: QWidget
191+
Creates a new instance of a layout item configuration widget for the specified ``item``.
192+
:rtype: QgsLayoutItemBaseWidget
193193
%End
194194

195195

‎src/gui/layout/qgslayoutitemguiregistry.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,15 @@ const QgsLayoutItemGuiGroup &QgsLayoutItemGuiRegistry::itemGroup( const QString
9292
return mItemGroups[ id ];
9393
}
9494

95-
QWidget *QgsLayoutItemGuiRegistry::createItemWidget( int type ) const
95+
QgsLayoutItemBaseWidget *QgsLayoutItemGuiRegistry::createItemWidget( QgsLayoutItem *item ) const
9696
{
97-
if ( !mMetadata.contains( type ) )
97+
if ( !item )
98+
return nullptr;
99+
100+
if ( !mMetadata.contains( item->type() ) )
98101
return nullptr;
99102

100-
return mMetadata[type]->createItemWidget();
103+
return mMetadata[item->type()]->createItemWidget( item );
101104
}
102105

103106
QgsLayoutViewRubberBand *QgsLayoutItemGuiRegistry::createItemRubberBand( int type, QgsLayoutView *view ) const

‎src/gui/layout/qgslayoutitemguiregistry.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class QgsLayout;
3030
class QgsLayoutView;
3131
class QgsLayoutItem;
3232
class QgsLayoutViewRubberBand;
33+
class QgsLayoutItemBaseWidget;
3334

3435
/**
3536
* \ingroup gui
@@ -73,9 +74,9 @@ class GUI_EXPORT QgsLayoutItemAbstractGuiMetadata
7374
virtual QIcon creationIcon() const { return QgsApplication::getThemeIcon( QStringLiteral( "/mActionAddBasicRectangle.svg" ) ); }
7475

7576
/**
76-
* Creates a configuration widget for layout items of this type. Can return nullptr if no configuration GUI is required.
77+
* Creates a configuration widget for an \a item of this type. Can return nullptr if no configuration GUI is required.
7778
*/
78-
virtual QWidget *createItemWidget() SIP_FACTORY { return nullptr; }
79+
virtual QgsLayoutItemBaseWidget *createItemWidget( QgsLayoutItem *item ) SIP_FACTORY { Q_UNUSED( item ); return nullptr; }
7980

8081
/**
8182
* Creates a rubber band for use when creating layout items of this type. Can return nullptr if no rubber band
@@ -91,7 +92,7 @@ class GUI_EXPORT QgsLayoutItemAbstractGuiMetadata
9192
};
9293

9394
//! Layout item configuration widget creation function
94-
typedef std::function<QWidget *()> QgsLayoutItemWidgetFunc SIP_SKIP;
95+
typedef std::function<QgsLayoutItemBaseWidget *( QgsLayoutItem * )> QgsLayoutItemWidgetFunc SIP_SKIP;
9596

9697
//! Layout rubber band creation function
9798
typedef std::function<QgsLayoutViewRubberBand *( QgsLayoutView * )> QgsLayoutItemRubberBandFunc SIP_SKIP;
@@ -149,7 +150,7 @@ class GUI_EXPORT QgsLayoutItemGuiMetadata : public QgsLayoutItemAbstractGuiMetad
149150
void setRubberBandCreationFunction( QgsLayoutItemRubberBandFunc function ) { mRubberBandFunc = function; }
150151

151152
QIcon creationIcon() const override { return mIcon.isNull() ? QgsLayoutItemAbstractGuiMetadata::creationIcon() : mIcon; }
152-
QWidget *createItemWidget() override { return mWidgetFunc ? mWidgetFunc() : nullptr; }
153+
QgsLayoutItemBaseWidget *createItemWidget( QgsLayoutItem *item ) override { return mWidgetFunc ? mWidgetFunc( item ) : nullptr; }
153154
QgsLayoutViewRubberBand *createRubberBand( QgsLayoutView *view ) override { return mRubberBandFunc ? mRubberBandFunc( view ) : nullptr; }
154155

155156
protected:
@@ -275,9 +276,9 @@ class GUI_EXPORT QgsLayoutItemGuiRegistry : public QObject
275276
const QgsLayoutItemGuiGroup &itemGroup( const QString &id );
276277

277278
/**
278-
* Creates a new instance of a layout item configuration widget for the specified item \a type.
279+
* Creates a new instance of a layout item configuration widget for the specified \a item.
279280
*/
280-
QWidget *createItemWidget( int type ) const SIP_FACTORY;
281+
QgsLayoutItemBaseWidget *createItemWidget( QgsLayoutItem *item ) const SIP_FACTORY;
281282

282283
/**
283284
* Creates a new rubber band item for the specified item \a type and destination \a view.

‎tests/src/gui/testqgslayoutview.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgslayoutviewrubberband.h"
2323
#include "qgslayoutitemregistry.h"
2424
#include "qgslayoutitemguiregistry.h"
25+
#include "qgslayoutitemwidget.h"
2526
#include "qgstestutils.h"
2627
#include "qgsproject.h"
2728
#include "qgsgui.h"
@@ -242,6 +243,7 @@ class TestItem : public QgsLayoutItem
242243

243244
//implement pure virtual methods
244245
int type() const override { return QgsLayoutItemRegistry::LayoutItem + 101; }
246+
QString stringType() const override { return QStringLiteral( "testitem" ); }
245247
void draw( QgsRenderContext &, const QStyleOptionGraphicsItem * = nullptr ) override
246248
{ }
247249
};
@@ -259,42 +261,45 @@ void TestQgsLayoutView::guiRegistry()
259261
// empty registry
260262
QVERIFY( !registry.itemMetadata( -1 ) );
261263
QVERIFY( registry.itemTypes().isEmpty() );
262-
QVERIFY( !registry.createItemWidget( 1 ) );
264+
QVERIFY( !registry.createItemWidget( nullptr ) );
265+
QVERIFY( !registry.createItemWidget( nullptr ) );
266+
TestItem *testItem = new TestItem( nullptr );
267+
QVERIFY( !registry.createItemWidget( testItem ) ); // not in registry
263268

264269
QSignalSpy spyTypeAdded( &registry, &QgsLayoutItemGuiRegistry::typeAdded );
265270

266271
// add a dummy item to registry
267-
auto createWidget = []()->QWidget*
272+
auto createWidget = []( QgsLayoutItem * item )->QgsLayoutItemBaseWidget*
268273
{
269-
return new QWidget();
274+
return new QgsLayoutItemBaseWidget( nullptr, item );
270275
};
271276

272277
auto createRubberBand = []( QgsLayoutView * view )->QgsLayoutViewRubberBand *
273278
{
274279
return new QgsLayoutViewRectangularRubberBand( view );
275280
};
276281

277-
QgsLayoutItemGuiMetadata *metadata = new QgsLayoutItemGuiMetadata( 2, QIcon(), createWidget, createRubberBand );
282+
QgsLayoutItemGuiMetadata *metadata = new QgsLayoutItemGuiMetadata( QgsLayoutItemRegistry::LayoutItem + 101, QIcon(), createWidget, createRubberBand );
278283
QVERIFY( registry.addLayoutItemGuiMetadata( metadata ) );
279284
QCOMPARE( spyTypeAdded.count(), 1 );
280-
QCOMPARE( spyTypeAdded.value( 0 ).at( 0 ).toInt(), 2 );
285+
QCOMPARE( spyTypeAdded.value( 0 ).at( 0 ).toInt(), QgsLayoutItemRegistry::LayoutItem + 101 );
281286
// duplicate type id
282287
QVERIFY( !registry.addLayoutItemGuiMetadata( metadata ) );
283288
QCOMPARE( spyTypeAdded.count(), 1 );
284289

285290
//retrieve metadata
286291
QVERIFY( !registry.itemMetadata( -1 ) );
287-
QVERIFY( registry.itemMetadata( 2 ) );
292+
QVERIFY( registry.itemMetadata( QgsLayoutItemRegistry::LayoutItem + 101 ) );
288293
QCOMPARE( registry.itemTypes().count(), 1 );
289-
QCOMPARE( registry.itemTypes().value( 0 ), 2 );
294+
QCOMPARE( registry.itemTypes().value( 0 ), QgsLayoutItemRegistry::LayoutItem + 101 );
290295

291-
QWidget *widget = registry.createItemWidget( 2 );
296+
QWidget *widget = registry.createItemWidget( testItem );
292297
QVERIFY( widget );
293298
delete widget;
294299

295300
QgsLayoutView *view = new QgsLayoutView();
296301
//should use metadata's method
297-
QgsLayoutViewRubberBand *band = registry.createItemRubberBand( 2, view );
302+
QgsLayoutViewRubberBand *band = registry.createItemRubberBand( QgsLayoutItemRegistry::LayoutItem + 101, view );
298303
QVERIFY( band );
299304
QVERIFY( dynamic_cast< QgsLayoutViewRectangularRubberBand * >( band ) );
300305
QCOMPARE( band->view(), view );

0 commit comments

Comments
 (0)
Please sign in to comment.