Move processing algorithm configuration code to gui lib

This commit is contained in:
Matthias Kuhn 2018-04-07 11:13:14 +02:00
parent 31d7e4b6a0
commit eb39d2379c
24 changed files with 232 additions and 187 deletions

View File

@ -367,7 +367,6 @@
%Include locator/qgslocator.sip
%Include locator/qgslocatorfilter.sip
%Include locator/qgslocatormodel.sip
%Include processing/qgsprocessingalgorithmconfigurationwidget.sip
%Include processing/qgsprocessingalgrunnertask.sip
%Include processing/qgsprocessingfeedback.sip
%Include processing/qgsprocessingprovider.sip

View File

@ -168,6 +168,7 @@ their acceptable ranges, defaults, etc.
FlagAdvanced,
FlagHidden,
FlagOptional,
FlagIsModelOutput,
};
typedef QFlags<QgsProcessingParameterDefinition::Flag> Flags;

View File

@ -143,30 +143,6 @@ Return a list with all known parameter types.
.. versionadded:: 3.2
%End
void addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory /Transfer/ );
%Docstring
Add a new configuration widget factory for customized algorithm configuration
widgets. Ownership is taken.
.. versionadded:: 3.2
%End
void removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory );
%Docstring
Remove a configuration widget factory for customized algorithm configuration
widgets.
.. versionadded:: 3.2
%End
QgsProcessingAlgorithmConfigurationWidget *algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const;
%Docstring
algorithmConfigurationWidget
@param algorithm
@return
%End
signals:
void providerAdded( const QString &id );

View File

@ -311,6 +311,8 @@
%Include layout/qgslayoutviewtooltemporarymousepan.sip
%Include layout/qgslayoutviewtoolzoom.sip
%Include locator/qgslocatorwidget.sip
%Include processing/qgsprocessingalgorithmconfigurationwidget.sip
%Include processing/qgsprocessingalgorithmdialogbase.sip
%Include processing/qgsprocessingconfigurationwidgets.sip
%Include processing/qgsprocessingguiregistry.sip
%Include qgsadvanceddigitizingcanvasitem.sip

View File

@ -11,44 +11,6 @@
class QgsProcessingConfigurationWidgets
{
%Docstring
This class is responsible for the management of processing widgets which
QGIS internally.
Standalone applications that require to show configuration widgets for processing
algorithms will need to execute the following code to have the configuration
interfaces available.
.. code-block:: python
# At startup time
QgsApplicationProcessingConfigurationWidgets.initialize()
# At exit time
QgsApplicationProcessingConfigurationWidgets.cleanup()
%End
%TypeHeaderCode
#include "qgsprocessingconfigurationwidgets.h"
%End
public:
static void initialize();
%Docstring
Initialize native configuration widgets.
%End
static void cleanup();
%Docstring
Cleanup native configuration widgets.
%End
private:
QgsProcessingConfigurationWidgets();
};

View File

@ -0,0 +1,61 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/processing/qgsprocessingguiregistry.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
class QgsProcessingGuiRegistry
{
%Docstring
The QgsProcessingGuiRegistry is a home for widgets for processing
configuration widgets.
.. versionadded:: 3.2
%End
%TypeHeaderCode
#include "qgsprocessingguiregistry.h"
%End
public:
QgsProcessingGuiRegistry();
~QgsProcessingGuiRegistry();
void addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory /Transfer/ );
%Docstring
Add a new configuration widget factory for customized algorithm configuration
widgets. Ownership is taken.
.. versionadded:: 3.2
%End
void removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory );
%Docstring
Remove a configuration widget factory for customized algorithm configuration
widgets.
.. versionadded:: 3.2
%End
QgsProcessingAlgorithmConfigurationWidget *algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const;
%Docstring
algorithmConfigurationWidget
@param algorithm
@return
%End
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/processing/qgsprocessingguiregistry.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/

View File

@ -62,6 +62,8 @@ Returns the global map layer action registry, used for registering map layer act
Returns the global layout item GUI registry, used for registering the GUI behavior of layout items.
%End
static QgsProcessingGuiRegistry *processingGuiRegistry();
static void enableAutoGeometryRestore( QWidget *widget, const QString &key = QString() );
%Docstring
Register the widget to allow its position to be automatically saved and restored when open and closed.

View File

