[QGIS Commit] r13491 - in trunk/qgis/src: app/composer core/composer

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat May 15 10:15:48 EDT 2010


Author: mhugent
Date: 2010-05-15 10:15:47 -0400 (Sat, 15 May 2010)
New Revision: 13491

Modified:
   trunk/qgis/src/app/composer/qgscomposer.cpp
   trunk/qgis/src/app/composer/qgscomposerlegendwidget.cpp
   trunk/qgis/src/app/composer/qgscomposerlegendwidget.h
   trunk/qgis/src/core/composer/qgscomposerlegend.cpp
   trunk/qgis/src/core/composer/qgscomposerlegenditem.cpp
   trunk/qgis/src/core/composer/qgscomposerlegenditem.h
   trunk/qgis/src/core/composer/qgslegendmodel.cpp
   trunk/qgis/src/core/composer/qgslegendmodel.h
Log:
Drag and drop support for composer legend model

Modified: trunk/qgis/src/app/composer/qgscomposer.cpp
===================================================================
--- trunk/qgis/src/app/composer/qgscomposer.cpp	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/app/composer/qgscomposer.cpp	2010-05-15 14:15:47 UTC (rev 13491)
@@ -1349,6 +1349,10 @@
   }
 
   QgsComposerLegendWidget* lWidget = new QgsComposerLegendWidget( legend );
+  if ( sender() ) //only update if created from GUI (not after XML read)
+  {
+    lWidget->updateLegend();
+  }
   mItemWidgetMap.insert( legend, lWidget );
 }
 

Modified: trunk/qgis/src/app/composer/qgscomposerlegendwidget.cpp
===================================================================
--- trunk/qgis/src/app/composer/qgscomposerlegendwidget.cpp	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/app/composer/qgscomposerlegendwidget.cpp	2010-05-15 14:15:47 UTC (rev 13491)
@@ -39,13 +39,9 @@
     mItemTreeView->setModel( legend->model() );
   }
 
-  updateLegend();
-
   mItemTreeView->setDragEnabled( true );
   mItemTreeView->setAcceptDrops( true );
   mItemTreeView->setDropIndicatorShown( true );
-  //only available in 4.6
-  //mItemTreeView->setDefaultDropAction( Qt::MoveAction );
   mItemTreeView->setDragDropMode( QAbstractItemView::InternalMove );
 
   setGuiElements();

Modified: trunk/qgis/src/app/composer/qgscomposerlegendwidget.h
===================================================================
--- trunk/qgis/src/app/composer/qgscomposerlegendwidget.h	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/app/composer/qgscomposerlegendwidget.h	2010-05-15 14:15:47 UTC (rev 13491)
@@ -34,6 +34,9 @@
     QgsComposerLegendWidget( QgsComposerLegend* legend );
     ~QgsComposerLegendWidget();
 
+    /**Updates the legend layers and groups*/
+    void updateLegend();
+
   public slots:
 
     void on_mTitleLineEdit_textChanged( const QString& text );
@@ -61,8 +64,6 @@
     QgsComposerLegendWidget();
     /**Sets GUI according to state of mLegend*/
     void setGuiElements();
-    /**Updates the legend layers and groups*/
-    void updateLegend();
 
     QgsComposerLegend* mLegend;
 };

Modified: trunk/qgis/src/core/composer/qgscomposerlegend.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.cpp	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.cpp	2010-05-15 14:15:47 UTC (rev 13491)
@@ -604,7 +604,6 @@
   if ( modelNodeList.size() > 0 )
   {
     QDomElement modelElem = modelNodeList.at( 0 ).toElement();
-    mLegendModel.clear();
     mLegendModel.readXML( modelElem, doc );
   }
 

Modified: trunk/qgis/src/core/composer/qgscomposerlegenditem.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegenditem.cpp	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/core/composer/qgscomposerlegenditem.cpp	2010-05-15 14:15:47 UTC (rev 13491)
@@ -16,9 +16,11 @@
  ***************************************************************************/
 
 #include "qgscomposerlegenditem.h"
+#include "qgsmaplayerregistry.h"
 #include "qgssymbol.h"
 #include "qgssymbolv2.h"
 #include "qgssymbollayerv2utils.h"
+#include "qgsvectorlayer.h"
 #include <QDomDocument>
 #include <QDomElement>
 
@@ -79,7 +81,6 @@
 
 QStandardItem* QgsComposerSymbolItem::clone() const
 {
-  qWarning( "QgsComposerSymbolItem::clone" );
   QgsComposerSymbolItem* cloneItem = new QgsComposerSymbolItem();
   *cloneItem = *this;
   if ( mSymbol )
@@ -97,12 +98,48 @@
     mSymbol->writeXML( vectorClassElem, doc, 0 );
   }
   vectorClassElem.setAttribute( "text", text() );
