Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[FEATURE] Add diagram nodes to legends (fix #4255)
  • Loading branch information
vmora authored and nyalldawson committed May 4, 2015
1 parent 4a9a936 commit 72cfe46
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 11 deletions.
18 changes: 18 additions & 0 deletions python/core/qgsdiagramrendererv2.sip
Expand Up @@ -75,6 +75,8 @@ class QgsDiagramSettings
QFont font;
QList< QColor > categoryColors;
QList< QString > categoryAttributes;
//! @note added in 2.10
QList< QString > categoryLabels;
QSizeF size; //size
SizeType sizeType; //mm or map units
QColor backgroundColor;
Expand All @@ -97,6 +99,12 @@ class QgsDiagramSettings

void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
void writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;

/** Returns list of legend nodes for the diagram
* @note caller is responsible for deletion of QgsLayerTreeModelLegendNodes
* @note added in 2.10
*/
QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const /Factory/;
};

//additional diagram settings for interpolated size rendering
Expand Down Expand Up @@ -150,6 +158,12 @@ class QgsDiagramRendererV2
virtual void readXML( const QDomElement& elem, const QgsVectorLayer* layer ) = 0;
virtual void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const = 0;

/** Returns list of legend nodes for the diagram
* @note caller is responsible for deletion of QgsLayerTreeModelLegendNodes
* @note added in 2.10
*/
virtual QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const /Factory/;

protected:

