[QGIS Commit] r12116 - in branches/symbology-ng-branch: images/themes/default python/gui src/app src/core/symbology-ng src/gui src/gui/symbology-ng src/ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Nov 14 20:48:36 EST 2009


Author: wonder
Date: 2009-11-14 20:48:35 -0500 (Sat, 14 Nov 2009)
New Revision: 12116

Added:
   branches/symbology-ng-branch/images/themes/default/rendererCategorizedSymbol.png
   branches/symbology-ng-branch/images/themes/default/rendererGraduatedSymbol.png
   branches/symbology-ng-branch/images/themes/default/rendererSingleSymbol.png
   branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.h
   branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h
   branches/symbology-ng-branch/src/ui/qgscategorizedsymbolrendererv2widget.ui
   branches/symbology-ng-branch/src/ui/qgsgraduatedsymbolrendererv2widget.ui
Modified:
   branches/symbology-ng-branch/python/gui/symbology-ng-gui.sip
   branches/symbology-ng-branch/src/app/qgsvectorlayerproperties.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.h
   branches/symbology-ng-branch/src/gui/CMakeLists.txt
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h
   branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollayerv2widget.h
   branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui
Log:
Renderer properties dialog completely refactored into several classes and made generic to be able to handle any custom renderer.


Added: branches/symbology-ng-branch/images/themes/default/rendererCategorizedSymbol.png
===================================================================
(Binary files differ)


Property changes on: branches/symbology-ng-branch/images/themes/default/rendererCategorizedSymbol.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/symbology-ng-branch/images/themes/default/rendererGraduatedSymbol.png
===================================================================
(Binary files differ)


Property changes on: branches/symbology-ng-branch/images/themes/default/rendererGraduatedSymbol.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: branches/symbology-ng-branch/images/themes/default/rendererSingleSymbol.png
===================================================================
(Binary files differ)


Property changes on: branches/symbology-ng-branch/images/themes/default/rendererSingleSymbol.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: branches/symbology-ng-branch/python/gui/symbology-ng-gui.sip
===================================================================
--- branches/symbology-ng-branch/python/gui/symbology-ng-gui.sip	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/python/gui/symbology-ng-gui.sip	2009-11-15 01:48:35 UTC (rev 12116)
@@ -26,7 +26,6 @@
 };
 
 
-
 class QgsRendererV2PropertiesDialog : QDialog //, private Ui::QgsRendererV2PropsDialogBase
 {
 %TypeHeaderCode
@@ -34,21 +33,25 @@
 %End
 
 public:
-  QgsRendererV2PropertiesDialog(QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent = NULL, bool embedded = false);
-  
+    QgsRendererV2PropertiesDialog(QgsVectorLayer* layer, QgsStyleV2* style, bool embedded = false);
+
 public slots:
-  void changeSingleSymbol();
-  void updateRenderer();
-  
-  void categoryColumnChanged();
-  void categoriesDoubleClicked(const QModelIndex & idx);
-  void addCategories();
-  void deleteCategory();
-  void deleteAllCategories();
+    //! called when user changes renderer type
+    void rendererChanged();
+
+    void apply();
+    void onOK();
+
+    void showSymbolLevels();
+
+protected:
+
+    //! Reimplements dialog keyPress event so we can ignore it
+    void keyPressEvent( QKeyEvent * event );
+
 };
 
 
-
 class QgsStyleV2ManagerDialog : QDialog //, private Ui::QgsStyleV2ManagerDialogBase
 {
 %TypeHeaderCode

Modified: branches/symbology-ng-branch/src/app/qgsvectorlayerproperties.cpp
===================================================================
--- branches/symbology-ng-branch/src/app/qgsvectorlayerproperties.cpp	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/app/qgsvectorlayerproperties.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -475,7 +475,7 @@
   
   if (layer->isUsingRendererV2())
   {
-    mRendererDialog = new QgsRendererV2PropertiesDialog(layer, QgsStyleV2::defaultStyle(), NULL, true);
+    mRendererDialog = new QgsRendererV2PropertiesDialog(layer, QgsStyleV2::defaultStyle(), true);
 
     // hide unused widgets
     legendtypecombobox->hide();

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -266,7 +266,7 @@
   // load renderer
   QString rendererType = element.attribute("type");
 
-  QgsRendererV2CreateFunc pfCreate = QgsRendererV2Registry::instance()->rendererCreateFunction(rendererType);
+  QgsRendererV2CreateFunc pfCreate = QgsRendererV2Registry::instance()->rendererMetadata(rendererType).createFunction();
 
   // unknown renderer type?
   if (pfCreate == NULL)

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.cpp	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -11,9 +11,18 @@
 QgsRendererV2Registry::QgsRendererV2Registry()
 {
   // add default renderers
-  addRenderer("singleSymbol", QgsSingleSymbolRendererV2::create);
-  addRenderer("categorizedSymbol", QgsCategorizedSymbolRendererV2::create);
-  addRenderer("graduatedSymbol", QgsGraduatedSymbolRendererV2::create);
+  addRenderer(QgsRendererV2Metadata("singleSymbol",
+                                    QObject::tr("Single Symbol"),
+                                    QgsSingleSymbolRendererV2::create,
+                                    "rendererSingleSymbol.png"));
+  addRenderer(QgsRendererV2Metadata("categorizedSymbol",
+                                    QObject::tr("Categorized"),
+                                    QgsCategorizedSymbolRendererV2::create,
+                                    "rendererCategorizedSymbol.png"));
+  addRenderer(QgsRendererV2Metadata("graduatedSymbol",
+                                    QObject::tr("Graduated"),
+                                    QgsGraduatedSymbolRendererV2::create,
+                                    "rendererGraduatedSymbol.png"));
 }
 
 QgsRendererV2Registry* QgsRendererV2Registry::instance()
@@ -25,12 +34,10 @@
 }
 
 
-bool QgsRendererV2Registry::addRenderer(QString rendererName, QgsRendererV2CreateFunc pfCreate)
+void QgsRendererV2Registry::addRenderer(const QgsRendererV2Metadata& metadata)
 {
-  if (mRenderers.contains(rendererName))
-    return false;
-  mRenderers.insert(rendererName, pfCreate);
-  return true;
+  mRenderers[metadata.name()] = metadata;
+  mRenderersOrder << metadata.name();
 }
 
 bool QgsRendererV2Registry::removeRenderer(QString rendererName)
@@ -38,10 +45,24 @@
   if (!mRenderers.contains(rendererName))
     return false;
   mRenderers.remove(rendererName);
+  mRenderersOrder.removeAll(rendererName);
   return true;
 }
 
-QgsRendererV2CreateFunc QgsRendererV2Registry::rendererCreateFunction(QString rendererName)
+QgsRendererV2Metadata QgsRendererV2Registry::rendererMetadata(QString rendererName)
 {
-  return mRenderers.value(rendererName, NULL);
+  return mRenderers.value(rendererName);
 }
+
+bool QgsRendererV2Registry::setRendererWidgetFunction(QString name, QgsRendererV2WidgetFunc f)
+{
+  if (!mRenderers.contains(name))
+    return false;
+  mRenderers[name].setWidgetFunction(f);
+  return true;
+}
+
+QStringList QgsRendererV2Registry::renderersList()
+{
+  return mRenderersOrder;
+}

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.h	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2registry.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -2,12 +2,53 @@
 #define QGSRENDERERV2REGISTRY_H
 
 #include <QMap>
+#include <QStringList>
 
 class QgsFeatureRendererV2;
 class QDomElement;
+class QgsVectorLayer;
+class QgsStyleV2;
+class QgsRendererV2Widget;
 
 typedef QgsFeatureRendererV2* (*QgsRendererV2CreateFunc)(QDomElement&);
+typedef QgsRendererV2Widget* (*QgsRendererV2WidgetFunc)(QgsVectorLayer*, QgsStyleV2*, QgsFeatureRendererV2*);
 