+  vectorClassElem.setAttribute( "layerId", mLayerID );
+
   elem.appendChild( vectorClassElem );
 }
 
 void QgsComposerSymbolItem::readXML( const QDomElement& itemElem )
 {
-  //soon...
+  if ( itemElem.isNull() )
+  {
+    return;
+  }
+  setText( itemElem.attribute( "text", "" ) );
+  setLayerID( itemElem.attribute( "layerId", "" ) );
+
+  QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( mLayerID ) );
+  if ( vLayer )
+  {
+    QDomElement symbolElem = itemElem.firstChildElement( "symbol" );
+    if ( !symbolElem.isNull() )
+    {
+      QgsSymbol* symbol = new QgsSymbol( vLayer->geometryType() );
+      symbol->readXML( symbolElem, vLayer );
+      setSymbol( symbol );
+
+      //add icon
+      switch ( symbol->type() )
+      {
+        case QGis::Point:
+          setIcon( QIcon( QPixmap::fromImage( symbol->getPointSymbolAsImage() ) ) );
+          break;
+        case QGis::Line:
+          setIcon( QIcon( QPixmap::fromImage( symbol->getLineSymbolAsImage() ) ) );
+          break;
+        case QGis::Polygon:
+          setIcon( QIcon( QPixmap::fromImage( symbol->getPolygonSymbolAsImage() ) ) );
+          break;
+        case QGis::UnknownGeometry:
+          // should not occur
+          break;
+      }
+    }
+  }
 }
 
 ////////////////QgsComposerSymbolV2Item
@@ -153,7 +190,28 @@
 
 void QgsComposerSymbolV2Item::readXML( const QDomElement& itemElem )
 {
-  //soon...
+  if ( itemElem.isNull() )
+  {
+    return;
+  }
+
+  setText( itemElem.attribute( "text", "" ) );
+  QDomElement symbolsElem = itemElem.firstChildElement( "symbols" );
+  if ( !symbolsElem.isNull() )
+  {
+    QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem );
+    //we assume there is only one symbol in the map...
+    QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin();
+    if ( mapIt != loadSymbolMap.end() )
+    {
+      QgsSymbolV2* symbolNg = mapIt.value();
+      if ( symbolNg )
+      {
+        setSymbolV2( symbolNg );
+        setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) );
+      }
+    }
+  }
 }
 
 void QgsComposerSymbolV2Item::setSymbolV2( QgsSymbolV2* s )
@@ -195,7 +253,45 @@
 
 void QgsComposerLayerItem::readXML( const QDomElement& itemElem )
 {
-  //soon...
+  if ( itemElem.isNull() )
+  {
+    return;
+  }
+  setText( itemElem.attribute( "text", "" ) );
+  setLayerID( itemElem.attribute( "layerId", "" ) );
+
+  //now call readXML for all the child items
+  QDomNodeList childList = itemElem.childNodes();
+  QDomNode currentNode;
+  QDomElement currentElem;
+  QgsComposerLegendItem* currentChildItem = 0;
+
+  int nChildItems = childList.count();
+  for ( int i = 0; i < nChildItems; ++i )
+  {
+    currentNode = childList.at( i );
+    if ( !currentNode.isElement() )
+    {
+      continue;
+    }
+
+    currentElem = currentNode.toElement();
+    QString elemTag = currentElem.tagName();
+    if ( elemTag == "VectorClassificationItem" )
+    {
+      currentChildItem = new QgsComposerSymbolItem();
+    }
+    else if ( elemTag == "VectorClassificationItemNg" )
+    {
+      currentChildItem = new QgsComposerSymbolV2Item();
+    }
+    else
+    {
+      continue; //unsupported child type
+    }
+    currentChildItem->readXML( currentElem );
+    appendRow( currentChildItem );
+  }
 }
 
 ////////////////////QgsComposerGroupItem