@ -53,7 +53,8 @@ from qgis.core import (Qgis,
QgsProcessingOutputDefinition,
QgsSettings)
from qgis.gui import (QgsMessageBar,
from qgis.gui import (QgsGui,
QgsMessageBar,
QgsScrollArea,
QgsFilterLineEdit,
QgsHelp)
@ -119,7 +120,7 @@ class ModelerParametersDialog(QDialog):
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
self.verticalLayout.addWidget(line)
self.algorithmItem = QgsApplication.instance().processingRegistry().algorithmConfigurationWidget(self._alg)
self.algorithmItem = QgsGui.instance().processingGuiRegistry().algorithmConfigurationWidget(self._alg)
if self.configuration:
self.algorithmItem.setConfiguration(self.configuration)
self.verticalLayout.addWidget(self.algorithmItem)
@ -332,6 +333,13 @@ class ModelerParametersDialog(QDialog):
output.setChildOutputName(dest.name())
outputs[name] = output
if dest.flags() & QgsProcessingParameterDefinition.FlagIsModelOutput:
if not name in outputs:
output = QgsProcessingModelOutput(dest.name(), dest.name())
output.setChildId(alg.childId())
output.setChildOutputName(dest.name())
outputs[dest.name()] = output
alg.setModelOutputs(outputs)
selectedOptions = self.dependenciesPanel.selectedoptions

View File

@ -75,7 +75,11 @@ void QgsFilterAlgorithm::initAlgorithm( const QVariantMap &configuration )
const QVariantMap outputDef = output.toMap();
const QString name = QStringLiteral( "OUTPUT_%1" ).arg( outputDef.value( QStringLiteral( "name" ) ).toString() );
QgsProcessingParameterFeatureSink *outputParam = new QgsProcessingParameterFeatureSink( name, outputDef.value( QStringLiteral( "name" ) ).toString() );
outputParam->setFlags( QgsProcessingParameterDefinition::FlagHidden );
QgsProcessingParameterDefinition::Flags flags = QgsProcessingParameterDefinition::Flags();
flags |= QgsProcessingParameterDefinition::FlagHidden;
if ( outputDef.value( QStringLiteral( "isModelOutput" ) ).toBool() )
flags |= QgsProcessingParameterDefinition::FlagIsModelOutput;
outputParam->setFlags( flags );
addParameter( outputParam );
mOutputs.append( new Output( name, outputDef.value( QStringLiteral( "expression" ) ).toString() ) );
}
@ -92,6 +96,8 @@ QVariantMap QgsFilterAlgorithm::processAlgorithm( const QVariantMap &parameters,
for ( Output *output : qgis::as_const( mOutputs ) )
{
output->sink.reset( parameterAsSink( parameters, output->name, context, output->destinationIdentifier, source->fields(), source->wkbType(), source->sourceCrs() ) );
if ( !output->sink )
return QVariantMap();
output->expression.prepare( &expressionContext );
}
@ -115,7 +121,9 @@ QVariantMap QgsFilterAlgorithm::processAlgorithm( const QVariantMap &parameters,
for ( Output *output : qgis::as_const( mOutputs ) )
{
if ( output->expression.evaluate( &expressionContext ).toBool() )
{
output->sink->addFeature( f, QgsFeatureSink::FastInsert );
}
}
feedback->setProgress( current * step );

View File

@ -246,7 +246,6 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
#include "qgsruntimeprofiler.h"
#include "qgshandlebadlayers.h"
#include "qgsprintlayout.h"
#include "qgsprocessingconfigurationwidgets.h"
#include "qgsprocessingregistry.h"
#include "qgsproject.h"
#include "qgsprojectlayergroupdialog.h"
@ -1458,7 +1457,6 @@ QgisApp::~QgisApp()
// cancel request for FileOpen events
QgsApplication::setFileOpenEventReceiver( nullptr );
QgsProcessingConfigurationWidgets::cleanup();
unregisterCustomLayoutDropHandler( mLayoutQptDropHandler );
@ -10497,7 +10495,6 @@ void QgisApp::initNativeProcessing()
#ifdef HAVE_3D
QgsApplication::processingRegistry()->addProvider( new Qgs3DAlgorithms( QgsApplication::processingRegistry() ) );
#endif
QgsProcessingConfigurationWidgets::initialize();
}
void QgisApp::initLayouts()

View File

@ -102,7 +102,6 @@ SET(QGIS_CORE_SRCS
locator/qgslocatormodel.cpp
processing/qgsprocessingalgorithm.cpp
processing/qgsprocessingalgorithmconfigurationwidget.cpp
processing/qgsprocessingalgrunnertask.cpp
processing/qgsprocessingcontext.cpp
processing/qgsprocessingfeedback.cpp
@ -669,7 +668,6 @@ SET(QGIS_CORE_MOC_HDRS
locator/qgslocatorfilter.h
locator/qgslocatormodel.h
processing/qgsprocessingalgorithmconfigurationwidget.h
processing/qgsprocessingalgrunnertask.h
processing/qgsprocessingfeedback.h
processing/qgsprocessingprovider.h

View File

@ -247,6 +247,7 @@ class CORE_EXPORT QgsProcessingParameterDefinition
FlagAdvanced = 1 << 1, //!< Parameter is an advanced parameter which should be hidden from users by default
FlagHidden = 1 << 2, //!< Parameter is hidden and should not be shown to users
FlagOptional = 1 << 3, //!< Parameter is optional
FlagIsModelOutput = 1 << 4, //!< Destination parameter is final output. The parameter name will be used.
};
Q_DECLARE_FLAGS( Flags, Flag )

View File

@ -18,7 +18,6 @@
#include "qgsprocessingregistry.h"
#include "qgsvectorfilewriter.h"
#include "qgsprocessingparametertypeimpl.h"
#include "qgsprocessingalgorithmconfigurationwidget.h"
QgsProcessingRegistry::QgsProcessingRegistry( QObject *parent SIP_TRANSFERTHIS )
: QObject( parent )
@ -189,28 +188,3 @@ QList<QgsProcessingParameterType *> QgsProcessingRegistry::parameterTypes() cons
{
return mParameterTypes.values();
}
void QgsProcessingRegistry::addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory )
{
mAlgorithmConfigurationWidgetFactories.append( factory );
}
void QgsProcessingRegistry::removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory )
{
mAlgorithmConfigurationWidgetFactories.removeAll( factory );
delete factory;
}
QgsProcessingAlgorithmConfigurationWidget *QgsProcessingRegistry::algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const
{
for ( const auto *factory : mAlgorithmConfigurationWidgetFactories )
{
if ( factory->canCreateFor( algorithm ) )
{
return factory->create( algorithm );
}
}
return nullptr;
}