+class QgsRendererV2Metadata
+{
+public:
+  /** construct invalid metadata */
+  QgsRendererV2Metadata()
+   : mName(), mVisibleName(), mCreateFunc(NULL), mIconName(), mWidgetFunc(NULL) {}
+
+  /** construct metadata */
+  QgsRendererV2Metadata(QString name,
+                        QString visibleName,
+                        QgsRendererV2CreateFunc pfCreate,
+                        QString iconName = QString(),
+                        QgsRendererV2WidgetFunc pfWidget = NULL)
+   : mName(name), mVisibleName(visibleName), mCreateFunc(pfCreate), mIconName(iconName), mWidgetFunc(pfWidget) {}
+
+  QString name() const { return mName; }
+  QString visibleName() const { return mVisibleName; }
+  QString iconName() const { return mIconName; }
+  QgsRendererV2CreateFunc createFunction() const { return mCreateFunc; }
+  QgsRendererV2WidgetFunc widgetFunction() const { return mWidgetFunc; }
+
+  void setWidgetFunction(QgsRendererV2WidgetFunc f) { mWidgetFunc = f; }
+
+protected:
+  //! name used within QGIS for identification (the same what renderer's type() returns)
+  QString mName;
+  //! name visible for users (translatable)
+  QString mVisibleName;
+  //! pointer to function that creates an instance of the renderer when loading project / style
+  QgsRendererV2CreateFunc mCreateFunc;
+  //! icon to be shown in the renderer properties dialog
+  QString mIconName;
+  //! pointer to function that creates a widget for configuration of renderer's params
+  QgsRendererV2WidgetFunc mWidgetFunc;
+};
+
 /**
   Registry of renderers.
 
@@ -19,19 +60,31 @@
 
   static QgsRendererV2Registry* instance();
 
-  bool addRenderer(QString rendererName, QgsRendererV2CreateFunc pfCreate);
+  //! add a renderer to registry
+  void addRenderer(const QgsRendererV2Metadata& metadata);
 
+  //! remove renderer from registry
   bool removeRenderer(QString rendererName);
 
-  QgsRendererV2CreateFunc rendererCreateFunction(QString rendererName);
+  //! get factory method for particular renderer
+  QgsRendererV2Metadata rendererMetadata(QString rendererName);
 
+  //! assign a widget factory to particular renderer
+  bool setRendererWidgetFunction(QString name, QgsRendererV2WidgetFunc f);
+
+  //! return a list of available renderers
+  QStringList renderersList();
+
 protected:
   //! protected constructor
   QgsRendererV2Registry();
 
   static QgsRendererV2Registry* mInstance;
 
-  QMap<QString, QgsRendererV2CreateFunc> mRenderers;
+  QMap<QString, QgsRendererV2Metadata> mRenderers;
+
+  //! list to keep order in which renderers have been added
+  QStringList mRenderersOrder;
 };
 
 #endif // QGSRENDERERV2REGISTRY_H

Modified: branches/symbology-ng-branch/src/gui/CMakeLists.txt
===================================================================
--- branches/symbology-ng-branch/src/gui/CMakeLists.txt	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/gui/CMakeLists.txt	2009-11-15 01:48:35 UTC (rev 12116)
@@ -5,6 +5,10 @@
 symbology-ng/qgspenstylecombobox.cpp
 symbology-ng/qgssymbollayerv2widget.cpp
 symbology-ng/qgssymbolv2propertiesdialog.cpp
+symbology-ng/qgsrendererv2widget.cpp
+symbology-ng/qgssinglesymbolrendererv2widget.cpp
+symbology-ng/qgscategorizedsymbolrendererv2widget.cpp
+symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp
 symbology-ng/qgsrendererv2propertiesdialog.cpp
 symbology-ng/qgsstylev2managerdialog.cpp
 symbology-ng/qgssymbollevelsv2dialog.cpp
@@ -44,6 +48,9 @@
 
 symbology-ng/qgssymbollayerv2widget.h
 symbology-ng/qgssymbolv2propertiesdialog.h
+symbology-ng/qgssinglesymbolrendererv2widget.h
+symbology-ng/qgscategorizedsymbolrendererv2widget.h
+symbology-ng/qgsgraduatedsymbolrendererv2widget.h
 symbology-ng/qgsrendererv2propertiesdialog.h
 symbology-ng/qgsstylev2managerdialog.h
 symbology-ng/qgssymbollevelsv2dialog.h

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,328 @@
+#include "qgscategorizedsymbolrendererv2widget.h"
+
+#include "qgscategorizedsymbolrendererv2.h"
+
+#include "qgssymbolv2.h"
+#include "qgssymbollayerv2utils.h"
+#include "qgsvectorcolorrampv2.h"
+#include "qgsstylev2.h"
+
+#include "qgssymbolv2selectordialog.h"
+
+#include "qgsvectorlayer.h"
+#include "qgsvectordataprovider.h" // for uniqueValues
+
+#include <QStandardItemModel>
+#include <QStandardItem>
+
+
+QgsRendererV2Widget* QgsCategorizedSymbolRendererV2Widget::create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
+{
+  return new QgsCategorizedSymbolRendererV2Widget(layer, style, renderer);
+}
+
+QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
+ : QgsRendererV2Widget(layer, style)
+{
+
+  // try to recognize the previous renderer
+  // (null renderer means "no previous renderer")
+  if (!renderer || renderer->type() != "categorizedSymbol")
+  {
+    // we're not going to use it - so let's delete the renderer
+    delete renderer;
+
+    mRenderer = new QgsCategorizedSymbolRendererV2("", QgsCategoryList());
+  }
+  else
+  {
+    mRenderer = static_cast<QgsCategorizedSymbolRendererV2*>(renderer);
+  }
+
+  // setup user interface
+  setupUi(this);
+
+  populateColumns();
+  populateColorRamps();
+  QStandardItemModel* m = new QStandardItemModel(this);
+  QStringList labels;
+  labels << "Value" << "Label";
+  m->setHorizontalHeaderLabels(labels);
+  viewCategories->setModel(m);
+
+  mCategorizedSymbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
+
+  connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
+
+  connect(viewCategories, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(categoriesDoubleClicked(const QModelIndex &)));
+
+  connect(btnChangeCategorizedSymbol, SIGNAL(clicked()), this, SLOT(changeCategorizedSymbol()));
+  connect(btnAddCategories, SIGNAL(clicked()), this, SLOT(addCategories()));
+  connect(btnDeleteCategory, SIGNAL(clicked()), this, SLOT(deleteCategory()));
+  connect(btnDeleteAllCategories, SIGNAL(clicked()), this, SLOT(deleteAllCategories()));
+
+  // update GUI from renderer
+  updateUiFromRenderer();
+}
+
+QgsCategorizedSymbolRendererV2Widget::~QgsCategorizedSymbolRendererV2Widget()
+{
+  delete mRenderer;
+}
+
+void QgsCategorizedSymbolRendererV2Widget::updateUiFromRenderer()
+{
+
+  updateCategorizedSymbolIcon();
+  populateCategories();
+
+  // set column
+  disconnect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
+  QString attrName = mRenderer->classAttribute();
+  int idx = cboCategorizedColumn->findText(attrName, Qt::MatchExactly);
+  cboCategorizedColumn->setCurrentIndex(idx >= 0 ? idx : 0);
+  connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
+
+  // set source symbol
+  if (mRenderer->sourceSymbol())
+  {
+    delete mCategorizedSymbol;
+    mCategorizedSymbol = mRenderer->sourceSymbol()->clone();
+    updateCategorizedSymbolIcon();
+  }
+
+  // set source color ramp
+  if (mRenderer->sourceColorRamp())
+  {
+    QSize rampIconSize(50,16);
+    QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(mRenderer->sourceColorRamp(), rampIconSize);
+    if (cboCategorizedColorRamp->itemText(0) == "[source]")
+      cboCategorizedColorRamp->setItemIcon(0, icon);
+    else
+      cboCategorizedColorRamp->insertItem(0, icon, "[source]");
+    cboCategorizedColorRamp->setCurrentIndex(0);
+  }
+
+}
+
+QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2Widget::renderer()
+{
+  return mRenderer;
+}
+
+void QgsCategorizedSymbolRendererV2Widget::changeCategorizedSymbol()
+{
+  QgsSymbolV2SelectorDialog dlg(mCategorizedSymbol, mStyle, this);
+  if (!dlg.exec())
+    return;
+
+  updateCategorizedSymbolIcon();
+}
+
+void QgsCategorizedSymbolRendererV2Widget::updateCategorizedSymbolIcon()
+{
+  QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(mCategorizedSymbol, btnChangeCategorizedSymbol->iconSize());
+  btnChangeCategorizedSymbol->setIcon(icon);
+}
+
+
+void QgsCategorizedSymbolRendererV2Widget::populateCategories()
+{
+  QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
+  m->clear();
+
+  QStringList labels;
+  labels << "Value" << "Label";
+  m->setHorizontalHeaderLabels(labels);
+
+  QSize iconSize(16,16);
+
+  int i, count = mRenderer->categories().count();
+
+  // TODO: sort?? utils.sortVariantList(keys);
+
+  for (i = 0; i < count; i++)
+  {
+    const QgsRendererCategoryV2& cat = mRenderer->categories()[i];
+    QVariant k = cat.value();
+
+    QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(cat.symbol(), iconSize);
+    QStandardItem* item = new QStandardItem(icon, k.toString());
+    item->setData(k); // set attribute value as user role
+    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+
+    QList<QStandardItem *> list;
+    list << item << new QStandardItem(cat.label());
+    m->appendRow( list );
+  }
+}
+
+void QgsCategorizedSymbolRendererV2Widget::populateColumns()
+{
+  cboCategorizedColumn->clear();
+  const QgsFieldMap& flds = mLayer->pendingFields();
+  QgsFieldMap::ConstIterator it = flds.begin();
+  for ( ; it != flds.end(); ++it)
+  {
+    cboCategorizedColumn->addItem(it->name());
+  }
+}
+
+void QgsCategorizedSymbolRendererV2Widget::populateColorRamps()
+{
+  QSize rampIconSize(50,16);
+  cboCategorizedColorRamp->setIconSize(rampIconSize);
+
+  QStringList rampNames = mStyle->colorRampNames();
+  for (QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it)
+  {
+    QgsVectorColorRampV2* ramp = mStyle->colorRamp(*it);
+    QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(ramp, rampIconSize);
+    cboCategorizedColorRamp->addItem(icon, *it);
+    delete ramp;
+  }
+}
+
+
+void QgsCategorizedSymbolRendererV2Widget::categoryColumnChanged()
+{
+  deleteAllCategories();
+}
+
+void QgsCategorizedSymbolRendererV2Widget::categoriesDoubleClicked(const QModelIndex & idx)
+{
+  if (idx.isValid() && idx.column() == 0)
+    changeCategorySymbol();
+}
+
+void QgsCategorizedSymbolRendererV2Widget::changeCategorySymbol()
+{
+  QVariant k = currentCategory();
+  if (!k.isValid())
+    return;
+
+  int catIdx = mRenderer->categoryIndexForValue(k);
+  QgsSymbolV2* newSymbol = mRenderer->categories()[catIdx].symbol()->clone();
+
+  QgsSymbolV2SelectorDialog dlg(newSymbol, mStyle, this);
+  if (!dlg.exec())
+  {
+    delete newSymbol;
+    return;
+  }
+
+  mRenderer->updateCategorySymbol(catIdx, newSymbol);
+
+  populateCategories();
+}
+
+
+
+
+static void _createCategories(QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp)
+{
+  // sort the categories first
+  // TODO: sortVariantList(values);
+
+  int num = values.count();
+
+  for (int i = 0; i < num; i++)
+  {
+    QVariant value = values[i];
+    double x = i / (double) num;
+    QgsSymbolV2* newSymbol = symbol->clone();
+    newSymbol->setColor( ramp->color(x) );
+
+    cats.append( QgsRendererCategoryV2(value, newSymbol, value.toString()) );
+  }
+
+}
+
+void QgsCategorizedSymbolRendererV2Widget::addCategories()
+{
+  QString attrName = cboCategorizedColumn->currentText();
+  int idx = QgsFeatureRendererV2::fieldNameIndex(mLayer->pendingFields(), attrName);
+  QList<QVariant> unique_vals;
+  mLayer->dataProvider()->uniqueValues(idx, unique_vals);
+
+  //DlgAddCategories dlg(mStyle, createDefaultSymbol(), unique_vals, this);
+  //if (!dlg.exec())
+  //  return;
+
+  QgsVectorColorRampV2* ramp = NULL;
+  QString rampName = cboCategorizedColorRamp->currentText();
+  if (rampName == "[source]")
+    ramp = mRenderer->sourceColorRamp()->clone();
+  else
+    ramp = mStyle->colorRamp( rampName );
+
+  QgsCategoryList cats;
+  _createCategories(cats, unique_vals, mCategorizedSymbol, ramp );
+
+  // TODO: if not all categories are desired, delete some!
+  /*
+  if (not dlg.radAllCats.isChecked())
+  {
+    cats2 = {}
+    for item in dlg.listCategories.selectedItems():
+      for k,c in cats.iteritems():
+        if item.text() == k.toString():
+          break
+      cats2[k] = c
+    cats = cats2
+  }
+  */
+
+  // recreate renderer
+  delete mRenderer;
+  mRenderer = new QgsCategorizedSymbolRendererV2(attrName, cats);
+  mRenderer->setSourceSymbol(mCategorizedSymbol->clone());
+  mRenderer->setSourceColorRamp(ramp->clone());
+
+  populateCategories();
+}
+
+int QgsCategorizedSymbolRendererV2Widget::currentCategoryRow()
+{
+  QModelIndex idx = viewCategories->selectionModel()->currentIndex();
+  if (!idx.isValid())
+    return -1;
+  return idx.row();
+}
+
+QVariant QgsCategorizedSymbolRendererV2Widget::currentCategory()
+{
+  int row = currentCategoryRow();
+  if (row == -1)
+    return QVariant();
+  QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
+  return m->item(row)->data();
+}
+
+void QgsCategorizedSymbolRendererV2Widget::deleteCategory()
+{
+  QVariant k = currentCategory();
+  if (!k.isValid())
+    return;
+
+  const QgsCategoryList& cats = mRenderer->categories();
+  QgsCategoryList::ConstIterator it = cats.begin();
+
+  for ( ; it != cats.end(); ++it)
+  {
+    if (k.toString() == it->value().toString())
+    {
+      int idx = mRenderer->categoryIndexForValue(k);
+      mRenderer->deleteCategory(idx);
+    }
+  }
+
+  populateCategories();
+}
+
+void QgsCategorizedSymbolRendererV2Widget::deleteAllCategories()
+{
+  mRenderer->deleteAllCategories();
+  populateCategories();
+}
+

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,61 @@
+#ifndef QGSCATEGORIZEDSYMBOLRENDERERV2WIDGET_H
+#define QGSCATEGORIZEDSYMBOLRENDERERV2WIDGET_H
+
+#include "qgsrendererv2widget.h"
+
+class QgsCategorizedSymbolRendererV2;
+
+#include "ui_qgscategorizedsymbolrendererv2widget.h"
+
+class QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widget, private Ui::QgsCategorizedSymbolRendererV2Widget
+{
+  Q_OBJECT
+
+public:
+
+  static QgsRendererV2Widget* create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer);
+
+  QgsCategorizedSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer);
+  ~QgsCategorizedSymbolRendererV2Widget();
+
+  virtual QgsFeatureRendererV2* renderer();
+
+public slots:
+  void changeCategorizedSymbol();
+  void categoryColumnChanged();
+  void categoriesDoubleClicked(const QModelIndex & idx);
+  void addCategories();
+  void deleteCategory();
+  void deleteAllCategories();
+
+protected:
+
+  void updateUiFromRenderer();
+
+  void updateCategorizedSymbolIcon();
+
+  //! populate categories view
+  void populateCategories();
+
+  //! populate column combo
+  void populateColumns();
+
+  void populateColorRamps();
+
+  //! return row index for the currently selected category (-1 if on no selection)
+  int currentCategoryRow();
+
+  //! return key for the currently selected category
+  QVariant currentCategory();
+
+  void changeCategorySymbol();
+
+protected:
+  QgsCategorizedSymbolRendererV2* mRenderer;
+
+  QgsSymbolV2* mCategorizedSymbol;
+};
+
+
+
+#endif // QGSCATEGORIZEDSYMBOLRENDERERV2WIDGET_H

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,256 @@
+#include "qgsgraduatedsymbolrendererv2widget.h"
+
+#include "qgssymbolv2.h"
+#include "qgssymbollayerv2utils.h"
+#include "qgsvectorcolorrampv2.h"
+#include "qgsstylev2.h"
+
+#include "qgsvectorlayer.h"
+
+#include "qgsgraduatedsymbolrendererv2.h"
+
+#include "qgssymbolv2selectordialog.h"
+
+#include <QStandardItemModel>
+#include <QStandardItem>
+
+
+QgsRendererV2Widget* QgsGraduatedSymbolRendererV2Widget::create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
+{
+  return new QgsGraduatedSymbolRendererV2Widget(layer, style, renderer);
+}
+
+QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
+ : QgsRendererV2Widget(layer, style)
+{
+
+  // try to recognize the previous renderer
+  // (null renderer means "no previous renderer")
+  if (!renderer || renderer->type() != "graduatedSymbol")
+  {
+    // we're not going to use it - so let's delete the renderer
+    delete renderer;
+
+    mRenderer = new QgsGraduatedSymbolRendererV2("", QgsRangeList());
+  }
+  else
+  {
+    mRenderer = static_cast<QgsGraduatedSymbolRendererV2*>(renderer);
+  }
+
+  // setup user interface
+  setupUi(this);
+
+  populateColumns();
+  populateColorRamps();
+  QStandardItemModel* mg = new QStandardItemModel(this);
+  QStringList labels;
+  labels << "Range" << "Label";
+  mg->setHorizontalHeaderLabels(labels);
+  viewGraduated->setModel(mg);
+
+  mGraduatedSymbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
+
+  connect(viewGraduated, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(rangesDoubleClicked(const QModelIndex &)));
+
+  connect(btnGraduatedClassify, SIGNAL(clicked()), this, SLOT(classifyGraduated()));
+  connect(btnChangeGraduatedSymbol, SIGNAL(clicked()), this, SLOT(changeGraduatedSymbol()));
+
+  // initialize from previously set renderer
+  updateUiFromRenderer();
+}
+
+QgsGraduatedSymbolRendererV2Widget::~QgsGraduatedSymbolRendererV2Widget()
+{
+  delete mRenderer;
+}
+
+QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2Widget::renderer()
+{
+  return mRenderer;
+}
+
+
+void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer()
+{
+
+  updateGraduatedSymbolIcon();
+  populateRanges();
+
+  // update UI from the graduated renderer (update combo boxes, view)
+  if (mRenderer->mode() < cboGraduatedMode->count())
+    cboGraduatedMode->setCurrentIndex( mRenderer->mode() );
+  if (mRenderer->ranges().count())
+    spinGraduatedClasses->setValue( mRenderer->ranges().count() );
+
+  // set column
+  //disconnect(cboGraduatedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(graduatedColumnChanged()));
+  QString attrName = mRenderer->classAttribute();
+  int idx = cboGraduatedColumn->findText(attrName, Qt::MatchExactly);
+  cboGraduatedColumn->setCurrentIndex(idx >= 0 ? idx : 0);
+  //connect(cboGraduatedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(graduatedColumnChanged()));
+
+  // set source symbol
+  if (mRenderer->sourceSymbol())
+  {
+    delete mGraduatedSymbol;
+    mGraduatedSymbol = mRenderer->sourceSymbol()->clone();
+    updateGraduatedSymbolIcon();
+  }
+
+  // set source color ramp
+  if (mRenderer->sourceColorRamp())
+  {
+    QSize rampIconSize(50,16);
+    QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(mRenderer->sourceColorRamp(), rampIconSize);
+    if (cboGraduatedColorRamp->itemText(0) == "[source]")
+      cboGraduatedColorRamp->setItemIcon(0, icon);
+    else
+      cboGraduatedColorRamp->insertItem(0, icon, "[source]");
+    cboGraduatedColorRamp->setCurrentIndex(0);
+  }
+
+}
+
+
+
+void QgsGraduatedSymbolRendererV2Widget::populateColumns()
+{
+  cboGraduatedColumn->clear();
+  const QgsFieldMap& flds = mLayer->pendingFields();
+  QgsFieldMap::ConstIterator it = flds.begin();
+  for ( ; it != flds.end(); ++it)
+  {
+    if (it->type() == QVariant::Double || it->type() == QVariant::Int)
+      cboGraduatedColumn->addItem(it->name());
+  }
+}
+
+
+void QgsGraduatedSymbolRendererV2Widget::populateColorRamps()
+{
+  QSize rampIconSize(50,16);
+  cboGraduatedColorRamp->setIconSize(rampIconSize);
+
+  QStringList rampNames = mStyle->colorRampNames();
+  for (QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it)
+  {
+    QgsVectorColorRampV2* ramp = mStyle->colorRamp(*it);
+    QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(ramp, rampIconSize);
+    cboGraduatedColorRamp->addItem(icon, *it);
+    delete ramp;
+  }
+}
+
+
+
+void QgsGraduatedSymbolRendererV2Widget::classifyGraduated()
+{
+  QString attrName = cboGraduatedColumn->currentText();
+
+  int classes = spinGraduatedClasses->value();
+
+  QgsVectorColorRampV2* ramp = NULL;
+  QString rampName = cboGraduatedColorRamp->currentText();
+  if (rampName == "[source]")
+    ramp = mRenderer->sourceColorRamp()->clone();
+  else
+    ramp = mStyle->colorRamp( rampName );
+
+  QgsGraduatedSymbolRendererV2::Mode mode;
+  if (cboGraduatedMode->currentIndex() == 0)
+    mode = QgsGraduatedSymbolRendererV2::EqualInterval;
+  else
+    mode = QgsGraduatedSymbolRendererV2::Quantile;
+
+  // create and set new renderer
+  delete mRenderer;
+  mRenderer = QgsGraduatedSymbolRendererV2::createRenderer(
+      mLayer, attrName, classes, mode, mGraduatedSymbol, ramp);
+
+  populateRanges();
+}
+
+void QgsGraduatedSymbolRendererV2Widget::changeGraduatedSymbol()
+{
+  QgsSymbolV2SelectorDialog dlg(mGraduatedSymbol, mStyle, this);
+  if (!dlg.exec())
+    return;
+
+  updateGraduatedSymbolIcon();
+}
+
+void QgsGraduatedSymbolRendererV2Widget::updateGraduatedSymbolIcon()
+{
+  QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(mGraduatedSymbol, btnChangeGraduatedSymbol->iconSize());
+  btnChangeGraduatedSymbol->setIcon(icon);
+}
+
+
+void QgsGraduatedSymbolRendererV2Widget::populateRanges()
+{
+
+  QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewGraduated->model());
+  m->clear();
+
+  QStringList labels;
+  labels << "Range" << "Label";
+  m->setHorizontalHeaderLabels(labels);
+
+  QSize iconSize(16,16);
+
+  int i, count = mRenderer->ranges().count();
+
+  for (i = 0; i < count; i++)
+  {
+    const QgsRendererRangeV2& range = mRenderer->ranges()[i];
+    QString rangeStr = QString::number(range.lowerValue(),'f',4) + " - " + QString::number(range.upperValue(),'f',4);
+
+    QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(range.symbol(), iconSize);
+    QStandardItem* item = new QStandardItem(icon, rangeStr);
+    //item->setData(k); // set attribute value as user role
+    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+
+    QList<QStandardItem *> list;
+    list << item << new QStandardItem(range.label());
+    m->appendRow( list );
+  }
+
+  // make sure that the "range" column has visible context
+  viewGraduated->resizeColumnToContents(0);
+}
+
+
+/*
+int QgsRendererV2PropertiesDialog::currentRangeRow()
+{
+  QModelIndex idx = viewGraduated->selectionModel()->currentIndex();
+  if (!idx.isValid())
+    return -1;
+  return idx.row();
+}
+*/
+
+void QgsGraduatedSymbolRendererV2Widget::rangesDoubleClicked(const QModelIndex & idx)
+{
+  if (idx.isValid() && idx.column() == 0)
+    changeRangeSymbol(idx.row());
+}
+
+void QgsGraduatedSymbolRendererV2Widget::changeRangeSymbol(int rangeIdx)
+{
+
+  QgsSymbolV2* newSymbol = mRenderer->ranges()[rangeIdx].symbol()->clone();
+
+  QgsSymbolV2SelectorDialog dlg(newSymbol, mStyle, this);
+  if (!dlg.exec())
+  {
+    delete newSymbol;
+    return;
+  }
+
+  mRenderer->updateRangeSymbol(rangeIdx, newSymbol);
+
+  populateRanges();
+}
+

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,51 @@
+#ifndef QGSGRADUATEDSYMBOLRENDERERV2WIDGET_H
+#define QGSGRADUATEDSYMBOLRENDERERV2WIDGET_H
+
+#include "qgsrendererv2widget.h"
+
+class QgsGraduatedSymbolRendererV2;
+
+#include "ui_qgsgraduatedsymbolrendererv2widget.h"
+
+class QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget, private Ui::QgsGraduatedSymbolRendererV2Widget
+{
+  Q_OBJECT
+
+public:
+
+  static QgsRendererV2Widget* create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer);
+
+  QgsGraduatedSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer);
+  ~QgsGraduatedSymbolRendererV2Widget();
+
+  virtual QgsFeatureRendererV2* renderer();
+
+public slots:
+  void changeGraduatedSymbol();
+  void classifyGraduated();
+  void rangesDoubleClicked(const QModelIndex & idx);
+
+protected:
+  void updateUiFromRenderer();
+
+  void updateGraduatedSymbolIcon();
+
+  //! populate column combos in categorized and graduated page
+  void populateColumns();
+
+  void populateColorRamps();
+
+  //! populate ranges of graduated symbol renderer
+  void populateRanges();
+
+  void changeRangeSymbol(int rangeIdx);
+
+
+protected:
+  QgsGraduatedSymbolRendererV2* mRenderer;
+
+  QgsSymbolV2* mGraduatedSymbol;
+};
+
+
+#endif // QGSGRADUATEDSYMBOLRENDERERV2WIDGET_H