@@ -229,5 +325,43 @@
 
 void QgsComposerGroupItem::readXML( const QDomElement& itemElem )
 {
-  //soon...
+  if ( itemElem.isNull() )
+  {
+    return;
+  }
+  setText( itemElem.attribute( "text", "" ) );
+
+  //now call readXML for all the child items
+  QDomNodeList childList = itemElem.childNodes();
+  QDomNode currentNode;
+  QDomElement currentElem;
+  QgsComposerLegendItem* currentChildItem = 0;
+
+  int nChildItems = childList.count();
+  for ( int i = 0; i < nChildItems; ++i )
+  {
+    currentNode = childList.at( i );
+    if ( !currentNode.isElement() )
+    {
+      continue;
+    }
+
+    currentElem = currentNode.toElement();
+    QString elemTag = currentElem.tagName();
+
+    if ( elemTag == "GroupItem" )
+    {
+      currentChildItem = new QgsComposerGroupItem();
+    }
+    else if ( elemTag == "LayerItem" )
+    {
+      currentChildItem = new QgsComposerLayerItem();
+    }
+    else
+    {
+      continue; //unsupported child item type
+    }
+    currentChildItem->readXML( currentElem );
+    appendRow( currentChildItem );
+  }
 }

Modified: trunk/qgis/src/core/composer/qgscomposerlegenditem.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegenditem.h	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/core/composer/qgscomposerlegenditem.h	2010-05-15 14:15:47 UTC (rev 13491)
@@ -69,10 +69,14 @@
     void setSymbol( QgsSymbol* s );
     QgsSymbol* symbol() {return mSymbol;}
 
+    void setLayerID( const QString& id ) { mLayerID = id; }
+    QString layerID() const { return mLayerID; }
+
     ItemType itemType() const { return SymbologyItem; }
 
   private:
     QgsSymbol* mSymbol;
+    QString mLayerID; //this is needed to read the symbol from XML
 };
 
 class QgsSymbolV2;

Modified: trunk/qgis/src/core/composer/qgslegendmodel.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.cpp	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/core/composer/qgslegendmodel.cpp	2010-05-15 14:15:47 UTC (rev 13491)
@@ -29,6 +29,7 @@
 #include "qgsvectorlayer.h"
 #include <QDomDocument>
 #include <QDomElement>
+#include <QMimeData>
 #include <QSettings>
 
 QgsLegendModel::QgsLegendModel(): QStandardItemModel()
@@ -233,7 +234,7 @@
       continue;
     }
 
-    QStandardItem* currentSymbolItem = itemFromSymbol( *symbolIt, opacity );
+    QStandardItem* currentSymbolItem = itemFromSymbol( *symbolIt, opacity, vlayer->getLayerID() );
     if ( !currentSymbolItem )
     {
       continue;
@@ -409,7 +410,7 @@
     currentSymbol = *symbolIt;
     if ( currentSymbol->lowerValue() + " - " + currentSymbol->upperValue() == itemText )
     {
-      parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity ) );
+      parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity, vl->getLayerID() ) );
       parentItem->removeRow( classificationItem->row() );
       return;
     }
@@ -422,7 +423,7 @@
     currentSymbol = *symbolIt;
     if ( currentSymbol->lowerValue() == itemText )
     {
-      parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity ) );
+      parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity, vl->getLayerID() ) );
       parentItem->removeRow( classificationItem->row() );
       return;
     }
@@ -436,7 +437,7 @@
     if ( currentSymbol->label() == itemText )
     {
       removeSymbol( symbol );
-      parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity ) );
+      parentItem->insertRow( classificationItem->row(), itemFromSymbol( currentSymbol, opacity, vl->getLayerID() ) );
       parentItem->removeRow( classificationItem->row() );
       return;
     }
@@ -548,7 +549,7 @@
   emit layersChanged();
 }
 
-QStandardItem* QgsLegendModel::itemFromSymbol( QgsSymbol* s, int opacity )
+QStandardItem* QgsLegendModel::itemFromSymbol( QgsSymbol* s, int opacity, const QString& layerID )
 {
   QgsComposerSymbolItem* currentSymbolItem = 0;
 
@@ -614,12 +615,12 @@
   {
     return 0;
   }
-  currentSymbolItem->setData( QgsLegendModel::ClassificationItem, Qt::UserRole + 1 ); //first user data stores the item type
 
   //Pass deep copy of QgsSymbol as user data. Cast to void* necessary such that QMetaType handles it
   QgsSymbol* symbolCopy = new QgsSymbol( *s );
   currentSymbolItem->setSymbol( symbolCopy );
   currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+  currentSymbolItem ->setLayerID( layerID );
   return currentSymbolItem;
 }
 
@@ -656,112 +657,34 @@
     return false;
   }
 
