[QGIS Commit] r9770 -
branches/vector_overlay_branch/src/plugins/diagram_overlay
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Wed Dec 10 08:16:59 EST 2008
Author: mhugent
Date: 2008-12-10 08:16:59 -0500 (Wed, 10 Dec 2008)
New Revision: 9770
Added:
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidgetbase.ui
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidgetbase.ui
Modified:
branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialogbase.ui
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramrendererwidget.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.h
Log:
Added gui to use proportional svg symbols as new diagram type
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt 2008-12-10 13:16:59 UTC (rev 9770)
@@ -6,9 +6,12 @@
qgsdiagramcategory.cpp
qgsdiagramfactory.cpp
qgswkndiagramfactory.cpp
+ qgswkndiagramfactorywidget.cpp
qgsbardiagramfactory.cpp
qgspiediagramfactory.cpp
qgssvgdiagramfactory.cpp
+ qgssvgdiagramfactorywidget.cpp
+ qgsdiagramfactorywidget.cpp
qgsdiagramoverlay.cpp
qgsdiagramoverlayplugin.cpp
qgsdiagramrenderer.cpp
@@ -16,12 +19,14 @@
qgslinearlyscalingdialog.cpp
)
-SET (DIAGRAMOVERLAY_UIS qgsdiagramdialogbase.ui qgslinearlyscalingdialogbase.ui)
+SET (DIAGRAMOVERLAY_UIS qgsdiagramdialogbase.ui qgslinearlyscalingdialogbase.ui qgssvgdiagramfactorywidgetbase.ui qgswkndiagramfactorywidgetbase.ui)
SET (DIAGRAMOVERLAY_MOC_HDRS
qgsdiagramoverlayplugin.h
qgsdiagramdialog.h
qgslinearlyscalingdialog.h
+ qgssvgdiagramfactorywidget.h
+ qgswkndiagramfactorywidget.h
)
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -135,7 +135,7 @@
double QgsBarDiagramFactory::sizeValueRatioBarChart(int size, const QgsAttributeMap& featureAttributes) const
{
//find value for scaling attribute
- QList<int>::const_iterator scaling_it = mScalingAttributes.constBegin();
+ QgsAttributeList::const_iterator scaling_it = mScalingAttributes.constBegin();
double scalingValue = 0;
for(; scaling_it != mScalingAttributes.constEnd(); ++scaling_it)
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.cpp 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -20,28 +20,23 @@
#include "qgsdiagramoverlay.h"
#include "qgsfield.h"
#include "qgslinearlyscalingdialog.h"
+#include "qgssvgdiagramfactory.h"
+#include "qgssvgdiagramfactorywidget.h"
#include "qgsvectordataprovider.h"
#include "qgswkndiagramfactory.h"
+#include "qgswkndiagramfactorywidget.h"
#include <QColorDialog>
QgsDiagramDialog::QgsDiagramDialog(QgsVectorLayer* vl): mVectorLayer(vl)
{
setupUi(this);
- QObject::connect(mAddPushButton, SIGNAL(clicked()), this, SLOT(addAttribute()));
- QObject::connect(mRemovePushButton, SIGNAL(clicked()), this, SLOT(removeAttribute()));
- QObject::connect(mClassificationTypeComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(changeClassificationType(const QString&)));
QObject::connect(mClassificationComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(changeClassificationAttribute(const QString&)));
- QObject::connect(mAttributesTreeWidget, SIGNAL(itemDoubleClicked( QTreeWidgetItem*, int)), this, SLOT(handleItemDoubleClick(QTreeWidgetItem*, int)));
- mDiagramTypeComboBox->insertItem(0, "Bar");
- mDiagramTypeComboBox->insertItem(0, "Pie");
+ mDiagramTypeComboBox->insertItem(0, tr("Pie chart"));
+ mDiagramTypeComboBox->insertItem(1, tr("Bar chart"));
+ mDiagramTypeComboBox->insertItem(2, tr("Proportional SVG symbols"));
- QStringList headerLabels;
- headerLabels << "Attribute";
- headerLabels << "Color";
- mAttributesTreeWidget->setHeaderLabels(headerLabels);
-
if(!mVectorLayer)
{
return;
@@ -58,7 +53,6 @@
for (QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it)
{
str = (*it).name();
- mAttributesComboBox->insertItem(comboIndex, str);
mClassificationComboBox->insertItem(comboIndex, str);
++comboIndex;
}
@@ -84,38 +78,8 @@
}
-void QgsDiagramDialog::addAttribute()
+void QgsDiagramDialog::on_mClassificationTypeComboBox_currentIndexChanged(const QString& newType)
{
- QTreeWidgetItem* newItem = new QTreeWidgetItem(mAttributesTreeWidget);
-
- //text
- QString currentText = mAttributesComboBox->currentText();
- newItem->setText(0, currentText);
-
- //and icon
- int red = 1 + (int) (255.0 * rand() / (RAND_MAX + 1.0));
- int green = 1 + (int) (255.0 * rand() / (RAND_MAX + 1.0));
- int blue = 1 + (int) (255.0 * rand() / (RAND_MAX + 1.0));
- QColor randomColor(red, green, blue);
- newItem->setBackground(1, QBrush(randomColor));
-
- if(!currentText.isNull() && !currentText.isEmpty())
- {
- mAttributesTreeWidget->addTopLevelItem(newItem);
- }
-}
-
-void QgsDiagramDialog::removeAttribute()
-{
- QTreeWidgetItem* currentItem = mAttributesTreeWidget->currentItem();
- if(currentItem)
- {
- delete currentItem;
- }
-}
-
-void QgsDiagramDialog::changeClassificationType(const QString& newType)
-{
if(newType == "linearly scaling")
{
QWidget* currentWidget = mWidgetStackRenderers->currentWidget();
@@ -126,11 +90,11 @@
QWidget* newWidget = new QgsLinearlyScalingDialog(mVectorLayer);
mWidgetStackRenderers->addWidget(newWidget);
mWidgetStackRenderers->setCurrentWidget(newWidget);
- changeClassificationAttribute(mClassificationComboBox->currentText());
+ on_mClassificationComboBox_currentIndexChanged(mClassificationComboBox->currentText());
}
}
-void QgsDiagramDialog::changeClassificationAttribute(const QString& newAttribute)
+void QgsDiagramDialog::on_mClassificationComboBox_currentIndexChanged(const QString& newAttribute)
{
int attributeIndex = QgsDiagramOverlay::indexFromAttributeName(newAttribute, mVectorLayer);
if(attributeIndex == -1)
@@ -145,58 +109,107 @@
rendererWidget->changeClassificationField(attributeIndex);
}
+void QgsDiagramDialog::on_mDiagramTypeComboBox_currentIndexChanged(const QString& text)
+{
+ //remove old widget
+ QWidget* currentWidget = mDiagramFactoryStackedWidget->currentWidget();
+ mDiagramFactoryStackedWidget->removeWidget(currentWidget);
+ delete currentWidget;
+
+ //and create a new one
+ QgsDiagramFactoryWidget* newWidget = 0;
+ if(text == tr("Pie chart"))
+ {
+ newWidget = new QgsWKNDiagramFactoryWidget(mVectorLayer, "Pie");
+ }
+ else if(text == tr("Bar chart"))
+ {
+ newWidget = new QgsWKNDiagramFactoryWidget(mVectorLayer, "Bar");
+ }
+ else if(text == (tr("Proportional SVG symbols")))
+ {
+ newWidget = new QgsSVGDiagramFactoryWidget();
+ }
+
+ if(newWidget)
+ {
+ mDiagramFactoryStackedWidget->addWidget(newWidget);
+ mDiagramFactoryStackedWidget->setCurrentWidget(newWidget);
+ newWidget->show();
+ }
+}
+
void QgsDiagramDialog::apply() const
{
- std::list<QColor> colorList;
- QgsAttributeList attList;
+ if(!mVectorLayer)
+ {
+ return;
+ }
- int topLevelItemCount = mAttributesTreeWidget->topLevelItemCount();
- QTreeWidgetItem* currentItem;
- int currentAttribute;
-
- int classificationField = QgsDiagramOverlay::indexFromAttributeName(mClassificationComboBox->currentText(), mVectorLayer);
-
- for(int i = 0; i < topLevelItemCount; ++i)
+ //create diagram factory
+ QgsDiagramFactory* diagramFactory = 0;
+ QWidget* factoryWidget = mDiagramFactoryStackedWidget->currentWidget();
+
+ if(factoryWidget)
{
- currentItem = mAttributesTreeWidget->topLevelItem(i);
- currentAttribute = QgsDiagramOverlay::indexFromAttributeName(currentItem->text(0), mVectorLayer);
- if(currentAttribute != -1)
- {
- colorList.push_back(currentItem->background(1).color());
- attList.push_back(currentAttribute);
- }
+ QgsDiagramFactoryWidget* diagramFactoryWidget = dynamic_cast<QgsDiagramFactoryWidget*>(factoryWidget);
+ if(factoryWidget)
+ {
+ diagramFactory = diagramFactoryWidget->createFactory();
+ }
}
- QgsDiagramRendererWidget* rendererWidget = dynamic_cast<QgsDiagramRendererWidget*>(mWidgetStackRenderers->currentWidget());
- if(!rendererWidget)
- {
- return;
- }
+ if(!diagramFactory)
+ {
+ return;
+ }
- QgsDiagramRenderer* renderer = rendererWidget->createRenderer(mDiagramTypeComboBox->currentText(), classificationField, attList, colorList);
- if(!renderer)
+ //and diagram renderer
+
+ //classAttr comes from the gui
+ int classAttr = QgsDiagramOverlay::indexFromAttributeName(mClassificationComboBox->currentText(), mVectorLayer);
+ if(classAttr == -1)
{
- return;
+ return;
}
- if(renderer->factory())
- {
- renderer->factory()->setSizeUnit(rendererWidget->sizeUnit());
- }
+ //attList comes from the diagram factory widget
+ QgsAttributeList attList = diagramFactory->categoryAttributes();
- //create QgsDiagramOverlay and add the renderer to it
-
- //the overlay may need a different attribute list than the renderer
- if(!attList.contains(classificationField))
- {
- attList.push_back(classificationField);
- }
-
- QgsDiagramOverlay* diagramOverlay = new QgsDiagramOverlay(mVectorLayer);
- diagramOverlay->setDiagramRenderer(renderer);
- diagramOverlay->setAttributes(attList);
-
- //display flag
+ QgsDiagramRenderer* diagramRenderer = 0;
+ QgsDiagramFactory::SizeUnit diagramSizeUnit = QgsDiagramFactory::MM; //mm on output medium is default
+
+ QWidget* rendererWidget = mWidgetStackRenderers->currentWidget();
+ if(rendererWidget)
+ {
+ QgsDiagramRendererWidget* diagramRendererWidget = dynamic_cast<QgsDiagramRendererWidget*>(rendererWidget);
+ if(diagramRendererWidget)
+ {
+ diagramRenderer = diagramRendererWidget->createRenderer(classAttr, attList);
+ diagramSizeUnit = diagramRendererWidget->sizeUnit();
+ }
+ }
+
+ if(!diagramRenderer)
+ {
+ return;
+ }
+
+ diagramRenderer->setFactory(diagramFactory);
+ diagramFactory->setScalingAttributes(attList);
+ //also set units to the diagram factory
+ diagramFactory->setSizeUnit(diagramSizeUnit);
+
+ //the overlay may need a different attribute list than the renderer
+ if(!attList.contains(classAttr))
+ {
+ attList.push_back(classAttr);
+ }
+ QgsDiagramOverlay* diagramOverlay = new QgsDiagramOverlay(mVectorLayer);
+ diagramOverlay->setDiagramRenderer(diagramRenderer);
+ diagramOverlay->setAttributes(attList);
+
+ //display flag
if(mDisplayDiagramsCheckBox->checkState() == Qt::Checked)
{
diagramOverlay->setDisplayFlag(true);
@@ -213,18 +226,6 @@
mVectorLayer->addOverlay(diagramOverlay);
}
-void QgsDiagramDialog::handleItemDoubleClick(QTreeWidgetItem * item, int column)
-{
- if(column == 1) //change color
- {
- QColor newColor = QColorDialog::getColor();
- if(newColor.isValid())
- {
- item->setBackground(1, QBrush(newColor));
- }
- }
-}
-
void QgsDiagramDialog::restoreSettings(const QgsVectorOverlay* overlay)
{
const QgsDiagramOverlay* previousDiagramOverlay = dynamic_cast<const QgsDiagramOverlay*>(overlay);
@@ -242,24 +243,49 @@
const QgsDiagramRenderer* previousDiagramRenderer = dynamic_cast<const QgsDiagramRenderer*>(previousDiagramOverlay->diagramRenderer());
if(previousDiagramRenderer && previousDiagramRenderer->factory())
- {
- QgsWKNDiagramFactory* theFactory = dynamic_cast<QgsWKNDiagramFactory*>(previousDiagramRenderer->factory());
- if(theFactory)
- {
- //well known diagram name
- mDiagramTypeComboBox->setCurrentIndex(mDiagramTypeComboBox->findText(theFactory->diagramType()));
- //insert attribute names and colors into mAttributesTreeWidget
- QList<QgsDiagramCategory> categoryList = theFactory->categories();
- QList<QgsDiagramCategory>::const_iterator c_it = categoryList.constBegin();
+ {
+ QgsDiagramFactory* theFactory = previousDiagramRenderer->factory();
+ QgsDiagramFactoryWidget* newWidget = 0;
+
+
+ QgsWKNDiagramFactory* theWKNFactory = dynamic_cast<QgsWKNDiagramFactory*>(theFactory);
+ if(theWKNFactory)
+ {
+ QString wknType = theWKNFactory->diagramType();
+ if(wknType == ("Pie"))
+ {
+ newWidget = new QgsWKNDiagramFactoryWidget(mVectorLayer, "Pie");
+ mDiagramTypeComboBox->setCurrentIndex(mDiagramTypeComboBox->findText(tr("Pie chart")));
+ }
+ else
+ {
+ newWidget = new QgsWKNDiagramFactoryWidget(mVectorLayer, "Bar");
+ mDiagramTypeComboBox->setCurrentIndex(mDiagramTypeComboBox->findText(tr("Bar chart")));
+ }
+ newWidget->setExistingFactory(theWKNFactory);
+ }
+
+ QgsSVGDiagramFactory* theSVGFactory = dynamic_cast<QgsSVGDiagramFactory*>(theFactory);
+ if(theSVGFactory)
+ {
+ mDiagramTypeComboBox->setCurrentIndex(mDiagramTypeComboBox->findText(tr("Proportional SVG symbols")));
+ newWidget = new QgsSVGDiagramFactoryWidget();
+ }
+
+ newWidget->setExistingFactory(theFactory);
+ //remove old widget
+ QWidget* currentWidget = mDiagramFactoryStackedWidget->currentWidget();
+ mDiagramFactoryStackedWidget->removeWidget(currentWidget);
+ delete currentWidget;
+
+ if(newWidget)
+ {
+ mDiagramFactoryStackedWidget->addWidget(newWidget);
+ mDiagramFactoryStackedWidget->setCurrentWidget(newWidget);
+ newWidget->show();
+ }
+
- for(; c_it != categoryList.constEnd(); ++c_it)
- {
- QTreeWidgetItem* newItem = new QTreeWidgetItem(mAttributesTreeWidget);
- newItem->setText(0, QgsDiagramOverlay::attributeNameFromIndex(c_it->propertyIndex(), mVectorLayer));
- newItem->setBackground(1, c_it->brush());
- mAttributesTreeWidget->addTopLevelItem(newItem);
- }
-
//classification attribute
QString classFieldName = QgsDiagramOverlay::attributeNameFromIndex(theFactory->scalingAttributes().first(), mVectorLayer);
mClassificationComboBox->setCurrentIndex(mClassificationComboBox->findText(classFieldName));
@@ -275,10 +301,9 @@
{
rendererWidget->applySettings(previousDiagramRenderer);
}
- }
- }
- }
- }
+ }
+ }
+ }
}
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.h 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialog.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -34,15 +34,11 @@
void apply() const;
private slots:
- /**Adds name of the attribute combo box into the tree widget*/
- void addAttribute();
- /**Removes the current attribute from the tree widget*/
- void removeAttribute();
- void changeClassificationType(const QString& newType);
- void changeClassificationAttribute(const QString& newAttribute);
- /**Calls the color dialog if column == 1*/
- void handleItemDoubleClick(QTreeWidgetItem * item, int column);
+ void on_mClassificationTypeComboBox_currentIndexChanged(const QString& newType);
+ void on_mClassificationComboBox_currentIndexChanged(const QString& newAttribute);
+ void on_mDiagramTypeComboBox_currentIndexChanged(const QString& text);
+
private:
QgsDiagramDialog();
/**Restores the dialog settings from an already existing overlay*/
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialogbase.ui
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialogbase.ui 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramdialogbase.ui 2008-12-10 13:16:59 UTC (rev 9770)
@@ -6,19 +6,13 @@
<x>0</x>
<y>0</y>
<width>398</width>
- <height>482</height>
+ <height>441</height>
</rect>
</property>
<property name="windowTitle" >
<string>Dialog</string>
</property>
<layout class="QGridLayout" >
- <property name="margin" >
- <number>9</number>
- </property>
- <property name="spacing" >
- <number>6</number>
- </property>
<item row="0" column="0" >
<widget class="QCheckBox" name="mDisplayDiagramsCheckBox" >
<property name="text" >
@@ -28,12 +22,21 @@
</item>
<item row="1" column="0" >
<layout class="QHBoxLayout" >
- <property name="margin" >
- <number>0</number>
- </property>
<property name="spacing" >
<number>6</number>
</property>
+ <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>
<item>
<widget class="QLabel" name="mTypeLabel" >
<property name="text" >
@@ -47,74 +50,31 @@
</layout>
</item>
<item row="2" column="0" >
- <layout class="QHBoxLayout" >
- <property name="margin" >
- <number>0</number>
- </property>
- <property name="spacing" >
- <number>6</number>
- </property>
- <item>
- <widget class="QLabel" name="mAttributesLabel" >
- <property name="text" >
- <string>Attributes:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="mAttributesComboBox" />
- </item>
- </layout>
+ <widget class="QStackedWidget" name="mDiagramFactoryStackedWidget" >
+ <widget class="QWidget" name="page_3" />
+ <widget class="QWidget" name="page_4" />
+ </widget>
</item>
<item row="3" column="0" >
<layout class="QGridLayout" >
- <property name="margin" >
+ <property name="leftMargin" >
<number>0</number>
</property>
- <property name="spacing" >
- <number>6</number>
+ <property name="topMargin" >
+ <number>0</number>
</property>
- <item row="1" column="0" colspan="2" >
- <widget class="QTreeWidget" name="mAttributesTreeWidget" >
- <property name="columnCount" >
- <number>2</number>
- </property>
- <column>
- <property name="text" >
- <string>1</string>
- </property>
- </column>
- <column>
- <property name="text" >
- <string>1</string>
- </property>
- </column>
- </widget>
- </item>
- <item row="0" column="1" >
- <widget class="QPushButton" name="mRemovePushButton" >
- <property name="text" >
- <string>Remove attribute</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0" >
- <widget class="QPushButton" name="mAddPushButton" >
- <property name="text" >
- <string>Add attribute</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="4" column="0" >
- <layout class="QGridLayout" >
- <property name="margin" >
+ <property name="rightMargin" >
<number>0</number>
</property>
- <property name="spacing" >
+ <property name="bottomMargin" >
+ <number>0</number>
+ </property>
+ <property name="horizontalSpacing" >
<number>6</number>
</property>
+ <property name="verticalSpacing" >
+ <number>6</number>
+ </property>
<item row="0" column="1" >
<widget class="QComboBox" name="mClassificationTypeComboBox" />
</item>
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -20,6 +20,7 @@
#include <QMap>
#include <QString>
+#include "qgsvectorlayer.h"
class QgsFeature;
class QgsRenderContext;
@@ -80,10 +81,22 @@
virtual QgsDiagramFactory::SizeType sizeType() const;
void setSizeUnit(SizeUnit u){mSizeUnit = u;}
+ SizeUnit sizeUnit() const {return mSizeUnit;}
+ //setters and getters for scaling attribute
+ QgsAttributeList scalingAttributes() const {return mScalingAttributes;}
+ void setScalingAttributes(const QgsAttributeList& att){mScalingAttributes = att;}
+
+ /**Returns the attributes represented in the pies / bars*/
+ virtual QgsAttributeList categoryAttributes() const {return QgsAttributeList();}
+
protected:
/**Size units of diagram items*/
SizeUnit mSizeUnit;
+
+ /**List of scaling attribute indexes (the values are summed up to
+ receive the scaling value)*/
+ QgsAttributeList mScalingAttributes;
};
#endif
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.cpp (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,28 @@
+/***************************************************************************
+ qgsdiagramfactorywidget.cpp - description
+ --------------------------
+ begin : December 2008
+ copyright : (C) 2008 by Marco Hugentobler
+ email : marco dot hugentobler at karto dot baug dot ethz dot 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 "qgsdiagramfactorywidget.h"
+
+QgsDiagramFactoryWidget::QgsDiagramFactoryWidget(): QWidget()
+{
+
+}
+
+QgsDiagramFactoryWidget::~QgsDiagramFactoryWidget()
+{
+
+}
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.h (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactorywidget.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,37 @@
+/***************************************************************************
+ qgsdiagramfactorywidget.h - description
+ --------------------------
+ begin : December 2008
+ copyright : (C) 2008 by Marco Hugentobler
+ email : marco dot hugentobler at karto dot baug dot ethz dot 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 QGSDIAGRAMFACTORYWIDGET_H
+#define QGSDIAGRAMFACTORYWIDGET_H
+
+#include <QWidget>
+
+class QgsDiagramFactory;
+
+/**Abstract factory for dialogs that display options to create a diagram factory*/
+class QgsDiagramFactoryWidget: public QWidget
+{
+ public:
+ QgsDiagramFactoryWidget();
+ virtual ~QgsDiagramFactoryWidget();
+ /**Creates a diagram factory object with the settings specified by the user*/
+ virtual QgsDiagramFactory* createFactory() = 0;
+ /**Sets the GUI element to the state of an existing diagram factory*/
+ virtual void setExistingFactory(const QgsDiagramFactory* f) = 0;
+};
+
+#endif
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramrendererwidget.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramrendererwidget.h 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramrendererwidget.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -37,7 +37,7 @@
@param classAttr index of the classification attribute
@param attributes list of all attribute indices involved in diagram generation
@param color color series for the attributes*/
- virtual QgsDiagramRenderer* createRenderer(const QString& type, int classAttr, const QgsAttributeList& attributes, const std::list<QColor>& colors) const = 0;
+ virtual QgsDiagramRenderer* createRenderer(int classAttr, const QgsAttributeList& attributes) const = 0;
/**Applies the settings of an existing renderer*/
virtual void applySettings(const QgsDiagramRenderer* renderer) = 0;
/**Possibility to adapt the dialog to a new field*/
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.cpp 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -34,18 +34,8 @@
}
-QgsDiagramRenderer* QgsLinearlyScalingDialog::createRenderer(const QString& type, int classAttr, const QgsAttributeList& attributes, const std::list<QColor>& colors) const
+QgsDiagramRenderer* QgsLinearlyScalingDialog::createRenderer(int classAttr, const QgsAttributeList& attributes) const
{
- //convert color list to brush list
- QList<QBrush> brushList;
- QList<QPen> penList;
-
- for(std::list<QColor>::const_iterator color_it = colors.begin(); color_it != colors.end(); ++color_it)
- {
- brushList.push_back(QBrush(*color_it));
- penList.push_back(QPen(Qt::NoPen));
- }
-
//create a linearly scaling renderer
QList<int> attributesList;
attributesList.push_back(classAttr);
@@ -61,39 +51,7 @@
itemList.push_back(secondItem);
renderer->setDiagramItems(itemList);
renderer->setItemInterpretation(QgsDiagramRenderer::LINEAR);
-
- QgsWKNDiagramFactory* f = 0;//new QgsWKNDiagramFactory();
- if(type == "Bar")
- {
- f = new QgsBarDiagramFactory();
- }
- else if(type == "Pie")
- {
- f = new QgsPieDiagramFactory();
- }
- else
- {
- return 0; //unknown diagram type
- }
- f->setDiagramType(type);
-
- std::list<QColor>::const_iterator c_it = colors.begin();
- QgsAttributeList::const_iterator a_it = attributes.constBegin();
-
- for(; c_it != colors.end() && a_it != attributes.constEnd(); ++c_it, ++a_it)
- {
- QgsDiagramCategory newCategory;
- newCategory.setPropertyIndex(*a_it);
- newCategory.setBrush(QBrush(*c_it));
- f->addCategory(newCategory);
- }
-
- QList<int> classAttrList;
- classAttrList.push_back(classAttr);
- f->setScalingAttributes(classAttrList);
- renderer->setFactory(f);
-
return renderer;
}
@@ -106,6 +64,19 @@
QgsDiagramItem theItem = itemList.at(1); //take the upper item
mValueLineEdit->setText(theItem.value.toString());
mSizeSpinBox->setValue(theItem.size);
+
+ if(linearRenderer->factory())
+ {
+ QgsDiagramFactory::SizeUnit sizeUnit = linearRenderer->factory()->sizeUnit();
+ if(sizeUnit == QgsDiagramFactory::MM)
+ {
+ mSizeUnitComboBox->setCurrentIndex(mSizeUnitComboBox->findText(tr("Millimeter")));
+ }
+ else if(sizeUnit == QgsDiagramFactory::MapUnits)
+ {
+ mSizeUnitComboBox->setCurrentIndex(mSizeUnitComboBox->findText(tr("Map units")));
+ }
+ }
}
}
@@ -117,7 +88,7 @@
QgsVectorDataProvider *provider = dynamic_cast<QgsVectorDataProvider *>(mVectorLayer->dataProvider());
if(provider)
{
- mValueLineEdit->setText(provider->maximumValue(mClassificationField).toString());
+ mValueLineEdit->setText(provider->maximumValue(mClassificationField).toString());
}
}
}
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.h 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgslinearlyscalingdialog.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -30,7 +30,7 @@
public:
QgsLinearlyScalingDialog(QgsVectorLayer* vl);
~QgsLinearlyScalingDialog();
- QgsDiagramRenderer* createRenderer(const QString& type, int classAttr, const QgsAttributeList& attributes, const std::list<QColor>& colors) const;
+ QgsDiagramRenderer* createRenderer(int classAttr, const QgsAttributeList& attributes) const;
void applySettings(const QgsDiagramRenderer* renderer);
/**Is called from QgsDiagramDialog. Inserts new maximum value into the text widget*/
void changeClassificationField(int newField){mClassificationField = newField;}
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.cpp (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,202 @@
+/***************************************************************************
+ qgssvgdiagramfactorywidget.cpp - description
+ ------------------------------
+ begin : December 2008
+ copyright : (C) 2008 by Marco Hugentobler
+ email : marco dot hugentobler at karto dot baug dot ethz dot 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 "qgssvgdiagramfactorywidget.h"
+#include "qgsapplication.h"
+#include "qgssvgdiagramfactory.h"
+#include <QDir>
+#include <QFile>
+#include <QFileDialog>
+#include <QProgressDialog>
+
+QgsSVGDiagramFactoryWidget::QgsSVGDiagramFactoryWidget(): QgsDiagramFactoryWidget()
+{
+ setupUi(this);
+
+ //add preview icons
+ addStandardDirectoriesToPreview();
+}
+
+QgsSVGDiagramFactoryWidget::~QgsSVGDiagramFactoryWidget()
+{
+
+}
+
+QgsDiagramFactory* QgsSVGDiagramFactoryWidget::createFactory()
+{
+ QString filePath = mPictureLineEdit->text();
+ if(filePath.isEmpty())
+ {
+ return 0;
+ }
+
+ QFile svgFile(filePath);
+ if(!svgFile.exists())
+ {
+ return 0;
+ }
+
+ //open file and read binary array
+ if(!svgFile.open(QIODevice::ReadOnly))
+ {
+ return 0;
+ }
+
+ QByteArray svgData = svgFile.readAll();
+
+ QgsSVGDiagramFactory* factory = new QgsSVGDiagramFactory();
+ if(!factory->setSVGData(svgData))
+ {
+ delete factory; return 0;
+ }
+
+ return factory;
+}
+
+void QgsSVGDiagramFactoryWidget::setExistingFactory(const QgsDiagramFactory* f)
+{
+ //nothing to be done
+}
+
+void QgsSVGDiagramFactoryWidget::on_mPreviewListWidget_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )
+{
+ if(!current)
+ {
+ return;
+ }
+
+ QString absoluteFilePath = current->data(Qt::UserRole).toString();
+ mPictureLineEdit->setText(absoluteFilePath);
+}
+
+void QgsSVGDiagramFactoryWidget::on_mAddDirectoryButton_clicked()
+{
+ //let user select a directory
+ QString directory = QFileDialog::getExistingDirectory(0, tr("Select new preview directory"));
+ if(directory.isNull())
+ {
+ return; //dialog canceled by user
+ }
+
+ //add entry to mSearchDirectoriesComboBox
+ mSearchDirectoriesComboBox->addItem(directory);
+
+ //and add icons to the preview
+ addDirectoryToPreview(directory);
+}
+
+void QgsSVGDiagramFactoryWidget::on_mRemoveDirectoryButton_clicked()
+{
+ QString directoryToRemove = mSearchDirectoriesComboBox->currentText();
+ mSearchDirectoriesComboBox->removeItem(mSearchDirectoriesComboBox->currentIndex());
+
+ //remove entries from back to front (to have the indices of existing items constant)
+ for(int i = (mPreviewListWidget->count() - 1); i >=0; --i)
+ {
+ QListWidgetItem* currentItem = mPreviewListWidget->item(i);
+ if(currentItem && currentItem->data(Qt::UserRole).toString().startsWith(directoryToRemove))
+ {
+ delete(mPreviewListWidget->takeItem(i));
+ }
+ }
+}
+
+int QgsSVGDiagramFactoryWidget::addDirectoryToPreview(const QString& path)
+{
+ //go through all files of a directory
+ QDir directory(path);
+ if(!directory.exists() || !directory.isReadable())
+ {
+ return 1; //error
+ }
+
+ QFileInfoList fileList = directory.entryInfoList(QDir::Files);
+ QFileInfoList::const_iterator fileIt = fileList.constBegin();
+
+ QProgressDialog progress("Adding Icons...", "Abort", 0, fileList.size() - 1, this);
+ //cancel button does not seem to work properly with modal dialog
+ //progress.setWindowModality(Qt::WindowModal);
+
+ int counter = 0;
+ for(; fileIt != fileList.constEnd(); ++fileIt)
+ {
+
+ progress.setLabelText(tr("Creating icon for file ") + fileIt->fileName());
+ progress.setValue(counter);
+ QCoreApplication::processEvents();
+ if(progress.wasCanceled())
+ {
+ break;
+ }
+ QString filePath = fileIt->absoluteFilePath();
+
+ //test if file is svg or pixel format
+ bool fileIsSvg = testSvgFile(filePath);
+
+ //exclude files that are not svg or image
+ if(!fileIsSvg)
+ {
+ ++counter; continue;
+ }
+
+ QListWidgetItem * listItem = new QListWidgetItem(mPreviewListWidget);
+
+ if(fileIsSvg)
+ {
+ QIcon icon(filePath);
+ listItem->setIcon(icon);
+ }
+
+ listItem->setText( "" );
+ //store the absolute icon file path as user data
+ listItem->setData( Qt::UserRole, fileIt->absoluteFilePath());
+ ++counter;
+ }
+
+ return 0;
+}
+
+void QgsSVGDiagramFactoryWidget::addStandardDirectoriesToPreview()
+{
+ //list all directories in $prefix/share/qgis/svg
+ QDir svgDirectory(QgsApplication::svgPath());
+ if(!svgDirectory.exists() || !svgDirectory.isReadable())
+ {
+ return; //error
+ }
+
+ QFileInfoList directoryList = svgDirectory.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
+ QFileInfoList::const_iterator dirIt = directoryList.constBegin();
+ for(; dirIt != directoryList.constEnd(); ++dirIt)
+ {
+ if(addDirectoryToPreview(dirIt->absoluteFilePath()) == 0)
+ {
+ mSearchDirectoriesComboBox->addItem(dirIt->absoluteFilePath());
+ }
+ }
+}
+
+bool QgsSVGDiagramFactoryWidget::testSvgFile(const QString& filename) const
+{
+ QSvgRenderer svgRenderer(filename);
+ if(svgRenderer.isValid())
+ {
+ return true;
+ }
+ return false;
+}
+
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.h (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidget.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,53 @@
+/***************************************************************************
+ qgssvgdiagramfactorywidget.h - description
+ --------------------------
+ begin : December 2008
+ copyright : (C) 2008 by Marco Hugentobler
+ email : marco dot hugentobler at karto dot baug dot ethz dot 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 QGSSVGDIAGRAMFACTORYWIDGET_H
+#define QGSSVGDIAGRAMFACTORYWIDGET_H
+
+#include "qgsdiagramfactorywidget.h"
+#include "ui_qgssvgdiagramfactorywidgetbase.h"
+
+
+/**A widget that queries the SVG filename for proportional SVG symbols*/
+class QgsSVGDiagramFactoryWidget: public QgsDiagramFactoryWidget, private Ui::QgsSVGDiagramFactoryWidgetBase
+{
+ Q_OBJECT
+
+ public:
+ QgsSVGDiagramFactoryWidget();
+ ~QgsSVGDiagramFactoryWidget();
+
+ QgsDiagramFactory* createFactory();
+ void setExistingFactory(const QgsDiagramFactory* f);
+
+ public slots:
+ void on_mPictureBrowseButton_clicked();
+ void on_mPreviewListWidget_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous );
+ void on_mAddDirectoryButton_clicked();
+ void on_mRemoveDirectoryButton_clicked();
+
+ private:
+
+ /**Add the icons of a directory to the preview. Returns 0 in case of success*/
+ int addDirectoryToPreview(const QString& path);
+ /**Add the icons of the standard directories to the preview*/
+ void addStandardDirectoriesToPreview();
+ /**Tests if a file is valid svg*/
+ bool testSvgFile(const QString& filename) const;
+};
+
+#endif
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidgetbase.ui
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidgetbase.ui (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactorywidgetbase.ui 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,153 @@
+<ui version="4.0" >
+ <class>QgsSVGDiagramFactoryWidgetBase</class>
+ <widget class="QWidget" name="QgsSVGDiagramFactoryWidgetBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>351</width>
+ <height>342</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="mSearchDirectoriesGroupBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Search directories</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QPushButton" name="mAddDirectoryButton" >
+ <property name="text" >
+ <string>Add...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QPushButton" name="mRemoveDirectoryButton" >
+ <property name="text" >
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <widget class="QComboBox" name="mSearchDirectoriesComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="mPreviewGroupBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>SVG Preview</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <widget class="QListWidget" name="mPreviewListWidget" >
+ <property name="movement" >
+ <enum>QListView::Free</enum>
+ </property>
+ <property name="flow" >
+ <enum>QListView::LeftToRight</enum>
+ </property>
+ <property name="isWrapping" stdset="0" >
+ <bool>true</bool>
+ </property>
+ <property name="gridSize" >
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="viewMode" >
+ <enum>QListView::IconMode</enum>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <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>
+ <item>
+ <widget class="QLineEdit" name="mPictureLineEdit" />
+ </item>
+ <item>
+ <widget class="QPushButton" name="mPictureBrowseButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>150</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Browse...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -112,3 +112,14 @@
mMaximumGap = currentGap;
}
}
+
+QgsAttributeList QgsWKNDiagramFactory::categoryAttributes() const
+{
+ QgsAttributeList categoryAttList;
+ QList<QgsDiagramCategory>::const_iterator it = mCategories.constBegin();
+ for(; it != mCategories.constEnd(); ++it)
+ {
+ categoryAttList.push_back(it->propertyIndex());
+ }
+ return categoryAttList;
+}
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.h 2008-12-10 10:37:11 UTC (rev 9769)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -52,17 +52,14 @@
/**Adds a new category (attribute together with symbolisation)*/
void addCategory(QgsDiagramCategory c);
- //setters and getters for scaling attribute
- QList<int> scalingAttributes() const {return mScalingAttributes;}
- void setScalingAttributes(const QList<int>& att){mScalingAttributes = att;}
+ /**Returns the attribute indexes represented in the bars/pie slices*/
+ QgsAttributeList categoryAttributes() const;
/**Returns the supported well known names in a list*/
static void supportedWellKnownNames(std::list<QString>& names);
protected:
- /**List of scaling attribute indexes (the values are summed up to
- receive the scaling value)*/
- QList<int> mScalingAttributes;
+
/**Well known diagram name (e.g. pie, bar, line)*/
QString mDiagramType;
/**List of attributes that are represented as slices, pillars, etc.*/
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.cpp (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.cpp 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,162 @@
+/***************************************************************************
+ qgswkndiagramfactorywidget.cpp - description
+ ------------------------------
+ begin : December 2008
+ copyright : (C) 2008 by Marco Hugentobler
+ email : marco dot hugentobler at karto dot baug dot ethz dot 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 "qgswkndiagramfactorywidget.h"
+#include "qgsvectordataprovider.h"
+#include "qgsvectorlayer.h"
+#include "qgsbardiagramfactory.h"
+#include "qgsdiagramoverlay.h"
+#include "qgspiediagramfactory.h"
+#include <QColorDialog>
+
+QgsWKNDiagramFactoryWidget::QgsWKNDiagramFactoryWidget(QgsVectorLayer* vl, const QString& wellKnownName): QgsDiagramFactoryWidget(), mVectorLayer(vl), mDiagramTypeName(wellKnownName)
+{
+ setupUi(this);
+
+ QStringList headerLabels;
+ headerLabels << "Attribute";
+ headerLabels << "Color";
+ mAttributesTreeWidget->setHeaderLabels(headerLabels);
+ QObject::connect(mAddPushButton, SIGNAL(clicked()), this, SLOT(addAttribute()));
+ QObject::connect(mRemovePushButton, SIGNAL(clicked()), this, SLOT(removeAttribute()));
+ QObject::connect(mAttributesTreeWidget, SIGNAL(itemDoubleClicked( QTreeWidgetItem*, int)), this, SLOT(handleItemDoubleClick(QTreeWidgetItem*, int)));
+
+ //insert attributes into combo box
+ QgsVectorDataProvider *provider;
+ if ((provider = dynamic_cast<QgsVectorDataProvider *>(mVectorLayer->dataProvider())))
+ {
+ const QgsFieldMap & fields = provider->fields();
+ QString str;
+
+ int comboIndex = 0;
+ for (QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it)
+ {
+ str = (*it).name();
+ mAttributesComboBox->insertItem(comboIndex, str);
+ ++comboIndex;
+ }
+ }
+}
+
+QgsWKNDiagramFactoryWidget::QgsWKNDiagramFactoryWidget(): mVectorLayer(0)
+{
+}
+
+QgsWKNDiagramFactoryWidget::~QgsWKNDiagramFactoryWidget()
+{
+
+}
+
+QgsDiagramFactory* QgsWKNDiagramFactoryWidget::createFactory()
+{
+ QgsWKNDiagramFactory* f = 0;//new QgsWKNDiagramFactory();
+ if(mDiagramTypeName == "Bar")
+ {
+ f = new QgsBarDiagramFactory();
+ }
+ else if(mDiagramTypeName == "Pie")
+ {
+ f = new QgsPieDiagramFactory();
+ }
+ else
+ {
+ return 0; //unknown diagram type
+ }
+ f->setDiagramType(mDiagramTypeName);
+
+ int topLevelItemCount = mAttributesTreeWidget->topLevelItemCount();
+ QTreeWidgetItem* currentItem = 0;
+ int currentAttribute = -1;
+
+ for(int i = 0; i < topLevelItemCount; ++i)
+ {
+ currentItem = mAttributesTreeWidget->topLevelItem(i);
+ currentAttribute = QgsDiagramOverlay::indexFromAttributeName(currentItem->text(0), mVectorLayer);
+ if(currentAttribute != -1)
+ {
+ QgsDiagramCategory newCategory;
+ newCategory.setPropertyIndex(currentAttribute);
+ newCategory.setBrush(QBrush(currentItem->background(1).color()));
+ f->addCategory(newCategory);
+ }
+ }
+
+ return f;
+}
+
+void QgsWKNDiagramFactoryWidget::setExistingFactory(const QgsDiagramFactory* f)
+{
+ const QgsWKNDiagramFactory* existingWKNFactory = dynamic_cast<const QgsWKNDiagramFactory*>(f);
+ if(existingWKNFactory)
+ {
+ //insert attribute names and colors into mAttributesTreeWidget
+ mAttributesTreeWidget->clear();
+ //insert attribute names and colors into mAttributesTreeWidget
+ QList<QgsDiagramCategory> categoryList = existingWKNFactory->categories();
+ QList<QgsDiagramCategory>::const_iterator c_it = categoryList.constBegin();
+
+ for(; c_it != categoryList.constEnd(); ++c_it)
+ {
+ QTreeWidgetItem* newItem = new QTreeWidgetItem(mAttributesTreeWidget);
+ newItem->setText(0, QgsDiagramOverlay::attributeNameFromIndex(c_it->propertyIndex(), mVectorLayer));
+ newItem->setBackground(1, c_it->brush());
+ mAttributesTreeWidget->addTopLevelItem(newItem);
+ }
+ }
+}
+
+void QgsWKNDiagramFactoryWidget::addAttribute()
+{
+ QTreeWidgetItem* newItem = new QTreeWidgetItem(mAttributesTreeWidget);
+
+ //text
+ QString currentText = mAttributesComboBox->currentText();
+ newItem->setText(0, currentText);
+
+ //and icon
+ int red = 1 + (int) (255.0 * rand() / (RAND_MAX + 1.0));
+ int green = 1 + (int) (255.0 * rand() / (RAND_MAX + 1.0));
+ int blue = 1 + (int) (255.0 * rand() / (RAND_MAX + 1.0));
+ QColor randomColor(red, green, blue);
+ newItem->setBackground(1, QBrush(randomColor));
+
+ if(!currentText.isNull() && !currentText.isEmpty())
+ {
+ mAttributesTreeWidget->addTopLevelItem(newItem);
+ }
+}
+
+void QgsWKNDiagramFactoryWidget::removeAttribute()
+{
+ QTreeWidgetItem* currentItem = mAttributesTreeWidget->currentItem();
+ if(currentItem)
+ {
+ delete currentItem;
+ }
+}
+
+void QgsWKNDiagramFactoryWidget::handleItemDoubleClick(QTreeWidgetItem * item, int column)
+{
+ if(column == 1) //change color
+ {
+ QColor newColor = QColorDialog::getColor();
+ if(newColor.isValid())
+ {
+ item->setBackground(1, QBrush(newColor));
+ }
+ }
+}
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.h (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidget.h 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,55 @@
+/***************************************************************************
+ qgswkndiagramfactorywidget.h - description
+ --------------------------
+ begin : December 2008
+ copyright : (C) 2008 by Marco Hugentobler
+ email : marco dot hugentobler at karto dot baug dot ethz dot 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 QGSWKNDIAGRAMFACTORYWIDGET_H
+#define QGSWKNDIAGRAMFACTORYWIDGET_H
+
+#include "qgsdiagramfactorywidget.h"
+#include "ui_qgswkndiagramfactorywidgetbase.h"
+
+class QgsVectorLayer;
+
+/**A class that creates diagram factories for well-known-name diagram types
+ (bar, pie, etc.)*/
+class QgsWKNDiagramFactoryWidget: public QgsDiagramFactoryWidget, private Ui::QgsWKNDiagramFactoryWidgetBase
+{
+ Q_OBJECT
+ public:
+ /**Creates a */
+ QgsWKNDiagramFactoryWidget(QgsVectorLayer* vl, const QString& wellKnownName);
+ ~QgsWKNDiagramFactoryWidget();
+
+ QgsDiagramFactory* createFactory();
+
+ void setExistingFactory(const QgsDiagramFactory* f);
+
+ private:
+ QgsWKNDiagramFactoryWidget();
+
+ QgsVectorLayer* mVectorLayer;
+ QString mDiagramTypeName;
+
+ private slots:
+ /**Adds name of the attribute combo box into the tree widget*/
+ void addAttribute();
+ /**Removes the current attribute from the tree widget*/
+ void removeAttribute();
+ /**Calls the color dialog if column == 1*/
+ void handleItemDoubleClick(QTreeWidgetItem * item, int column);
+};
+
+#endif
Added: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidgetbase.ui
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidgetbase.ui (rev 0)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactorywidgetbase.ui 2008-12-10 13:16:59 UTC (rev 9770)
@@ -0,0 +1,102 @@
+<ui version="4.0" >
+ <class>QgsWKNDiagramFactoryWidgetBase</class>
+ <widget class="QWidget" name="QgsWKNDiagramFactoryWidgetBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>342</width>
+ <height>277</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <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>
+ <item>
+ <widget class="QLabel" name="mAttributesLabel" >
+ <property name="text" >
+ <string>Attributes:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="mAttributesComboBox" />
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" >
+ <layout class="QGridLayout" >
+ <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" >
+ <number>6</number>
+ </property>
+ <property name="verticalSpacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QTreeWidget" name="mAttributesTreeWidget" >
+ <property name="columnCount" >
+ <number>2</number>
+ </property>
+ <column>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QPushButton" name="mRemovePushButton" >
+ <property name="text" >
+ <string>Remove attribute</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QPushButton" name="mAddPushButton" >
+ <property name="text" >
+ <string>Add attribute</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
More information about the QGIS-commit
mailing list