View File

@ -169,30 +169,6 @@ class CORE_EXPORT QgsProcessingRegistry : public QObject
*/
QList<QgsProcessingParameterType *> parameterTypes() const;
/**
* Add a new configuration widget factory for customized algorithm configuration
* widgets. Ownership is taken.
*
* \since QGIS 3.2
*/
void addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory SIP_TRANSFER );
/**
* Remove a configuration widget factory for customized algorithm configuration
* widgets.
*
* \since QGIS 3.2
*/
void removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory );
/**
* @brief algorithmConfigurationWidget
* @param algorithm
* @return
*/
QgsProcessingAlgorithmConfigurationWidget *algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const;
signals:
//! Emitted when a provider has been added to the registry.
@ -224,8 +200,6 @@ class CORE_EXPORT QgsProcessingRegistry : public QObject
//! Hash of available parameter types by id. This object owns the pointers.
QMap<QString, QgsProcessingParameterType *> mParameterTypes;
QList <QgsProcessingAlgorithmConfigurationWidgetFactory *> mAlgorithmConfigurationWidgetFactories;
#ifdef SIP_RUN
QgsProcessingRegistry( const QgsProcessingRegistry &other );
#endif

View File

@ -192,8 +192,10 @@ SET(QGIS_GUI_SRCS
ogr/qgsnewogrconnection.cpp
ogr/qgsvectorlayersaveasdialog.cpp
processing/qgsprocessingalgorithmconfigurationwidget.cpp
processing/qgsprocessingalgorithmdialogbase.cpp
processing/qgsprocessingconfigurationwidgets.cpp
processing/qgsprocessingguiregistry.cpp
qgisinterface.cpp
qgsactionmenu.cpp
@ -710,8 +712,10 @@ SET(QGIS_GUI_MOC_HDRS
locator/qgslocatorwidget.h
processing/qgsprocessingalgorithmconfigurationwidget.h
processing/qgsprocessingalgorithmdialogbase.h
processing/qgsprocessingconfigurationwidgets.h
processing/qgsprocessingguiregistry.h
)
SET_PROPERTY(GLOBAL PROPERTY QGIS_GUI_MOC_HDRS ${QGIS_GUI_MOC_HDRS})
@ -870,10 +874,11 @@ INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/src/gui/auth
${CMAKE_SOURCE_DIR}/src/gui/editorwidgets
${CMAKE_SOURCE_DIR}/src/gui/editorwidgets/core
${CMAKE_SOURCE_DIR}/src/gui/effects
${CMAKE_SOURCE_DIR}/src/gui/layertree
${CMAKE_SOURCE_DIR}/src/gui/layout
${CMAKE_SOURCE_DIR}/src/gui/effects
${CMAKE_SOURCE_DIR}/src/gui/ogr
${CMAKE_SOURCE_DIR}/src/gui/processing
${CMAKE_SOURCE_DIR}/src/core
${CMAKE_SOURCE_DIR}/src/core/annotations
${CMAKE_SOURCE_DIR}/src/core/auth

View File

@ -19,7 +19,6 @@
#ifndef QGSPROCESSINGALGORITHMCONFIGURATIONWIDGET_H
#define QGSPROCESSINGALGORITHMCONFIGURATIONWIDGET_H
#include <QWidget>
#include <QVariantMap>

View File

@ -20,7 +20,8 @@
#include "qgsprocessingalgorithm.h"
#include "qgsexpressionlineedit.h"
#include "qgsapplication.h"
#include "qgsprocessingregistry.h"
#include "qgsgui.h"
#include "qgsprocessingguiregistry.h"
#include <QTableWidget>
#include <QGridLayout>
@ -29,32 +30,6 @@
#include <QCheckBox>
#include <QHeaderView>
QList<QgsProcessingAlgorithmConfigurationWidgetFactory *> QgsProcessingConfigurationWidgets::sProcessingAlgorithmConfigurationWidgetFactories;
QgsProcessingConfigurationWidgets::QgsProcessingConfigurationWidgets()
{
}
void QgsProcessingConfigurationWidgets::initialize()
{
if ( !sProcessingAlgorithmConfigurationWidgetFactories.isEmpty() )
{
QgsDebugMsg( "QgsProcessingConfigurationWidgets::initialize() called more than once. Exiting now." );
return;
}
QgsProcessingAlgorithmConfigurationWidgetFactory *factory = new QgsFilterAlgorithmConfigurationWidgetFactory();
sProcessingAlgorithmConfigurationWidgetFactories.append( factory );
QgsApplication::instance()->processingRegistry()->addAlgorithmConfigurationWidgetFactory( factory );
}
void QgsProcessingConfigurationWidgets::cleanup()
{
for ( QgsProcessingAlgorithmConfigurationWidgetFactory *factory : qgis::as_const( sProcessingAlgorithmConfigurationWidgetFactories ) )
QgsApplication::instance()->processingRegistry()->removeAlgorithmConfigurationWidgetFactory( factory );
sProcessingAlgorithmConfigurationWidgetFactories.clear();
}
QgsFilterAlgorithmConfigurationWidget::QgsFilterAlgorithmConfigurationWidget( QWidget *parent )
: QgsProcessingAlgorithmConfigurationWidget( parent )
{

View File

@ -25,41 +25,6 @@
class QTableWidget;
/**
* This class is responsible for the management of processing widgets which
* QGIS internally.
*
* Standalone applications that require to show configuration widgets for processing
* algorithms will need to execute the following code to have the configuration
* interfaces available.
*
* \code{.py}
* # At startup time
* QgsApplicationProcessingConfigurationWidgets.initialize()
*
* # At exit time
* QgsApplicationProcessingConfigurationWidgets.cleanup()
* \endcode
*/
class GUI_EXPORT QgsProcessingConfigurationWidgets
{
public:
/**
* Initialize native configuration widgets.
*/
static void initialize();
/**
* Cleanup native configuration widgets.
*/
static void cleanup();
private:
QgsProcessingConfigurationWidgets() SIP_FORCE;
static QList<QgsProcessingAlgorithmConfigurationWidgetFactory *> sProcessingAlgorithmConfigurationWidgetFactories;
};
///@cond PRIVATE
#ifndef SIP_RUN

View File

@ -0,0 +1,56 @@
/***************************************************************************
qgsprocessingguiregistry.cpp
---------------------
begin : April 2018
copyright : (C) 2018 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/
/***************************************************************************
* *
* 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 "qgsprocessingguiregistry.h"
#include "qgsprocessingalgorithmconfigurationwidget.h"
#include "qgsprocessingconfigurationwidgets.h"
#include "qgis.h"
QgsProcessingGuiRegistry::QgsProcessingGuiRegistry()
{
addAlgorithmConfigurationWidgetFactory( new QgsFilterAlgorithmConfigurationWidgetFactory() );
}
QgsProcessingGuiRegistry::~QgsProcessingGuiRegistry()
{
for ( QgsProcessingAlgorithmConfigurationWidgetFactory *factory : qgis::as_const( mAlgorithmConfigurationWidgetFactories ) )
removeAlgorithmConfigurationWidgetFactory( factory );
}
void QgsProcessingGuiRegistry::addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory )
{
mAlgorithmConfigurationWidgetFactories.append( factory );
}
void QgsProcessingGuiRegistry::removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory )
{
mAlgorithmConfigurationWidgetFactories.removeAll( factory );
delete factory;
}
QgsProcessingAlgorithmConfigurationWidget *QgsProcessingGuiRegistry::algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const
{
for ( const auto *factory : mAlgorithmConfigurationWidgetFactories )
{
if ( factory->canCreateFor( algorithm ) )
{
return factory->create( algorithm );
}
}
return nullptr;
}

View File

@ -0,0 +1,71 @@
/***************************************************************************
qgsprocessingguiregistry.h
---------------------
begin : April 2018
copyright : (C) 2018 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/
/***************************************************************************
* *
* 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 QGSPROCESSINGGUIREGISTRY_H
#define QGSPROCESSINGGUIREGISTRY_H
#include "qgis_gui.h"
#include "qgis_sip.h"
#include <QList>
class QgsProcessingAlgorithm;
class QgsProcessingAlgorithmConfigurationWidget;
class QgsProcessingAlgorithmConfigurationWidgetFactory;
/**
* The QgsProcessingGuiRegistry is a home for widgets for processing
* configuration widgets.
*
* \ingroup gui
* \since QGIS 3.2
*/
class GUI_EXPORT QgsProcessingGuiRegistry
{
public:
QgsProcessingGuiRegistry();
~QgsProcessingGuiRegistry();
/**
* Add a new configuration widget factory for customized algorithm configuration
* widgets. Ownership is taken.
*
* \since QGIS 3.2
*/
void addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory SIP_TRANSFER );
/**
* Remove a configuration widget factory for customized algorithm configuration
* widgets.
*
* \since QGIS 3.2
*/
void removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory );
/**
* @brief algorithmConfigurationWidget
* @param algorithm
* @return
*/
QgsProcessingAlgorithmConfigurationWidget *algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const;
private:
QList <QgsProcessingAlgorithmConfigurationWidgetFactory *> mAlgorithmConfigurationWidgetFactories;
};
#endif // QGSPROCESSINGGUIREGISTRY_H