-  return false;
-  //todo: adapt to new legend item structure
-  /*
-    //iterate over layer items
-    QDomNodeList layerItemList = legendModelElem.elementsByTagName( "LayerItem" );
-    QgsMapLayer* currentLayer = 0; //store current layer to get
+  clear();
 
-    for ( int i = 0; i < layerItemList.size(); ++i )
+  QDomNodeList topLevelItemList = legendModelElem.childNodes();
+  QDomElement currentElem;
+  QgsComposerLegendItem* currentItem = 0;
+
+  int nTopLevelItems =  topLevelItemList.size();
+  for ( int i = 0; i < nTopLevelItems; ++i )
+  {
+    currentElem = topLevelItemList.at( i ).toElement();
+    if ( currentElem.isNull() )
     {
-      QDomElement layerItemElem = layerItemList.at( i ).toElement();
-      QString layerId = layerItemElem.attribute( "layerId" );
+      continue;
+    }
 
-      QStandardItem* layerItem = new QStandardItem( layerItemElem.attribute( "text" ) );
-
-      //set layer id as user data into the item
-      layerItem->setData( QVariant( layerId ) );
-      layerItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
-
-      currentLayer = QgsMapLayerRegistry::instance()->mapLayer( layerId );
-
-      //go through all children of layerItemElem
-      QDomElement currentChildElement = layerItemElem.firstChildElement();
-      while ( !currentChildElement.isNull() )
-      {
-        QStandardItem* childItem = new QStandardItem( currentChildElement.attribute( "text" ) );
-        if ( currentChildElement.tagName() == "RasterItem" )
-        {
-          //get icon from current layer
-          QgsRasterLayer* rasterLayer = qobject_cast<QgsRasterLayer *>( currentLayer );
-          if ( rasterLayer )
-          {
-            childItem->setIcon( QIcon( rasterLayer->legendAsPixmap( true ) ) );
-          }
-          layerItem->setChild( layerItem->rowCount(), 0, childItem );
-        }
-        else if ( currentChildElement.tagName() == "VectorClassificationItem" )
-        {
-          //read QgsSymbol from xml and get icon
-          QgsVectorLayer* vectorLayer = qobject_cast<QgsVectorLayer *>( currentLayer );
-          if ( vectorLayer )
-          {
-            //look for symbol
-            QDomNodeList symbolNodeList = currentChildElement.elementsByTagName( "symbol" );
-            if ( symbolNodeList.size() > 0 )
-            {
-              QgsSymbol* symbol = new QgsSymbol( vectorLayer->geometryType() );
-              QDomNode symbolNode = symbolNodeList.at( 0 );
-              symbol->readXML( symbolNode, vectorLayer );
-              childItem->setData( QVariant::fromValue(( void* )symbol ) );
-
-              //add icon
-              switch ( symbol->type() )
-              {
-                case QGis::Point:
-                  childItem->setIcon( QIcon( QPixmap::fromImage( symbol->getPointSymbolAsImage() ) ) );
-                  break;
-                case QGis::Line:
-                  childItem->setIcon( QIcon( QPixmap::fromImage( symbol->getLineSymbolAsImage() ) ) );
-                  break;
-                case QGis::Polygon:
-                  childItem->setIcon( QIcon( QPixmap::fromImage( symbol->getPolygonSymbolAsImage() ) ) );
-                  break;
-                case QGis::UnknownGeometry:
-                  // should not occur
-                  break;
-              }
-              insertSymbol( symbol );
-            }
-          }
-          layerItem->setChild( layerItem->rowCount(), 0, childItem );
-        }
-        else if ( currentChildElement.tagName() == "VectorClassificationItemNg" )
-        {
-          QDomElement symbolNgElem = currentChildElement.firstChildElement( "symbols" );
-          if ( !symbolNgElem.isNull() )
-          {
-            QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolNgElem );
-            //we assume there is only one symbol in the map...
-            QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin();
-            if ( mapIt != loadSymbolMap.end() )
-            {
-              QgsSymbolV2* symbolNg = mapIt.value();
-              insertSymbolV2( symbolNg );
-              childItem->setData( QVariant::fromValue(( void* )symbolNg ), Qt::UserRole + 2 );
-              childItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) );
-            }
-            layerItem->setChild( layerItem->rowCount(), 0, childItem );
-          }
-        }
-        else if ( currentChildElement.tagName() == "TextItem" )
-        {
-          layerItem->setChild( layerItem->rowCount(), 0, childItem );
-        }
-        else //unknown tag name, don't add item
-        {
-          delete childItem;
-        }
-
-        currentChildElement = currentChildElement.nextSiblingElement();
-      }
-
-      invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), layerItem );
+    //toplevel items can be groups or layers
+    if ( currentElem.tagName() == "LayerItem" )
+    {
+      currentItem = new QgsComposerLayerItem();
     }
-
-    return true;
-    */
+    else if ( currentElem.tagName() == "GroupItem" )
+    {
+      currentItem = new QgsComposerGroupItem();
+    }
+    currentItem->readXML( currentElem );
+    appendRow( currentItem );
+  }
+  return true;
 }
 
 Qt::DropActions QgsLegendModel::supportedDropActions() const