Modified: branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -1,42 +1,26 @@
 
 #include "qgsrendererv2propertiesdialog.h"
 
-#include "qgssymbollayerv2utils.h"
 #include "qgsrendererv2.h"
-#include "qgssymbolv2.h"
-#include "qgsvectorcolorrampv2.h"
-#include "qgsstylev2.h"
+#include "qgsrendererv2registry.h"
 
-#include "qgssinglesymbolrendererv2.h"
-#include "qgscategorizedsymbolrendererv2.h"
-#include "qgsgraduatedsymbolrendererv2.h"
+#include "qgsrendererv2widget.h"
+#include "qgssinglesymbolrendererv2widget.h"
+#include "qgscategorizedsymbolrendererv2widget.h"
+#include "qgsgraduatedsymbolrendererv2widget.h"
 
-
-#include "qgssymbolv2selectordialog.h"
 #include "qgssymbollevelsv2dialog.h"
 
+#include "qgsapplication.h"
 #include "qgslogger.h"
 #include "qgsvectorlayer.h"
-#include "qgsvectordataprovider.h"
 
-#include <QStandardItemModel>
-#include <QStandardItem>
 #include <QKeyEvent>
 
-QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog(QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent, bool embedded)
-  : QDialog(parent), mStyle(style)
-{
-  mLayer = layer;
-  
-  // if the layer doesn't use renderer V2, let's start using it!
-  if (!mLayer->isUsingRendererV2())
-  {
-    mLayer->setRendererV2( QgsFeatureRendererV2::defaultRenderer(mLayer->geometryType()) );
-    mLayer->setUsingRendererV2(true);
-  }
 
-  mRenderer = mLayer->rendererV2()->clone();
-  
+QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog(QgsVectorLayer* layer, QgsStyleV2* style, bool embedded)
+    : mLayer(layer), mStyle(style), mActiveWidget(NULL)
+{
   setupUi(this);
 
   // can be embedded in vector layer properties
@@ -46,575 +30,139 @@
   }
 
   connect(buttonBox, SIGNAL(accepted()), this, SLOT(onOK()));
+  connect(btnSymbolLevels, SIGNAL(clicked()), this, SLOT(showSymbolLevels()));
 
-  connect(btnSymbolLevels, SIGNAL(clicked()), this, SLOT(symbolLevels()));
-
-  connect(radSingleSymbol, SIGNAL(clicked()), this, SLOT(updateRenderer()));
-  connect(radCategorized, SIGNAL(clicked()), this, SLOT(updateRenderer()));
-  connect(radGraduated, SIGNAL(clicked()), this, SLOT(updateRenderer()));
-  
-  // simple symbol page
-  if (mRenderer->type() == "singleSymbol")
-    mSingleSymbol = ((QgsSingleSymbolRendererV2*)mRenderer)->symbol()->clone();
-  else
-    mSingleSymbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
-
-  stackedWidget->removeWidget(pageSingleSymbol);
-  delete pageSingleSymbol;
-  pageSingleSymbol = new QgsSymbolV2SelectorDialog(mSingleSymbol, mStyle, NULL, true);
-  stackedWidget->addWidget( pageSingleSymbol );
-  connect(pageSingleSymbol, SIGNAL(symbolModified()), this, SLOT(changeSingleSymbol()));
-
-  // categorized symbol page
-  
-  populateColumns(); // together with graduated
-  QStandardItemModel* m = new QStandardItemModel(this);
-  QStringList labels;
-  labels << "Value" << "Label";
-  m->setHorizontalHeaderLabels(labels);
-  viewCategories->setModel(m);
-
-  mCategorizedSymbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
-
-  connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
-  
-  connect(viewCategories, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(categoriesDoubleClicked(const QModelIndex &)));
-  
-  connect(btnChangeCategorizedSymbol, SIGNAL(clicked()), this, SLOT(changeCategorizedSymbol()));
-  connect(btnAddCategories, SIGNAL(clicked()), this, SLOT(addCategories()));
-  connect(btnDeleteCategory, SIGNAL(clicked()), this, SLOT(deleteCategory()));
-  connect(btnDeleteAllCategories, SIGNAL(clicked()), this, SLOT(deleteAllCategories()));
-  
-  // graduated symbol page
-  populateColorRamps();
-  QStandardItemModel* mg = new QStandardItemModel(this);
-  QStringList labelsG;
-  labels << "Range" << "Label";
-  mg->setHorizontalHeaderLabels(labels);
-  viewGraduated->setModel(mg);
-  
-  mGraduatedSymbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
-  
-  connect(viewGraduated, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(rangesDoubleClicked(const QModelIndex &)));
-
-  connect(btnGraduatedClassify, SIGNAL(clicked()), this, SLOT(classifyGraduated()));
-  connect(btnChangeGraduatedSymbol, SIGNAL(clicked()), this, SLOT(changeGraduatedSymbol()));
-
-  // initialize from previously set renderer
-  updateUiFromRenderer();
-}
-
-QgsRendererV2PropertiesDialog::~QgsRendererV2PropertiesDialog()
-{
-  // delete the temporary renderer (if exists)
-  delete mRenderer;
-
-  delete mSingleSymbol;
-  // TODO: delete categorized, graduated symbol?
-}
-
-void QgsRendererV2PropertiesDialog::apply()
-{
-  // use clone of our temporary renderer
-  mLayer->setRendererV2( mRenderer->clone() );
-}
-
-void QgsRendererV2PropertiesDialog::onOK()
-{
-  apply();
-  accept();
-}
-
-QgsSingleSymbolRendererV2* QgsRendererV2PropertiesDialog::rendererSingle()
-{
-  Q_ASSERT(mRenderer != NULL && mRenderer->type() == "singleSymbol");
-  return static_cast<QgsSingleSymbolRendererV2*>(mRenderer);
-}
-
-QgsCategorizedSymbolRendererV2* QgsRendererV2PropertiesDialog::rendererCategorized()
-{
-  Q_ASSERT(mRenderer != NULL && mRenderer->type() == "categorizedSymbol");
-  return static_cast<QgsCategorizedSymbolRendererV2*>(mRenderer);
-}
-
-QgsGraduatedSymbolRendererV2* QgsRendererV2PropertiesDialog::rendererGraduated()
-{
-  Q_ASSERT(mRenderer != NULL && mRenderer->type() == "graduatedSymbol");
-  return static_cast<QgsGraduatedSymbolRendererV2*>(mRenderer);
-}
-
-void QgsRendererV2PropertiesDialog::changeSingleSymbol()
-{
-  // update symbol from the GUI
-  rendererSingle()->setSymbol( mSingleSymbol->clone() );
-}
-
-void QgsRendererV2PropertiesDialog::updateRenderer()
-{
-  delete mRenderer;
-
-  if (radSingleSymbol->isChecked())
-    mRenderer = new QgsSingleSymbolRendererV2( mSingleSymbol->clone() );
-  else if (radCategorized->isChecked())
-    mRenderer = new QgsCategorizedSymbolRendererV2(QString(), QgsCategoryList());
-  else if (radGraduated->isChecked())
-    mRenderer = new QgsGraduatedSymbolRendererV2(QString(), QgsRangeList());
-  else
-    Q_ASSERT(false);
-    
-  updateUiFromRenderer();
-}
-
-void QgsRendererV2PropertiesDialog::updateUiFromRenderer()
-{
-  QString rendererType = mRenderer->type();
-
-  if (rendererType == "singleSymbol")
+  // initialize registry's widget functions
+  QgsRendererV2Registry* reg = QgsRendererV2Registry::instance();
+  if (reg->rendererMetadata("singleSymbol").widgetFunction() == NULL)
   {
-    radSingleSymbol->setChecked(true);
-
-    stackedWidget->setCurrentWidget(pageSingleSymbol);
-    //updateSingleSymbolIcon();
+    reg->setRendererWidgetFunction("singleSymbol", QgsSingleSymbolRendererV2Widget::create);
+    reg->setRendererWidgetFunction("categorizedSymbol", QgsCategorizedSymbolRendererV2Widget::create);
+    reg->setRendererWidgetFunction("graduatedSymbol", QgsGraduatedSymbolRendererV2Widget::create);
   }
-  else if (rendererType == "categorizedSymbol")
+
+  QPixmap pix;
+  QStringList renderers = reg->renderersList();
+  foreach (QString name, renderers)
   {
-    radCategorized->setChecked(true);
+    QgsRendererV2Metadata m = reg->rendererMetadata(name);
 
-    stackedWidget->setCurrentWidget(pageCategorized);
-    updateCategorizedSymbolIcon();
-    populateCategories();
+    QString iconPath = QgsApplication::defaultThemePath() + m.iconName();
+    if (!pix.load(iconPath, "png"))
+      pix = QPixmap();
 
-    QgsCategorizedSymbolRendererV2* r = rendererCategorized();
-
-    // set column
-    disconnect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
-    QString attrName = r->classAttribute();
-    int idx = cboCategorizedColumn->findText(attrName, Qt::MatchExactly);
-    cboCategorizedColumn->setCurrentIndex(idx >= 0 ? idx : 0);
-    connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
-
-    // set source symbol
-    if (r->sourceSymbol())
-    {
-      delete mCategorizedSymbol;
-      mCategorizedSymbol = r->sourceSymbol()->clone();
-      updateCategorizedSymbolIcon();
-    }
-
-    // set source color ramp
-    if (r->sourceColorRamp())
-    {
-      QSize rampIconSize(50,16);
-      QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(r->sourceColorRamp(), rampIconSize);
-      if (cboCategorizedColorRamp->itemText(0) == "[source]")
-        cboCategorizedColorRamp->setItemIcon(0, icon);
-      else
-        cboCategorizedColorRamp->insertItem(0, icon, "[source]");
-      cboCategorizedColorRamp->setCurrentIndex(0);
-    }
+    QListWidgetItem* item = new QListWidgetItem(QIcon(pix), m.visibleName(), listRenderers);
+    item->setData(Qt::UserRole, name);
   }
-  else if (rendererType == "graduatedSymbol")
+
+  // if the layer doesn't use renderer V2, let's start using it!
+  if (!mLayer->isUsingRendererV2())
   {
-    radGraduated->setChecked(true);
+    mLayer->setRendererV2( QgsFeatureRendererV2::defaultRenderer(mLayer->geometryType()) );
+    mLayer->setUsingRendererV2(true);
+  }
 
-    stackedWidget->setCurrentWidget(pageGraduated);
-    updateGraduatedSymbolIcon();
-    populateRanges();
+  // setup slot rendererChanged()
+  connect(listRenderers, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(rendererChanged()));
 
-    // update UI from the graduated renderer (update combo boxes, view)
-    QgsGraduatedSymbolRendererV2* r = rendererGraduated();
-    if (r->mode() < cboGraduatedMode->count())
-      cboGraduatedMode->setCurrentIndex( r->mode() );
-    if (r->ranges().count())
-      spinGraduatedClasses->setValue( r->ranges().count() );
-
-    // set column
-    //disconnect(cboGraduatedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(graduatedColumnChanged()));
-    QString attrName = r->classAttribute();
-    int idx = cboGraduatedColumn->findText(attrName, Qt::MatchExactly);
-    cboGraduatedColumn->setCurrentIndex(idx >= 0 ? idx : 0);
-    //connect(cboGraduatedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(graduatedColumnChanged()));
-
-    // set source symbol
-    if (r->sourceSymbol())
+  // set current renderer from layer
+  QString rendererName = mLayer->rendererV2()->type();
+  for (int i = 0; i < listRenderers->count(); i++)
+  {
+    if (listRenderers->item(i)->data(Qt::UserRole).toString() == rendererName)
     {
-      delete mGraduatedSymbol;
-      mGraduatedSymbol = r->sourceSymbol()->clone();
-      updateGraduatedSymbolIcon();
+      listRenderers->setCurrentItem( listRenderers->item(i) );
+      return;
     }
-
-    // set source color ramp
-    if (r->sourceColorRamp())
-    {
-      QSize rampIconSize(50,16);
-      QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(r->sourceColorRamp(), rampIconSize);
-      if (cboGraduatedColorRamp->itemText(0) == "[source]")
-        cboGraduatedColorRamp->setItemIcon(0, icon);
-      else
-        cboGraduatedColorRamp->insertItem(0, icon, "[source]");
-      cboGraduatedColorRamp->setCurrentIndex(0);
-    }
   }
-}
 
- 
-void QgsRendererV2PropertiesDialog::changeCategorizedSymbol()
-{
-  QgsSymbolV2SelectorDialog dlg(mCategorizedSymbol, mStyle, this);
-  if (!dlg.exec())
-    return;
+  // no renderer found... this mustn't happen
+  Q_ASSERT( false && "there must be a renderer!" );
 
-  updateCategorizedSymbolIcon();
 }
 
-void QgsRendererV2PropertiesDialog::updateCategorizedSymbolIcon()
-{
-  QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(mCategorizedSymbol, btnChangeCategorizedSymbol->iconSize());
-  btnChangeCategorizedSymbol->setIcon(icon);
-}
 
-void QgsRendererV2PropertiesDialog::populateCategories()
+void QgsRendererV2PropertiesDialog::rendererChanged()
 {
-  QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
-  m->clear();
-  
-  QStringList labels;
-  labels << "Value" << "Label";
-  m->setHorizontalHeaderLabels(labels);
-  
-  QSize iconSize(16,16);
-  
-  QgsCategorizedSymbolRendererV2* r = rendererCategorized();
-  int i, count = r->categories().count();
-  
-  // TODO: sort?? utils.sortVariantList(keys);
-  
-  for (i = 0; i < count; i++)
-  {
-    const QgsRendererCategoryV2& cat = r->categories()[i];
-    QVariant k = cat.value();
-    
-    QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(cat.symbol(), iconSize);
-    QStandardItem* item = new QStandardItem(icon, k.toString());
-    item->setData(k); // set attribute value as user role
-    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
-    
-    QList<QStandardItem *> list;
-    list << item << new QStandardItem(cat.label());
-    m->appendRow( list );
-  }
-}
 
-void QgsRendererV2PropertiesDialog::populateColumns()
-{
-  cboCategorizedColumn->clear();
-  const QgsFieldMap& flds = mLayer->dataProvider()->fields();
-  QgsFieldMap::ConstIterator it = flds.begin();
-  for ( ; it != flds.end(); ++it)
+  if (listRenderers->currentItem() == NULL)
   {
-    cboCategorizedColumn->addItem(it->name());
-    
-    if (it->type() == QVariant::Double || it->type() == QVariant::Int)
-      cboGraduatedColumn->addItem(it->name());
+    QgsDebugMsg("No current item -- this should never happen!");
+    return;
   }
-}
 
+  QString rendererName = listRenderers->currentItem()->data(Qt::UserRole).toString();
 
-void QgsRendererV2PropertiesDialog::categoryColumnChanged()
-{
-  deleteAllCategories();
-}
-
-void QgsRendererV2PropertiesDialog::categoriesDoubleClicked(const QModelIndex & idx)
-{
-  if (idx.isValid() && idx.column() == 0)
-    changeCategorySymbol();
-}
-
-void QgsRendererV2PropertiesDialog::changeCategorySymbol()
-{
-  QVariant k = currentCategory();
-  if (!k.isValid())
-    return;
-  
-  QgsCategorizedSymbolRendererV2* r = rendererCategorized();
-  int catIdx = r->categoryIndexForValue(k);
-  QgsSymbolV2* newSymbol = r->categories()[catIdx].symbol()->clone();
-  
-  QgsSymbolV2SelectorDialog dlg(newSymbol, mStyle, this);
-  if (!dlg.exec())
+  // get rid of old active widget (if any)
+  if (mActiveWidget)
   {
-    delete newSymbol;
-    return;
+    stackedWidget->removeWidget( mActiveWidget );
+
+    delete mActiveWidget;
+    mActiveWidget = NULL;
   }
-  
-  r->updateCategorySymbol(catIdx, newSymbol);
-  
-  populateCategories();
-}
 
-void createCategories(QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp)
-{
-  // sort the categories first
-  // TODO: sortVariantList(values);
-  
-  int num = values.count();
-  
-  for (int i = 0; i < num; i++)
+  QgsRendererV2Metadata m = QgsRendererV2Registry::instance()->rendererMetadata(rendererName);
+  QgsRendererV2WidgetFunc fWidget = m.widgetFunction();
+  if (fWidget != NULL)
   {
-    QVariant value = values[i];
-    double x = i / (double) num;
-    QgsSymbolV2* newSymbol = symbol->clone();
-    newSymbol->setColor( ramp->color(x) );
-    
-    cats.append( QgsRendererCategoryV2(value, newSymbol, value.toString()) );
-  }
-  
-}
+    // instantiate the widget and set as active
+    mActiveWidget = fWidget(mLayer, mStyle, mLayer->rendererV2()->clone());
+    stackedWidget->addWidget(mActiveWidget);
+    stackedWidget->setCurrentWidget(mActiveWidget);
 
-void QgsRendererV2PropertiesDialog::addCategories()
-{
-  QString attrName = cboCategorizedColumn->currentText();
-  int idx = QgsFeatureRendererV2::fieldNameIndex(mLayer->pendingFields(), attrName);
-  QList<QVariant> unique_vals;
-  mLayer->dataProvider()->uniqueValues(idx, unique_vals);
-  
-  //DlgAddCategories dlg(mStyle, createDefaultSymbol(), unique_vals, this);
-  //if (!dlg.exec())
-  //  return;
-
-  QgsVectorColorRampV2* ramp = NULL;
-  QString rampName = cboCategorizedColorRamp->currentText();
-  if (rampName == "[source]" && rendererCategorized())
-    ramp = rendererCategorized()->sourceColorRamp()->clone();
+    btnSymbolLevels->setEnabled(true);
+  }
   else
-    ramp = mStyle->colorRamp( rampName );
-  
-  QgsCategoryList cats;
-  ::createCategories(cats, unique_vals, mCategorizedSymbol, ramp );
-  
-  // TODO: if not all categories are desired, delete some!
-  /*
-  if (not dlg.radAllCats.isChecked())
   {
-    cats2 = {}
-    for item in dlg.listCategories.selectedItems():
-      for k,c in cats.iteritems():
-        if item.text() == k.toString():
-          break
-      cats2[k] = c
-    cats = cats2
+    // set default "no edit widget available" page
+    stackedWidget->setCurrentWidget(pageNoWidget);
+
+    btnSymbolLevels->setEnabled(false);
   }
-  */
-      
-  // recreate renderer
-  delete mRenderer;
-  QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2(attrName, cats);
-  r->setSourceSymbol(mCategorizedSymbol->clone());
-  r->setSourceColorRamp(ramp->clone());
-  mRenderer = r;
 
-  populateCategories();
 }
 
-int QgsRendererV2PropertiesDialog::currentCategoryRow()
+void QgsRendererV2PropertiesDialog::apply()
 {
-  QModelIndex idx = viewCategories->selectionModel()->currentIndex();
-  if (!idx.isValid())
-    return -1;
-  return idx.row();
-}
-
-QVariant QgsRendererV2PropertiesDialog::currentCategory()
-{
-  int row = currentCategoryRow();
-  if (row == -1)
-    return QVariant();
-  QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
-  return m->item(row)->data();
-}
-
-void QgsRendererV2PropertiesDialog::deleteCategory()
-{
-  QVariant k = currentCategory();
-  if (!k.isValid())
-    return;
-  
-  QgsCategorizedSymbolRendererV2* r = rendererCategorized();
-  const QgsCategoryList& cats = r->categories();
-  QgsCategoryList::ConstIterator it = cats.begin();
-  
-  for ( ; it != cats.end(); ++it)
+  if (mActiveWidget != NULL)
   {
-    if (k.toString() == it->value().toString())
-    {
-      int idx = r->categoryIndexForValue(k);
-      r->deleteCategory(idx);
-    }
+    mLayer->setRendererV2( mActiveWidget->renderer()->clone() );
   }
-  
-  populateCategories();
 }
 
-void QgsRendererV2PropertiesDialog::deleteAllCategories()
+void QgsRendererV2PropertiesDialog::onOK()
 {
-  rendererCategorized()->deleteAllCategories();
-  populateCategories();
+  apply();
+  accept();
 }
 
-//////
 
-
-void QgsRendererV2PropertiesDialog::populateColorRamps()
+void QgsRendererV2PropertiesDialog::keyPressEvent( QKeyEvent * e )
 {
-  QSize rampIconSize(50,16);
-  cboGraduatedColorRamp->setIconSize(rampIconSize);
-  cboCategorizedColorRamp->setIconSize(rampIconSize);
-
-  QStringList rampNames = mStyle->colorRampNames();
-  for (QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it)
+  // Ignore the ESC key to avoid close the dialog without the properties window
+  if ( !isWindow() && e->key() == Qt::Key_Escape )
   {
-    QgsVectorColorRampV2* ramp = mStyle->colorRamp(*it);
-    QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(ramp, rampIconSize);
-    cboGraduatedColorRamp->addItem(icon, *it);
-    cboCategorizedColorRamp->addItem(icon, *it);
-    delete ramp;
+    e->ignore();
   }
-}
-
-void QgsRendererV2PropertiesDialog::classifyGraduated()
-{
-  QString attrName = cboGraduatedColumn->currentText();
-  
-  int classes = spinGraduatedClasses->value();
-  
-  QgsVectorColorRampV2* ramp = NULL;
-  QString rampName = cboGraduatedColorRamp->currentText();
-  if (rampName == "[source]" && rendererGraduated())
-    ramp = rendererGraduated()->sourceColorRamp()->clone();
   else
-    ramp = mStyle->colorRamp( rampName );
-
-  QgsGraduatedSymbolRendererV2::Mode mode;
-  if (cboGraduatedMode->currentIndex() == 0)
-    mode = QgsGraduatedSymbolRendererV2::EqualInterval;
-  else
-    mode = QgsGraduatedSymbolRendererV2::Quantile;
-  
-  // create and set new renderer
-  QgsGraduatedSymbolRendererV2* r = QgsGraduatedSymbolRendererV2::createRenderer(
-      mLayer, attrName, classes, mode, mGraduatedSymbol, ramp);
-  
-  delete mRenderer;
-  mRenderer = r;
-  
-  populateRanges();
-}
-
-void QgsRendererV2PropertiesDialog::changeGraduatedSymbol()
-{
-  QgsSymbolV2SelectorDialog dlg(mGraduatedSymbol, mStyle, this);
-  if (!dlg.exec())
-    return;
-  
-  updateGraduatedSymbolIcon();
-}
-
-void QgsRendererV2PropertiesDialog::updateGraduatedSymbolIcon()
-{
-  QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(mGraduatedSymbol, btnChangeGraduatedSymbol->iconSize());
-  btnChangeGraduatedSymbol->setIcon(icon);
-}
-
-void QgsRendererV2PropertiesDialog::populateRanges()
-{
-
-  QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewGraduated->model());
-  m->clear();
-  
-  QStringList labels;
-  labels << "Range" << "Label";
-  m->setHorizontalHeaderLabels(labels);
-  
-  QSize iconSize(16,16);
-  
-  QgsGraduatedSymbolRendererV2* r = rendererGraduated();
-  int i, count = r->ranges().count();
-  
-  for (i = 0; i < count; i++)
   {
-    const QgsRendererRangeV2& range = r->ranges()[i];
-    QString rangeStr = QString::number(range.lowerValue(),'f',4) + " - " + QString::number(range.upperValue(),'f',4);
-    
-    QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(range.symbol(), iconSize);
-    QStandardItem* item = new QStandardItem(icon, rangeStr);
-    //item->setData(k); // set attribute value as user role
-    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
-    
-    QList<QStandardItem *> list;
-    list << item << new QStandardItem(range.label());
-    m->appendRow( list );
+    QDialog::keyPressEvent(e);
   }
-
-  // make sure that the "range" column has visible context
-  viewGraduated->resizeColumnToContents(0);
 }
 
-/*
-int QgsRendererV2PropertiesDialog::currentRangeRow()
-{
-  QModelIndex idx = viewGraduated->selectionModel()->currentIndex();
-  if (!idx.isValid())
-    return -1;
-  return idx.row();
-}
-*/
 
-void QgsRendererV2PropertiesDialog::rangesDoubleClicked(const QModelIndex & idx)
+void QgsRendererV2PropertiesDialog::showSymbolLevels()
 {
-  if (idx.isValid() && idx.column() == 0)
-    changeRangeSymbol(idx.row());
-}
-
-void QgsRendererV2PropertiesDialog::changeRangeSymbol(int rangeIdx)
-{
-
-  QgsGraduatedSymbolRendererV2* r = rendererGraduated();
-  QgsSymbolV2* newSymbol = r->ranges()[rangeIdx].symbol()->clone();
-
-  QgsSymbolV2SelectorDialog dlg(newSymbol, mStyle, this);
-  if (!dlg.exec())
-  {
-    delete newSymbol;
+  if (!mActiveWidget)
     return;
-  }
 
-  r->updateRangeSymbol(rangeIdx, newSymbol);
+  QgsFeatureRendererV2* r = mActiveWidget->renderer();
+  QgsSymbolV2List symbols = r->symbols();
 
-  populateRanges();
-}
-
-
-void QgsRendererV2PropertiesDialog::symbolLevels()
-{
-  QgsSymbolV2List symbols = mRenderer->symbols();
-
-  QgsSymbolLevelsV2Dialog dlg(symbols, mRenderer->usingSymbolLevels(), this);
+  QgsSymbolLevelsV2Dialog dlg(symbols, r->usingSymbolLevels(), this);
   if (dlg.exec())
   {
-    mRenderer->setUsingSymbolLevels( dlg.usingLevels() );
+    r->setUsingSymbolLevels( dlg.usingLevels() );
   }
 }
-
-void QgsRendererV2PropertiesDialog::keyPressEvent( QKeyEvent * e )
-{
-  // Ignore the ESC key to avoid close the dialog without the properties window
-  if ( !isWindow() && e->key() == Qt::Key_Escape )
-  {
-    e->ignore();
-  }
-  else
-  {
-    QDialog::keyPressEvent(e);
-  }
-}

