Fix globe plugin

This commit is contained in:
Nathan 2016-07-07 09:22:30 +10:00 committed by Nathan Woodrow
parent 7dd6104982
commit e097443771
18 changed files with 400 additions and 294 deletions

View File

@ -136,6 +136,7 @@
%Include qgsorderbydialog.sip %Include qgsorderbydialog.sip
%Include qgsowssourceselect.sip %Include qgsowssourceselect.sip
%Include qgspanelwidget.sip %Include qgspanelwidget.sip
%Include qgspanelwidgetstack.sip
%Include qgspixmaplabel.sip %Include qgspixmaplabel.sip
%Include qgspluginmanagerinterface.sip %Include qgspluginmanagerinterface.sip
%Include qgsprevieweffect.sip %Include qgsprevieweffect.sip

View File

@ -29,6 +29,10 @@ class QgsMapLayerConfigWidgetFactory
*/ */
virtual QString title() const; virtual QString title() const;
virtual bool supportsStyleDock() const;
virtual bool supportLayerPropertiesDialog() const;
/** /**
* @brief Check if the layer is supported for this widget. * @brief Check if the layer is supported for this widget.
* @return True if this layer is supported for this widget * @return True if this layer is supported for this widget

View File

@ -156,75 +156,3 @@ class QgsPanelWidgetWrapper: public QgsPanelWidget
*/ */
QWidget* widget(); QWidget* widget();
}; };
/**
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* Any widgets that want to have a non blocking panel based interface should use this
* class to manage the panels.
*/
class QgsPanelWidgetStack: public QWidget
{
%TypeHeaderCode
#include "qgspanelwidget.h"
%End
public:
/**
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* @param parent
*/
QgsPanelWidgetStack( QWidget* parent = nullptr );
/**
* Adds the main widget to the stack and selects it for the user
* The main widget can not be closed and only the showPanel signal is attached
* to handle children widget opening panels.
* @param panel The panel to set as the first widget in the stack.
*/
void addMainPanel( QgsPanelWidget* panel );
/**
* The main widget that is set in the stack. The main widget can not be closed
* and doesn't display a back button.
* @return The main QgsPanelWidget that is active in the stack.
*/
QgsPanelWidget* mainWidget();
/**
* Removes the main widget from the stack and transfers ownsership to the
* caller.
* @return The main widget that is set in the stack.
*/
QgsPanelWidget* takeMainWidget();
/**
* Clear the stack of all widgets. Unless the panels autoDelete is set to false
* the widget will be deleted.
*/
void clear();
public slots:
/**
* Accept the current active widget in the stack.
*
* Calls the panelAccepeted signal on the active widget.
*/
void acceptCurrentPanel();
/**
* Show a panel in the stack widget. Will connect to the panels showPanel event to handle
* nested panels. Auto switches the the given panel for the user.
* @param panel The panel to show.
*/
void showPanel( QgsPanelWidget* panel );
/**
* Closes the panel in the widget. Will also delete the widget.
* This slot is normally auto connected to panelAccepted when a panel is shown.
* @param panel The panel to close.
*/
void closePanel( QgsPanelWidget* panel );
};

View File

@ -0,0 +1,71 @@
/**
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* Any widgets that want to have a non blocking panel based interface should use this
* class to manage the panels.
*/
class QgsPanelWidgetStack: public QWidget
{
%TypeHeaderCode
#include "qgspanelwidgetstack.h"
%End
public:
/**
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* @param parent
*/
QgsPanelWidgetStack( QWidget* parent = nullptr );
/**
* Adds the main widget to the stack and selects it for the user
* The main widget can not be closed and only the showPanel signal is attached
* to handle children widget opening panels.
* @param panel The panel to set as the first widget in the stack.
*/
void addMainPanel( QgsPanelWidget* panel );
/**
* The main widget that is set in the stack. The main widget can not be closed
* and doesn't display a back button.
* @return The main QgsPanelWidget that is active in the stack.
*/
QgsPanelWidget* mainWidget();
/**
* Removes the main widget from the stack and transfers ownsership to the
* caller.
* @return The main widget that is set in the stack.
*/
QgsPanelWidget* takeMainWidget();
/**
* Clear the stack of all widgets. Unless the panels autoDelete is set to false
* the widget will be deleted.
*/
void clear();
public slots:
/**
* Accept the current active widget in the stack.
*
* Calls the panelAccepeted signal on the active widget.
*/
void acceptCurrentPanel();
/**
* Show a panel in the stack widget. Will connect to the panels showPanel event to handle
* nested panels. Auto switches the the given panel for the user.
* @param panel The panel to show.
*/
void showPanel( QgsPanelWidget* panel );
/**
* Closes the panel in the widget. Will also delete the widget.
* This slot is normally auto connected to panelAccepted when a panel is shown.
* @param panel The panel to close.
*/
void closePanel( QgsPanelWidget* panel );
};

