Skip to content

Commit

Permalink
better API doc, own category for 3D, fix leak
Browse files Browse the repository at this point in the history
  • Loading branch information
3nids authored and nyalldawson committed Sep 14, 2018
1 parent e91a42d commit 0df5b9e
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 54 deletions.
48 changes: 32 additions & 16 deletions python/core/auto_generated/qgsmaplayer.sip.in
Expand Up @@ -79,7 +79,8 @@ This is the base class for all map layer types (vector, raster).
{ {
LayerConfiguration, LayerConfiguration,
Symbology, Symbology,
Labels, Symbology3D,
Labeling,
Fields, Fields,
Forms, Forms,
Actions, Actions,
Expand All @@ -97,10 +98,25 @@ This is the base class for all map layer types (vector, raster).
{ {
public: public:
ReadableStyleCategory( const QString &name, const QString &toolTip = QString() ); ReadableStyleCategory( const QString &name, const QString &toolTip = QString() );
%Docstring
Create a ReadableStyleCategory
%End
ReadableStyleCategory( const QString &name, const QIcon &icon, const QString &toolTip = QString() ); ReadableStyleCategory( const QString &name, const QIcon &icon, const QString &toolTip = QString() );
%Docstring
Create a ReadableStyleCategory
%End
QString name() const; QString name() const;
%Docstring
Return the translated name of the category
%End
QString toolTip() const; QString toolTip() const;
%Docstring
Return the translated tooltip of the category
%End
QIcon icon() const; QIcon icon() const;
%Docstring
Return the icon of the category
%End
}; };


QgsMapLayer( QgsMapLayer::LayerType type = VectorLayer, const QString &name = QString(), const QString &source = QString() ); QgsMapLayer( QgsMapLayer::LayerType type = VectorLayer, const QString &name = QString(), const QString &source = QString() );
Expand Down Expand Up @@ -531,17 +547,17 @@ Returns true if the layer is considered a spatial layer, ie it has some form of


bool readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context ); bool readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context );
%Docstring %Docstring
Sets state from Dom document Sets state from DOM document


:param layerElement: The Dom element corresponding to ``maplayer'' tag :param layerElement: The DOM element corresponding to ``maplayer'' tag
:param context: writing context (e.g. for conversion between relative and absolute paths) :param context: writing context (e.g. for conversion between relative and absolute paths)
\note \note


The Dom node corresponds to a Dom document project file XML element read The DOM node corresponds to a DOM document project file XML element read
by :py:class:`QgsProject`. by :py:class:`QgsProject`.


This, in turn, calls readXml() (and then readSymbology()), which is over-rideable This, in turn, calls readXml() (and then readSymbology()), which is overridable
by sub-classes so that they can read their own specific state from the given Dom node. by sub-classes so that they can read their own specific state from the given DOM node.


Invoked by :py:func:`QgsProject.read()` Invoked by :py:func:`QgsProject.read()`


Expand All @@ -550,18 +566,18 @@ Invoked by :py:func:`QgsProject.read()`


