Skip to content

Commit

Permalink
Move QgsSymbolLegendNode checkAll/uncheckAll/toggle methods up to
Browse files Browse the repository at this point in the history
QgsLayerTreeModelLegendNode base class

Preparing the way for other legend node types to offer checkable support
  • Loading branch information
nyalldawson authored and PeterPetrik committed Dec 3, 2020
1 parent 97f73fb commit 902cb3d
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 107 deletions.
Expand Up @@ -213,6 +213,41 @@ Draws label on the right side of the item
:param symbolSize: Real size of the associated symbol - used for correct positioning when rendering

:return: Size of the label (may span multiple lines)
%End

public slots:

void checkAllItems();
%Docstring
Checks all checkable items belonging to the same layer as this node.

.. seealso:: :py:func:`uncheckAllItems`

.. seealso:: :py:func:`toggleAllItems`

.. versionadded:: 3.18
%End

void uncheckAllItems();
%Docstring
Unchecks all checkable items belonging to the same layer as this node.

.. seealso:: :py:func:`checkAllItems`

.. seealso:: :py:func:`toggleAllItems`

.. versionadded:: 3.18
%End

void toggleAllItems();
%Docstring
Toggle all checkable items belonging to the same layer as this node.

.. seealso:: :py:func:`checkAllItems`

.. seealso:: :py:func:`uncheckAllItems`

.. versionadded:: 3.18
%End

signals:
Expand Down Expand Up @@ -240,6 +275,7 @@ Returns a temporary context or ``None`` if legendMapViewData are not valid
%End

protected:

};


Expand Down Expand Up @@ -428,41 +464,6 @@ Evaluates and returns the text label of the current node
:param label: text to evaluate instead of the layer layertree string

.. versionadded:: 3.10
%End

public slots:

void checkAllItems();
%Docstring
Checks all items belonging to the same layer as this node.

.. seealso:: :py:func:`uncheckAllItems`

.. seealso:: :py:func:`toggleAllItems`

.. versionadded:: 2.14
%End

void uncheckAllItems();
%Docstring
Unchecks all items belonging to the same layer as this node.

.. seealso:: :py:func:`checkAllItems`

.. seealso:: :py:func:`toggleAllItems`

.. versionadded:: 2.14
%End

void toggleAllItems();
%Docstring
Toggle all items belonging to the same layer as this node.

.. seealso:: :py:func:`checkAllItems`

.. seealso:: :py:func:`uncheckAllItems`

.. versionadded:: 3.6
%End

};
Expand Down
88 changes: 47 additions & 41 deletions src/core/layertree/qgslayertreemodellegendnode.cpp
Expand Up @@ -240,6 +240,34 @@ QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &set
return labelSize;
}

void QgsLayerTreeModelLegendNode::checkAllItems()
{
checkAll( true );
}

void QgsLayerTreeModelLegendNode::uncheckAllItems()
{
checkAll( false );
}

void QgsLayerTreeModelLegendNode::toggleAllItems()
{
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() ) )
{
if ( !vlayer->renderer() )
return;

const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
for ( const auto &item : symbolList )
{
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), ! vlayer->renderer()->legendSymbolItemChecked( item.ruleKey() ) );
}

emit dataChanged();
vlayer->triggerRepaint();
}
}

// -------------------------------------------------------------------------

QgsSymbolLegendNode::QgsSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsLegendSymbolItem &item, QObject *parent )
Expand Down Expand Up @@ -383,32 +411,6 @@ void QgsSymbolLegendNode::setSymbol( QgsSymbol *symbol )
vlayer->triggerRepaint();
}

void QgsSymbolLegendNode::checkAllItems()
{
checkAll( true );
}

void QgsSymbolLegendNode::uncheckAllItems()
{
checkAll( false );
}

void QgsSymbolLegendNode::toggleAllItems()
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() );
if ( !vlayer || !vlayer->renderer() )
return;

const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
for ( const auto &item : symbolList )
{
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), ! vlayer->renderer()->legendSymbolItemChecked( item.ruleKey() ) );
}

emit dataChanged();
vlayer->triggerRepaint();
}

QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() const
{
double scale = 0.0;
Expand All @@ -430,20 +432,22 @@ QgsRenderContext *QgsLayerTreeModelLegendNode::createTemporaryRenderContext() co
return context.release();
}

void QgsSymbolLegendNode::checkAll( bool state )
void QgsLayerTreeModelLegendNode::checkAll( bool state )
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() );
if ( !vlayer || !vlayer->renderer() )
return;

const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
for ( const auto &item : symbolList )
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() ) )
{
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), state );
}
if ( !vlayer->renderer() )
return;

emit dataChanged();
vlayer->triggerRepaint();
const QgsLegendSymbolList symbolList = vlayer->renderer()->legendSymbolItems();
for ( const auto &item : symbolList )
{
vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), state );
}

emit dataChanged();
vlayer->triggerRepaint();
}
}

QVariant QgsSymbolLegendNode::data( int role ) const
Expand Down Expand Up @@ -497,11 +501,13 @@ QVariant QgsSymbolLegendNode::data( int role ) const
if ( !mItem.isCheckable() )
return QVariant();

QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() );
if ( !vlayer || !vlayer->renderer() )
return QVariant();
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mLayerNode->layer() ) )
{
if ( !vlayer->renderer() )
return QVariant();

return vlayer->renderer()->legendSymbolItemChecked( mItem.ruleKey() ) ? Qt::Checked : Qt::Unchecked;
return vlayer->renderer()->legendSymbolItemChecked( mItem.ruleKey() ) ? Qt::Checked : Qt::Unchecked;
}
}
else if ( role == RuleKeyRole )
{
Expand Down
65 changes: 34 additions & 31 deletions src/core/layertree/qgslayertreemodellegendnode.h
Expand Up @@ -265,6 +265,32 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
*/
virtual QSizeF drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const;

public slots:

/**
* Checks all checkable items belonging to the same layer as this node.
* \see uncheckAllItems()
* \see toggleAllItems()
* \since QGIS 3.18 (previously was available in QgsSymbolLegendNode subclass only)
*/
void checkAllItems();

/**
* Unchecks all checkable items belonging to the same layer as this node.
* \see checkAllItems()
* \see toggleAllItems()
* \since QGIS 3.18 (previously was available in QgsSymbolLegendNode subclass only)
*/
void uncheckAllItems();

/**
* Toggle all checkable items belonging to the same layer as this node.
* \see checkAllItems()
* \see uncheckAllItems()
* \since QGIS 3.18 (previously was available in QgsSymbolLegendNode subclass only)
*/
void toggleAllItems();

signals:
//! Emitted on internal data change so the layer tree model can forward the signal to views
void dataChanged();
Expand All @@ -290,6 +316,14 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
QgsLegendPatchShape mPatchShape;
QSizeF mUserSize;
bool mColumnBreakBeforeNode = false;

private:

/**
* Sets all items belonging to the same layer as this node to the same check state.
* \param state check state
*/
void checkAll( bool state );
};
Q_DECLARE_METATYPE( QgsLayerTreeModelLegendNode::NodeTypes )

Expand Down Expand Up @@ -453,32 +487,6 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
*/
QString evaluateLabel( const QgsExpressionContext &context = QgsExpressionContext(), const QString &label = QString() );

public slots:

/**
* Checks all items belonging to the same layer as this node.
* \see uncheckAllItems()
* \see toggleAllItems()
* \since QGIS 2.14
*/
void checkAllItems();

/**
* Unchecks all items belonging to the same layer as this node.
* \see checkAllItems()
* \see toggleAllItems()
* \since QGIS 2.14
*/
void uncheckAllItems();

/**
* Toggle all items belonging to the same layer as this node.
* \see checkAllItems()
* \see uncheckAllItems()
* \since QGIS 3.6
*/
void toggleAllItems();

private:
void updateLabel();

Expand Down Expand Up @@ -506,11 +514,6 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
*/
QgsExpressionContextScope *createSymbolScope() const SIP_FACTORY;

/**
* Sets all items belonging to the same layer as this node to the same check state.
* \param state check state
*/
void checkAll( bool state );
};


Expand Down

0 comments on commit 902cb3d

Please sign in to comment.