@@ -822,3 +745,103 @@
 {
   return ( QgsLegendModel::ItemType )item.data( Qt::UserRole + 1 ).toInt();
 }
+
+QMimeData* QgsLegendModel::mimeData( const QModelIndexList &indexes ) const
+{
+  QMimeData* mimeData = new QMimeData();
+  QByteArray encodedData;
+  QDomDocument xmlDoc;
+  QDomElement xmlRootElement = xmlDoc.createElement( "LegendModelDragData" );
+  xmlDoc.appendChild( xmlRootElement );
+
+  QModelIndexList::const_iterator indexIt = indexes.constBegin();
+  for ( ; indexIt != indexes.constEnd(); ++indexIt )
+  {
+    QStandardItem* sItem = itemFromIndex( *indexIt );
+    if ( sItem )
+    {
+      QgsComposerLegendItem* mItem = dynamic_cast<QgsComposerLegendItem*>( sItem );
+      if ( mItem )
+      {
+        mItem->writeXML( xmlRootElement, xmlDoc );
+      }
+    }
+  }
+  mimeData->setData( "text/xml", xmlDoc.toByteArray() );
+  return mimeData;
+}
+
+QStringList QgsLegendModel::mimeTypes() const
+{
+  QStringList types;
+  types << "text/xml";
+  return types;
+}
+
+bool QgsLegendModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent )
+{
+  if ( !data->hasFormat( "text/xml" ) )
+  {
+    return false;
+  }
+
+  QStandardItem* dropIntoItem = 0;
+  if ( parent.isValid() )
+  {
+    dropIntoItem = itemFromIndex( parent );
+  }
+  else
+  {
+    dropIntoItem = invisibleRootItem();
+  }
+
+  //get XML doc
+  QByteArray encodedData = data->data( "text/xml" );
+  QDomDocument xmlDoc;
+  xmlDoc.setContent( encodedData );
+
+  QDomElement dragDataElem = xmlDoc.documentElement();
+  if ( dragDataElem.tagName() != "LegendModelDragData" )
+  {
+    return false;
+  }
+
+  QDomNodeList nodeList = dragDataElem.childNodes();
+  int nChildNodes = nodeList.size();
+  QDomElement currentElem;
+  QString currentTagName;
+  QgsComposerLegendItem* currentItem = 0;
+
+  for ( int i = 0; i < nChildNodes; ++i )
+  {
+    currentElem = nodeList.at( i ).toElement();
+    if ( currentElem.isNull() )
+    {
+      continue;
+    }
+    currentTagName = currentElem.tagName();
+    if ( currentTagName == "LayerItem" )
+    {
+      currentItem = new QgsComposerLayerItem();
+    }
+    else if ( currentTagName == "GroupItem" )
+    {
+      currentItem = new QgsComposerGroupItem();
+    }
+    else
+    {
+      continue;
+    }
+    currentItem->readXML( currentElem );
+    if ( row < 0 )
+    {
+      dropIntoItem->insertRow( dropIntoItem->rowCount(), currentItem );
+    }
+    else
+    {
+      dropIntoItem->insertRow( row + i, currentItem );
+    }
+  }
+  emit layersChanged();
+  return true;
+}

Modified: trunk/qgis/src/core/composer/qgslegendmodel.h
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.h	2010-05-15 12:33:08 UTC (rev 13490)
+++ trunk/qgis/src/core/composer/qgslegendmodel.h	2010-05-15 14:15:47 UTC (rev 13491)
@@ -79,6 +79,14 @@
 
     QgsLegendModel::ItemType itemType( const QStandardItem& item ) const;
 
+    /**For the drag operation*/
+    QMimeData* mimeData( const QModelIndexList &indexes ) const;
+    QStringList mimeTypes() const;
+
+    /**Implements the drop operation*/
+    bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent );
+
+
   public slots:
     void removeLayer( const QString& layerId );
     void addLayer( QgsMapLayer* theMapLayer );
@@ -99,7 +107,7 @@
     int addRasterLayerItem( QStandardItem* layerItem, QgsMapLayer* rlayer );
 
     /**Creates a model item for a vector symbol. The calling function takes ownership*/
-    QStandardItem* itemFromSymbol( QgsSymbol* s, int opacity );
+    QStandardItem* itemFromSymbol( QgsSymbol* s, int opacity, const QString& layerID );
 
   protected:
     QStringList mLayerIds;



More information about the QGIS-commit mailing list