/**Returns diagram settings for a feature (or false if the diagram for the feature is not to be rendered). Used internally within renderDiagram()
Expand Down Expand Up @@ -197,6 +211,8 @@ class QgsSingleCategoryDiagramRenderer : QgsDiagramRendererV2
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;

virtual QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const /Factory/;

protected:
bool diagramSettings( const QgsFeature &feature, const QgsRenderContext& c, QgsDiagramSettings& s );

Expand Down Expand Up @@ -248,6 +264,8 @@ class QgsLinearlyInterpolatedDiagramRenderer : QgsDiagramRendererV2
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;

virtual QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const /Factory/;

protected:
bool diagramSettings( const QgsFeature &feature, const QgsRenderContext& c, QgsDiagramSettings& s );

Expand Down
9 changes: 8 additions & 1 deletion src/app/qgsdiagramproperties.cpp
Expand Up @@ -309,9 +309,11 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare

QList< QColor > categoryColors = settingList.at( 0 ).categoryColors;
QList< QString > categoryAttributes = settingList.at( 0 ).categoryAttributes;
QList< QString > categoryLabels = settingList.at( 0 ).categoryLabels;
QList< QString >::const_iterator catIt = categoryAttributes.constBegin();
QList< QColor >::const_iterator coIt = categoryColors.constBegin();
for ( ; catIt != categoryAttributes.constEnd(); ++catIt, ++coIt )
QList< QString >::const_iterator labIt = categoryLabels.constBegin();
for ( ; catIt != categoryAttributes.constEnd(); ++catIt, ++coIt, ++labIt )
{
QTreeWidgetItem *newItem = new QTreeWidgetItem( mDiagramAttributesTreeWidget );
newItem->setText( 0, *catIt );
Expand All @@ -320,6 +322,8 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare
QColor col( *coIt );
col.setAlpha( 255 );
newItem->setBackground( 1, QBrush( col ) );
newItem->setText( 2, *labIt );
newItem->setFlags( newItem->flags() | Qt::ItemIsEditable );
}
}

Expand Down Expand Up @@ -645,15 +649,18 @@ void QgsDiagramProperties::apply()

QList<QColor> categoryColors;
QList<QString> categoryAttributes;
QList<QString> categoryLabels;
for ( int i = 0; i < mDiagramAttributesTreeWidget->topLevelItemCount(); ++i )
{
QColor color = mDiagramAttributesTreeWidget->topLevelItem( i )->background( 1 ).color();
color.setAlpha( 255 - ds.transparency );
categoryColors.append( color );
categoryAttributes.append( mDiagramAttributesTreeWidget->topLevelItem( i )->data( 0, Qt::UserRole ).toString() );
categoryLabels.append( mDiagramAttributesTreeWidget->topLevelItem( i )->text( 2 ) );
}
ds.categoryColors = categoryColors;
ds.categoryAttributes = categoryAttributes;
ds.categoryLabels = categoryLabels;
ds.size = QSizeF( mDiagramSizeSpinBox->value(), mDiagramSizeSpinBox->value() );
ds.sizeType = static_cast<QgsDiagramSettings::SizeType>( mDiagramUnitComboBox->itemData( mDiagramUnitComboBox->currentIndex() ).toInt() );
ds.labelPlacementMethod = static_cast<QgsDiagramSettings::LabelPlacementMethod>( mLabelPlacementComboBox->itemData( mLabelPlacementComboBox->currentIndex() ).toInt() );
Expand Down
35 changes: 35 additions & 0 deletions src/core/qgsdiagramrendererv2.cpp
Expand Up @@ -18,6 +18,7 @@
#include "diagram/qgspiediagram.h"
#include "diagram/qgshistogramdiagram.h"
#include "qgsrendercontext.h"
#include "qgslayertreemodellegendnode.h"

#include <QDomElement>
#include <QPainter>
Expand Down Expand Up @@ -167,6 +168,11 @@ void QgsDiagramSettings::readXML( const QDomElement& elem, const QgsVectorLayer*
newColor.setAlpha( 255 - transparency );
categoryColors.append( newColor );
categoryAttributes.append( attrElem.attribute( "field" ) );
categoryLabels.append( attrElem.attribute( "label" ) );
if ( categoryLabels.back().isEmpty() )
{
categoryLabels.back() = categoryAttributes.back();
}
}
}
else
Expand All @@ -189,6 +195,7 @@ void QgsDiagramSettings::readXML( const QDomElement& elem, const QgsVectorLayer*
for ( ; catIt != catList.constEnd(); ++catIt )
{
categoryAttributes.append( *catIt );
categoryLabels.append( *catIt );
}
}
}
Expand Down Expand Up @@ -277,6 +284,7 @@ void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc,

attributeElem.setAttribute( "field", categoryAttributes.at( i ) );
attributeElem.setAttribute( "color", categoryColors.at( i ).name() );
attributeElem.setAttribute( "label", categoryLabels.at( i ) );
categoryElem.appendChild( attributeElem );
}

Expand Down Expand Up @@ -533,3 +541,30 @@ void QgsLinearlyInterpolatedDiagramRenderer::writeXML( QDomElement& layerElem, Q
_writeXML( rendererElem, doc, layer );
layerElem.appendChild( rendererElem );
}

QList< QgsLayerTreeModelLegendNode* > QgsDiagramSettings::legendItems( QgsLayerTreeLayer* nodeLayer ) const
{
QList< QgsLayerTreeModelLegendNode * > list;
for ( int i = 0 ; i < categoryLabels.size(); ++i )
{
QPixmap pix( 16, 16 );
pix.fill( categoryColors[i] );
list << new QgsSimpleLegendNode( nodeLayer, categoryLabels[i], QIcon( pix ), 0, QString( "diagram_%1" ).arg( QString::number( i ) ) );
}
return list;
}

QList< QgsLayerTreeModelLegendNode* > QgsDiagramRendererV2::legendItems( QgsLayerTreeLayer* ) const
{
return QList< QgsLayerTreeModelLegendNode * >();
}

QList< QgsLayerTreeModelLegendNode* > QgsSingleCategoryDiagramRenderer::legendItems( QgsLayerTreeLayer* nodeLayer ) const
{
return mSettings.legendItems( nodeLayer );
}

QList< QgsLayerTreeModelLegendNode* > QgsLinearlyInterpolatedDiagramRenderer::legendItems( QgsLayerTreeLayer* nodeLayer ) const
{
return mSettings.legendItems( nodeLayer );
}
21 changes: 21 additions & 0 deletions src/core/qgsdiagramrendererv2.h
Expand Up @@ -33,6 +33,8 @@ class QgsPalGeometry;
class QgsCoordinateTransform;
class QgsMapToPixel;
class QgsVectorLayer;
class QgsLayerTreeModelLegendNode;
class QgsLayerTreeLayer;

namespace pal { class Layer; }

Expand Down Expand Up @@ -129,6 +131,8 @@ class CORE_EXPORT QgsDiagramSettings
QFont font;
QList< QColor > categoryColors;
QList< QString > categoryAttributes;
//! @note added in 2.10
QList< QString > categoryLabels;
QSizeF size; //size
SizeType sizeType; //mm or map units
QColor backgroundColor;
Expand All @@ -151,6 +155,13 @@ class CORE_EXPORT QgsDiagramSettings

void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
void writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;

/** Returns list of legend nodes for the diagram
* @note caller is responsible for deletion of QgsLayerTreeModelLegendNodes
* @note added in 2.10
*/
QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const;

};

