From e926e2d0aafed33dea466b3832579b6f50ce8c8f Mon Sep 17 00:00:00 2001 From: Nathan Woodrow Date: Mon, 13 Jun 2016 18:07:39 +1000 Subject: [PATCH] [style dock] Add better API for panels --- .../qgseffectstackpropertieswidget.sip | 23 +- python/gui/gui.sip | 2 +- python/gui/qgisinterface.sip | 4 +- python/gui/qgsmaplayerstylemanagerwidget.sip | 2 +- python/gui/qgsmapstylepanel.sip | 12 +- .../qgsrendererrasterpropertieswidget.sip | 2 +- .../symbology-ng/qgslayerpropertieswidget.sip | 2 +- .../qgsrendererv2propertiesdialog.sip | 14 +- .../gui/symbology-ng/qgsrendererv2widget.sip | 21 +- .../qgsrendererwidgetcontainer.sip | 55 -- .../qgssinglesymbolrendererv2widget.sip | 2 + .../qgssymbolv2selectordialog.sip | 98 ++++ src/app/qgisapp.cpp | 4 +- src/app/qgisapp.h | 8 +- src/app/qgisappinterface.cpp | 4 +- src/app/qgisappinterface.h | 4 +- src/app/qgsmapstylingwidget.cpp | 20 +- src/app/qgsmapstylingwidget.h | 14 +- src/app/qgsvectorlayerproperties.cpp | 1 + src/gui/CMakeLists.txt | 4 +- .../qgseffectstackpropertieswidget.cpp | 24 +- .../effects/qgseffectstackpropertieswidget.h | 23 +- src/gui/qgisinterface.h | 6 +- src/gui/qgsmaplayerstylemanagerwidget.cpp | 2 +- src/gui/qgsmaplayerstylemanagerwidget.h | 2 +- src/gui/qgsmapstylepanel.cpp | 9 +- src/gui/qgsmapstylepanel.h | 22 +- .../qgsrendererrasterpropertieswidget.cpp | 2 +- .../qgsrendererrasterpropertieswidget.h | 2 +- .../qgscategorizedsymbolrendererv2widget.cpp | 33 +- .../qgscategorizedsymbolrendererv2widget.h | 4 +- .../qgsgraduatedsymbolrendererv2widget.cpp | 31 +- .../qgsgraduatedsymbolrendererv2widget.h | 4 +- .../symbology-ng/qgslayerpropertieswidget.cpp | 16 +- .../symbology-ng/qgslayerpropertieswidget.h | 11 +- .../qgsrendererv2propertiesdialog.cpp | 31 +- .../qgsrendererv2propertiesdialog.h | 23 +- src/gui/symbology-ng/qgsrendererv2widget.cpp | 8 +- src/gui/symbology-ng/qgsrendererv2widget.h | 25 +- .../qgsrendererwidgetcontainer.cpp | 54 -- .../symbology-ng/qgsrendererwidgetcontainer.h | 84 --- .../qgssinglesymbolrendererv2widget.cpp | 11 +- .../qgssinglesymbolrendererv2widget.h | 11 +- .../qgssymbolv2selectordialog.cpp | 256 ++++++-- .../symbology-ng/qgssymbolv2selectordialog.h | 216 ++++++- src/ui/qgsrendererv2propsdialogbase.ui | 9 +- src/ui/qgssymbolv2selectordialogbase.ui | 546 ++++++++---------- src/ui/styledock/qgsrenderercontainerbase.ui | 107 ++-- 48 files changed, 1032 insertions(+), 836 deletions(-) delete mode 100644 python/gui/symbology-ng/qgsrendererwidgetcontainer.sip delete mode 100644 src/gui/symbology-ng/qgsrendererwidgetcontainer.cpp delete mode 100644 src/gui/symbology-ng/qgsrendererwidgetcontainer.h diff --git a/python/gui/effects/qgseffectstackpropertieswidget.sip b/python/gui/effects/qgseffectstackpropertieswidget.sip index 288bd3fe164..892ddc32c89 100644 --- a/python/gui/effects/qgseffectstackpropertieswidget.sip +++ b/python/gui/effects/qgseffectstackpropertieswidget.sip @@ -9,7 +9,7 @@ * \see QgsEffectStackCompactWidget */ -class QgsEffectStackPropertiesWidget : QWidget +class QgsEffectStackPropertiesWidget : QgsPanelWidget { %TypeHeaderCode #include @@ -66,18 +66,6 @@ class QgsEffectStackPropertiesWidget : QWidget */ void changeEffect( QgsPaintEffect* newEffect ); - signals: - /** - * Emitted when something in the widget changes. - */ - void widgetChanged(); - - /** Emitted when a panel is shown in the widget. - * @param widget widget panel which was shown - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer* widget ); - protected: /** Refreshes the widget to reflect the current state of the stack. @@ -159,7 +147,7 @@ class QgsEffectStackPropertiesDialog : QgsDialog * \see QgsEffectStackPropertiesDialog */ -class QgsEffectStackCompactWidget : QWidget +class QgsEffectStackCompactWidget : QgsPanelWidget { %TypeHeaderCode #include @@ -206,11 +194,4 @@ class QgsEffectStackCompactWidget : QWidget /** Emitted when the paint effect properties change */ void changed(); - - /** Emitted when a panel is shown in the widget. - * @param widget widget panel which was shown - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer* widget ); - }; diff --git a/python/gui/gui.sip b/python/gui/gui.sip index bfa244b4eaa..08cb1da1249 100644 --- a/python/gui/gui.sip +++ b/python/gui/gui.sip @@ -135,6 +135,7 @@ %Include qgsoptionsdialogbase.sip %Include qgsorderbydialog.sip %Include qgsowssourceselect.sip +%Include qgspanelwidget.sip %Include qgspixmaplabel.sip %Include qgspluginmanagerinterface.sip %Include qgsprevieweffect.sip @@ -252,7 +253,6 @@ %Include symbology-ng/qgsvectorfieldsymbollayerwidget.sip %Include symbology-ng/qgsvectorgradientcolorrampv2dialog.sip %Include symbology-ng/qgsvectorrandomcolorrampv2dialog.sip -%Include symbology-ng/qgsrendererwidgetcontainer.sip %Include effects/qgseffectdrawmodecombobox.sip %Include effects/qgseffectstackpropertieswidget.sip diff --git a/python/gui/qgisinterface.sip b/python/gui/qgisinterface.sip index f997eebe985..ebe260d7bf8 100644 --- a/python/gui/qgisinterface.sip +++ b/python/gui/qgisinterface.sip @@ -293,10 +293,10 @@ class QgisInterface : QObject virtual void unregisterMapLayerPropertiesFactory( QgsMapLayerPropertiesFactory* factory ) = 0; /** Register a new tab in the layer properties dialog */ - virtual void registerMapStylePanelFactory( QgsMapStylePanelFactory* factory ) = 0; + virtual void registerMapStylePanelFactory( QgsMapStylingPanelFactory* factory ) = 0; /** Unregister a previously registered tab in the layer properties dialog */ - virtual void unregisterMapStylePanelFactory( QgsMapStylePanelFactory* factory ) = 0; + virtual void unregisterMapStylePanelFactory( QgsMapStylingPanelFactory* factory ) = 0; // @todo is this deprecated in favour of QgsContextHelp? /** Open a url in the users browser. By default the QGIS doc directory is used diff --git a/python/gui/qgsmaplayerstylemanagerwidget.sip b/python/gui/qgsmaplayerstylemanagerwidget.sip index f0fda1ceee6..b6edfb6016e 100644 --- a/python/gui/qgsmaplayerstylemanagerwidget.sip +++ b/python/gui/qgsmaplayerstylemanagerwidget.sip @@ -2,7 +2,7 @@ * @brief The QgsMapLayerStyleManagerWidget class which is used to visually manage * the layer styles. */ -class QgsMapLayerStyleManagerWidget : QgsMapStylePanel +class QgsMapLayerStyleManagerWidget : QgsMapStylingPanel { %TypeHeaderCode #include "qgsmaplayerstylemanagerwidget.h" diff --git a/python/gui/qgsmapstylepanel.sip b/python/gui/qgsmapstylepanel.sip index 4793384ee69..366e1b16e67 100644 --- a/python/gui/qgsmapstylepanel.sip +++ b/python/gui/qgsmapstylepanel.sip @@ -2,7 +2,7 @@ * \class A panel widget that can be shown in the map style dock * \note added in QGIS 2.16 */ -class QgsMapStylePanel : public QWidget +class QgsMapStylingPanel : public QgsPanelWidget { %TypeHeaderCode #include @@ -16,7 +16,7 @@ public: * @note The widget is created each time the panel is selected in the dock. * Keep the loading light as possible for speed in the UI. */ - QgsMapStylePanel(QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget *parent = 0); + QgsMapStylingPanel(QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget *parent = 0); signals: /** @@ -41,7 +41,7 @@ public slots: * \class QgsMapStylePanelFactory * \note added in QGIS 2.16 */ -class QgsMapStylePanelFactory +class QgsMapStylingPanelFactory { %TypeHeaderCode #include @@ -50,10 +50,10 @@ class QgsMapStylePanelFactory typedef QFlags LayerTypesFlags; /** Constructor */ - QgsMapStylePanelFactory(); + QgsMapStylingPanelFactory(); /** Destructor */ - virtual ~QgsMapStylePanelFactory(); + virtual ~QgsMapStylingPanelFactory(); /** * @brief The icon that will be shown in the UI for the panel. @@ -82,5 +82,5 @@ class QgsMapStylePanelFactory * @param parent The parent of the widget. * @return A new QgsMapStylePanel which is shown in the map style dock. */ - virtual QgsMapStylePanel* createPanel( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget* parent /TransferThis/ ) = 0 /Factory/; + virtual QgsMapStylingPanel* createPanel( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget* parent /TransferThis/ ) = 0 /Factory/; }; diff --git a/python/gui/raster/qgsrendererrasterpropertieswidget.sip b/python/gui/raster/qgsrendererrasterpropertieswidget.sip index 3118f38f622..c4f57f557cc 100644 --- a/python/gui/raster/qgsrendererrasterpropertieswidget.sip +++ b/python/gui/raster/qgsrendererrasterpropertieswidget.sip @@ -1,4 +1,4 @@ -class QgsRendererRasterPropertiesWidget : QgsMapStylePanel +class QgsRendererRasterPropertiesWidget : QgsMapStylingPanel { %TypeHeaderCode #include diff --git a/python/gui/symbology-ng/qgslayerpropertieswidget.sip b/python/gui/symbology-ng/qgslayerpropertieswidget.sip index 2e50f67a55b..91563ca6399 100644 --- a/python/gui/symbology-ng/qgslayerpropertieswidget.sip +++ b/python/gui/symbology-ng/qgslayerpropertieswidget.sip @@ -1,4 +1,4 @@ -class QgsLayerPropertiesWidget : QWidget +class QgsLayerPropertiesWidget : QgsPanelWidget { %TypeHeaderCode #include diff --git a/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip b/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip index 83a362da9ac..7adc6720b7a 100644 --- a/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip +++ b/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip @@ -24,6 +24,8 @@ class QgsRendererV2PropertiesDialog : QDialog */ void setMapCanvas( QgsMapCanvas* canvas ); + void setDockMode( bool dockMode ); + signals: /** * Emitted when expression context variables on the associated @@ -48,18 +50,6 @@ class QgsRendererV2PropertiesDialog : QDialog //! Apply and accept the changes for the dialog. void onOK(); - /** Shows a panel widget inside the renderer widget. - * @param container widget panel to show - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer *container ); - - /** - * Closes the given panel in the stack of panels. - * @param container The container widget to close. - */ - void closePanel( QgsRendererWidgetContainer *container ); - protected: /** * Connect the given slot to the value changed event for the set of widgets diff --git a/python/gui/symbology-ng/qgsrendererv2widget.sip b/python/gui/symbology-ng/qgsrendererv2widget.sip index 1dc5a68be2d..973ffb88101 100644 --- a/python/gui/symbology-ng/qgsrendererv2widget.sip +++ b/python/gui/symbology-ng/qgsrendererv2widget.sip @@ -1,4 +1,4 @@ -class QgsRendererV2Widget : QWidget +class QgsRendererV2Widget : QgsPanelWidget { %TypeHeaderCode #include @@ -39,6 +39,13 @@ class QgsRendererV2Widget : QWidget */ void applyChanges(); + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + virtual void setDockMode( bool dockMode); + signals: /** * Emitted when expression context variables on the associated @@ -47,18 +54,6 @@ class QgsRendererV2Widget : QWidget */ void layerVariablesChanged(); - /** - * Emitted when something on the widget has changed. - * All widgets will fire this event to notify of an internal change. - */ - void widgetChanged(); - - /** Shows a panel widget inside the renderer widget. - * @param widget widget panel to show - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer* widget ); - protected: /** Subclasses may provide the capability of changing multiple symbols at once by implementing the following two methods and by connecting the slot contextMenuViewCategories(const QPoint&)*/ diff --git a/python/gui/symbology-ng/qgsrendererwidgetcontainer.sip b/python/gui/symbology-ng/qgsrendererwidgetcontainer.sip deleted file mode 100644 index 62cb20c8a9e..00000000000 --- a/python/gui/symbology-ng/qgsrendererwidgetcontainer.sip +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @brief A container widget that can be used to show a renderer widget with a title and close button. - * @note Mainly used for the style dock panels at the moment. - */ -class QgsRendererWidgetContainer : QWidget -{ -%TypeHeaderCode -#include "qgsrendererwidgetcontainer.h" -%End - public: - /** - * @brief A container widget that can be used to show a renderer widget with a title and close button. - * @param widget The internal widget to be shown to the user. - * @param title The title to show on the widget. - * @param parent The parent of the widget. - */ - QgsRendererWidgetContainer( QWidget* widget, const QString &title, QWidget *parent = 0 ); - - /** - * @brief Returns the current internal widget. - * @return The internal widget. - */ - QWidget* widget(); - - signals: - - /** - * @brief Emitted when the container is accpeted and closed. - * Listen to this to clean up the callers state. - */ - void accepted( QgsRendererWidgetContainer* container ); - - /** - * Emiited when the internal widget changes state. - * @param conatiner The container holding the widget that changed state. - */ - void widgetChanged( QgsRendererWidgetContainer* conatiner ); - - public slots: - - /** - * Accept the container. Causes accepted to be emiited. - */ - void accept(); - - /** - * Fire the widgetChanged event on the container. Connect your widgets dirty signal to - * this slot to fire the and listen to widgetChanged to handle the event. - */ - void emitWidgetChanged(); - - - protected: - void keyPressEvent( QKeyEvent* event ); -}; diff --git a/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip b/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip index 3437eb70c05..60feafb8a94 100644 --- a/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip +++ b/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip @@ -13,6 +13,8 @@ class QgsSingleSymbolRendererV2Widget : QgsRendererV2Widget virtual void setMapCanvas( QgsMapCanvas* canvas ); + virtual void setDockMode( bool dockMode ); + public slots: void changeSingleSymbol(); diff --git a/python/gui/symbology-ng/qgssymbolv2selectordialog.sip b/python/gui/symbology-ng/qgssymbolv2selectordialog.sip index ed4f440049b..1784f1f888a 100644 --- a/python/gui/symbology-ng/qgssymbolv2selectordialog.sip +++ b/python/gui/symbology-ng/qgssymbolv2selectordialog.sip @@ -1,3 +1,101 @@ +class QgsSymbolV2SelectorWidget : QgsPanelWidget +{ +%TypeHeaderCode +#include +%End + + public: + QgsSymbolV2SelectorWidget( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent /TransferThis/ = 0); + + //! return menu for "advanced" button - create it if doesn't exist and show the advanced button + QMenu* advancedMenu(); + + /** Sets the optional expression context used for the widget. This expression context is used for + * evaluating data defined symbol properties and for populating based expression widgets in + * the layer widget. + * @param context expression context pointer. Ownership is transferred to the dialog. + * @note added in QGIS 2.12 + * @see expressionContext() + */ + void setExpressionContext( QgsExpressionContext* context /Transfer/ ); + + /** Returns the expression context used for the dialog, if set. This expression context is used for + * evaluating data defined symbol properties and for populating based expression widgets in + * the dialog. + * @note added in QGIS 2.12 + * @see setExpressionContext() + */ + QgsExpressionContext* expressionContext() const; + + /** Sets the map canvas associated with the dialog. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @note added in QGIS 2.12 + */ + void setMapCanvas( QgsMapCanvas* canvas ); + + /** + * @brief Return the symbol that is currently active in the widget. Can be null. + * @return The active symbol. + */ + QgsSymbolV2* symbol(); + + /** + * Set the widget in dock mode which will emit showPanel when a sub widget requests + * to show a widget. + * @param dockMode True to enable dock mode. + */ + void setDockMode( bool dockMode ); + protected: + //! Reimplements dialog keyPress event so we can ignore it + void keyPressEvent( QKeyEvent * event ); + + void loadSymbol(); + //! @note not available in python bindings + // void loadSymbol( QgsSymbolV2* symbol, SymbolLayerItem* parent ); + + void updateUi(); + + void updateLockButton(); + + //! @note not available in python bindings + // SymbolLayerItem* currentLayerItem(); + QgsSymbolLayerV2* currentLayer(); + + void moveLayerByOffset( int offset ); + + void setWidget( QWidget* widget ); + + signals: + void symbolModified(); + + public slots: + void moveLayerDown(); + void moveLayerUp(); + + void addLayer(); + void removeLayer(); + + void lockLayer(); + + void saveSymbol() /Deprecated/; + + //! Duplicates the current symbol layer and places the duplicated layer above the current symbol layer + //! @note added in QGIS 2.14 + void duplicateLayer(); + + void layerChanged(); + + void updateLayerPreview(); + void updatePreview(); + + //! Slot to update tree when a new symbol from style + void symbolChanged(); + //! alters tree and sets proper widget when Layer Type is changed + //! @note: The layer is received from the LayerPropertiesWidget + void changeLayer( QgsSymbolLayerV2* layer ); +}; + class QgsSymbolV2SelectorDialog : QDialog { %TypeHeaderCode diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 55f2e45bb40..27f3ab48cc8 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -9063,12 +9063,12 @@ void QgisApp::unregisterMapLayerPropertiesFactory( QgsMapLayerPropertiesFactory* mMapLayerPropertiesFactories.removeAll( factory ); } -void QgisApp::registerMapStylePanelFactory( QgsMapStylePanelFactory *factory ) +void QgisApp::registerMapStylePanelFactory( QgsMapStylingPanelFactory *factory ) { mMapStylePanelFactories << factory; } -void QgisApp::unregisterMapStylePanelFactory( QgsMapStylePanelFactory *factory ) +void QgisApp::unregisterMapStylePanelFactory( QgsMapStylingPanelFactory *factory ) { mMapStylePanelFactories.removeAll( factory ); } diff --git a/src/app/qgisapp.h b/src/app/qgisapp.h index c5174f87e1e..0e536914e90 100644 --- a/src/app/qgisapp.h +++ b/src/app/qgisapp.h @@ -58,7 +58,7 @@ class QgsLayerTreeView; class QgsMapCanvas; class QgsMapLayer; class QgsMapLayerPropertiesFactory; -class QgsMapStylePanelFactory; +class QgsMapStylingPanelFactory; class QgsMapTip; class QgsMapTool; class QgsMapToolAdvancedDigitizing; @@ -514,10 +514,10 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow void unregisterMapLayerPropertiesFactory( QgsMapLayerPropertiesFactory* factory ); /** Register a new tab in the layer properties dialog */ - void registerMapStylePanelFactory( QgsMapStylePanelFactory* factory ); + void registerMapStylePanelFactory( QgsMapStylingPanelFactory* factory ); /** Unregister a previously registered tab in the layer properties dialog */ - void unregisterMapStylePanelFactory( QgsMapStylePanelFactory* factory ); + void unregisterMapStylePanelFactory( QgsMapStylingPanelFactory* factory ); public slots: void layerTreeViewDoubleClicked( const QModelIndex& index ); @@ -1781,7 +1781,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow QgsSnappingUtils* mSnappingUtils; QList mMapLayerPropertiesFactories; - QList mMapStylePanelFactories; + QList mMapStylePanelFactories; QDateTime mProjectLastModified; diff --git a/src/app/qgisappinterface.cpp b/src/app/qgisappinterface.cpp index bf454a67d9a..b61bf4b7a60 100644 --- a/src/app/qgisappinterface.cpp +++ b/src/app/qgisappinterface.cpp @@ -485,12 +485,12 @@ void QgisAppInterface::unregisterMapLayerPropertiesFactory( QgsMapLayerPropertie qgis->unregisterMapLayerPropertiesFactory( factory ); } -void QgisAppInterface::registerMapStylePanelFactory( QgsMapStylePanelFactory *factory ) +void QgisAppInterface::registerMapStylePanelFactory( QgsMapStylingPanelFactory *factory ) { qgis->registerMapStylePanelFactory( factory ); } -void QgisAppInterface::unregisterMapStylePanelFactory( QgsMapStylePanelFactory *factory ) +void QgisAppInterface::unregisterMapStylePanelFactory( QgsMapStylingPanelFactory *factory ) { qgis->unregisterMapStylePanelFactory( factory ); } diff --git a/src/app/qgisappinterface.h b/src/app/qgisappinterface.h index 99de6b712fe..39f76cfe510 100644 --- a/src/app/qgisappinterface.h +++ b/src/app/qgisappinterface.h @@ -302,10 +302,10 @@ class APP_EXPORT QgisAppInterface : public QgisInterface virtual void unregisterMapLayerPropertiesFactory( QgsMapLayerPropertiesFactory* factory ) override; /** Register a new tab in the layer properties dialog */ - virtual void registerMapStylePanelFactory( QgsMapStylePanelFactory* factory ) override; + virtual void registerMapStylePanelFactory( QgsMapStylingPanelFactory* factory ) override; /** Unregister a previously registered tab in the layer properties dialog */ - virtual void unregisterMapStylePanelFactory( QgsMapStylePanelFactory* factory ) override; + virtual void unregisterMapStylePanelFactory( QgsMapStylingPanelFactory* factory ) override; /** Accessors for inserting items into menus and toolbars. * An item can be inserted before any existing action. diff --git a/src/app/qgsmapstylingwidget.cpp b/src/app/qgsmapstylingwidget.cpp index cd2a3defc43..06b5de12167 100644 --- a/src/app/qgsmapstylingwidget.cpp +++ b/src/app/qgsmapstylingwidget.cpp @@ -41,7 +41,7 @@ #include "qgsmapstylepanel.h" #include "qgsmaplayerstylemanagerwidget.h" -QgsMapStylingWidget::QgsMapStylingWidget( QgsMapCanvas* canvas, QList pages, QWidget *parent ) +QgsMapStylingWidget::QgsMapStylingWidget( QgsMapCanvas* canvas, QList pages, QWidget *parent ) : QWidget( parent ) , mNotSupportedPage( 0 ) , mLayerPage( 1 ) @@ -87,7 +87,7 @@ QgsMapStylingWidget::~QgsMapStylingWidget() delete mStyleManagerFactory; } -void QgsMapStylingWidget::setPageFactories( QList factories ) +void QgsMapStylingWidget::setPageFactories( QList factories ) { mPageFactories = factories; // Always append the style manager factory at the bottom of the list @@ -127,7 +127,7 @@ void QgsMapStylingWidget::setLayer( QgsMapLayer *layer ) mOptionsListWidget->addItem( new QListWidgetItem( QgsApplication::getThemeIcon( "propertyicons/histogram.png" ), "" ) ); } - Q_FOREACH ( QgsMapStylePanelFactory* factory, mPageFactories ) + Q_FOREACH ( QgsMapStylingPanelFactory* factory, mPageFactories ) { if ( factory->supportsLayer( layer ) ) { @@ -162,7 +162,7 @@ void QgsMapStylingWidget::apply() QWidget* current = mWidgetArea->widget(); bool styleWasChanged = false; - if ( QgsMapStylePanel* widget = qobject_cast( current ) ) + if ( QgsMapStylingPanel* widget = qobject_cast( current ) ) { widget->apply(); styleWasChanged = true; @@ -256,12 +256,13 @@ void QgsMapStylingWidget::updateCurrentWidgetLayer() // TODO Make all widgets use this method. if ( mUserPages.contains( row ) ) { - QgsMapStylePanel* panel = mUserPages[row]->createPanel( layer, mMapCanvas, this ); + QgsMapStylingPanel* panel = mUserPages[row]->createPanel( layer, mMapCanvas, this ); if ( panel ) { - QgsDebugMsg( "Made me a widget!!" ); - connect( panel, SIGNAL( widgetChanged() ), this, SLOT( autoApply() ) ); - mWidgetArea->setWidget( panel ); + connect( panel, SIGNAL( widgetChanged( QgsPanelWidget* ) ), this, SLOT( autoApply() ) ); + QgsPanelWidgetStackWidget* stack = new QgsPanelWidgetStackWidget( mWidgetArea ); + mWidgetArea->setWidget( stack ); + stack->addMainPanel( panel ); } } @@ -280,6 +281,7 @@ void QgsMapStylingWidget::updateCurrentWidgetLayer() { mVectorStyleWidget->deleteLater(); mVectorStyleWidget = new QgsRendererV2PropertiesDialog( vlayer, QgsStyleV2::defaultStyle(), true, mWidgetArea ); + mVectorStyleWidget->setDockMode( true ); connect( mVectorStyleWidget, SIGNAL( widgetChanged() ), this, SLOT( autoApply() ) ); mWidgetArea->setWidget( mVectorStyleWidget ); break; @@ -419,7 +421,7 @@ QString QgsMapLayerStyleManagerWidgetFactory::title() return QString(); } -QgsMapStylePanel *QgsMapLayerStyleManagerWidgetFactory::createPanel( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent ) +QgsMapStylingPanel *QgsMapLayerStyleManagerWidgetFactory::createPanel( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent ) { return new QgsMapLayerStyleManagerWidget( layer, canvas, parent ); diff --git a/src/app/qgsmapstylingwidget.h b/src/app/qgsmapstylingwidget.h index 938abe64c8b..3c95e779a4a 100644 --- a/src/app/qgsmapstylingwidget.h +++ b/src/app/qgsmapstylingwidget.h @@ -36,15 +36,15 @@ class QgsRendererV2PropertiesDialog; class QgsRendererRasterPropertiesWidget; class QgsUndoWidget; class QgsRasterHistogramWidget; -class QgsMapStylePanelFactory; +class QgsMapStylingPanelFactory; class QgsMapLayerStyleManagerWidget; -class APP_EXPORT QgsMapLayerStyleManagerWidgetFactory : public QgsMapStylePanelFactory +class APP_EXPORT QgsMapLayerStyleManagerWidgetFactory : public QgsMapStylingPanelFactory { public: QIcon icon() override; QString title() override; - QgsMapStylePanel *createPanel( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent ) override; + QgsMapStylingPanel *createPanel( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent ) override; bool supportsLayer( QgsMapLayer *layer ) override; }; @@ -66,11 +66,11 @@ class APP_EXPORT QgsMapStylingWidget : public QWidget, private Ui::QgsMapStyling { Q_OBJECT public: - QgsMapStylingWidget( QgsMapCanvas *canvas, QList pages, QWidget *parent = 0 ); + QgsMapStylingWidget( QgsMapCanvas *canvas, QList pages, QWidget *parent = 0 ); ~QgsMapStylingWidget(); QgsMapLayer* layer() { return mCurrentLayer; } - void setPageFactories( QList factories ); + void setPageFactories( QList factories ); signals: void styleChanged( QgsMapLayer* layer ); @@ -100,8 +100,8 @@ class APP_EXPORT QgsMapStylingWidget : public QWidget, private Ui::QgsMapStyling QgsLabelingWidget *mLabelingWidget; QgsRendererV2PropertiesDialog* mVectorStyleWidget; QgsRendererRasterPropertiesWidget* mRasterStyleWidget; - QList mPageFactories; - QMap mUserPages; + QList mPageFactories; + QMap mUserPages; QgsMapLayerStyleManagerWidgetFactory* mStyleManagerFactory; }; diff --git a/src/app/qgsvectorlayerproperties.cpp b/src/app/qgsvectorlayerproperties.cpp index 8b6daa5681f..ad2a77f1741 100644 --- a/src/app/qgsvectorlayerproperties.cpp +++ b/src/app/qgsvectorlayerproperties.cpp @@ -1306,6 +1306,7 @@ void QgsVectorLayerProperties::updateSymbologyPage() if ( mLayer->rendererV2() ) { mRendererDialog = new QgsRendererV2PropertiesDialog( mLayer, QgsStyleV2::defaultStyle(), true, this ); + mRendererDialog->setDockMode( true ); mRendererDialog->setMapCanvas( QgisApp::instance()->mapCanvas() ); connect( mRendererDialog, SIGNAL( layerVariablesChanged() ), this, SLOT( updateVariableEditor() ) ); diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 79694d57a4f..375d2f50fac 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -31,7 +31,6 @@ SET(QGIS_GUI_SRCS symbology-ng/qgspointdisplacementrendererwidget.cpp symbology-ng/qgsrendererv2propertiesdialog.cpp symbology-ng/qgsrendererv2widget.cpp - symbology-ng/qgsrendererwidgetcontainer.cpp symbology-ng/qgsrulebasedrendererv2widget.cpp symbology-ng/qgssinglesymbolrendererv2widget.cpp symbology-ng/qgssizescalewidget.cpp @@ -275,6 +274,7 @@ SET(QGIS_GUI_SRCS qgsorderbydialog.cpp qgsowssourceselect.cpp qgssourceselectdialog.cpp + qgspanelwidget.cpp qgspixmaplabel.cpp qgspluginmanagerinterface.cpp qgsprevieweffect.cpp @@ -424,6 +424,7 @@ SET(QGIS_GUI_MOC_HDRS qgsorderbydialog.h qgsowssourceselect.h qgssourceselectdialog.h + qgspanelwidget.h qgspixmaplabel.h qgspluginmanagerinterface.h qgsprevieweffect.h @@ -480,7 +481,6 @@ SET(QGIS_GUI_MOC_HDRS symbology-ng/qgspointdisplacementrendererwidget.h symbology-ng/qgsrendererv2propertiesdialog.h symbology-ng/qgsrendererv2widget.h - symbology-ng/qgsrendererwidgetcontainer.h symbology-ng/qgsrulebasedrendererv2widget.h symbology-ng/qgssinglesymbolrendererv2widget.h symbology-ng/qgssizescalewidget.h diff --git a/src/gui/effects/qgseffectstackpropertieswidget.cpp b/src/gui/effects/qgseffectstackpropertieswidget.cpp index f3dfb771ea1..3de5de1867e 100644 --- a/src/gui/effects/qgseffectstackpropertieswidget.cpp +++ b/src/gui/effects/qgseffectstackpropertieswidget.cpp @@ -21,7 +21,7 @@ #include "qgspainteffectwidget.h" #include "qgsapplication.h" #include "qgssymbollayerv2utils.h" -#include "qgsrendererwidgetcontainer.h" +#include "qgspanelwidget.h" #include #include @@ -94,7 +94,7 @@ class EffectItem : public QStandardItem // QgsEffectStackPropertiesWidget::QgsEffectStackPropertiesWidget( QgsEffectStack *stack, QWidget *parent ) - : QWidget( parent ) + : QgsPanelWidget( parent ) , mStack( stack ) , mPreviewPicture( nullptr ) { @@ -133,6 +133,8 @@ QgsEffectStackPropertiesWidget::QgsEffectStackPropertiesWidget( QgsEffectStack * // set effect as active item in the tree QModelIndex newIndex = mEffectsList->model()->index( 0, 0 ); mEffectsList->setCurrentIndex( newIndex ); + + setPanelTitle( tr( "Effects Properties" ) ); } QgsEffectStackPropertiesWidget::~QgsEffectStackPropertiesWidget() @@ -379,7 +381,7 @@ void QgsEffectStackPropertiesDialog::setPreviewPicture( const QPicture &picture // QgsEffectStackCompactWidget::QgsEffectStackCompactWidget( QWidget *parent , QgsPaintEffect *effect ) - : QWidget( parent ) + : QgsPanelWidget( parent ) , mDockMode( false ) , mEnabledCheckBox( nullptr ) , mButton( nullptr ) @@ -457,11 +459,9 @@ void QgsEffectStackCompactWidget::showDialog() { widget->setPreviewPicture( *mPreviewPicture ); } - QgsRendererWidgetContainer* container = new QgsRendererWidgetContainer( widget, tr( "Effects Properties" ), nullptr ); - connect( widget, SIGNAL( widgetChanged() ), container, SLOT( emitWidgetChanged() ) ); - connect( container, SIGNAL( widgetChanged( QgsRendererWidgetContainer* ) ), this, SLOT( updateFromContainer( QgsRendererWidgetContainer* ) ) ); - connect( container, SIGNAL( accepted( QgsRendererWidgetContainer* ) ), this, SLOT( cleanUpContainer( QgsRendererWidgetContainer* ) ) ); - emit showPanel( container ); + connect( widget, SIGNAL( widgetChanged() ), this, SLOT( updateEffectLive() ) ); + connect( widget, SIGNAL( panelAccepted( QgsPanelWidget* ) ), this, SLOT( updateAcceptWidget( QgsPanelWidget* ) ) ); + emit showPanel( widget ); } else { @@ -492,17 +492,17 @@ void QgsEffectStackCompactWidget::enableToggled( bool checked ) emit changed(); } -void QgsEffectStackCompactWidget::cleanUpContainer( QgsRendererWidgetContainer *container ) +void QgsEffectStackCompactWidget::updateAcceptWidget( QgsPanelWidget *panel ) { - QgsEffectStackPropertiesWidget* widget = qobject_cast( container->widget() ); + QgsEffectStackPropertiesWidget* widget = qobject_cast( panel ); *mStack = *widget->stack(); emit changed(); // delete widget->stack(); } -void QgsEffectStackCompactWidget::updateFromContainer( QgsRendererWidgetContainer *container ) +void QgsEffectStackCompactWidget::updateEffectLive() { - QgsEffectStackPropertiesWidget* widget = qobject_cast( container->widget() ); + QgsEffectStackPropertiesWidget* widget = qobject_cast( sender() ); *mStack = *widget->stack(); emit changed(); } diff --git a/src/gui/effects/qgseffectstackpropertieswidget.h b/src/gui/effects/qgseffectstackpropertieswidget.h index 38266512551..22a776befa4 100644 --- a/src/gui/effects/qgseffectstackpropertieswidget.h +++ b/src/gui/effects/qgseffectstackpropertieswidget.h @@ -20,6 +20,7 @@ #include "effects/qgseffectstack.h" #include #include +#include #include "ui_qgseffectstackpropertieswidgetbase.h" @@ -27,7 +28,7 @@ class EffectItem; class QgsPaintEffect; class QCheckBox; class QToolButton; -class QgsRendererWidgetContainer; +class QgsPanelWidget; /** \ingroup gui * \class QgsEffectStackPropertiesWidget @@ -40,7 +41,7 @@ class QgsRendererWidgetContainer; * \see QgsEffectStackCompactWidget */ -class GUI_EXPORT QgsEffectStackPropertiesWidget : public QWidget, private Ui::QgsEffectStackPropertiesWidgetBase +class GUI_EXPORT QgsEffectStackPropertiesWidget : public QgsPanelWidget, private Ui::QgsEffectStackPropertiesWidgetBase { Q_OBJECT @@ -64,12 +65,6 @@ class GUI_EXPORT QgsEffectStackPropertiesWidget : public QWidget, private Ui::Qg */ void setPreviewPicture( const QPicture& picture ); - signals: - /** - * Emiited when something in the widget changes. - */ - void widgetChanged(); - public slots: /** Moves the currently selected effect down in the stack. @@ -190,7 +185,7 @@ class GUI_EXPORT QgsEffectStackPropertiesDialog: public QgsDialog * \see QgsEffectStackPropertiesDialog */ -class GUI_EXPORT QgsEffectStackCompactWidget: public QWidget +class GUI_EXPORT QgsEffectStackCompactWidget: public QgsPanelWidget { Q_OBJECT @@ -237,20 +232,14 @@ class GUI_EXPORT QgsEffectStackCompactWidget: public QWidget */ void changed(); - /** Emitted when a panel is shown in the widget. - * @param widget widget panel which was shown - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer* widget ); - private slots: void showDialog(); void enableToggled( bool checked ); - void cleanUpContainer( QgsRendererWidgetContainer* container ); - void updateFromContainer( QgsRendererWidgetContainer *container ); + void updateAcceptWidget( QgsPanelWidget* panel ); + void updateEffectLive(); private: bool mDockMode; diff --git a/src/gui/qgisinterface.h b/src/gui/qgisinterface.h index 60020fa31e1..ab97979c18c 100644 --- a/src/gui/qgisinterface.h +++ b/src/gui/qgisinterface.h @@ -35,7 +35,7 @@ class QgsLegendInterface; class QgsMapCanvas; class QgsMapLayer; class QgsMapLayerPropertiesFactory; -class QgsMapStylePanelFactory; +class QgsMapStylingPanelFactory; class QgsMessageBar; class QgsPluginManagerInterface; class QgsRasterLayer; @@ -344,10 +344,10 @@ class GUI_EXPORT QgisInterface : public QObject virtual void unregisterMapLayerPropertiesFactory( QgsMapLayerPropertiesFactory* factory ) = 0; /** Register a new tab in the layer properties dialog */ - virtual void registerMapStylePanelFactory( QgsMapStylePanelFactory* factory ) = 0; + virtual void registerMapStylePanelFactory( QgsMapStylingPanelFactory* factory ) = 0; /** Unregister a previously registered tab in the layer properties dialog */ - virtual void unregisterMapStylePanelFactory( QgsMapStylePanelFactory* factory ) = 0; + virtual void unregisterMapStylePanelFactory( QgsMapStylingPanelFactory* factory ) = 0; // @todo is this deprecated in favour of QgsContextHelp? /** Open a url in the users browser. By default the QGIS doc directory is used diff --git a/src/gui/qgsmaplayerstylemanagerwidget.cpp b/src/gui/qgsmaplayerstylemanagerwidget.cpp index 140f4e5deef..fd42313b93a 100644 --- a/src/gui/qgsmaplayerstylemanagerwidget.cpp +++ b/src/gui/qgsmaplayerstylemanagerwidget.cpp @@ -33,7 +33,7 @@ QgsMapLayerStyleManagerWidget::QgsMapLayerStyleManagerWidget( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget *parent ) - : QgsMapStylePanel( layer, canvas, parent ) + : QgsMapStylingPanel( layer, canvas, parent ) { mModel = new QStandardItemModel( this ); mStyleList = new QListView( this ); diff --git a/src/gui/qgsmaplayerstylemanagerwidget.h b/src/gui/qgsmaplayerstylemanagerwidget.h index 6bff21cbc2b..18cf62b3d19 100644 --- a/src/gui/qgsmaplayerstylemanagerwidget.h +++ b/src/gui/qgsmaplayerstylemanagerwidget.h @@ -29,7 +29,7 @@ class QgsMapCanvas; * @brief The QgsMapLayerStyleManagerWidget class which is used to visually manage * the layer styles. */ -class GUI_EXPORT QgsMapLayerStyleManagerWidget : public QgsMapStylePanel +class GUI_EXPORT QgsMapLayerStyleManagerWidget : public QgsMapStylingPanel { Q_OBJECT public: diff --git a/src/gui/qgsmapstylepanel.cpp b/src/gui/qgsmapstylepanel.cpp index ff05983a022..b8f64abb28a 100644 --- a/src/gui/qgsmapstylepanel.cpp +++ b/src/gui/qgsmapstylepanel.cpp @@ -13,21 +13,22 @@ * * ***************************************************************************/ #include "qgsmapstylepanel.h" +#include "qgspanelwidget.h" -QgsMapStylePanel::QgsMapStylePanel( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent ) - : QWidget( parent ) +QgsMapStylingPanel::QgsMapStylingPanel( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent ) + : QgsPanelWidget( parent ) , mLayer( layer ) , mMapCanvas( canvas ) { } -QgsMapStylePanelFactory::QgsMapStylePanelFactory() +QgsMapStylingPanelFactory::QgsMapStylingPanelFactory() { } -QgsMapStylePanelFactory::~QgsMapStylePanelFactory() +QgsMapStylingPanelFactory::~QgsMapStylingPanelFactory() { } diff --git a/src/gui/qgsmapstylepanel.h b/src/gui/qgsmapstylepanel.h index ca91aa6706e..2265f43c076 100644 --- a/src/gui/qgsmapstylepanel.h +++ b/src/gui/qgsmapstylepanel.h @@ -19,6 +19,7 @@ #include #include "qgsmaplayer.h" +#include "qgspanelwidget.h" class QgsMapCanvas; @@ -27,7 +28,7 @@ class QgsMapCanvas; * \brief A panel widget that can be shown in the map style dock * \note added in QGIS 2.16 */ -class GUI_EXPORT QgsMapStylePanel : public QWidget +class GUI_EXPORT QgsMapStylingPanel : public QgsPanelWidget { Q_OBJECT public: @@ -40,16 +41,7 @@ class GUI_EXPORT QgsMapStylePanel : public QWidget * @note The widget is created each time the panel is selected in the dock. * Keep the loading light as possible for speed in the UI. */ - QgsMapStylePanel( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget *parent = 0 ); - - signals: - /** - * @brief Nofity the map style dock that something has changed and - * we need to update the map. - * You should emit this when any of the widgets are changed if live - * update is enabled apply() will get called to apply the changes to the layer. - */ - void widgetChanged(); + QgsMapStylingPanel( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget *parent = 0 ); public slots: /** @@ -68,16 +60,16 @@ class GUI_EXPORT QgsMapStylePanel : public QWidget * \class QgsMapStylePanelFactory * \note added in QGIS 2.16 */ -class GUI_EXPORT QgsMapStylePanelFactory +class GUI_EXPORT QgsMapStylingPanelFactory { public: Q_DECLARE_FLAGS( LayerTypesFlags, QgsMapLayer::LayerType ) /** Constructor */ - QgsMapStylePanelFactory(); + QgsMapStylingPanelFactory(); /** Destructor */ - virtual ~QgsMapStylePanelFactory(); + virtual ~QgsMapStylingPanelFactory(); /** * @brief The icon that will be shown in the UI for the panel. @@ -106,7 +98,7 @@ class GUI_EXPORT QgsMapStylePanelFactory * @param parent The parent of the widget. * @return A new QgsMapStylePanel which is shown in the map style dock. */ - virtual QgsMapStylePanel* createPanel( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget* parent ) = 0; + virtual QgsMapStylingPanel* createPanel( QgsMapLayer* layer, QgsMapCanvas *canvas, QWidget* parent ) = 0; }; diff --git a/src/gui/raster/qgsrendererrasterpropertieswidget.cpp b/src/gui/raster/qgsrendererrasterpropertieswidget.cpp index 80053011d7f..ad8a3672fd0 100644 --- a/src/gui/raster/qgsrendererrasterpropertieswidget.cpp +++ b/src/gui/raster/qgsrendererrasterpropertieswidget.cpp @@ -47,7 +47,7 @@ static void _initRendererWidgetFunctions() QgsRendererRasterPropertiesWidget::QgsRendererRasterPropertiesWidget( QgsMapLayer *layer, QgsMapCanvas* canvas, QWidget *parent ) - : QgsMapStylePanel( layer, canvas, parent ) + : QgsMapStylingPanel( layer, canvas, parent ) , mRendererWidget( nullptr ) { mRasterLayer = qobject_cast( layer ); diff --git a/src/gui/raster/qgsrendererrasterpropertieswidget.h b/src/gui/raster/qgsrendererrasterpropertieswidget.h index ab499b7b917..7514902e1e1 100644 --- a/src/gui/raster/qgsrendererrasterpropertieswidget.h +++ b/src/gui/raster/qgsrendererrasterpropertieswidget.h @@ -27,7 +27,7 @@ class QgsRasterLayer; class QgsMapCanvas; class QgsRasterRendererWidget; -class GUI_EXPORT QgsRendererRasterPropertiesWidget : public QgsMapStylePanel, private Ui::QgsRendererRasterPropsWidgetBase +class GUI_EXPORT QgsRendererRasterPropertiesWidget : public QgsMapStylingPanel, private Ui::QgsRendererRasterPropsWidgetBase { Q_OBJECT diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp index 0377b9c1cd4..69af4986c7b 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp @@ -14,7 +14,7 @@ ***************************************************************************/ #include "qgscategorizedsymbolrendererv2widget.h" -#include "qgsrendererwidgetcontainer.h" +#include "qgspanelwidget.h" #include "qgscategorizedsymbolrendererv2.h" @@ -571,14 +571,13 @@ void QgsCategorizedSymbolRendererV2Widget::changeSelectedSymbols() void QgsCategorizedSymbolRendererV2Widget::changeCategorizedSymbol() { QgsSymbolV2* newSymbol = mCategorizedSymbol->clone(); - QgsSymbolV2SelectorDialog* dlg = new QgsSymbolV2SelectorDialog( newSymbol, mStyle, mLayer, nullptr, true ); + QgsSymbolV2SelectorWidget* dlg = new QgsSymbolV2SelectorWidget( newSymbol, mStyle, mLayer, nullptr ); + dlg->setDockMode( true ); dlg->setMapCanvas( mMapCanvas ); - QgsRendererWidgetContainer* container = new QgsRendererWidgetContainer( dlg, "Select Symbol", nullptr ); - connect( dlg, SIGNAL( symbolModified() ), container, SLOT( emitWidgetChanged() ) ); - connect( container, SIGNAL( widgetChanged( QgsRendererWidgetContainer* ) ), this, SLOT( updateSymbolsFromWidget( QgsRendererWidgetContainer* ) ) ); - connect( container, SIGNAL( accepted( QgsRendererWidgetContainer* ) ), this, SLOT( cleanUpSymbolSelector( QgsRendererWidgetContainer* ) ) ); - emit showPanel( container ); + connect( dlg, SIGNAL( widgetChanged() ), this, SLOT( updateSymbolsFromWidget() ) ); + connect( dlg, SIGNAL( accepted( QgsPanelWidget* ) ), this, SLOT( cleanUpSymbolSelector( QgsPanelWidget* ) ) ); + emit showPanel( dlg ); } void QgsCategorizedSymbolRendererV2Widget::updateCategorizedSymbolIcon() @@ -617,14 +616,12 @@ void QgsCategorizedSymbolRendererV2Widget::changeCategorySymbol() symbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() ); } - QgsSymbolV2SelectorDialog* dlg = new QgsSymbolV2SelectorDialog( symbol, mStyle, mLayer, nullptr, true ); + QgsSymbolV2SelectorWidget* dlg = new QgsSymbolV2SelectorWidget( symbol, mStyle, mLayer, nullptr ); + dlg->setDockMode( true ); dlg->setMapCanvas( mMapCanvas ); - - QgsRendererWidgetContainer* container = new QgsRendererWidgetContainer( dlg, "Select Symbol", nullptr ); - connect( dlg, SIGNAL( symbolModified() ), container, SLOT( emitWidgetChanged() ) ); - connect( container, SIGNAL( widgetChanged( QgsRendererWidgetContainer* ) ), this, SLOT( updateSymbolsFromWidget( QgsRendererWidgetContainer* ) ) ); - connect( container, SIGNAL( accepted( QgsRendererWidgetContainer* ) ), this, SLOT( cleanUpSymbolSelector( QgsRendererWidgetContainer* ) ) ); - emit showPanel( container ); + connect( dlg, SIGNAL( widgetChanged() ), this, SLOT( updateSymbolsFromWidget() ) ); + connect( dlg, SIGNAL( accepted( QgsPanelWidget* ) ), this, SLOT( cleanUpSymbolSelector( QgsPanelWidget* ) ) ); + emit showPanel( dlg ); } static void _createCategories( QgsCategoryList& cats, QList& values, QgsSymbolV2* symbol ) @@ -1002,18 +999,18 @@ void QgsCategorizedSymbolRendererV2Widget::matchToSymbolsFromXml() } } -void QgsCategorizedSymbolRendererV2Widget::cleanUpSymbolSelector( QgsRendererWidgetContainer *container ) +void QgsCategorizedSymbolRendererV2Widget::cleanUpSymbolSelector( QgsPanelWidget *container ) { if ( container ) { - QgsSymbolV2SelectorDialog* dlg = qobject_cast( container->widget() ); + QgsSymbolV2SelectorWidget* dlg = qobject_cast( container ); delete dlg->symbol(); } } -void QgsCategorizedSymbolRendererV2Widget::updateSymbolsFromWidget( QgsRendererWidgetContainer* container ) +void QgsCategorizedSymbolRendererV2Widget::updateSymbolsFromWidget() { - QgsSymbolV2SelectorDialog* dlg = qobject_cast( container->widget() ); + QgsSymbolV2SelectorWidget* dlg = qobject_cast( sender() ); delete mCategorizedSymbol; mCategorizedSymbol = dlg->symbol()->clone(); diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h index 0cd945e5445..0f01cded45e 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h @@ -131,8 +131,8 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widg private slots: - void cleanUpSymbolSelector( QgsRendererWidgetContainer* container ); - void updateSymbolsFromWidget( QgsRendererWidgetContainer *container ); + void cleanUpSymbolSelector( QgsPanelWidget* container ); + void updateSymbolsFromWidget(); protected: diff --git a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp index e2bec84cce6..37fc4e329fc 100644 --- a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp @@ -13,7 +13,7 @@ * * ***************************************************************************/ #include "qgsgraduatedsymbolrendererv2widget.h" -#include "qgsrendererwidgetcontainer.h" +#include "qgspanelwidget.h" #include "qgssymbolv2.h" #include "qgssymbollayerv2utils.h" @@ -687,18 +687,18 @@ void QgsGraduatedSymbolRendererV2Widget::refreshRanges( bool reset ) emit widgetChanged(); } -void QgsGraduatedSymbolRendererV2Widget::cleanUpSymbolSelector( QgsRendererWidgetContainer *container ) +void QgsGraduatedSymbolRendererV2Widget::cleanUpSymbolSelector( QgsPanelWidget *container ) { if ( container ) { - QgsSymbolV2SelectorDialog* dlg = qobject_cast( container->widget() ); + QgsSymbolV2SelectorWidget* dlg = qobject_cast( container ); delete dlg->symbol(); } } -void QgsGraduatedSymbolRendererV2Widget::updateSymbolsFromWidget( QgsRendererWidgetContainer *container ) +void QgsGraduatedSymbolRendererV2Widget::updateSymbolsFromWidget() { - QgsSymbolV2SelectorDialog* dlg = qobject_cast( container->widget() ); + QgsSymbolV2SelectorWidget* dlg = qobject_cast( sender() ); delete mGraduatedSymbol; mGraduatedSymbol = dlg->symbol()->clone(); @@ -827,14 +827,12 @@ void QgsGraduatedSymbolRendererV2Widget::reapplySizes() void QgsGraduatedSymbolRendererV2Widget::changeGraduatedSymbol() { QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); - QgsSymbolV2SelectorDialog* dlg = new QgsSymbolV2SelectorDialog( newSymbol, mStyle, mLayer, nullptr, true ); + QgsSymbolV2SelectorWidget* dlg = new QgsSymbolV2SelectorWidget( newSymbol, mStyle, mLayer, nullptr ); dlg->setMapCanvas( mMapCanvas ); - QgsRendererWidgetContainer* container = new QgsRendererWidgetContainer( dlg, "Select Symbol", nullptr ); - connect( dlg, SIGNAL( symbolModified() ), container, SLOT( emitWidgetChanged() ) ); - connect( container, SIGNAL( widgetChanged( QgsRendererWidgetContainer* ) ), this, SLOT( updateSymbolsFromWidget( QgsRendererWidgetContainer* ) ) ); - connect( container, SIGNAL( accepted( QgsRendererWidgetContainer* ) ), this, SLOT( cleanUpSymbolSelector( QgsRendererWidgetContainer* ) ) ); - emit showPanel( container ); + connect( dlg, SIGNAL( widgetChanged() ), this, SLOT( updateSymbolsFromWidget() ) ); + connect( dlg, SIGNAL( accepted( QgsPanelWidget* ) ), this, SLOT( cleanUpSymbolSelector( QgsPanelWidget* ) ) ); + emit showPanel( dlg ); } void QgsGraduatedSymbolRendererV2Widget::updateGraduatedSymbolIcon() @@ -907,14 +905,13 @@ void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols() void QgsGraduatedSymbolRendererV2Widget::changeRangeSymbol( int rangeIdx ) { QgsSymbolV2* newSymbol = mRenderer->ranges()[rangeIdx].symbol()->clone(); - QgsSymbolV2SelectorDialog* dlg = new QgsSymbolV2SelectorDialog( newSymbol, mStyle, mLayer, nullptr, true ); + QgsSymbolV2SelectorWidget* dlg = new QgsSymbolV2SelectorWidget( newSymbol, mStyle, mLayer, nullptr ); + dlg->setDockMode( true ); dlg->setMapCanvas( mMapCanvas ); - QgsRendererWidgetContainer* container = new QgsRendererWidgetContainer( dlg, "Select Symbol", nullptr ); - connect( dlg, SIGNAL( symbolModified() ), container, SLOT( emitWidgetChanged() ) ); - connect( container, SIGNAL( widgetChanged( QgsRendererWidgetContainer* ) ), this, SLOT( updateSymbolsFromWidget( QgsRendererWidgetContainer* ) ) ); - connect( container, SIGNAL( accepted( QgsRendererWidgetContainer* ) ), this, SLOT( cleanUpSymbolSelector( QgsRendererWidgetContainer* ) ) ); - emit showPanel( container ); + connect( dlg, SIGNAL( widgetChanged() ), this, SLOT( updateSymbolsFromWidget() ) ); + connect( dlg, SIGNAL( accepted( QgsPanelWidget* ) ), this, SLOT( cleanUpSymbolSelector( QgsPanelWidget* ) ) ); + emit showPanel( dlg ); } void QgsGraduatedSymbolRendererV2Widget::changeRange( int rangeIdx ) diff --git a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h index 51d43191cd0..87a097e3bd2 100644 --- a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h +++ b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h @@ -119,8 +119,8 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget void refreshRanges( bool reset = false ); private slots: - void cleanUpSymbolSelector( QgsRendererWidgetContainer* container ); - void updateSymbolsFromWidget( QgsRendererWidgetContainer *container ); + void cleanUpSymbolSelector( QgsPanelWidget* container ); + void updateSymbolsFromWidget(); protected: void updateUiFromRenderer( bool updateCount = true ); diff --git a/src/gui/symbology-ng/qgslayerpropertieswidget.cpp b/src/gui/symbology-ng/qgslayerpropertieswidget.cpp index 0fc2cb76a7f..6db76dc82ac 100644 --- a/src/gui/symbology-ng/qgslayerpropertieswidget.cpp +++ b/src/gui/symbology-ng/qgslayerpropertieswidget.cpp @@ -32,6 +32,7 @@ #include "qgsellipsesymbollayerv2widget.h" #include "qgsvectorfieldsymbollayerwidget.h" #include "qgssymbolv2.h" //for the unit +#include "qgspanelwidget.h" static bool _initWidgetFunction( const QString& name, QgsSymbolLayerV2WidgetFunc f ) { @@ -86,7 +87,7 @@ static void _initWidgetFunctions() QgsLayerPropertiesWidget::QgsLayerPropertiesWidget( QgsSymbolLayerV2* layer, const QgsSymbolV2* symbol, const QgsVectorLayer* vl, QWidget* parent ) - : QWidget( parent ) + : QgsPanelWidget( parent ) , mPresetExpressionContext( nullptr ) , mMapCanvas( nullptr ) { @@ -119,6 +120,9 @@ QgsLayerPropertiesWidget::QgsLayerPropertiesWidget( QgsSymbolLayerV2* layer, con connect( cboLayerType, SIGNAL( currentIndexChanged( int ) ), this, SLOT( layerTypeChanged() ) ); connect( mEffectWidget, SIGNAL( changed() ), this, SLOT( emitSignalChanged() ) ); + + this->connectChildPanel( mEffectWidget ); + mEffectWidget->setPaintEffect( mLayer->paintEffect() ); } @@ -130,6 +134,15 @@ void QgsLayerPropertiesWidget::setMapCanvas( QgsMapCanvas *canvas ) w->setMapCanvas( mMapCanvas ); } +void QgsLayerPropertiesWidget::setDockMode( bool dockMode ) +{ + mDockMode = dockMode; + if ( dockMode ) + { + mEffectWidget->setDockMode( dockMode ); + } +} + void QgsLayerPropertiesWidget::setExpressionContext( QgsExpressionContext *context ) { mPresetExpressionContext = context; @@ -227,6 +240,7 @@ void QgsLayerPropertiesWidget::emitSignalChanged() // also update paint effect preview mEffectWidget->setPreviewPicture( QgsSymbolLayerV2Utils::symbolLayerPreviewPicture( mLayer, QgsSymbolV2::MM, QSize( 80, 80 ) ) ); + emit widgetChanged(); } void QgsLayerPropertiesWidget::reloadLayer() diff --git a/src/gui/symbology-ng/qgslayerpropertieswidget.h b/src/gui/symbology-ng/qgslayerpropertieswidget.h index 1884fae3592..97b47ff81a0 100644 --- a/src/gui/symbology-ng/qgslayerpropertieswidget.h +++ b/src/gui/symbology-ng/qgslayerpropertieswidget.h @@ -23,6 +23,7 @@ class QgsSymbolLayerV2; class QgsSymbolLayerV2Widget; class QgsVectorLayer; class QgsMapCanvas; +class QgsPanelWidget; class SymbolLayerItem; @@ -30,7 +31,7 @@ class SymbolLayerItem; #include -class GUI_EXPORT QgsLayerPropertiesWidget : public QWidget, private Ui::LayerPropertiesWidget +class GUI_EXPORT QgsLayerPropertiesWidget : public QgsPanelWidget, private Ui::LayerPropertiesWidget { Q_OBJECT @@ -52,6 +53,13 @@ class GUI_EXPORT QgsLayerPropertiesWidget : public QWidget, private Ui::LayerPro */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + void setDockMode( bool dockMode ); + public slots: void layerTypeChanged(); void emitSignalChanged(); @@ -84,6 +92,7 @@ class GUI_EXPORT QgsLayerPropertiesWidget : public QWidget, private Ui::LayerPro void reloadLayer(); private: + bool mDockMode; QgsExpressionContext* mPresetExpressionContext; QgsMapCanvas* mMapCanvas; diff --git a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp index 96556d184dd..61383eba45a 100644 --- a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp +++ b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp @@ -27,7 +27,7 @@ #include "qgsheatmaprendererwidget.h" #include "qgs25drendererwidget.h" #include "qgsnullsymbolrendererwidget.h" -#include "qgsrendererwidgetcontainer.h" +#include "qgspanelwidget.h" #include "qgsorderbydialog.h" #include "qgsapplication.h" @@ -97,6 +97,7 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* la layout()->setContentsMargins( 0, 0, 0, 0 ); } + this->setDockMode( embedded ); // initialize registry's widget functions _initRendererWidgetFunctions(); @@ -121,9 +122,10 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* la connect( checkboxEnableOrderBy, SIGNAL( toggled( bool ) ), btnOrderBy, SLOT( setEnabled( bool ) ) ); connect( checkboxEnableOrderBy, SIGNAL( toggled( bool ) ), lineEditOrderBy, SLOT( setEnabled( bool ) ) ); connect( btnOrderBy, SIGNAL( clicked( bool ) ), this, SLOT( showOrderByDialog() ) ); - connect( mEffectWidget, SIGNAL( showPanel( QgsRendererWidgetContainer* ) ), this, SLOT( showPanel( QgsRendererWidgetContainer* ) ) ); - mEffectWidget->setDockMode( true ); + QList panels; + panels << mEffectWidget; + mainStack->connectPanels( panels ); syncToLayer(); @@ -197,6 +199,12 @@ void QgsRendererV2PropertiesDialog::setMapCanvas( QgsMapCanvas* canvas ) mActiveWidget->setMapCanvas( mMapCanvas ); } +void QgsRendererV2PropertiesDialog::setDockMode( bool dockMode ) +{ + mDockMode = dockMode; + mEffectWidget->setDockMode( dockMode ); +} + void QgsRendererV2PropertiesDialog::rendererChanged() { @@ -250,7 +258,8 @@ void QgsRendererV2PropertiesDialog::rendererChanged() connect( mActiveWidget, SIGNAL( layerVariablesChanged() ), this, SIGNAL( layerVariablesChanged() ) ); } connect( mActiveWidget, SIGNAL( widgetChanged() ), this, SIGNAL( widgetChanged() ) ); - connect( mActiveWidget, SIGNAL( showPanel( QgsRendererWidgetContainer* ) ), this, SLOT( showPanel( QgsRendererWidgetContainer* ) ) ); + mainStack->connectPanel( mActiveWidget ); + w->setDockMode( mDockMode ); } else { @@ -293,20 +302,6 @@ void QgsRendererV2PropertiesDialog::onOK() accept(); } -void QgsRendererV2PropertiesDialog::showPanel( QgsRendererWidgetContainer *container ) -{ - connect( container, SIGNAL( accepted( QgsRendererWidgetContainer* ) ), this, SLOT( closePanel( QgsRendererWidgetContainer* ) ) ); - - int page = this->mainStack->addWidget( container ); - this->mainStack->setCurrentIndex( page ); -} - -void QgsRendererV2PropertiesDialog::closePanel( QgsRendererWidgetContainer *container ) -{ - this->mainStack->removeWidget( container ); - this->mainStack->setCurrentIndex( this->mainStack->currentIndex() - 1 ); - container->deleteLater(); -} void QgsRendererV2PropertiesDialog::syncToLayer() { diff --git a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h index 7119c9fe397..cb377a71f5e 100644 --- a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h +++ b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h @@ -31,7 +31,6 @@ class QgsSymbolV2; class QgsPaintEffect; class QgsRendererV2Widget; class QgsMapCanvas; -class QgsRendererWidgetContainer; class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::QgsRendererV2PropsDialogBase @@ -57,6 +56,13 @@ class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::Qgs */ void setMapCanvas( QgsMapCanvas* canvas ); + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + void setDockMode( bool dockMode ); + signals: /** * Emitted when expression context variables on the associated @@ -81,18 +87,6 @@ class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::Qgs //! Apply and accept the changes for the dialog. void onOK(); - /** Shows a panel widget inside the renderer widget. - * @param container widget panel to show - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer *container ); - - /** - * Closes the given panel in the stack of panels. - * @param container The container widget to close. - */ - void closePanel( QgsRendererWidgetContainer *container ); - private slots: void showOrderByDialog(); @@ -126,6 +120,9 @@ class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::Qgs QgsMapCanvas* mMapCanvas; QgsFeatureRequest::OrderBy mOrderBy; + + private: + bool mDockMode; }; diff --git a/src/gui/symbology-ng/qgsrendererv2widget.cpp b/src/gui/symbology-ng/qgsrendererv2widget.cpp index 28cad996938..307c765799d 100644 --- a/src/gui/symbology-ng/qgsrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsrendererv2widget.cpp @@ -19,13 +19,14 @@ #include "qgssymbollevelsv2dialog.h" #include "qgsexpressionbuilderdialog.h" #include "qgsmapcanvas.h" +#include "qgspanelwidget.h" #include #include #include QgsRendererV2Widget::QgsRendererV2Widget( QgsVectorLayer* layer, QgsStyleV2* style ) - : QWidget() + : QgsPanelWidget() , mLayer( layer ) , mStyle( style ) , mMapCanvas( nullptr ) @@ -272,6 +273,11 @@ void QgsRendererV2Widget::applyChanges() apply(); } +void QgsRendererV2Widget::setDockMode( bool dockMode ) +{ + mDockMode = dockMode; +} + //////////// diff --git a/src/gui/symbology-ng/qgsrendererv2widget.h b/src/gui/symbology-ng/qgsrendererv2widget.h index 52b3d35065a..d0f6ec7623a 100644 --- a/src/gui/symbology-ng/qgsrendererv2widget.h +++ b/src/gui/symbology-ng/qgsrendererv2widget.h @@ -20,14 +20,13 @@ #include #include "qgssymbolv2.h" #include "qgsdatadefined.h" +#include "qgspanelwidget.h" class QgsVectorLayer; class QgsStyleV2; class QgsFeatureRendererV2; class QgsSymbolV2SelectorDialog; class QgsMapCanvas; -class QgsRendererWidgetContainer; - /** Base class for renderer settings widgets @@ -39,7 +38,7 @@ WORKFLOW: - on any change of renderer type, create some default (dummy?) version and change the stacked widget - when clicked ok/apply, get the renderer from active widget and clone it for the layer */ -class GUI_EXPORT QgsRendererV2Widget : public QWidget +class GUI_EXPORT QgsRendererV2Widget : public QgsPanelWidget { Q_OBJECT public: @@ -77,6 +76,13 @@ class GUI_EXPORT QgsRendererV2Widget : public QWidget */ void applyChanges(); + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + virtual void setDockMode( bool dockMode ) override; + signals: /** @@ -86,19 +92,8 @@ class GUI_EXPORT QgsRendererV2Widget : public QWidget */ void layerVariablesChanged(); - /** - * Emitted when something on the widget has changed. - * All widgets will fire this event to notify of an internal change. - */ - void widgetChanged(); - - /** Shows a panel widget inside the renderer widget. - * @param widget widget panel to show - * @note added in QGIS 2.16 - */ - void showPanel( QgsRendererWidgetContainer* widget ); - protected: + bool mDockMode; QgsVectorLayer* mLayer; QgsStyleV2* mStyle; QMenu* contextMenu; diff --git a/src/gui/symbology-ng/qgsrendererwidgetcontainer.cpp b/src/gui/symbology-ng/qgsrendererwidgetcontainer.cpp deleted file mode 100644 index 38b5a9b6bc6..00000000000 --- a/src/gui/symbology-ng/qgsrendererwidgetcontainer.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/*************************************************************************** - qgsrendererwidgetcontainer.cpp - --------------------- - begin : June 2016 - copyright : (C) 2016 by Nathan Woodrow - email : - *************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#include -#include - -#include "qgsrendererwidgetcontainer.h" - -QgsRendererWidgetContainer::QgsRendererWidgetContainer( QWidget *widget, const QString& title, QWidget *parent ) - : QWidget( parent ) - , mWidget( widget ) -{ - setupUi( this ); - mWidgetLayout->addWidget( widget ); - mWidgetLayout->setContentsMargins( 0, 0, 0, 0 ); - mTitleText->setText( title ); - QPushButton* button = mButtonBox->button( QDialogButtonBox::Close ); - button->setDefault( true ); - connect( button, SIGNAL( pressed() ), this, SLOT( accept() ) ); -} - -QWidget *QgsRendererWidgetContainer::widget() -{ - return mWidget; -} - -void QgsRendererWidgetContainer::accept() -{ - emit accepted( this ); -} - -void QgsRendererWidgetContainer::emitWidgetChanged() -{ - emit widgetChanged( this ); -} - -void QgsRendererWidgetContainer::keyPressEvent( QKeyEvent *event ) -{ - if ( event->key() == Qt::Key_Escape ) - { - accept(); - } -} diff --git a/src/gui/symbology-ng/qgsrendererwidgetcontainer.h b/src/gui/symbology-ng/qgsrendererwidgetcontainer.h deleted file mode 100644 index 3b65a770146..00000000000 --- a/src/gui/symbology-ng/qgsrendererwidgetcontainer.h +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - qgsrendererwidgetcontainer.h - --------------------- - begin : June 2016 - copyright : (C) 2016 by Nathan Woodrow - email : - *************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -#ifndef QGSRENDERERWIDGETCONTAINER_H -#define QGSRENDERERWIDGETCONTAINER_H - -#include -#include - -#include "ui_qgsrenderercontainerbase.h" - - -/** - * @brief A container widget that can be used to show a renderer widget with a title and close button. - * @note Mainly used for the style dock panels at the moment. - */ -class GUI_EXPORT QgsRendererWidgetContainer : public QWidget, private Ui::QgsRendererWidgetContainerBase -{ - Q_OBJECT - public: - /** - * @brief A container widget that can be used to show a renderer widget with a title and close button. - * @param widget The internal widget to be shown to the user. - * @param title The title to show on the widget. - * @param parent The parent of the widget. - */ - QgsRendererWidgetContainer( QWidget* widget, const QString &title, QWidget *parent = 0 ); - - /** - * @brief Returns the current internal widget. - * @return The internal widget. - */ - QWidget* widget(); - - signals: - /** - * @brief Emitted when the container is accpeted and closed. - * Listen to this to clean up the callers state. - */ - void accepted( QgsRendererWidgetContainer* container ); - - /** - * Emiited when the internal widget changes state. - * @param conatiner The container holding the widget that changed state. - */ - void widgetChanged( QgsRendererWidgetContainer* conatiner ); - - public slots: - - /** - * Accept the container. Causes accepted to be emiited. - */ - void accept(); - - /** - * Fire the widgetChanged event on the container. Connect your widgets dirty signal to - * this slot to fire the and listen to widgetChanged to handle the event. - */ - void emitWidgetChanged(); - - protected: - /** - * @brief Overriden key press event to handle the esc event on the widget. - * @param event The key event - */ - void keyPressEvent( QKeyEvent* event ); - - private: - QWidget* mWidget; - -}; - -#endif // QGSRENDERERWIDGETCONTAINER_H diff --git a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp index 69700257453..cd1c627b534 100644 --- a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp @@ -51,8 +51,9 @@ QgsSingleSymbolRendererV2Widget::QgsSingleSymbolRendererV2Widget( QgsVectorLayer mSingleSymbol = mRenderer->symbol()->clone(); // setup ui - mSelector = new QgsSymbolV2SelectorDialog( mSingleSymbol, mStyle, mLayer, nullptr, true ); + mSelector = new QgsSymbolV2SelectorWidget( mSingleSymbol, mStyle, mLayer, nullptr ); connect( mSelector, SIGNAL( symbolModified() ), this, SLOT( changeSingleSymbol() ) ); + connect( mSelector, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SIGNAL( showPanel( QgsPanelWidget* ) ) ); QVBoxLayout* layout = new QVBoxLayout( this ); layout->setContentsMargins( 0, 0, 0, 0 ); @@ -86,6 +87,14 @@ void QgsSingleSymbolRendererV2Widget::setMapCanvas( QgsMapCanvas* canvas ) mSelector->setMapCanvas( canvas ); } +void QgsSingleSymbolRendererV2Widget::setDockMode( bool dockMode ) +{ + QgsRendererV2Widget::setDockMode( dockMode ); + mDockMode = dockMode; + if ( mSelector ) + mSelector->setDockMode( dockMode ); +} + void QgsSingleSymbolRendererV2Widget::changeSingleSymbol() { // update symbol from the GUI diff --git a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h index af8bcedf910..5e5499c0364 100644 --- a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h +++ b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h @@ -18,7 +18,7 @@ #include "qgsrendererv2widget.h" class QgsSingleSymbolRendererV2; -class QgsSymbolV2SelectorDialog; +class QgsSymbolV2SelectorWidget; class QMenu; @@ -36,6 +36,13 @@ class GUI_EXPORT QgsSingleSymbolRendererV2Widget : public QgsRendererV2Widget virtual void setMapCanvas( QgsMapCanvas* canvas ) override; + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + virtual void setDockMode( bool dockMode ) override; + public slots: void changeSingleSymbol(); @@ -47,7 +54,7 @@ class GUI_EXPORT QgsSingleSymbolRendererV2Widget : public QgsRendererV2Widget protected: QgsSingleSymbolRendererV2* mRenderer; - QgsSymbolV2SelectorDialog* mSelector; + QgsSymbolV2SelectorWidget* mSelector; QgsSymbolV2* mSingleSymbol; }; diff --git a/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp b/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp index 74967cb66ab..f1942b54f56 100644 --- a/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp +++ b/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp @@ -208,8 +208,8 @@ class SymbolLayerItem : public QStandardItem ////////// -QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent, bool embedded ) - : QDialog( parent ) +QgsSymbolV2SelectorWidget::QgsSymbolV2SelectorWidget( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent ) + : QgsPanelWidget( parent ) , mAdvancedMenu( nullptr ) , mVectorLayer( vl ) , mMapCanvas( nullptr ) @@ -223,15 +223,6 @@ QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsSt setupUi( this ); - QSettings settings; - restoreGeometry( settings.value( "/Windows/SymbolSelectorDialog/geometry" ).toByteArray() ); - - // can be embedded in renderer properties dialog - if ( embedded ) - { - buttonBox->hide(); - layout()->setContentsMargins( 0, 0, 0, 0 ); - } // setup icons btnAddLayer->setIcon( QIcon( QgsApplication::iconPath( "symbologyAdd.svg" ) ) ); btnRemoveLayer->setIcon( QIcon( QgsApplication::iconPath( "symbologyRemove.svg" ) ) ); @@ -262,34 +253,22 @@ QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsSt connect( btnRemoveLayer, SIGNAL( clicked() ), this, SLOT( removeLayer() ) ); connect( btnLock, SIGNAL( clicked() ), this, SLOT( lockLayer() ) ); connect( btnDuplicate, SIGNAL( clicked() ), this, SLOT( duplicateLayer() ) ); + connect( this, SIGNAL( symbolModified() ), this, SIGNAL( widgetChanged() ) ); updateUi(); // set symbol as active item in the tree QModelIndex newIndex = layersTree->model()->index( 0, 0 ); layersTree->setCurrentIndex( newIndex ); + + setPanelTitle( tr( "Symbol selector" ) ); } -QgsSymbolV2SelectorDialog::~QgsSymbolV2SelectorDialog() +QgsSymbolV2SelectorWidget::~QgsSymbolV2SelectorWidget() { - QSettings settings; - settings.setValue( "/Windows/SymbolSelectorDialog/geometry", saveGeometry() ); } -void QgsSymbolV2SelectorDialog::keyPressEvent( QKeyEvent * e ) -{ - // Ignore the ESC key to avoid close the dialog without the properties window - if ( !isWindow() && e->key() == Qt::Key_Escape ) - { - e->ignore(); - } - else - { - QDialog::keyPressEvent( e ); - } -} - -QMenu* QgsSymbolV2SelectorDialog::advancedMenu() +QMenu* QgsSymbolV2SelectorWidget::advancedMenu() { if ( !mAdvancedMenu ) { @@ -300,14 +279,14 @@ QMenu* QgsSymbolV2SelectorDialog::advancedMenu() return mAdvancedMenu; } -void QgsSymbolV2SelectorDialog::setExpressionContext( QgsExpressionContext *context ) +void QgsSymbolV2SelectorWidget::setExpressionContext( QgsExpressionContext *context ) { mPresetExpressionContext.reset( context ); layerChanged(); updatePreview(); } -void QgsSymbolV2SelectorDialog::setMapCanvas( QgsMapCanvas *canvas ) +void QgsSymbolV2SelectorWidget::setMapCanvas( QgsMapCanvas *canvas ) { mMapCanvas = canvas; @@ -321,7 +300,12 @@ void QgsSymbolV2SelectorDialog::setMapCanvas( QgsMapCanvas *canvas ) listWidget->setMapCanvas( canvas ); } -void QgsSymbolV2SelectorDialog::loadSymbol( QgsSymbolV2* symbol, SymbolLayerItem* parent ) +void QgsSymbolV2SelectorWidget::setDockMode( bool dockMode ) +{ + mDockMode = dockMode; +} + +void QgsSymbolV2SelectorWidget::loadSymbol( QgsSymbolV2* symbol, SymbolLayerItem* parent ) { SymbolLayerItem* symbolItem = new SymbolLayerItem( symbol ); QFont boldFont = symbolItem->font(); @@ -345,13 +329,13 @@ void QgsSymbolV2SelectorDialog::loadSymbol( QgsSymbolV2* symbol, SymbolLayerItem } -void QgsSymbolV2SelectorDialog::loadSymbol() +void QgsSymbolV2SelectorWidget::loadSymbol() { model->clear(); loadSymbol( mSymbol, static_cast( model->invisibleRootItem() ) ); } -void QgsSymbolV2SelectorDialog::updateUi() +void QgsSymbolV2SelectorWidget::updateUi() { QModelIndex currentIdx = layersTree->currentIndex(); if ( !currentIdx.isValid() ) @@ -378,7 +362,7 @@ void QgsSymbolV2SelectorDialog::updateUi() btnDuplicate->setEnabled( true ); } -void QgsSymbolV2SelectorDialog::updatePreview() +void QgsSymbolV2SelectorWidget::updatePreview() { QImage preview = mSymbol->bigSymbolPreviewImage( mPresetExpressionContext.data() ); lblPreview->setPixmap( QPixmap::fromImage( preview ) ); @@ -386,7 +370,7 @@ void QgsSymbolV2SelectorDialog::updatePreview() emit symbolModified(); } -void QgsSymbolV2SelectorDialog::updateLayerPreview() +void QgsSymbolV2SelectorWidget::updateLayerPreview() { // get current layer item and update its icon SymbolLayerItem* item = currentLayerItem(); @@ -396,7 +380,7 @@ void QgsSymbolV2SelectorDialog::updateLayerPreview() updatePreview(); } -SymbolLayerItem* QgsSymbolV2SelectorDialog::currentLayerItem() +SymbolLayerItem* QgsSymbolV2SelectorWidget::currentLayerItem() { QModelIndex idx = layersTree->currentIndex(); if ( !idx.isValid() ) @@ -409,7 +393,7 @@ SymbolLayerItem* QgsSymbolV2SelectorDialog::currentLayerItem() return item; } -QgsSymbolLayerV2* QgsSymbolV2SelectorDialog::currentLayer() +QgsSymbolLayerV2* QgsSymbolV2SelectorWidget::currentLayer() { QModelIndex idx = layersTree->currentIndex(); if ( !idx.isValid() ) @@ -422,7 +406,7 @@ QgsSymbolLayerV2* QgsSymbolV2SelectorDialog::currentLayer() return nullptr; } -void QgsSymbolV2SelectorDialog::layerChanged() +void QgsSymbolV2SelectorWidget::layerChanged() { updateUi(); @@ -435,6 +419,7 @@ void QgsSymbolV2SelectorDialog::layerChanged() SymbolLayerItem *parent = static_cast( currentItem->parent() ); mDataDefineRestorer.reset( new DataDefinedRestorer( parent->symbol(), currentItem->layer() ) ); QgsLayerPropertiesWidget *layerProp = new QgsLayerPropertiesWidget( currentItem->layer(), parent->symbol(), mVectorLayer ); + layerProp->setDockMode( mDockMode ); layerProp->setExpressionContext( mPresetExpressionContext.data() ); layerProp->setMapCanvas( mMapCanvas ); setWidget( layerProp ); @@ -442,6 +427,8 @@ void QgsSymbolV2SelectorDialog::layerChanged() connect( layerProp, SIGNAL( changed() ), this, SLOT( updateLayerPreview() ) ); // This connection when layer type is changed connect( layerProp, SIGNAL( changeLayer( QgsSymbolLayerV2* ) ), this, SLOT( changeLayer( QgsSymbolLayerV2* ) ) ); + + connectChildPanel( layerProp ); } else { @@ -459,7 +446,7 @@ void QgsSymbolV2SelectorDialog::layerChanged() updateLockButton(); } -void QgsSymbolV2SelectorDialog::symbolChanged() +void QgsSymbolV2SelectorWidget::symbolChanged() { SymbolLayerItem *currentItem = static_cast( model->itemFromIndex( layersTree->currentIndex() ) ); if ( !currentItem || currentItem->isLayer() ) @@ -488,7 +475,7 @@ void QgsSymbolV2SelectorDialog::symbolChanged() connect( layersTree->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( layerChanged() ) ); } -void QgsSymbolV2SelectorDialog::setWidget( QWidget* widget ) +void QgsSymbolV2SelectorWidget::setWidget( QWidget* widget ) { int index = stackedWidget->addWidget( widget ); stackedWidget->setCurrentIndex( index ); @@ -497,7 +484,7 @@ void QgsSymbolV2SelectorDialog::setWidget( QWidget* widget ) mPresentWidget = widget; } -void QgsSymbolV2SelectorDialog::updateLockButton() +void QgsSymbolV2SelectorWidget::updateLockButton() { QgsSymbolLayerV2* layer = currentLayer(); if ( !layer ) @@ -505,7 +492,7 @@ void QgsSymbolV2SelectorDialog::updateLockButton() btnLock->setChecked( layer->isLocked() ); } -void QgsSymbolV2SelectorDialog::addLayer() +void QgsSymbolV2SelectorWidget::addLayer() { QModelIndex idx = layersTree->currentIndex(); if ( !idx.isValid() ) @@ -555,7 +542,7 @@ void QgsSymbolV2SelectorDialog::addLayer() updatePreview(); } -void QgsSymbolV2SelectorDialog::removeLayer() +void QgsSymbolV2SelectorWidget::removeLayer() { SymbolLayerItem *item = currentLayerItem(); int row = item->row(); @@ -577,17 +564,17 @@ void QgsSymbolV2SelectorDialog::removeLayer() delete tmpLayer; } -void QgsSymbolV2SelectorDialog::moveLayerDown() +void QgsSymbolV2SelectorWidget::moveLayerDown() { moveLayerByOffset( + 1 ); } -void QgsSymbolV2SelectorDialog::moveLayerUp() +void QgsSymbolV2SelectorWidget::moveLayerUp() { moveLayerByOffset( -1 ); } -void QgsSymbolV2SelectorDialog::moveLayerByOffset( int offset ) +void QgsSymbolV2SelectorWidget::moveLayerByOffset( int offset ) { SymbolLayerItem *item = currentLayerItem(); if ( !item ) @@ -613,7 +600,7 @@ void QgsSymbolV2SelectorDialog::moveLayerByOffset( int offset ) updateUi(); } -void QgsSymbolV2SelectorDialog::lockLayer() +void QgsSymbolV2SelectorWidget::lockLayer() { QgsSymbolLayerV2* layer = currentLayer(); if ( !layer ) @@ -621,7 +608,7 @@ void QgsSymbolV2SelectorDialog::lockLayer() layer->setLocked( btnLock->isChecked() ); } -void QgsSymbolV2SelectorDialog::duplicateLayer() +void QgsSymbolV2SelectorWidget::duplicateLayer() { QModelIndex idx = layersTree->currentIndex(); if ( !idx.isValid() ) @@ -658,7 +645,7 @@ void QgsSymbolV2SelectorDialog::duplicateLayer() updatePreview(); } -void QgsSymbolV2SelectorDialog::saveSymbol() +void QgsSymbolV2SelectorWidget::saveSymbol() { bool ok; QString name = QInputDialog::getText( this, tr( "Symbol name" ), @@ -686,7 +673,7 @@ void QgsSymbolV2SelectorDialog::saveSymbol() mStyle->saveSymbol( name, mSymbol->clone(), 0, QStringList() ); } -void QgsSymbolV2SelectorDialog::changeLayer( QgsSymbolLayerV2* newLayer ) +void QgsSymbolV2SelectorWidget::changeLayer( QgsSymbolLayerV2* newLayer ) { SymbolLayerItem* item = currentLayerItem(); QgsSymbolLayerV2* layer = item->layer(); @@ -714,3 +701,172 @@ void QgsSymbolV2SelectorDialog::changeLayer( QgsSymbolLayerV2* newLayer ) // Important: This lets the layer have its own layer properties widget layerChanged(); } + +QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2 *symbol, QgsStyleV2 *style, const QgsVectorLayer *vl, QWidget *parent, bool embedded ) + : QDialog( parent ) +{ + setLayout( new QVBoxLayout() ); + mSelectorWidget = new QgsSymbolV2SelectorWidget( symbol, style, vl, this ); + mButtonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel ); + + connect( mButtonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); + connect( mButtonBox, SIGNAL( rejected() ), this, SLOT( reject() ) ); + + layout()->addWidget( mSelectorWidget ); + layout()->addWidget( mButtonBox ); + + QSettings settings; + restoreGeometry( settings.value( "/Windows/SymbolSelectorWidget/geometry" ).toByteArray() ); + + // can be embedded in renderer properties dialog + if ( embedded ) + { + mButtonBox->hide(); + layout()->setContentsMargins( 0, 0, 0, 0 ); + } + mSelectorWidget->setDockMode( embedded ); +} + +QgsSymbolV2SelectorDialog::~QgsSymbolV2SelectorDialog() +{ + QSettings settings; + settings.setValue( "/Windows/SymbolSelectorWidget/geometry", saveGeometry() ); +} + +QMenu *QgsSymbolV2SelectorDialog::advancedMenu() +{ + return mSelectorWidget->advancedMenu(); +} + +void QgsSymbolV2SelectorDialog::setExpressionContext( QgsExpressionContext *context ) +{ + mSelectorWidget->setExpressionContext( context ); +} + +QgsExpressionContext *QgsSymbolV2SelectorDialog::expressionContext() const +{ + return mSelectorWidget->expressionContext(); +} + +void QgsSymbolV2SelectorDialog::setMapCanvas( QgsMapCanvas *canvas ) +{ + mSelectorWidget->setMapCanvas( canvas ); +} + +QgsSymbolV2 *QgsSymbolV2SelectorDialog::symbol() +{ + return mSelectorWidget->symbol(); +} + +void QgsSymbolV2SelectorDialog::keyPressEvent( QKeyEvent *e ) +{ + // Ignore the ESC key to avoid close the dialog without the properties window + if ( !isWindow() && e->key() == Qt::Key_Escape ) + { + e->ignore(); + } + else + { + QDialog::keyPressEvent( e ); + } +} + +void QgsSymbolV2SelectorDialog::loadSymbol() +{ + mSelectorWidget->loadSymbol(); +} + +void QgsSymbolV2SelectorDialog::loadSymbol( QgsSymbolV2 *symbol, SymbolLayerItem *parent ) +{ + mSelectorWidget->loadSymbol( symbol, parent ); +} + +void QgsSymbolV2SelectorDialog::updateUi() +{ + mSelectorWidget->updateUi(); +} + +void QgsSymbolV2SelectorDialog::updateLockButton() +{ + mSelectorWidget->updateLockButton(); +} + +SymbolLayerItem *QgsSymbolV2SelectorDialog::currentLayerItem() +{ + return mSelectorWidget->currentLayerItem(); +} + +QgsSymbolLayerV2 *QgsSymbolV2SelectorDialog::currentLayer() +{ + return mSelectorWidget->currentLayer(); +} + +void QgsSymbolV2SelectorDialog::moveLayerByOffset( int offset ) +{ + mSelectorWidget->moveLayerByOffset( offset ); +} + +void QgsSymbolV2SelectorDialog::setWidget( QWidget *widget ) +{ + mSelectorWidget->setWidget( widget ); +} + +void QgsSymbolV2SelectorDialog::moveLayerDown() +{ + mSelectorWidget->moveLayerDown(); +} + +void QgsSymbolV2SelectorDialog::moveLayerUp() +{ + mSelectorWidget->moveLayerUp(); +} + +void QgsSymbolV2SelectorDialog::addLayer() +{ + mSelectorWidget->addLayer(); +} + +void QgsSymbolV2SelectorDialog::removeLayer() +{ + mSelectorWidget->removeLayer(); +} + +void QgsSymbolV2SelectorDialog::lockLayer() +{ + mSelectorWidget->lockLayer(); +} + +void QgsSymbolV2SelectorDialog::saveSymbol() +{ + mSelectorWidget->saveSymbol(); +} + +void QgsSymbolV2SelectorDialog::duplicateLayer() +{ + mSelectorWidget->duplicateLayer(); +} + +void QgsSymbolV2SelectorDialog::layerChanged() +{ + mSelectorWidget->layerChanged(); +} + +void QgsSymbolV2SelectorDialog::updateLayerPreview() +{ + mSelectorWidget->updateLayerPreview(); +} + +void QgsSymbolV2SelectorDialog::updatePreview() +{ + mSelectorWidget->updatePreview(); +} + +void QgsSymbolV2SelectorDialog::symbolChanged() +{ + mSelectorWidget->symbolChanged(); +} + +void QgsSymbolV2SelectorDialog::changeLayer( QgsSymbolLayerV2 *layer ) +{ + mSelectorWidget->changeLayer( layer ); +} diff --git a/src/gui/symbology-ng/qgssymbolv2selectordialog.h b/src/gui/symbology-ng/qgssymbolv2selectordialog.h index 2f0bf351a24..1b4afa287e7 100644 --- a/src/gui/symbology-ng/qgssymbolv2selectordialog.h +++ b/src/gui/symbology-ng/qgssymbolv2selectordialog.h @@ -21,9 +21,11 @@ #include "ui_qgssymbolv2selectordialogbase.h" #include "qgsdatadefined.h" +#include "qgspanelwidget.h" #include #include +#include class QgsStyleV2; class QgsSymbolV2; @@ -71,13 +73,27 @@ class DataDefinedRestorer: public QObject }; ///@endcond -class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymbolV2SelectorDialogBase +class QgsSymbolV2SelectorDialog; + +/** + * Symbol selector widget that cna be used to select and build a symbol + */ +class GUI_EXPORT QgsSymbolV2SelectorWidget: public QgsPanelWidget, private Ui::QgsSymbolV2SelectorDialogBase { Q_OBJECT + /// Too allow for non API break access from the dialog. + friend class QgsSymbolV2SelectorDialog; public: - QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent = nullptr, bool embedded = false ); - ~QgsSymbolV2SelectorDialog(); + /** + * Symbol selector widget that cna be used to select and build a symbol + * @param symbol The symbol to load into the widget as a start point. + * @param style The style used by the widget. + * @param vl The vector layer for the symbol. + * @param parent + */ + QgsSymbolV2SelectorWidget( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent = nullptr ); + ~QgsSymbolV2SelectorWidget(); //! return menu for "advanced" button - create it if doesn't exist and show the advanced button QMenu* advancedMenu(); @@ -112,9 +128,185 @@ class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymb */ QgsSymbolV2* symbol() { return mSymbol; } + /** + * Set the widget in dock mode which will emit showPanel when a sub widget requests + * to show a widget. + * @param dockMode True to enable dock mode. + */ + void setDockMode( bool dockMode ); + + protected: + + /** + * Reload the current symbol in the view. + */ + void loadSymbol(); + //! @note not available in python bindings + + /** + * Load the given symbol into the widget.. + * @param symbol The symbol to load. + * @param parent The parent symbol layer item. + */ + void loadSymbol( QgsSymbolV2* symbol, SymbolLayerItem* parent ); + + /** + * Update the state of the UI based on the currently set symbol layer. + */ + void updateUi(); + + /** + * Update the lock button states based on the current symbol layer. + */ + void updateLockButton(); + + //! @note not available in python bindings + SymbolLayerItem* currentLayerItem(); + + /** + * The current symbol layer that is active in the interface. + * @return The active symbol layer. + */ + QgsSymbolLayerV2* currentLayer(); + + /** + * Move the current active layer by a set offset in the list. + * @param offset The offset to move the layer by + */ + void moveLayerByOffset( int offset ); + + /** + * Set the properties widget for the active symbol layer. + * @param widget The widget to set to configure the active symbol layer. + */ + void setWidget( QWidget* widget ); + + signals: + /** + * Emiited when a symbol is modified in the widget. + */ + void symbolModified(); + + public slots: + /** + * Move the active symbol layer down. + */ + void moveLayerDown(); + + /** + * Move the active symbol layer up. + */ + void moveLayerUp(); + + /** + * Add a symobl layer to the bottom of the stack. + */ + void addLayer(); + + /** + * Remove the current active symbol layer. + */ + void removeLayer(); + + /** + * Lock the current active symbol layer. + */ + void lockLayer(); + + /** + * Save the current active symbol layer into the users saved styles. + */ + Q_DECL_DEPRECATED void saveSymbol(); + + //! Duplicates the current symbol layer and places the duplicated layer above the current symbol layer + //! @note added in QGIS 2.14 + void duplicateLayer(); + + /** + * Called when the layer changes in the widget. Updates the active properties for + * active symbol layer. + */ + void layerChanged(); + + /** + * Update the single symbol layer preview in the widget. + */ + void updateLayerPreview(); + + /** + * Update the preivew of the whole symbol in the iterface. + */ + void updatePreview(); + + //! Slot to update tree when a new symbol from style + void symbolChanged(); + //! alters tree and sets proper widget when Layer Type is changed + //! @note: The layer is received from the LayerPropertiesWidget + void changeLayer( QgsSymbolLayerV2* layer ); + + + protected: // data + QgsStyleV2* mStyle; + QgsSymbolV2* mSymbol; + QMenu* mAdvancedMenu; + const QgsVectorLayer* mVectorLayer; + + QStandardItemModel* model; + QWidget *mPresentWidget; + + private: + bool mDockMode; + QScopedPointer mDataDefineRestorer; + QScopedPointer< QgsExpressionContext > mPresetExpressionContext; + + QgsMapCanvas* mMapCanvas; +}; + + +class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog +{ + Q_OBJECT + + public: + QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent = nullptr, bool embedded = false ); + ~QgsSymbolV2SelectorDialog(); + + //! return menu for "advanced" button - create it if doesn't exist and show the advanced button + QMenu* advancedMenu(); + + /** Sets the optional expression context used for the widget. This expression context is used for + * evaluating data defined symbol properties and for populating based expression widgets in + * the layer widget. + * @param context expression context pointer. Ownership is transferred to the dialog. + * @note added in QGIS 2.12 + * @see expressionContext() + */ + void setExpressionContext( QgsExpressionContext* context ); + + /** Returns the expression context used for the dialog, if set. This expression context is used for + * evaluating data defined symbol properties and for populating based expression widgets in + * the dialog. + * @note added in QGIS 2.12 + * @see setExpressionContext() + */ + QgsExpressionContext* expressionContext() const; + + /** Sets the map canvas associated with the dialog. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @note added in QGIS 2.12 + */ + void setMapCanvas( QgsMapCanvas* canvas ); + + /** + * @brief Return the symbol that is currently active in the widget. Can be null. + * @return The active symbol. + */ + QgsSymbolV2* symbol(); + protected: //! Reimplements dialog keyPress event so we can ignore it - void keyPressEvent( QKeyEvent * event ) override; + void keyPressEvent( QKeyEvent * e ) override; void loadSymbol(); //! @note not available in python bindings @@ -161,21 +353,9 @@ class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymb //! @note: The layer is received from the LayerPropertiesWidget void changeLayer( QgsSymbolLayerV2* layer ); - - protected: // data - QgsStyleV2* mStyle; - QgsSymbolV2* mSymbol; - QMenu* mAdvancedMenu; - const QgsVectorLayer* mVectorLayer; - - QStandardItemModel* model; - QWidget *mPresentWidget; - private: - QScopedPointer mDataDefineRestorer; - QScopedPointer< QgsExpressionContext > mPresetExpressionContext; - - QgsMapCanvas* mMapCanvas; + QgsSymbolV2SelectorWidget* mSelectorWidget; + QDialogButtonBox* mButtonBox; }; #endif diff --git a/src/ui/qgsrendererv2propsdialogbase.ui b/src/ui/qgsrendererv2propsdialogbase.ui index 9b02cd16e7f..52ff5a645ab 100644 --- a/src/ui/qgsrendererv2propsdialogbase.ui +++ b/src/ui/qgsrendererv2propsdialogbase.ui @@ -27,7 +27,7 @@ 0 - + @@ -218,7 +218,6 @@ - @@ -241,6 +240,12 @@
effects/qgseffectstackpropertieswidget.h
1 + + QgsPanelWidgetStackWidget + QStackedWidget +
qgspanelwidget.h
+ 1 +
cboRenderers diff --git a/src/ui/qgssymbolv2selectordialogbase.ui b/src/ui/qgssymbolv2selectordialogbase.ui index 2fdcf2aea1e..93cd30cfb37 100644 --- a/src/ui/qgssymbolv2selectordialogbase.ui +++ b/src/ui/qgssymbolv2selectordialogbase.ui @@ -1,297 +1,249 @@ - - - QgsSymbolV2SelectorDialogBase - - - - 0 - 0 - 364 - 594 - - - - Symbol selector - - - - 0 - - - 0 - - - 0 - - - - - QFrame::NoFrame - - - true - - - - - 0 - 0 - 364 - 552 - - - - - 0 - - - - - - - - 0 - 0 - - - - - 16777215 - 100 - - - - QAbstractItemView::NoEditTriggers - - - - - - - - 0 - 0 - - - - - 100 - 100 - - - - QFrame::NoFrame - - - QFrame::Sunken - - - - - - Qt::AlignCenter - - - - - - - - - 6 - - - - - - 50 - 16777215 - - - - Add symbol layer - - - - - - - - 50 - 16777215 - - - - Remove symbol layer - - - - - - - - 50 - 16777215 - - - - Lock layer's color - - - true - - - - - - - - 50 - 16777215 - - - - Duplicates the current layer - - - - - - - - - - - 50 - 16777215 - - - - Move up - - - - - - - - 50 - 16777215 - - - - Move down - - - - - - - Qt::Horizontal - - - - 20 - 20 - - - - - - - - - - Qt::Horizontal - - - - - - - - 4 - 0 - - - - QFrame::NoFrame - - - QFrame::Sunken - - - - 0 - - - 0 - - - - - - 2 - 0 - - - - - - - - - - frame - line - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - QgsSymbolV2SelectorDialogBase - accept() - - - 257 - 406 - - - 157 - 274 - - - - - buttonBox - rejected() - QgsSymbolV2SelectorDialogBase - reject() - - - 325 - 406 - - - 286 - 274 - - - - - + + + QgsSymbolV2SelectorDialogBase + + + + 0 + 0 + 341 + 616 + + + + Form + + + + 0 + + + + + QFrame::NoFrame + + + true + + + + + 0 + 0 + 341 + 616 + + + + + 0 + + + + + 6 + + + + + + 50 + 16777215 + + + + Add symbol layer + + + + + + + + 50 + 16777215 + + + + Remove symbol layer + + + + + + + + 50 + 16777215 + + + + Lock layer's color + + + true + + + + + + + + 50 + 16777215 + + + + Duplicates the current layer + + + + + + + + + + + 50 + 16777215 + + + + Move up + + + + + + + + 50 + 16777215 + + + + Move down + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + 4 + 0 + + + + QFrame::NoFrame + + + QFrame::Sunken + + + + 0 + + + 0 + + + + + + 2 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 100 + + + + QAbstractItemView::NoEditTriggers + + + + + + + + 0 + 0 + + + + + 100 + 100 + + + + QFrame::NoFrame + + + QFrame::Sunken + + + + + + Qt::AlignCenter + + + + + + + frame + line + + + + + + + + + diff --git a/src/ui/styledock/qgsrenderercontainerbase.ui b/src/ui/styledock/qgsrenderercontainerbase.ui index a7654413d14..fdfdf3dc0e4 100644 --- a/src/ui/styledock/qgsrenderercontainerbase.ui +++ b/src/ui/styledock/qgsrenderercontainerbase.ui @@ -1,44 +1,63 @@ - - - QgsRendererWidgetContainerBase - - - - 0 - 0 - 375 - 628 - - - - Form - - - - - - - 0 - 0 - - - - TextLabel - - - - - - - - - - QDialogButtonBox::Close - - - - - - - - + + + QgsRendererWidgetContainerBase + + + + 0 + 0 + 375 + 628 + + + + Form + + + + + + + + + 0 + 0 + + + + Back + + + + :/images/themes/default/mActionArrowLeft.png:/images/themes/default/mActionArrowLeft.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + +