[QGIS Commit] r8988 - in branches/advanced_printing_branch/src/app:
. composer
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Mon Aug 4 10:13:11 EDT 2008
Author: mhugent
Date: 2008-08-04 10:13:11 -0400 (Mon, 04 Aug 2008)
New Revision: 8988
Modified:
branches/advanced_printing_branch/src/app/CMakeLists.txt
branches/advanced_printing_branch/src/app/composer/qgscomposer.cpp
branches/advanced_printing_branch/src/app/composer/qgscomposerlabel.cpp
branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.cpp
branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.h
branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp
branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.cpp
branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.h
branches/advanced_printing_branch/src/app/composer/qgscomposerscalebarwidget.cpp
branches/advanced_printing_branch/src/app/composer/qgslegendmodel.cpp
branches/advanced_printing_branch/src/app/composer/qgslegendmodel.h
branches/advanced_printing_branch/src/app/composer/qgsticksscalebarstyle.cpp
branches/advanced_printing_branch/src/app/qgisapp.cpp
Log:
Remove layers in composer legend that have been removed in main canvas
Modified: branches/advanced_printing_branch/src/app/CMakeLists.txt
===================================================================
--- branches/advanced_printing_branch/src/app/CMakeLists.txt 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/CMakeLists.txt 2008-08-04 14:13:11 UTC (rev 8988)
@@ -131,6 +131,7 @@
composer/qgscomposer.h
composer/qgscomposerlabelwidget.h
+ composer/qgscomposerlegend.h
composer/qgscomposerlegendwidget.h
composer/qgscomposermap.h
composer/qgscomposermapwidget.h
@@ -139,6 +140,7 @@
composer/qgscomposerview.h
composer/qgscomposeritemgroup.h
composer/qgscompositionwidget.h
+ composer/qgslegendmodel.h
legend/qgslegend.h
legend/qgslegendlayer.h
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposer.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposer.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposer.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -1219,8 +1219,35 @@
newLabel->readXML(currentComposerLabelElem, doc);
addComposerLabel(newLabel);
mComposition->addItem(newLabel);
+ newLabel->setZValue(60);
mComposition->update();
}
+
+ //composer maps
+ QDomNodeList composerMapList = composerElem.elementsByTagName("ComposerMap");
+ for(int i = 0; i < composerMapList.size(); ++i)
+ {
+ QDomElement currentComposerMapElem = composerMapList.at(i).toElement();
+ QgsComposerMap* newMap = new QgsComposerMap(mComposition);
+ newMap->readXML(currentComposerMapElem, doc);
+ addComposerMap(newMap);
+ mComposition->addItem(newMap);
+ newMap->setZValue(50);
+ mComposition->update();
+ }
+
+ //composer scalebars
+ QDomNodeList composerScaleBarList = composerElem.elementsByTagName("ComposerScaleBar");
+ for(int i = 0; i < composerScaleBarList.size(); ++i)
+ {
+ QDomElement currentScaleBarElem = composerScaleBarList.at(i).toElement();
+ QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar(mComposition);
+ newScaleBar->readXML(currentScaleBarElem, doc);
+ addComposerScaleBar(newScaleBar);
+ mComposition->addItem(newScaleBar);
+ newScaleBar->setZValue(60);
+ mComposition->update();
+ }
}
mView->setComposition(mComposition);
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposerlabel.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposerlabel.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposerlabel.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -117,5 +117,5 @@
QDomElement composerItemElem = composerItemList.at(0).toElement();
_readXML(composerItemElem, doc);
}
- return false; //soon...
+ return true;
}
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -23,17 +23,9 @@
QgsComposerLegend::QgsComposerLegend(QgsComposition* composition): QgsComposerItem(composition), mTitle(QObject::tr("Legend")), mBoxSpace(2), mLayerSpace(3), mSymbolSpace(2), mIconLabelSpace(2)
{
- QStringList layerIdList;
- QMap<QString,QgsMapLayer*> layerMap = QgsMapLayerRegistry::instance()->mapLayers();
- QMap<QString,QgsMapLayer*>::const_iterator mapIt = layerMap.constBegin();
+ QStringList idList = layerIdList();
+ mLegendModel.setLayerSet(idList);
- for(; mapIt != layerMap.constEnd(); ++mapIt)
- {
- layerIdList.push_back(mapIt.key());
- }
-
- mLegendModel.setLayerSet(layerIdList);
-
//default font size
mTitleFont.setPointSizeF(4);
mLayerFont.setPointSizeF(3);
@@ -41,6 +33,8 @@
mSymbolWidth = 7;
mSymbolHeight = 4;
adjustBoxSize();
+
+ connect(&mLegendModel, SIGNAL(layersChanged()), this, SLOT(synchronizeWithModel()));
}
QgsComposerLegend::QgsComposerLegend(): QgsComposerItem(0)
@@ -318,6 +312,26 @@
currentXPosition += mSymbolWidth;
}
+QStringList QgsComposerLegend::layerIdList() const
+{
+ QStringList layerIdList;
+ QMap<QString,QgsMapLayer*> layerMap = QgsMapLayerRegistry::instance()->mapLayers();
+ QMap<QString,QgsMapLayer*>::const_iterator mapIt = layerMap.constBegin();
+
+ for(; mapIt != layerMap.constEnd(); ++mapIt)
+ {
+ layerIdList.push_back(mapIt.key());
+ }
+
+ return layerIdList;
+}
+
+void QgsComposerLegend::synchronizeWithModel()
+{
+ adjustBoxSize();
+ update();
+}
+
bool QgsComposerLegend::writeXML(QDomElement& elem, QDomDocument & doc)
{
return true; //soon...
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.h
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.h 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposerlegend.h 2008-08-04 14:13:11 UTC (rev 8988)
@@ -20,11 +20,14 @@
#include "qgscomposeritem.h"
#include "qgslegendmodel.h"
+#include <QObject>
class QgsSymbol;
-class QgsComposerLegend: public QgsComposerItem
+class QgsComposerLegend: public QObject, public QgsComposerItem
{
+ Q_OBJECT
+
public:
QgsComposerLegend(QgsComposition* composition);
~QgsComposerLegend();
@@ -83,6 +86,10 @@
*/
bool readXML(const QDomElement& itemElem, const QDomDocument& doc);
+ public slots:
+ /**Data changed*/
+ void synchronizeWithModel();
+
protected:
QString mTitle;
@@ -123,6 +130,9 @@
void drawPointSymbol(QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight) const;
void drawLineSymbol(QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition) const;
void drawPolygonSymbol(QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition) const;
+
+ /**Helper function that lists ids of layers contained in map canvas*/
+ QStringList layerIdList() const;
};
#endif
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposermap.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -186,7 +186,7 @@
painter->translate(0, 0); //do we need this?
painter->scale(scale,scale);
-
+
painter->drawPixmap(0,0, mCachePixmap);
painter->restore();
@@ -211,6 +211,7 @@
drawSelectionBoxes(painter);
}
+
painter->restore();
mLastScaleFactorX = currentScaleFactorX;
@@ -328,10 +329,89 @@
bool QgsComposerMap::writeXML(QDomElement& elem, QDomDocument & doc)
{
- return true; //soon...
+ if(elem.isNull())
+ {
+ return false;
+ }
+
+ QDomElement composerMapElem = doc.createElement("ComposerMap");
+
+ //previewMode
+ if(mPreviewMode == Cache)
+ {
+ composerMapElem.setAttribute("previewMode", "Cache");
+ }
+ else if(mPreviewMode == Render)
+ {
+ composerMapElem.setAttribute("previewMode", "Render");
+ }
+ else //rectangle
+ {
+ composerMapElem.setAttribute("previewMode", "Rectangle");
+ }
+
+ //extent
+ QDomElement extentElem = doc.createElement("Extent");
+ extentElem.setAttribute("xmin", QString::number(mExtent.xMin()));
+ extentElem.setAttribute("xmax", QString::number(mExtent.xMax()));
+ extentElem.setAttribute("ymin", QString::number(mExtent.yMin()));
+ extentElem.setAttribute("ymax", QString::number(mExtent.yMax()));
+ composerMapElem.appendChild(extentElem);
+
+ mCacheUpdated = false;
+ mNumCachedLayers = 0;
+
+ elem.appendChild(composerMapElem);
+ return _writeXML(composerMapElem, doc);
}
bool QgsComposerMap::readXML(const QDomElement& itemElem, const QDomDocument& doc)
{
- return false; //soon...
+ if(itemElem.isNull())
+ {
+ return false;
+ }
+
+ //previewMode
+ QString previewMode = itemElem.attribute("previewMode");
+ if(previewMode == "Cache")
+ {
+ mPreviewMode = Cache;
+ }
+ else if(previewMode == "Render")
+ {
+ mPreviewMode = Render;
+ }
+ else
+ {
+ mPreviewMode = Rectangle;
+ }
+
+ //extent
+ QDomNodeList extentNodeList = itemElem.elementsByTagName("Extent");
+ if(extentNodeList.size() > 0)
+ {
+ QDomElement extentElem = extentNodeList.at(0).toElement();
+ double xmin, xmax, ymin, ymax;
+ xmin = extentElem.attribute("xmin").toDouble();
+ xmax = extentElem.attribute("xmax").toDouble();
+ ymin = extentElem.attribute("ymin").toDouble();
+ ymax = extentElem.attribute("ymax").toDouble();
+
+ mExtent = QgsRect(xmin, ymin, xmax, ymax);
+ }
+
+ mDrawing = false;
+ mNumCachedLayers = 0;
+ mCacheUpdated = false;
+
+ //restore general composer item properties
+ QDomNodeList composerItemList = itemElem.elementsByTagName("ComposerItem");
+ if(composerItemList.size() > 0)
+ {
+ QDomElement composerItemElem = composerItemList.at(0).toElement();
+ _readXML(composerItemElem, doc);
+ }
+
+ return true;
}
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -22,6 +22,8 @@
#include "qgssingleboxscalebarstyle.h"
#include "qgsticksscalebarstyle.h"
#include "qgsrect.h"
+#include <QDomDocument>
+#include <QDomElement>
#include <QFontMetricsF>
#include <QPainter>
#include <cmath>
@@ -229,6 +231,18 @@
}
}
+QString QgsComposerScaleBar::style() const
+{
+ if(mStyle)
+ {
+ return mStyle->name();
+ }
+ else
+ {
+ return "";
+ }
+}
+
QString QgsComposerScaleBar::firstLabelString() const
{
if(mNumSegmentsLeft > 0)
@@ -243,12 +257,111 @@
bool QgsComposerScaleBar::writeXML(QDomElement& elem, QDomDocument & doc)
{
- return true; //soon...
+ if(elem.isNull())
+ {
+ return false;
+ }
+
+ QDomElement composerScaleBarElem = doc.createElement("ComposerScaleBar");
+ composerScaleBarElem.setAttribute("height", mHeight);
+ composerScaleBarElem.setAttribute("labelBarSpace", mLabelBarSpace);
+ composerScaleBarElem.setAttribute("boxContentSpace", mBoxContentSpace);
+ composerScaleBarElem.setAttribute("numSegments", mNumSegments);
+ composerScaleBarElem.setAttribute("numSegmentsLeft", mNumSegmentsLeft);
+ composerScaleBarElem.setAttribute("numUnitsPerSegment", mNumUnitsPerSegment);
+ composerScaleBarElem.setAttribute("numMapUnitsPerScaleBarUnit", mNumMapUnitsPerScaleBarUnit);
+ composerScaleBarElem.setAttribute("font", mFont.toString());
+ composerScaleBarElem.setAttribute("outlineWidth", mPen.widthF());
+
+ //style
+ if(mStyle)
+ {
+ composerScaleBarElem.setAttribute("style", mStyle->name());
+ }
+
+ //map id
+ if(mComposerMap)
+ {
+ composerScaleBarElem.setAttribute("mapId", mComposerMap->id());
+ }
+
+ //fill color
+ QColor brushColor = mBrush.color();
+ QDomElement colorElem = doc.createElement("BrushColor");
+ colorElem.setAttribute("red", brushColor.red());
+ colorElem.setAttribute("green", brushColor.green());
+ colorElem.setAttribute("blue", brushColor.blue());
+ composerScaleBarElem.appendChild(colorElem);
+
+ elem.appendChild(composerScaleBarElem);
+ return _writeXML(composerScaleBarElem, doc);
}
bool QgsComposerScaleBar::readXML(const QDomElement& itemElem, const QDomDocument& doc)
{
- return false; //soon...
+ if(itemElem.isNull())
+ {
+ return false;
+ }
+
+ mHeight = itemElem.attribute("height", "5.0").toDouble();
+ mLabelBarSpace = itemElem.attribute("labelBarSpace", "3.0").toDouble();
+ mBoxContentSpace = itemElem.attribute("boxContentSpace", "1.0").toDouble();
+ mNumSegments = itemElem.attribute("numSegments", "2").toInt();
+ mNumSegmentsLeft = itemElem.attribute("numSegmentsLeft", "0").toInt();
+ mNumUnitsPerSegment = itemElem.attribute("numUnitsPerSegment", "1.0").toDouble();
+ mNumMapUnitsPerScaleBarUnit = itemElem.attribute("numMapUnitsPerScaleBarUnit", "1.0").toDouble();
+ mPen.setWidthF(itemElem.attribute("outlineWidth", "1.0").toDouble());
+ QString fontString = itemElem.attribute("font", "");
+ if(!fontString.isEmpty())
+ {
+ mFont.fromString(fontString);
+ }
+
+ //style
+ delete mStyle;
+ mStyle = 0;
+ QString styleString = itemElem.attribute("style", "");
+ if(!styleString.isEmpty())
+ {
+ if(styleString == "Line with Ticks")
+ {
+ mStyle = new QgsTicksScaleBarStyle(this);
+ }
+ else if(styleString == "Single Box")
+ {
+ mStyle = new QgsSingleBoxScaleBarStyle(this);
+ }
+ else if(styleString == "Double Box")
+ {
+ mStyle = new QgsDoubleBoxScaleBarStyle(this);
+ }
+ else //numeric
+ {
+ mStyle = new QgsNumericScaleBarStyle(this);
+ }
+ }
+
+
+ //map
+ int mapId = itemElem.attribute("mapId", "-1").toInt();
+ if(mapId >= 0)
+ {
+ const QgsComposerMap* composerMap = mComposition->getComposerMapById(mapId);
+ mComposerMap = composerMap;
+ }
+
+ refreshSegmentMM();
+
+ //restore general composer item properties
+ QDomNodeList composerItemList = itemElem.elementsByTagName("ComposerItem");
+ if(composerItemList.size() > 0)
+ {
+ QDomElement composerItemElem = composerItemList.at(0).toElement();
+ _readXML(composerItemElem, doc);
+ }
+
+ return true;
}
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.h
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.h 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposerscalebar.h 2008-08-04 14:13:11 UTC (rev 8988)
@@ -82,6 +82,9 @@
possibilities are: */
void setStyle(const QString& styleName);
+ /**Returns style name*/
+ QString style() const;
+
/**Returns the x - positions of the segment borders (in item coordinates) and the width
of the segment*/
void segmentPositions(QList<QPair<double, double> >& posWidthList) const;
Modified: branches/advanced_printing_branch/src/app/composer/qgscomposerscalebarwidget.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgscomposerscalebarwidget.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgscomposerscalebarwidget.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -156,7 +156,7 @@
mBoxCheckBox->setCheckState(Qt::Unchecked);
}
- //Style //todo...
+ //todo: style...
blockSignals(false);
Modified: branches/advanced_printing_branch/src/app/composer/qgslegendmodel.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgslegendmodel.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgslegendmodel.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -25,6 +25,10 @@
QgsLegendModel::QgsLegendModel(): QStandardItemModel()
{
+ if(QgsMapLayerRegistry::instance())
+ {
+ connect(QgsMapLayerRegistry::instance(), SIGNAL(layerWillBeRemoved(QString)), this, SLOT(removeLayer(const QString&)));
+ }
}
QgsLegendModel::~QgsLegendModel()
@@ -54,6 +58,8 @@
//addItem for layer
QStandardItem* layerItem = new QStandardItem(currentLayer->name());
+ //set layer id as user data into the item
+ layerItem->setData(QVariant(currentLayer->getLayerID()));
layerItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
invisibleRootItem()->setChild (invisibleRootItem()->rowCount(), layerItem);
@@ -194,3 +200,73 @@
{
mSymbols.remove(s);
}
+
+void QgsLegendModel::updateLayerEntries(const QStringList& newLayerIds)
+{
+ if(!invisibleRootItem())
+ {
+ return;
+ }
+
+ //check for layers to remove
+ QStandardItem* currentLayerItem = 0;
+ QSet<int> rowsToRemove;
+
+ int numRootItems = rowCount();
+ for(int i = 0; i < numRootItems ; ++i)
+ {
+ currentLayerItem = item(i);
+ if(!currentLayerItem)
+ {
+ continue;
+ }
+
+ QString layerId = currentLayerItem->data().toString();
+
+ if(!newLayerIds.contains(layerId)) //layer has been removed
+ {
+ rowsToRemove.insert(i);
+ }
+ }
+
+ //remove layers in reverse order
+ if(rowsToRemove.size() > 0)
+ {
+ QSet<int>::const_iterator delete_it = --rowsToRemove.constEnd();
+ for(;; --delete_it)
+ {
+ removeRow(*delete_it);
+ if(delete_it == rowsToRemove.constBegin())
+ {
+ break;
+ }
+ }
+
+ }
+
+
+ mLayerIds = newLayerIds;
+}
+
+void QgsLegendModel::removeLayer(const QString& layerId)
+{
+ QStandardItem* currentLayerItem = 0;
+
+ int numRootItems = rowCount();
+ for(int i = 0; i < numRootItems ; ++i)
+ {
+ currentLayerItem = item(i);
+ if(!currentLayerItem)
+ {
+ continue;
+ }
+
+ QString currentId = currentLayerItem->data().toString();
+ if(currentId == layerId)
+ {
+ removeRow(i);
+ emit layersChanged();
+ return;
+ }
+ }
+}
Modified: branches/advanced_printing_branch/src/app/composer/qgslegendmodel.h
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgslegendmodel.h 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgslegendmodel.h 2008-08-04 14:13:11 UTC (rev 8988)
@@ -28,12 +28,22 @@
/**A model that provides layers as root items. The classification items are children of the layer items*/
class QgsLegendModel: public QStandardItemModel
{
+ Q_OBJECT
+
public:
QgsLegendModel();
~QgsLegendModel();
void setLayerSet(const QStringList& layerIds);
+ /**Apply added or removed layers to the model*/
+ void updateLayerEntries(const QStringList& newLayerIds);
+ public slots:
+ void removeLayer(const QString& layerId);
+
+ signals:
+ void layersChanged();
+
private:
/**Adds classification items of vector layers
@return 0 in case of success*/
Modified: branches/advanced_printing_branch/src/app/composer/qgsticksscalebarstyle.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/composer/qgsticksscalebarstyle.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/composer/qgsticksscalebarstyle.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -35,7 +35,7 @@
QString QgsTicksScaleBarStyle::name() const
{
- return "Line Ticks Middle";
+ return "Line with Ticks";
}
void QgsTicksScaleBarStyle::draw(QPainter* p, double xOffset) const
Modified: branches/advanced_printing_branch/src/app/qgisapp.cpp
===================================================================
--- branches/advanced_printing_branch/src/app/qgisapp.cpp 2008-08-03 08:40:17 UTC (rev 8987)
+++ branches/advanced_printing_branch/src/app/qgisapp.cpp 2008-08-04 14:13:11 UTC (rev 8988)
@@ -2558,6 +2558,9 @@
QgsMapLayerRegistry::instance()->removeAllMapLayers();
mMapCanvas->clear();
+ delete mComposer;
+ mComposer = new QgsComposer(this);
+
QgsProject* prj = QgsProject::instance();
prj->title( QString::null );
prj->filename( QString::null );
@@ -2779,6 +2782,9 @@
// clear out any stuff from previous project
mMapCanvas->freeze(true);
removeAllLayers();
+
+ delete mComposer;
+ mComposer = new QgsComposer(this);
QgsProject::instance()->filename( fullPath );
More information about the QGIS-commit
mailing list