Modified: branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -2,91 +2,45 @@
 #ifndef QGSRENDERERV2PROPERTIESDIALOG_H
 #define QGSRENDERERV2PROPERTIESDIALOG_H
 
+#include <QDialog>
+
 #include "ui_qgsrendererv2propsdialogbase.h"
 
+class QKeyEvent;
+
 class QgsVectorLayer;
 class QgsStyleV2;
 class QgsSymbolV2;
 
-class QgsFeatureRendererV2;
-class QgsSingleSymbolRendererV2;
-class QgsCategorizedSymbolRendererV2;
-class QgsGraduatedSymbolRendererV2;
+class QgsRendererV2Widget;
 
 class QgsRendererV2PropertiesDialog : public QDialog, private Ui::QgsRendererV2PropsDialogBase
 {
   Q_OBJECT
 
 public:
-  QgsRendererV2PropertiesDialog(QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent = NULL, bool embedded = false);
-  ~QgsRendererV2PropertiesDialog();
-  
+    QgsRendererV2PropertiesDialog(QgsVectorLayer* layer, QgsStyleV2* style, bool embedded = false);
+
 public slots:
-  void changeSingleSymbol();
-  void updateRenderer();
-  
-  void changeCategorizedSymbol();
-  void categoryColumnChanged();
-  void categoriesDoubleClicked(const QModelIndex & idx);
-  void addCategories();
-  void deleteCategory();
-  void deleteAllCategories();
+    //! called when user changes renderer type
+    void rendererChanged();
 
-  void changeGraduatedSymbol();
-  void classifyGraduated();
-  void rangesDoubleClicked(const QModelIndex & idx);
+    void apply();
+    void onOK();
 
-  void symbolLevels();
+    void showSymbolLevels();
 
-  void onOK();
-  void apply();
-
 protected:
 
-  //! Reimplements dialog keyPress event so we can ignore it
-  void keyPressEvent( QKeyEvent * event );
+    //! Reimplements dialog keyPress event so we can ignore it
+    void keyPressEvent( QKeyEvent * event );
 
-  //! update UI to reflect changes in renderer
-  void updateUiFromRenderer();
-  
-  void updateCategorizedSymbolIcon();
-  void updateGraduatedSymbolIcon();
- 
-  //! populate categories view
-  void populateCategories();
-  
-  //! populate column combos in categorized and graduated page
-  void populateColumns();
-  
-  //! populate ranges of graduated symbol renderer
-  void populateRanges();
-  
-  void populateColorRamps();
 
-  //! return row index for the currently selected category (-1 if on no selection)
-  int currentCategoryRow();
-  
-  //! return key for the currently selected category
-  QVariant currentCategory();
-  
-  void changeCategorySymbol();
+    QgsVectorLayer* mLayer;
+    QgsStyleV2* mStyle;
 
-  void changeRangeSymbol(int rangeIdx);
-
-  QgsSingleSymbolRendererV2* rendererSingle();
-  QgsCategorizedSymbolRendererV2* rendererCategorized();
-  QgsGraduatedSymbolRendererV2* rendererGraduated();
-  
-  //! temporary renderer in current dialog
-  QgsFeatureRendererV2* mRenderer;
-
-  QgsVectorLayer* mLayer;
-  
-  QgsStyleV2* mStyle;
-  
-  QgsSymbolV2* mSingleSymbol;
-  QgsSymbolV2* mGraduatedSymbol;
-  QgsSymbolV2* mCategorizedSymbol;
+    QgsRendererV2Widget* mActiveWidget;
 };
 
+
 #endif

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.cpp	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,7 @@
+#include "qgsrendererv2widget.h"
+
+
+QgsRendererV2Widget::QgsRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style)
+  : QWidget(), mLayer(layer), mStyle(style)
+{
+}

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.h	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2widget.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,38 @@
+#ifndef QGSRENDERERV2WIDGET_H
+#define QGSRENDERERV2WIDGET_H
+
+#include <QWidget>
+
+class QgsVectorLayer;
+class QgsStyleV2;
+class QgsSymbolV2;
+class QgsFeatureRendererV2;
+class QgsSymbolV2SelectorDialog;
+
+
+/**
+  Base class for renderer settings widgets
+
+WORKFLOW:
+- open renderer dialog with some RENDERER  (never null!)
+- find out which widget to use
+- instantiate it and set in stacked widget
+- on any change of renderer type, create some default (dummy?) version and change the stacked widget
+- when clicked ok/apply, get the renderer from active widget and clone it for the layer
+*/
+class QgsRendererV2Widget : public QWidget
+{
+public:
+    QgsRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style);
+
+    virtual ~QgsRendererV2Widget() {}
+
+    //! return pointer to the renderer (no transfer of ownership)
+    virtual QgsFeatureRendererV2* renderer() = 0;
+
+protected:
+    QgsVectorLayer* mLayer;
+    QgsStyleV2* mStyle;
+};
+
+#endif // QGSRENDERERV2WIDGET_H

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,68 @@
+#include "qgssinglesymbolrendererv2widget.h"
+
+#include "qgssinglesymbolrendererv2.h"
+#include "qgssymbolv2.h"
+
+#include "qgsvectorlayer.h"
+
+#include "qgssymbolv2selectordialog.h"
+
+QgsRendererV2Widget* QgsSingleSymbolRendererV2Widget::create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
+{
+  return new QgsSingleSymbolRendererV2Widget(layer, style, renderer);
+}
+
+QgsSingleSymbolRendererV2Widget::QgsSingleSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
+  : QgsRendererV2Widget(layer, style)
+{
+  // try to recognize the previous renderer
+  // (null renderer means "no previous renderer")
+  if (!renderer || renderer->type() != "singleSymbol")
+  {
+    // we're not going to use it - so let's delete the renderer
+    delete renderer;
+
+    // some default options
+    QgsSymbolV2* symbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
+
+    mRenderer = new QgsSingleSymbolRendererV2( symbol );
+  }
+  else
+  {
+    mRenderer = static_cast<QgsSingleSymbolRendererV2*>(renderer);
+  }
+
+  // load symbol from it
+  mSingleSymbol = mRenderer->symbol()->clone();
+
+  // setup ui
+  mSelector = new QgsSymbolV2SelectorDialog(mSingleSymbol, mStyle, NULL, true);
+  connect(mSelector, SIGNAL(symbolModified()), this, SLOT(changeSingleSymbol()));
+
+  QVBoxLayout* layout = new QVBoxLayout;
+  layout->addWidget(mSelector);
+  setLayout(layout);
+
+}
+
+QgsSingleSymbolRendererV2Widget::~QgsSingleSymbolRendererV2Widget()
+{
+  delete mSingleSymbol;
+
+  delete mRenderer;
+
+  delete mSelector;
+}
+
+
+QgsFeatureRendererV2* QgsSingleSymbolRendererV2Widget::renderer()
+{
+  return mRenderer;
+}
+
+void QgsSingleSymbolRendererV2Widget::changeSingleSymbol()
+{
+  // update symbol from the GUI
+  mRenderer->setSymbol( mSingleSymbol->clone() );
+}
+

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,32 @@
+#ifndef QGSSINGLESYMBOLRENDERERV2WIDGET_H
+#define QGSSINGLESYMBOLRENDERERV2WIDGET_H
+
+#include "qgsrendererv2widget.h"
+
+class QgsSingleSymbolRendererV2;
+class QgsSymbolV2SelectorDialog;
+
+class QgsSingleSymbolRendererV2Widget : public QgsRendererV2Widget
+{
+  Q_OBJECT
+
+public:
+
+  static QgsRendererV2Widget* create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer);
+
+  QgsSingleSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer);
+  ~QgsSingleSymbolRendererV2Widget();
+
+  virtual QgsFeatureRendererV2* renderer();
+
+public slots:
+  void changeSingleSymbol();
+
+protected:
+  QgsSingleSymbolRendererV2* mRenderer;
+  QgsSymbolV2SelectorDialog* mSelector;
+  QgsSymbolV2* mSingleSymbol;
+};
+
+
+#endif // QGSSINGLESYMBOLRENDERERV2WIDGET_H

Modified: branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollayerv2widget.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollayerv2widget.h	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollayerv2widget.h	2009-11-15 01:48:35 UTC (rev 12116)
@@ -13,6 +13,7 @@
   
   public:
     QgsSymbolLayerV2Widget(QWidget* parent) : QWidget(parent) {}
+    virtual ~QgsSymbolLayerV2Widget() {}
     
     virtual void setSymbolLayer(QgsSymbolLayerV2* layer) = 0;
     virtual QgsSymbolLayerV2* symbolLayer() = 0;

Added: branches/symbology-ng-branch/src/ui/qgscategorizedsymbolrendererv2widget.ui
===================================================================
--- branches/symbology-ng-branch/src/ui/qgscategorizedsymbolrendererv2widget.ui	                        (rev 0)
+++ branches/symbology-ng-branch/src/ui/qgscategorizedsymbolrendererv2widget.ui	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QgsCategorizedSymbolRendererV2Widget</class>
+ <widget class="QWidget" name="QgsCategorizedSymbolRendererV2Widget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>464</width>
+    <height>316</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Column:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="cboCategorizedColumn">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Expanding</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label_9">
+       <property name="text">
+        <string>Symbol:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnChangeCategorizedSymbol">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>change</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_10">
+       <property name="text">
+        <string>Color ramp:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="cboCategorizedColorRamp">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QTreeView" name="viewCategories">
+     <property name="iconSize">
+      <size>
+       <width>16</width>
+       <height>16</height>
+      </size>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <property name="allColumnsShowFocus">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <item>
+      <widget class="QPushButton" name="btnAddCategories">
+       <property name="text">
+        <string>Classify</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnDeleteCategory">
+       <property name="text">
+        <string>Delete</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnDeleteAllCategories">
+       <property name="text">
+        <string>Delete all</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnJoinCategories">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="text">
+        <string>Join</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>cboCategorizedColumn</tabstop>
+  <tabstop>btnChangeCategorizedSymbol</tabstop>
+  <tabstop>cboCategorizedColorRamp</tabstop>
+  <tabstop>viewCategories</tabstop>
+  <tabstop>btnAddCategories</tabstop>
+  <tabstop>btnDeleteCategory</tabstop>
+  <tabstop>btnDeleteAllCategories</tabstop>
+  <tabstop>btnJoinCategories</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>