View File

@ -28,6 +28,7 @@
#else
#include "qgsnative.h"
#endif
#include "qgsprocessingguiregistry.h"
#include "qgsshortcutsmanager.h"
#include "qgswidgetstatehelper_p.h"
#include "qgslogger.h"
@ -73,6 +74,11 @@ QgsLayoutItemGuiRegistry *QgsGui::layoutItemGuiRegistry()
return instance()->mLayoutItemGuiRegistry;
}
QgsProcessingGuiRegistry *QgsGui::processingGuiRegistry()
{
return instance()->mProcessingGuiRegistry;
}
void QgsGui::enableAutoGeometryRestore( QWidget *widget, const QString &key )
{
if ( widget->objectName().isEmpty() )
@ -109,4 +115,5 @@ QgsGui::QgsGui()
mSourceSelectProviderRegistry = new QgsSourceSelectProviderRegistry();
mLayoutItemGuiRegistry = new QgsLayoutItemGuiRegistry();
mWidgetStateHelper = new QgsWidgetStateHelper();
mProcessingGuiRegistry = new QgsProcessingGuiRegistry();
}

View File

@ -30,6 +30,7 @@ class QgsSourceSelectProviderRegistry;
class QgsNative;
class QgsLayoutItemGuiRegistry;
class QgsWidgetStateHelper;
class QgsProcessingGuiRegistry;
/**
* \ingroup gui
@ -89,6 +90,8 @@ class GUI_EXPORT QgsGui
*/
static QgsLayoutItemGuiRegistry *layoutItemGuiRegistry();
static QgsProcessingGuiRegistry *processingGuiRegistry();
/**
* Register the widget to allow its position to be automatically saved and restored when open and closed.
* Use this to avoid needing to call saveGeometry() and restoreGeometry() on your widget.
@ -109,6 +112,7 @@ class GUI_EXPORT QgsGui
QgsLayerTreeEmbeddedWidgetRegistry *mLayerTreeEmbeddedWidgetRegistry = nullptr;
QgsMapLayerActionRegistry *mMapLayerActionRegistry = nullptr;
QgsLayoutItemGuiRegistry *mLayoutItemGuiRegistry = nullptr;
QgsProcessingGuiRegistry *mProcessingGuiRegistry = nullptr;
#ifdef SIP_RUN
QgsGui( const QgsGui &other );