[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