bool writeLayerXml( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const; bool writeLayerXml( QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
%Docstring %Docstring
Stores state in Dom node Stores state in DOM node


:param layerElement: is a Dom element corresponding to ``maplayer'' tag :param layerElement: is a DOM element corresponding to ``maplayer'' tag
:param document: is a the dom document being written :param document: is a the DOM document being written
:param context: reading context (e.g. for conversion between relative and absolute paths) :param context: reading context (e.g. for conversion between relative and absolute paths)
\note \note


The Dom node corresponds to a Dom document project file XML element to be The DOM node corresponds to a DOM document project file XML element to be
written by :py:class:`QgsProject`. written by :py:class:`QgsProject`.


This, in turn, calls writeXml() (and then writeSymbology), which is over-rideable This, in turn, calls writeXml() (and then writeSymbology), which is over-rideable
by sub-classes so that they can write their own specific state to the given Dom node. by sub-classes so that they can write their own specific state to the given DOM node.


Invoked by :py:func:`QgsProject.write()` Invoked by :py:func:`QgsProject.write()`


Expand Down Expand Up @@ -909,7 +925,7 @@ Attempts to style the layer using the formatting from an SLD type file.
virtual bool readSymbology( const QDomNode &node, QString &errorMessage, virtual bool readSymbology( const QDomNode &node, QString &errorMessage,
QgsReadWriteContext &context, StyleCategories categories = AllCategories ) = 0; QgsReadWriteContext &context, StyleCategories categories = AllCategories ) = 0;
%Docstring %Docstring
Read the symbology for the current layer from the Dom node supplied. Read the symbology for the current layer from the DOM node supplied.


:param node: node that will contain the symbology definition for this layer. :param node: node that will contain the symbology definition for this layer.
:param errorMessage: reference to string that will be updated with any error messages :param errorMessage: reference to string that will be updated with any error messages
Expand All @@ -921,7 +937,7 @@ Read the symbology for the current layer from the Dom node supplied.
virtual bool readStyle( const QDomNode &node, QString &errorMessage, virtual bool readStyle( const QDomNode &node, QString &errorMessage,
QgsReadWriteContext &context, StyleCategories categories = AllCategories ); QgsReadWriteContext &context, StyleCategories categories = AllCategories );
%Docstring %Docstring
Read the style for the current layer from the Dom node supplied. Read the style for the current layer from the DOM node supplied.


:param node: node that will contain the style definition for this layer. :param node: node that will contain the style definition for this layer.
:param errorMessage: reference to string that will be updated with any error messages :param errorMessage: reference to string that will be updated with any error messages
Expand Down Expand Up @@ -1486,7 +1502,7 @@ passwords or drivers prefixes ("HDF5:")
:param source: data source to encode, typically :py:func:`QgsMapLayer.source()` :param source: data source to encode, typically :py:func:`QgsMapLayer.source()`
:param context: writing context (e.g. for conversion between relative and absolute paths) :param context: writing context (e.g. for conversion between relative and absolute paths)


:return: encoded source, typically to be written in the dom element "datasource" :return: encoded source, typically to be written in the DOM element "datasource"


.. versionadded:: 3.2 .. versionadded:: 3.2
%End %End
Expand All @@ -1497,8 +1513,8 @@ Called by readLayerXML(), used by derived classes to decode provider's specific
source from project files. Typically resolving absolute or relative paths, usernames and source from project files. Typically resolving absolute or relative paths, usernames and
passwords or drivers prefixes ("HDF5:") passwords or drivers prefixes ("HDF5:")


:param source: data source to decode, typically read from layer's dom element "datasource" :param source: data source to decode, typically read from layer's DOM element "datasource"
:param dataProvider: string identification of data provider (e.g. "ogr"), typically read from layer's dom element :param dataProvider: string identification of data provider (e.g. "ogr"), typically read from layer's DOM element
:param context: reading context (e.g. for conversion between relative and absolute paths) :param context: reading context (e.g. for conversion between relative and absolute paths)


:return: decoded source, typically to be used as the layer's datasource :return: decoded source, typically to be used as the layer's datasource
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsapplayertreeviewmenuprovider.cpp
Expand Up @@ -325,7 +325,7 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()
for ( QgsMapLayer::StyleCategory category : categories ) for ( QgsMapLayer::StyleCategory category : categories )
{ {
QgsMapLayer::ReadableStyleCategory readableCategory = QgsMapLayer::readableStyleCategory( category ); QgsMapLayer::ReadableStyleCategory readableCategory = QgsMapLayer::readableStyleCategory( category );
QAction *copyAction = new QAction( readableCategory.icon(), readableCategory.name() ); QAction *copyAction = new QAction( readableCategory.icon(), readableCategory.name(), copyStyleMenu );
copyAction->setToolTip( readableCategory.toolTip() ); copyAction->setToolTip( readableCategory.toolTip() );
connect( copyAction, &QAction::triggered, this, [ = ]() {app->copyStyle( layer, category );} ); connect( copyAction, &QAction::triggered, this, [ = ]() {app->copyStyle( layer, category );} );
copyStyleMenu->addAction( copyAction ); copyStyleMenu->addAction( copyAction );
Expand Down
18 changes: 11 additions & 7 deletions src/core/qgsmaplayer.cpp
Expand Up @@ -74,11 +74,14 @@ QgsMapLayer::ReadableStyleCategory QgsMapLayer::readableStyleCategory( QgsMapLay
case LayerConfiguration: case LayerConfiguration:
return ReadableStyleCategory( tr( "Layer Configuration" ), return ReadableStyleCategory( tr( "Layer Configuration" ),
QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/system.svg" ) ), QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/system.svg" ) ),
tr( "Flags, display expression, read-only" ) ); tr( "Identifiable, removable, searchable, display expression, read-only" ) );
case Symbology : case Symbology :
return ReadableStyleCategory( tr( "Symbology" ), return ReadableStyleCategory( tr( "Symbology" ),
QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/symbology.svg" ) ) ); QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/symbology.svg" ) ) );
case Labels : case Symbology3D:
return ReadableStyleCategory( tr( "3D Symbology" ),
QgsApplication::getThemeIcon( QStringLiteral( "/3d.svg" ) ) );
case Labeling :
return ReadableStyleCategory( tr( "Labels" ), return ReadableStyleCategory( tr( "Labels" ),
QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/labels.svg" ) ) ); QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/labels.svg" ) ) );
case Fields : case Fields :
Expand All @@ -98,8 +101,9 @@ QgsMapLayer::ReadableStyleCategory QgsMapLayer::readableStyleCategory( QgsMapLay
return ReadableStyleCategory( tr( "Diagrams" ), return ReadableStyleCategory( tr( "Diagrams" ),
QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/diagram.svg" ) ) ); QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/diagram.svg" ) ) );
case AttributeTable : case AttributeTable :
return ReadableStyleCategory( tr( "Attribute Table" ), return ReadableStyleCategory( tr( "Attribute Table Settings" ),
QgsApplication::getThemeIcon( QStringLiteral( "/mActionOpenTable.svg" ) ) ); QgsApplication::getThemeIcon( QStringLiteral( "/mActionOpenTable.svg" ) ),
tr( "Choice and order of columns, conditional styling" ) );
case Rendering : case Rendering :
return ReadableStyleCategory( tr( "Rendering" ), return ReadableStyleCategory( tr( "Rendering" ),
QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/rendering.svg" ) ), QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/rendering.svg" ) ),
Expand All @@ -108,7 +112,7 @@ QgsMapLayer::ReadableStyleCategory QgsMapLayer::readableStyleCategory( QgsMapLay
return ReadableStyleCategory( tr( "Custom Properties" ), return ReadableStyleCategory( tr( "Custom Properties" ),
QgsApplication::getThemeIcon( QStringLiteral( "/mActionOptions.svg" ) ) ); QgsApplication::getThemeIcon( QStringLiteral( "/mActionOptions.svg" ) ) );
case AllCategories : case AllCategories :
return ReadableStyleCategory( tr( "All categories" ) ); return ReadableStyleCategory( tr( "All Categories" ) );
} }
} }


