[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