View File

@ -1,7 +1,7 @@
/** /**
* @brief Widget to control a layers transparency and related options * @brief Widget to control a layers transparency and related options
*/ */
class QgsRasterTransparencyWidget: QgsPanelWidgetStack class QgsRasterTransparencyWidget: QgsMapLayerConfigWidget
{ {
%TypeHeaderCode %TypeHeaderCode
#include <qgsrastertransparencywidget.h> #include <qgsrastertransparencywidget.h>

View File

@ -173,7 +173,7 @@ void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
Q_FOREACH ( QgsMapLayerConfigWidgetFactory* factory, mPageFactories ) Q_FOREACH ( QgsMapLayerConfigWidgetFactory* factory, mPageFactories )
{ {
if ( factory->supportsLayer( layer ) ) if ( factory->supportsStyleDock() && factory->supportsLayer( layer ) )
{ {
QListWidgetItem* item = new QListWidgetItem( factory->icon(), QString() ); QListWidgetItem* item = new QListWidgetItem( factory->icon(), QString() );
mOptionsListWidget->addItem( item ); mOptionsListWidget->addItem( item );

View File

@ -329,19 +329,21 @@ void QgsVectorLayerProperties::setLabelCheckBox()
void QgsVectorLayerProperties::addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory* factory ) void QgsVectorLayerProperties::addPropertiesPageFactory( QgsMapLayerConfigWidgetFactory* factory )
{ {
if ( !factory->supportLayerPropertiesDialog() )
{
return;
}
QListWidgetItem* item = new QListWidgetItem(); QListWidgetItem* item = new QListWidgetItem();
item->setIcon( factory->icon() ); item->setIcon( factory->icon() );
item->setText( factory->title() ); item->setText( factory->title() );
item->setToolTip( factory->title() ); item->setToolTip( factory->title() );
if ( item )
{
mOptionsListWidget->addItem( item ); mOptionsListWidget->addItem( item );
QgsMapLayerConfigWidget* page = factory->createWidget( mLayer, nullptr, false, this ); QgsMapLayerConfigWidget* page = factory->createWidget( mLayer, nullptr, false, this );
mLayerPropertiesPages << page; mLayerPropertiesPages << page;
mOptionsStackedWidget->addWidget( page ); mOptionsStackedWidget->addWidget( page );
}
} }
void QgsVectorLayerProperties::insertField() void QgsVectorLayerProperties::insertField()

View File

@ -275,6 +275,7 @@ SET(QGIS_GUI_SRCS
qgsowssourceselect.cpp qgsowssourceselect.cpp
qgssourceselectdialog.cpp qgssourceselectdialog.cpp
qgspanelwidget.cpp qgspanelwidget.cpp
qgspanelwidgetstack.cpp
qgspixmaplabel.cpp qgspixmaplabel.cpp
qgspluginmanagerinterface.cpp qgspluginmanagerinterface.cpp
qgsprevieweffect.cpp qgsprevieweffect.cpp
@ -425,6 +426,7 @@ SET(QGIS_GUI_MOC_HDRS
qgsowssourceselect.h qgsowssourceselect.h
qgssourceselectdialog.h qgssourceselectdialog.h
qgspanelwidget.h qgspanelwidget.h
qgspanelwidgetstack.h
qgspixmaplabel.h qgspixmaplabel.h
qgspluginmanagerinterface.h qgspluginmanagerinterface.h
qgsprevieweffect.h qgsprevieweffect.h

View File

@ -47,6 +47,18 @@ class GUI_EXPORT QgsMapLayerConfigWidgetFactory
*/ */
virtual QString title() const { return QString(); } virtual QString title() const { return QString(); }
/**
* Flag if widget is supported for use in style dock.
* @return True if supported
*/
virtual bool supportsStyleDock() const { return false; }
/**
* Flag if widget is supported for use in layer properties dialog.
* @return True if supported
*/
virtual bool supportLayerPropertiesDialog() const { return false; }
/** /**
* @brief Check if the layer is supported for this widget. * @brief Check if the layer is supported for this widget.
* @return True if this layer is supported for this widget * @return True if this layer is supported for this widget

View File

@ -16,6 +16,7 @@
#include <QPushButton> #include <QPushButton>
#include <QDialog> #include <QDialog>
#include <QSettings> #include <QSettings>
#include <QVBoxLayout>
#include "qgspanelwidget.h" #include "qgspanelwidget.h"
#include "qgslogger.h" #include "qgslogger.h"
@ -84,117 +85,6 @@ void QgsPanelWidget::keyPressEvent( QKeyEvent *event )
} }
} }
QgsPanelWidgetStack::QgsPanelWidgetStack( QWidget *parent )
: QWidget( parent )
{
setupUi( this );
clear();
connect( mBackButton, SIGNAL( pressed() ), this, SLOT( acceptCurrentPanel() ) );
}
void QgsPanelWidgetStack::addMainPanel( QgsPanelWidget *panel )
{
// TODO Don't allow adding another main widget or else that would be strange for the user.
connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ),
// using unique connection because addMainPanel() may be called multiple times
// for a panel, so showPanel() slot could be invoked more times from one signal
Qt::UniqueConnection );
mStackedWidget->insertWidget( 0, panel );
mStackedWidget->setCurrentIndex( 0 );
}
QgsPanelWidget *QgsPanelWidgetStack::mainWidget()
{
return qobject_cast<QgsPanelWidget*>( mStackedWidget->widget( 0 ) );
}
QgsPanelWidget *QgsPanelWidgetStack::takeMainWidget()
{
QWidget* widget = mStackedWidget->widget( 0 );
mStackedWidget->removeWidget( widget );
return qobject_cast<QgsPanelWidget*>( widget );
}
void QgsPanelWidgetStack::clear()
{
for ( int i = mStackedWidget->count(); i >= 0; i-- )
{
if ( QgsPanelWidget* panelWidget = qobject_cast<QgsPanelWidget*>( mStackedWidget->widget( i ) ) )
{
mStackedWidget->removeWidget( panelWidget );
if ( panelWidget->autoDelete() )
{
panelWidget->deleteLater();
}
}
else if ( QWidget* widget = mStackedWidget->widget( i ) )
{
mStackedWidget->removeWidget( widget );
widget->deleteLater();
}
}
mTitles.clear();
mTitleText->hide();
mBackButton->hide();
this->updateBreadcrumb();
}
void QgsPanelWidgetStack::acceptCurrentPanel()
{
// You can't accept the main panel.
if ( mStackedWidget->currentIndex() == 0 )
return;
QgsPanelWidget* widget = qobject_cast<QgsPanelWidget*>( mStackedWidget->currentWidget() );
widget->acceptPanel();
}
void QgsPanelWidgetStack::showPanel( QgsPanelWidget *panel )
{
mTitles.push( panel->panelTitle() );
connect( panel, SIGNAL( panelAccepted( QgsPanelWidget* ) ), this, SLOT( closePanel( QgsPanelWidget* ) ) );
connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ) );
int index = mStackedWidget->addWidget( panel );
mStackedWidget->setCurrentIndex( index );
mBackButton->show();
mTitleText->show();
this->updateBreadcrumb();
}
void QgsPanelWidgetStack::closePanel( QgsPanelWidget *panel )
{
mTitles.pop();
mStackedWidget->setCurrentIndex( mStackedWidget->currentIndex() - 1 );
mStackedWidget->removeWidget( panel );
if ( panel->autoDelete() )
{
panel->deleteLater();
}
if ( mStackedWidget->currentIndex() == 0 )
{
mBackButton->hide();
mTitleText->hide();
}
this->updateBreadcrumb();
}
void QgsPanelWidgetStack::updateBreadcrumb()
{
QString breadcrumb;
Q_FOREACH ( QString title, mTitles )
{
breadcrumb += QString( " %1 >" ).arg( title );
}
// Remove the last
breadcrumb.chop( 1 );
mTitleText->setText( breadcrumb );
}
QgsPanelWidgetWrapper::QgsPanelWidgetWrapper( QWidget *widget, QWidget *parent ) QgsPanelWidgetWrapper::QgsPanelWidgetWrapper( QWidget *widget, QWidget *parent )
: QgsPanelWidget( parent ) : QgsPanelWidget( parent )
, mWidget( widget ) , mWidget( widget )

View File

@ -17,12 +17,8 @@
#include <QWidget> #include <QWidget>
#include <QKeyEvent> #include <QKeyEvent>
#include <QStackedWidget>
#include <QStack> #include <QStack>
#include "ui_qgsrenderercontainerbase.h"
/** \ingroup gui /** \ingroup gui
* @brief Base class for any widget that can be shown as a inline panel * @brief Base class for any widget that can be shown as a inline panel
*/ */
@ -188,78 +184,4 @@ class GUI_EXPORT QgsPanelWidgetWrapper: public QgsPanelWidget
}; };
/** \ingroup gui
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* Any widgets that want to have a non blocking panel based interface should use this
* class to manage the panels.
*/
class GUI_EXPORT QgsPanelWidgetStack : public QWidget, private Ui::QgsRendererWidgetContainerBase
{
Q_OBJECT
public:
/**
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* @param parent
*/
QgsPanelWidgetStack( QWidget* parent = nullptr );
/**
* Adds the main widget to the stack and selects it for the user
* The main widget can not be closed and only the showPanel signal is attached
* to handle children widget opening panels.
* @param panel The panel to set as the first widget in the stack.
*/
void addMainPanel( QgsPanelWidget* panel );
/**
* The main widget that is set in the stack. The main widget can not be closed
* and doesn't display a back button.
* @return The main QgsPanelWidget that is active in the stack.
*/
QgsPanelWidget* mainWidget();
/**
* Removes the main widget from the stack and transfers ownsership to the
* caller.
* @return The main widget that is set in the stack.
*/
QgsPanelWidget* takeMainWidget();
/**
* Clear the stack of all widgets. Unless the panels autoDelete is set to false
* the widget will be deleted.
*/
void clear();
public slots:
/**
* Accept the current active widget in the stack.
*
* Calls the panelAccepeted signal on the active widget.
*/
void acceptCurrentPanel();
/**
* Show a panel in the stack widget. Will connect to the panels showPanel event to handle
* nested panels. Auto switches the the given panel for the user.
* @param panel The panel to show.
*/
void showPanel( QgsPanelWidget* panel );
/**
* Closes the panel in the widget. Will also delete the widget.
* This slot is normally auto connected to panelAccepted when a panel is shown.
* @param panel The panel to close.
*/
void closePanel( QgsPanelWidget* panel );
private:
void updateBreadcrumb();
QStack<QString> mTitles;
};
#endif // QGSPANELWIDGET_H #endif // QGSPANELWIDGET_H

View File

@ -0,0 +1,135 @@
/***************************************************************************
qgspanelwidget.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 <QDialogButtonBox>
#include <QPushButton>
#include <QDialog>
#include <QSettings>
#include "qgslogger.h"
#include "qgspanelwidgetstack.h"
#include "qgspanelwidget.h"
QgsPanelWidgetStack::QgsPanelWidgetStack( QWidget *parent )
: QWidget( parent )
{
setupUi( this );
clear();
connect( mBackButton, SIGNAL( pressed() ), this, SLOT( acceptCurrentPanel() ) );
}
void QgsPanelWidgetStack::addMainPanel( QgsPanelWidget *panel )
{
// TODO Don't allow adding another main widget or else that would be strange for the user.
connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ),
// using unique connection because addMainPanel() may be called multiple times
// for a panel, so showPanel() slot could be invoked more times from one signal
Qt::UniqueConnection );
mStackedWidget->insertWidget( 0, panel );
mStackedWidget->setCurrentIndex( 0 );
}
QgsPanelWidget *QgsPanelWidgetStack::mainWidget()
{
return qobject_cast<QgsPanelWidget*>( mStackedWidget->widget( 0 ) );
}
QgsPanelWidget *QgsPanelWidgetStack::takeMainWidget()
{
QWidget* widget = mStackedWidget->widget( 0 );
mStackedWidget->removeWidget( widget );
return qobject_cast<QgsPanelWidget*>( widget );
}
void QgsPanelWidgetStack::clear()
{
for ( int i = mStackedWidget->count(); i >= 0; i-- )
{
if ( QgsPanelWidget* panelWidget = qobject_cast<QgsPanelWidget*>( mStackedWidget->widget( i ) ) )
{
mStackedWidget->removeWidget( panelWidget );
if ( panelWidget->autoDelete() )
{
panelWidget->deleteLater();
}
}
else if ( QWidget* widget = mStackedWidget->widget( i ) )
{
mStackedWidget->removeWidget( widget );
widget->deleteLater();
}
}
mTitles.clear();
mTitleText->hide();
mBackButton->hide();
this->updateBreadcrumb();
}
void QgsPanelWidgetStack::acceptCurrentPanel()
{
// You can't accept the main panel.
if ( mStackedWidget->currentIndex() == 0 )
return;
QgsPanelWidget* widget = qobject_cast<QgsPanelWidget*>( mStackedWidget->currentWidget() );
widget->acceptPanel();
}
void QgsPanelWidgetStack::showPanel( QgsPanelWidget *panel )
{
mTitles.push( panel->panelTitle() );
connect( panel, SIGNAL( panelAccepted( QgsPanelWidget* ) ), this, SLOT( closePanel( QgsPanelWidget* ) ) );
connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ) );
int index = mStackedWidget->addWidget( panel );
mStackedWidget->setCurrentIndex( index );
mBackButton->show();
mTitleText->show();
this->updateBreadcrumb();
}
void QgsPanelWidgetStack::closePanel( QgsPanelWidget *panel )
{
mTitles.pop();
mStackedWidget->setCurrentIndex( mStackedWidget->currentIndex() - 1 );
mStackedWidget->removeWidget( panel );
if ( panel->autoDelete() )
{
panel->deleteLater();
}
if ( mStackedWidget->currentIndex() == 0 )
{
mBackButton->hide();
mTitleText->hide();
}
this->updateBreadcrumb();
}
void QgsPanelWidgetStack::updateBreadcrumb()
{
QString breadcrumb;
Q_FOREACH ( QString title, mTitles )
{
breadcrumb += QString( " %1 >" ).arg( title );
}
// Remove the last
breadcrumb.chop( 1 );
mTitleText->setText( breadcrumb );
}

View File

@ -0,0 +1,101 @@
/***************************************************************************
qgspanelwidgetstack.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 QGSPANELWIDGETSTACK_H
#define QGSPANELWIDGETSTACK_H
#include <QWidget>
#include <QKeyEvent>
#include <QStackedWidget>
#include <QStack>
#include "qgspanelwidget.h"
#include "ui_qgsrenderercontainerbase.h"
/** \ingroup gui
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* Any widgets that want to have a non blocking panel based interface should use this
* class to manage the panels.
*/
class GUI_EXPORT QgsPanelWidgetStack : public QWidget, private Ui::QgsRendererWidgetContainerBase
{
Q_OBJECT
public:
/**
* A stack widget to manage panels in the interface. Handles the open and close events
* for added panels.
* @param parent
*/
QgsPanelWidgetStack( QWidget* parent = nullptr );
/**
* Adds the main widget to the stack and selects it for the user
* The main widget can not be closed and only the showPanel signal is attached
* to handle children widget opening panels.
* @param panel The panel to set as the first widget in the stack.
*/
void addMainPanel( QgsPanelWidget* panel );
/**
* The main widget that is set in the stack. The main widget can not be closed
* and doesn't display a back button.
* @return The main QgsPanelWidget that is active in the stack.
*/
QgsPanelWidget* mainWidget();
/**
* Removes the main widget from the stack and transfers ownsership to the
* caller.
* @return The main widget that is set in the stack.
*/
QgsPanelWidget* takeMainWidget();
/**
* Clear the stack of all widgets. Unless the panels autoDelete is set to false
* the widget will be deleted.
*/
void clear();
public slots:
/**
* Accept the current active widget in the stack.
*
* Calls the panelAccepeted signal on the active widget.
*/
void acceptCurrentPanel();
/**
* Show a panel in the stack widget. Will connect to the panels showPanel event to handle
* nested panels. Auto switches the the given panel for the user.
* @param panel The panel to show.
*/
void showPanel( QgsPanelWidget* panel );
/**
* Closes the panel in the widget. Will also delete the widget.
* This slot is normally auto connected to panelAccepted when a panel is shown.
* @param panel The panel to close.
*/
void closePanel( QgsPanelWidget* panel );
private:
void updateBreadcrumb();
QStack<QString> mTitles;
};
#endif // QGSPANELWIDGETSTACK_H

View File

@ -272,7 +272,7 @@ void GlobePlugin::initGui()
mQGisIface->addPluginToMenu( tr( "&Globe" ), mActionToggleGlobe ); mQGisIface->addPluginToMenu( tr( "&Globe" ), mActionToggleGlobe );
mLayerPropertiesFactory = new QgsGlobeLayerPropertiesFactory( this ); mLayerPropertiesFactory = new QgsGlobeLayerPropertiesFactory( this );
mQGisIface->registerMapLayerPropertiesFactory( mLayerPropertiesFactory ); mQGisIface->registerMapLayerConfigWidgetFactory( mLayerPropertiesFactory );
connect( mActionToggleGlobe, SIGNAL( triggered( bool ) ), this, SLOT( setGlobeEnabled( bool ) ) ); connect( mActionToggleGlobe, SIGNAL( triggered( bool ) ), this, SLOT( setGlobeEnabled( bool ) ) );
connect( mLayerPropertiesFactory, SIGNAL( layerSettingsChanged( QgsMapLayer* ) ), this, SLOT( layerChanged( QgsMapLayer* ) ) ); connect( mLayerPropertiesFactory, SIGNAL( layerSettingsChanged( QgsMapLayer* ) ), this, SLOT( layerChanged( QgsMapLayer* ) ) );
@ -1090,7 +1090,7 @@ void GlobePlugin::unload()
} }
mQGisIface->removePluginMenu( tr( "&Globe" ), mActionToggleGlobe ); mQGisIface->removePluginMenu( tr( "&Globe" ), mActionToggleGlobe );
mQGisIface->removeToolBarIcon( mActionToggleGlobe ); mQGisIface->removeToolBarIcon( mActionToggleGlobe );
mQGisIface->unregisterMapLayerPropertiesFactory( mLayerPropertiesFactory ); mQGisIface->unregisterMapLayerConfigWidgetFactory( mLayerPropertiesFactory );
delete mLayerPropertiesFactory; delete mLayerPropertiesFactory;
mLayerPropertiesFactory = 0; mLayerPropertiesFactory = 0;
delete mSettingsDialog; delete mSettingsDialog;

View File

@ -34,8 +34,8 @@ QgsGlobeVectorLayerConfig* QgsGlobeVectorLayerConfig::getConfig( QgsVectorLayer*
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
QgsGlobeVectorLayerPropertiesPage::QgsGlobeVectorLayerPropertiesPage( QgsVectorLayer* layer, QWidget *parent ) QgsGlobeVectorLayerPropertiesPage::QgsGlobeVectorLayerPropertiesPage( QgsVectorLayer* layer, QgsMapCanvas *canvas, QWidget *parent )
: QgsVectorLayerPropertiesPage( parent ) : QgsMapLayerConfigWidget( layer, canvas, parent )
, mLayer( layer ) , mLayer( layer )
{ {
setupUi( this ); setupUi( this );
@ -190,17 +190,27 @@ QgsGlobeLayerPropertiesFactory::QgsGlobeLayerPropertiesFactory( QObject *parent
connect( QgsProject::instance(), SIGNAL( writeMapLayer( QgsMapLayer*, QDomElement&, QDomDocument& ) ), this, SLOT( writeGlobeVectorLayerConfig( QgsMapLayer*, QDomElement&, QDomDocument& ) ) ); connect( QgsProject::instance(), SIGNAL( writeMapLayer( QgsMapLayer*, QDomElement&, QDomDocument& ) ), this, SLOT( writeGlobeVectorLayerConfig( QgsMapLayer*, QDomElement&, QDomDocument& ) ) );
} }
QgsVectorLayerPropertiesPage* QgsGlobeLayerPropertiesFactory::createVectorLayerPropertiesPage( QgsVectorLayer* layer, QWidget* parent ) QgsMapLayerConfigWidget *QgsGlobeLayerPropertiesFactory::createWidget( QgsMapLayer *layer, QgsMapCanvas *canvas, bool dockWidget, QWidget *parent ) const
{ {
QgsGlobeVectorLayerPropertiesPage* propsPage = new QgsGlobeVectorLayerPropertiesPage( layer, parent ); Q_UNUSED( dockWidget );
QgsGlobeVectorLayerPropertiesPage* propsPage = new QgsGlobeVectorLayerPropertiesPage( qobject_cast<QgsVectorLayer*>( layer ), canvas, parent );
connect( propsPage, SIGNAL( layerSettingsChanged( QgsMapLayer* ) ), this, SIGNAL( layerSettingsChanged( QgsMapLayer* ) ) ); connect( propsPage, SIGNAL( layerSettingsChanged( QgsMapLayer* ) ), this, SIGNAL( layerSettingsChanged( QgsMapLayer* ) ) );
return propsPage; return propsPage;
} }
QListWidgetItem* QgsGlobeLayerPropertiesFactory::createVectorLayerPropertiesItem( QgsVectorLayer* layer, QListWidget* view ) QIcon QgsGlobeLayerPropertiesFactory::icon() const
{ {
Q_UNUSED( layer ); return QIcon( ":/globe/icon.svg" );
return new QListWidgetItem( QIcon( ":/globe/icon.svg" ), tr( "Globe" ), view ); }
QString QgsGlobeLayerPropertiesFactory::title() const
{
return tr( "Globe" );
}
bool QgsGlobeLayerPropertiesFactory::supportsLayer( QgsMapLayer *layer ) const
{
return layer->type() == QgsMapLayer::VectorLayer;
} }
void QgsGlobeLayerPropertiesFactory::readGlobeVectorLayerConfig( QgsMapLayer* mapLayer, const QDomElement& elem ) void QgsGlobeLayerPropertiesFactory::readGlobeVectorLayerConfig( QgsMapLayer* mapLayer, const QDomElement& elem )

View File

@ -16,8 +16,11 @@
#ifndef QGSGLOBEVECTORLAYERPROPERTIES_H #ifndef QGSGLOBEVECTORLAYERPROPERTIES_H
#define QGSGLOBEVECTORLAYERPROPERTIES_H #define QGSGLOBEVECTORLAYERPROPERTIES_H
#include <QIcon>
#include "ui_qgsglobevectorlayerpropertiespage.h" #include "ui_qgsglobevectorlayerpropertiespage.h"
#include <qgsmaplayerpropertiesfactory.h> #include <qgsmaplayerconfigwidget.h>
#include <qgsmaplayerconfigwidgetfactory.h>
#include <osgEarthSymbology/AltitudeSymbol> #include <osgEarthSymbology/AltitudeSymbol>
class QgsGlobeVectorLayerConfig; class QgsGlobeVectorLayerConfig;
@ -79,12 +82,12 @@ class QgsGlobeVectorLayerConfig : public QObject
}; };
class QgsGlobeVectorLayerPropertiesPage : public QgsVectorLayerPropertiesPage, private Ui::QgsGlobeVectorLayerPropertiesPage class QgsGlobeVectorLayerPropertiesPage : public QgsMapLayerConfigWidget, private Ui::QgsGlobeVectorLayerPropertiesPage
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit QgsGlobeVectorLayerPropertiesPage( QgsVectorLayer* layer, QWidget *parent = 0 ); explicit QgsGlobeVectorLayerPropertiesPage( QgsVectorLayer* layer, QgsMapCanvas* canvas, QWidget *parent = 0 );
public slots: public slots:
virtual void apply(); virtual void apply();
@ -102,13 +105,20 @@ class QgsGlobeVectorLayerPropertiesPage : public QgsVectorLayerPropertiesPage, p
}; };
class QgsGlobeLayerPropertiesFactory : public QObject, public QgsMapLayerPropertiesFactory class QgsGlobeLayerPropertiesFactory : public QObject, public QgsMapLayerConfigWidgetFactory
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit QgsGlobeLayerPropertiesFactory( QObject* parent = 0 ); explicit QgsGlobeLayerPropertiesFactory( QObject* parent = 0 );
QgsVectorLayerPropertiesPage* createVectorLayerPropertiesPage( QgsVectorLayer* layer, QWidget* parent ) override; QgsMapLayerConfigWidget* createWidget( QgsMapLayer *layer, QgsMapCanvas *canvas, bool dockWidget, QWidget *parent ) const override;
QListWidgetItem* createVectorLayerPropertiesItem( QgsVectorLayer* layer, QListWidget* view ) override;
QIcon icon() const override;
QString title() const override;
bool supportLayerPropertiesDialog() const override { return true; }
bool supportsLayer( QgsMapLayer *layer ) const override;
signals: signals:
void layerSettingsChanged( QgsMapLayer* layer ); void layerSettingsChanged( QgsMapLayer* layer );

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>QgsGlobeVectorLayerPropertiesPage</class> <class>QgsGlobeVectorLayerPropertiesPage</class>
<widget class="QgsVectorLayerPropertiesPage" name="QgsGlobeVectorLayerPropertiesPage"> <widget class="QgsMapLayerConfigWidget" name="QgsGlobeVectorLayerPropertiesPage">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -17,7 +17,7 @@
<item row="1" column="0" colspan="2"> <item row="1" column="0" colspan="2">
<widget class="QStackedWidget" name="stackedWidgetRenderingMode"> <widget class="QStackedWidget" name="stackedWidgetRenderingMode">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="pageRasterized"> <widget class="QWidget" name="pageRasterized">
<layout class="QVBoxLayout" name="verticalLayout"/> <layout class="QVBoxLayout" name="verticalLayout"/>
@ -261,9 +261,9 @@
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
<class>QgsVectorLayerPropertiesPage</class> <class>QgsMapLayerConfigWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>qgsvectorlayerpropertiespage.h</header> <header>qgsmaplayerconfigwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>

View File

@ -14,7 +14,16 @@
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<property name="margin"> <property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number> <number>3</number>
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
@ -35,12 +44,21 @@
</widget> </widget>
<widget class="QWidget" name="page_2"> <widget class="QWidget" name="page_2">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing"> <property name="horizontalSpacing">
<number>3</number> <number>3</number>
</property> </property>
<property name="margin">
<number>0</number>
</property>
<item row="2" column="1"> <item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing"> <property name="spacing">
@ -204,7 +222,7 @@
<customwidget> <customwidget>
<class>QgsPanelWidgetStack</class> <class>QgsPanelWidgetStack</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>qgspanelwidget.h</header> <header>qgspanelwidgetstack.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>