//additional diagram settings for interpolated size rendering
Expand Down Expand Up @@ -198,6 +209,12 @@ class CORE_EXPORT QgsDiagramRendererV2
virtual void readXML( const QDomElement& elem, const QgsVectorLayer* layer ) = 0;
virtual void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const = 0;

/** Returns list of legend nodes for the diagram
* @note caller is responsible for deletion of QgsLayerTreeModelLegendNodes
* @note added in 2.10
*/
virtual QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const;

protected:
QgsDiagramRendererV2( const QgsDiagramRendererV2& other );

Expand Down Expand Up @@ -245,6 +262,8 @@ class CORE_EXPORT QgsSingleCategoryDiagramRenderer : public QgsDiagramRendererV2
void readXML( const QDomElement& elem, const QgsVectorLayer* layer ) override;
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const override;

QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const override;

protected:
bool diagramSettings( const QgsFeature &feature, const QgsRenderContext& c, QgsDiagramSettings& s ) override;

Expand Down Expand Up @@ -295,6 +314,8 @@ class CORE_EXPORT QgsLinearlyInterpolatedDiagramRenderer : public QgsDiagramRend
void readXML( const QDomElement& elem, const QgsVectorLayer* layer ) override;
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const override;

QList< QgsLayerTreeModelLegendNode* > legendItems( QgsLayerTreeLayer* nodeLayer ) const override;

protected:
bool diagramSettings( const QgsFeature &feature, const QgsRenderContext& c, QgsDiagramSettings& s ) override;

Expand Down
11 changes: 11 additions & 0 deletions src/core/qgsmaplayerlegend.cpp
Expand Up @@ -23,6 +23,7 @@
#include "qgsrasterlayer.h"
#include "qgsrendererv2.h"
#include "qgsvectorlayer.h"
#include "qgsdiagramrendererv2.h"


QgsMapLayerLegend::QgsMapLayerLegend( QObject *parent ) :
Expand Down Expand Up @@ -206,6 +207,16 @@ QList<QgsLayerTreeModelLegendNode*> QgsDefaultVectorLayerLegend::createLayerTree
if ( nodes.count() == 1 && nodes[0]->data( Qt::EditRole ).toString().isEmpty() )
nodes[0]->setEmbeddedInParent( true );


if ( mLayer->diagramsEnabled() )
{
foreach ( QgsLayerTreeModelLegendNode * i, mLayer->diagramRenderer()->legendItems( nodeLayer ) )
{
nodes.append( i );
}
}


return nodes;
}

Expand Down
1 change: 1 addition & 0 deletions src/core/qgsvectorlayer.cpp
Expand Up @@ -587,6 +587,7 @@ void QgsVectorLayer::setDiagramRenderer( QgsDiagramRendererV2* r )
{
delete mDiagramRenderer;
mDiagramRenderer = r;
emit rendererChanged();
}

QGis::GeometryType QgsVectorLayer::geometryType() const
Expand Down
25 changes: 15 additions & 10 deletions src/ui/qgsdiagrampropertiesbase.ui
Expand Up @@ -298,7 +298,7 @@
<x>0</x>
<y>0</y>
<width>630</width>
<height>376</height>
<height>372</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6">
Expand Down Expand Up @@ -472,7 +472,7 @@
<bool>false</bool>
</property>
<property name="columnCount">
<number>2</number>
<number>3</number>
</property>
<column>
<property name="text">
Expand All @@ -484,6 +484,11 @@
<string>Color</string>
</property>
</column>
<column>
<property name="text">
<string>Legend</string>
</property>
</column>
</widget>
</item>
</layout>
Expand Down Expand Up @@ -525,8 +530,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>630</width>
<height>376</height>
<width>318</width>
<height>377</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
Expand Down Expand Up @@ -870,8 +875,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>630</width>
<height>376</height>
<width>586</width>
<height>318</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_11">
Expand Down Expand Up @@ -1148,8 +1153,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>630</width>
<height>376</height>
<width>326</width>
<height>272</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_12">
Expand Down Expand Up @@ -1437,8 +1442,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>630</width>
<height>376</height>
<width>123</width>
<height>171</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
Expand Down

0 comments on commit 72cfe46

Please sign in to comment.