Expand Down Expand Up @@ -604,7 +608,7 @@ void QgsMapLayer::writeCommonStyle( QDomElement &layerElement, QDomDocument &doc
layerElement.setAttribute( QStringLiteral( "minScale" ), QString::number( minimumScale() ) ); layerElement.setAttribute( QStringLiteral( "minScale" ), QString::number( minimumScale() ) );
} }


if ( categories.testFlag( Symbology ) ) if ( categories.testFlag( Symbology3D ) )
{ {
if ( m3DRenderer ) if ( m3DRenderer )
{ {
Expand Down Expand Up @@ -1613,7 +1617,7 @@ bool QgsMapLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorM
void QgsMapLayer::readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context, void QgsMapLayer::readCommonStyle( const QDomElement &layerElement, const QgsReadWriteContext &context,
QgsMapLayer::StyleCategories categories ) QgsMapLayer::StyleCategories categories )
{ {
if ( categories.testFlag( Symbology ) ) if ( categories.testFlag( Symbology3D ) )
{ {
QgsAbstract3DRenderer *r3D = nullptr; QgsAbstract3DRenderer *r3D = nullptr;
QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) ); QDomElement renderer3DElem = layerElement.firstChildElement( QStringLiteral( "renderer-3d" ) );
Expand Down
63 changes: 35 additions & 28 deletions src/core/qgsmaplayer.h
Expand Up @@ -141,39 +141,46 @@ class CORE_EXPORT QgsMapLayer : public QObject
*/ */
enum StyleCategory enum StyleCategory
{ {
LayerConfiguration = 1 << 0, //!< Flags, display expression, read-only LayerConfiguration = 1 << 0, //!< General configuration: identifiable, removable, searchable, display expression, read-only
Symbology = 1 << 1, Symbology = 1 << 1, //!< Symbology
Labels = 1 << 2, Symbology3D = 1 << 2, //!< 3D symbology
Fields = 1 << 3, //!< Aliases, widgets, WMS/WFS, expressions, constraints, virtual fields Labeling = 1 << 3, //!< Labeling
Forms = 1 << 4, Fields = 1 << 4, //!< Aliases, widgets, WMS/WFS, expressions, constraints, virtual fields
Actions = 1 << 5, Forms = 1 << 5, //!< Feature form
MapTips = 1 << 6, Actions = 1 << 6, //!< Actions
Diagrams = 1 << 7, MapTips = 1 << 7, //!< Map tips
AttributeTable = 1 << 8, Diagrams = 1 << 8, //!< Diagrams
Rendering = 1 << 9, //!< Scale visibility, simplify method, opacity AttributeTable = 1 << 9, //!< Attribute table settings: choice and order of columns, conditional styling
CustomProperties = 1 << 10, Rendering = 1 << 10, //!< Rendering: scale visibility, simplify method, opacity
AllCategories = LayerConfiguration | Symbology | Labels | Fields | Forms | Actions | CustomProperties = 1 << 11, //!< Custom properties (by plugins for instance)
AllCategories = LayerConfiguration | Symbology | Labeling | Fields | Forms | Actions |
MapTips | Diagrams | AttributeTable | Rendering | CustomProperties, MapTips | Diagrams | AttributeTable | Rendering | CustomProperties,
}; };
Q_ENUM( StyleCategory ) Q_ENUM( StyleCategory )
Q_DECLARE_FLAGS( StyleCategories, StyleCategory ) Q_DECLARE_FLAGS( StyleCategories, StyleCategory )
Q_FLAG( StyleCategories ) Q_FLAG( StyleCategories )


/** /**
* Style category with its name and its tooltip translated and readable * Style category with its name, tooltip and icon.
* Text are translated and readable
* \since QGIS 3.4 * \since QGIS 3.4
*/ */
struct ReadableStyleCategory struct ReadableStyleCategory
{ {
public: public:
//! Create a ReadableStyleCategory
ReadableStyleCategory( const QString &name, const QString &toolTip = QString() ) ReadableStyleCategory( const QString &name, const QString &toolTip = QString() )
: mName( name ), mToolTip( toolTip ) : mName( name ), mToolTip( toolTip )
{} {}
//! Create a ReadableStyleCategory
ReadableStyleCategory( const QString &name, const QIcon &icon, const QString &toolTip = QString() ) ReadableStyleCategory( const QString &name, const QIcon &icon, const QString &toolTip = QString() )
: mName( name ), mToolTip( toolTip ), mIcon( icon ) : mName( name ), mToolTip( toolTip ), mIcon( icon )
{} {}
//! Return the translated name of the category
QString name() const {return mName;} QString name() const {return mName;}
//! Return the translated tooltip of the category
QString toolTip() const {return mToolTip;} QString toolTip() const {return mToolTip;}
//! Return the icon of the category
QIcon icon() const {return mIcon;} QIcon icon() const {return mIcon;}
private: private:
QString mName; QString mName;
Expand Down Expand Up @@ -544,16 +551,16 @@ class CORE_EXPORT QgsMapLayer : public QObject
virtual bool isSpatial() const; virtual bool isSpatial() const;


/** /**
* Sets state from Dom document * Sets state from DOM document
* \param layerElement The Dom element corresponding to ``maplayer'' tag * \param layerElement The DOM element corresponding to ``maplayer'' tag
* \param context writing context (e.g. for conversion between relative and absolute paths) * \param context writing context (e.g. for conversion between relative and absolute paths)
* \note * \note
* *
* The Dom node corresponds to a Dom document project file XML element read * The DOM node corresponds to a DOM document project file XML element read
* by QgsProject. * by QgsProject.
* *
* This, in turn, calls readXml() (and then readSymbology()), which is over-rideable * This, in turn, calls readXml() (and then readSymbology()), which is overridable
* by sub-classes so that they can read their own specific state from the given Dom node. * by sub-classes so that they can read their own specific state from the given DOM node.
* *
* Invoked by QgsProject::read(). * Invoked by QgsProject::read().
* *
Expand All @@ -562,17 +569,17 @@ class CORE_EXPORT QgsMapLayer : public QObject
bool readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context ); bool readLayerXml( const QDomElement &layerElement, QgsReadWriteContext &context );


/** /**
* Stores state in Dom node * Stores state in DOM node
* \param layerElement is a Dom element corresponding to ``maplayer'' tag * \param layerElement is a DOM element corresponding to ``maplayer'' tag
* \param document is a the dom document being written * \param document is a the DOM document being written
* \param context reading context (e.g. for conversion between relative and absolute paths) * \param context reading context (e.g. for conversion between relative and absolute paths)
* \note * \note
* *
* The Dom node corresponds to a Dom document project file XML element to be * The DOM node corresponds to a DOM document project file XML element to be
* written by QgsProject. * written by QgsProject.
* *
* This, in turn, calls writeXml() (and then writeSymbology), which is over-rideable * This, in turn, calls writeXml() (and then writeSymbology), which is over-rideable
* by sub-classes so that they can write their own specific state to the given Dom node. * by sub-classes so that they can write their own specific state to the given DOM node.
* *
* Invoked by QgsProject::write(). * Invoked by QgsProject::write().
* *
Expand Down Expand Up @@ -860,7 +867,7 @@ class CORE_EXPORT QgsMapLayer : public QObject




/** /**
* Read the symbology for the current layer from the Dom node supplied. * Read the symbology for the current layer from the DOM node supplied.
* \param node node that will contain the symbology definition for this layer. * \param node node that will contain the symbology definition for this layer.
* \param errorMessage reference to string that will be updated with any error messages * \param errorMessage reference to string that will be updated with any error messages
* \param context reading context (used for transform from relative to absolute paths) * \param context reading context (used for transform from relative to absolute paths)
Expand All @@ -870,7 +877,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
QgsReadWriteContext &context, StyleCategories categories = AllCategories ) = 0; QgsReadWriteContext &context, StyleCategories categories = AllCategories ) = 0;


/** /**
* Read the style for the current layer from the Dom node supplied. * Read the style for the current layer from the DOM node supplied.
* \param node node that will contain the style definition for this layer. * \param node node that will contain the style definition for this layer.
* \param errorMessage reference to string that will be updated with any error messages * \param errorMessage reference to string that will be updated with any error messages
* \param context reading context (used for transform from relative to absolute paths) * \param context reading context (used for transform from relative to absolute paths)
Expand Down Expand Up @@ -1312,7 +1319,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
* *
* \param source data source to encode, typically QgsMapLayer::source() * \param source data source to encode, typically QgsMapLayer::source()
* \param context writing context (e.g. for conversion between relative and absolute paths) * \param context writing context (e.g. for conversion between relative and absolute paths)
* \return encoded source, typically to be written in the dom element "datasource" * \return encoded source, typically to be written in the DOM element "datasource"
* *
* \since QGIS 3.2 * \since QGIS 3.2
*/ */
Expand All @@ -1323,8 +1330,8 @@ class CORE_EXPORT QgsMapLayer : public QObject
* source from project files. Typically resolving absolute or relative paths, usernames and * source from project files. Typically resolving absolute or relative paths, usernames and
* passwords or drivers prefixes ("HDF5:") * passwords or drivers prefixes ("HDF5:")
* *
* \param source data source to decode, typically read from layer's dom element "datasource" * \param source data source to decode, typically read from layer's DOM element "datasource"
* \param dataProvider string identification of data provider (e.g. "ogr"), typically read from layer's dom element * \param dataProvider string identification of data provider (e.g. "ogr"), typically read from layer's DOM element
* \param context reading context (e.g. for conversion between relative and absolute paths) * \param context reading context (e.g. for conversion between relative and absolute paths)
* \return decoded source, typically to be used as the layer's datasource * \return decoded source, typically to be used as the layer's datasource
* *
Expand Down
4 changes: 2 additions & 2 deletions src/core/qgsvectorlayer.cpp
Expand Up @@ -2124,7 +2124,7 @@ bool QgsVectorLayer::readStyle( const QDomNode &node, QString &errorMessage,
} }


// read labeling definition // read labeling definition
if ( categories.testFlag( Labels ) ) if ( categories.testFlag( Labeling ) )
{ {
QDomElement labelingElement = node.firstChildElement( QStringLiteral( "labeling" ) ); QDomElement labelingElement = node.firstChildElement( QStringLiteral( "labeling" ) );
QgsAbstractVectorLayerLabeling *labeling = nullptr; QgsAbstractVectorLayerLabeling *labeling = nullptr;
Expand Down Expand Up @@ -2465,7 +2465,7 @@ bool QgsVectorLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &err
} }
} }


if ( categories.testFlag( Labels ) ) if ( categories.testFlag( Labeling ) )
{ {
if ( mLabeling ) if ( mLabeling )
{ {
Expand Down

0 comments on commit 0df5b9e

Please sign in to comment.