Added: branches/symbology-ng-branch/src/ui/qgsgraduatedsymbolrendererv2widget.ui
===================================================================
--- branches/symbology-ng-branch/src/ui/qgsgraduatedsymbolrendererv2widget.ui	                        (rev 0)
+++ branches/symbology-ng-branch/src/ui/qgsgraduatedsymbolrendererv2widget.ui	2009-11-15 01:48:35 UTC (rev 12116)
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QgsGraduatedSymbolRendererV2Widget</class>
+ <widget class="QWidget" name="QgsGraduatedSymbolRendererV2Widget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>507</width>
+    <height>341</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QGridLayout">
+     <item row="0" column="0">
+      <widget class="QLabel" name="label_4">
+       <property name="text">
+        <string>Column:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1" colspan="2">
+      <widget class="QComboBox" name="cboGraduatedColumn"/>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_6">
+       <property name="text">
+        <string>Symbol:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QPushButton" name="btnChangeGraduatedSymbol">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>change</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="3">
+      <widget class="QLabel" name="label_5">
+       <property name="text">
+        <string>Classes:</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="4">
+      <widget class="QSpinBox" name="spinGraduatedClasses">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="value">
+        <number>5</number>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="label_7">
+       <property name="text">
+        <string>Color ramp:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QComboBox" name="cboGraduatedColorRamp"/>
+     </item>
+     <item row="2" column="3">
+      <widget class="QLabel" name="label_8">
+       <property name="text">
+        <string>Mode:</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="4">
+      <widget class="QComboBox" name="cboGraduatedMode">
+       <item>
+        <property name="text">
+         <string>Equal Interval</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>Quantile</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+     <item row="1" column="2" rowspan="2">
+      <spacer>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QTreeView" name="viewGraduated">
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="_2">
+     <item>
+      <widget class="QPushButton" name="btnGraduatedClassify">
+       <property name="text">
+        <string>Classify</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnGraduatedDelete">
+       <property name="text">
+        <string>Delete class</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>cboGraduatedColumn</tabstop>
+  <tabstop>btnChangeGraduatedSymbol</tabstop>
+  <tabstop>cboGraduatedColorRamp</tabstop>
+  <tabstop>spinGraduatedClasses</tabstop>
+  <tabstop>cboGraduatedMode</tabstop>
+  <tabstop>viewGraduated</tabstop>
+  <tabstop>btnGraduatedClassify</tabstop>
+  <tabstop>btnGraduatedDelete</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>

Modified: branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui
===================================================================
--- branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui	2009-11-15 00:21:19 UTC (rev 12115)
+++ branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui	2009-11-15 01:48:35 UTC (rev 12116)
@@ -6,478 +6,90 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>612</width>
-    <height>398</height>
+    <width>529</width>
+    <height>324</height>
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Renderer V2 properties</string>
+   <string>Renderer settings</string>
   </property>
-  <layout class="QGridLayout">
+  <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
-    <layout class="QVBoxLayout">
-     <item>
-      <widget class="QLabel" name="label">
-       <property name="text">
-        <string>Renderer:</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QRadioButton" name="radSingleSymbol">
-       <property name="text">
-        <string>single symbol</string>
-       </property>
-       <property name="checked">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QRadioButton" name="radCategorized">
-       <property name="text">
-        <string>categorized</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QRadioButton" name="radGraduated">
-       <property name="enabled">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>graduated</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer>
-       <property name="orientation">
-        <enum>Qt::Vertical</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>20</width>
-         <height>111</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="btnSymbolLevels">
-       <property name="enabled">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>Symbol levels...</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item row="0" column="1">
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
+    <widget class="QListWidget" name="listRenderers">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>1</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
      </property>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="3">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
      </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     <property name="showDropIndicator" stdset="0">
+      <bool>false</bool>
      </property>
+     <property name="iconSize">
+      <size>
+       <width>48</width>
+       <height>48</height>
+      </size>
+     </property>
+     <property name="spacing">
+      <number>4</number>
+     </property>
+     <property name="viewMode">
+      <enum>QListView::IconMode</enum>
+     </property>
     </widget>
    </item>
-   <item row="0" column="2">
+   <item row="0" column="1" rowspan="2">
     <widget class="QStackedWidget" name="stackedWidget">
-     <property name="currentIndex">
-      <number>0</number>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>4</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
      </property>
-     <widget class="QWidget" name="pageSingleSymbol">
-      <layout class="QGridLayout">
-       <item row="0" column="0">
-        <widget class="QLabel" name="label_2">
-         <property name="text">
-          <string>Symbol:</string>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="1">
-        <widget class="QPushButton" name="btnChangeSingleSymbol">
-         <property name="text">
-          <string>Change</string>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="2">
-        <spacer>
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>40</width>
-           <height>20</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="1" column="0" colspan="2">
-        <spacer>
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>271</width>
-           <height>181</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="pageCategorized">
+     <widget class="QWidget" name="pageNoWidget">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <item>
-          <widget class="QLabel" name="label_3">
-           <property name="text">
-            <string>Column:</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QComboBox" name="cboCategorizedColumn">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeType">
-            <enum>QSizePolicy::Expanding</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout">
-         <item>
-          <widget class="QLabel" name="label_9">
-           <property name="text">
-            <string>Symbol:</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="btnChangeCategorizedSymbol">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-             <horstretch>1</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string>change</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QLabel" name="label_10">
-           <property name="text">
-            <string>Color ramp:</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QComboBox" name="cboCategorizedColorRamp">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-             <horstretch>1</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <widget class="QTreeView" name="viewCategories">
-         <property name="iconSize">
-          <size>
-           <width>16</width>
-           <height>16</height>
-          </size>
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>This renderer doesn't implement a graphical interface.</string>
          </property>
-         <property name="rootIsDecorated">
-          <bool>false</bool>
-         </property>
-         <property name="allColumnsShowFocus">
-          <bool>true</bool>
-         </property>
         </widget>
        </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_3">
-         <item>
-          <widget class="QPushButton" name="btnAddCategories">
-           <property name="text">
-            <string>Classify</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="btnDeleteCategory">
-           <property name="text">
-            <string>Delete</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="btnDeleteAllCategories">
-           <property name="text">
-            <string>Delete all</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer>
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QPushButton" name="btnJoinCategories">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="text">
-            <string>Join</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="pageGraduated">
-      <layout class="QVBoxLayout">
-       <item>
-        <layout class="QGridLayout">
-         <item row="0" column="0">
-          <widget class="QLabel" name="label_4">
-           <property name="text">
-            <string>Column:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1" colspan="2">
-          <widget class="QComboBox" name="cboGraduatedColumn"/>
-         </item>
-         <item row="1" column="0">
-          <widget class="QLabel" name="label_6">
-           <property name="text">
-            <string>Symbol:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="1">
-          <widget class="QPushButton" name="btnChangeGraduatedSymbol">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-             <horstretch>1</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string>change</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="3">
-          <widget class="QLabel" name="label_5">
-           <property name="text">
-            <string>Classes:</string>
-           </property>
-           <property name="alignment">
-            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="4">
-          <widget class="QSpinBox" name="spinGraduatedClasses">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="value">
-            <number>5</number>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0">
-          <widget class="QLabel" name="label_7">
-           <property name="text">
-            <string>Color ramp:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="1">
-          <widget class="QComboBox" name="cboGraduatedColorRamp"/>
-         </item>
-         <item row="2" column="3">
-          <widget class="QLabel" name="label_8">
-           <property name="text">
-            <string>Mode:</string>
-           </property>
-           <property name="alignment">
-            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="4">
-          <widget class="QComboBox" name="cboGraduatedMode">
-           <item>
-            <property name="text">
-             <string>Equal Interval</string>
-            </property>
-           </item>
-           <item>
-            <property name="text">
-             <string>Quantile</string>
-            </property>
-           </item>
-          </widget>
-         </item>
-         <item row="1" column="2" rowspan="2">
-          <spacer>
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>20</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <widget class="QTreeView" name="viewGraduated">
-         <property name="rootIsDecorated">
-          <bool>false</bool>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <layout class="QHBoxLayout">
-         <item>
-          <widget class="QPushButton" name="btnGraduatedClassify">
-           <property name="text">
-            <string>Classify</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="btnGraduatedDelete">
-           <property name="text">
-            <string>Delete class</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer>
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
     </widget>
    </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QPushButton" name="btnSymbolLevels">
+     <property name="text">
+      <string>Symbol levels</string>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <tabstops>
-  <tabstop>buttonBox</tabstop>
-  <tabstop>radSingleSymbol</tabstop>
-  <tabstop>radCategorized</tabstop>
-  <tabstop>radGraduated</tabstop>
-  <tabstop>btnChangeSingleSymbol</tabstop>
-  <tabstop>cboCategorizedColumn</tabstop>
-  <tabstop>btnChangeCategorizedSymbol</tabstop>
-  <tabstop>cboCategorizedColorRamp</tabstop>
-  <tabstop>viewCategories</tabstop>
-  <tabstop>btnAddCategories</tabstop>
-  <tabstop>btnDeleteCategory</tabstop>
-  <tabstop>btnDeleteAllCategories</tabstop>
-  <tabstop>btnJoinCategories</tabstop>
-  <tabstop>cboGraduatedColumn</tabstop>
-  <tabstop>btnChangeGraduatedSymbol</tabstop>
-  <tabstop>spinGraduatedClasses</tabstop>
-  <tabstop>cboGraduatedColorRamp</tabstop>
-  <tabstop>cboGraduatedMode</tabstop>
-  <tabstop>viewGraduated</tabstop>
-  <tabstop>btnGraduatedClassify</tabstop>
-  <tabstop>btnGraduatedDelete</tabstop>
+  <tabstop>listRenderers</tabstop>
   <tabstop>btnSymbolLevels</tabstop>
+  <tabstop>buttonBox</tabstop>
  </tabstops>
  <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>QgsRendererV2PropsDialogBase</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>325</x>
-     <y>388</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
+ <connections/>
 </ui>



More information about the QGIS-commit mailing list