QGIS/src/qgscomposition.cpp
gsherman 8c64ebf684 ** Merged Projections_Branch into HEAD
Problems:
      Polygon outlines are not drawn. This was checked twice and no cause
      was found.

      Projections do not work in all circumstances

      Note that both the proj4 library and sqlite3 are now required. The
      build system has not been modified to test for these yet.

      Qt 3.3.x is required to build this source tree.

      Make sure to increment the EXTRA_VERSION in configure.in when
      committing changes.

      Make sure to update the Changelog with each commit


git-svn-id: http://svn.osgeo.org/qgis/trunk@3112 c8812cc2-4d05-0410-92ff-de0c093fc19c
2005-04-10 07:04:07 +00:00

792 lines
24 KiB
C++

/***************************************************************************
qgscomposition.cpp
-------------------
begin : January 2005
copyright : (C) 2005 by Radim Blazek
email : blazek@itc.it
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <iostream>
#include <qwidget.h>
#include <qcombobox.h>
#include <qlineedit.h>
#include <qcanvas.h>
#include <qevent.h>
#include <qpoint.h>
#include <qrect.h>
#include <qwmatrix.h>
#include <qobjectlist.h>
#include <qdom.h>
#include <qstringlist.h>
#include "qgsmapcanvas.h"
#include "qgsproject.h"
#include "qgscomposer.h"
#include "qgscomposeritem.h"
#include "qgscomposerview.h"
#include "qgscomposition.h"
#include "qgscomposermap.h"
#include "qgscomposervectorlegend.h"
#include "qgscomposerlabel.h"
#include "qgscomposerscalebar.h"
QgsCompositionPaper::QgsCompositionPaper ( QString name, int w, int h, bool c)
:mName(name), mWidth(w), mHeight(h), mCustom(c)
{
}
QgsCompositionPaper::~QgsCompositionPaper ( )
{
}
QgsComposition::QgsComposition( QgsComposer *c, int id )
{
#ifdef QGISDEBUG
std::cerr << "QgsComposition::QgsComposition()" << std::endl;
#endif
mId = id;
mNextItemId = 1;
mCanvas = 0;
mPaperItem = 0;
mComposer = c;
mMapCanvas = c->mapCanvas();
mView = c->view();
mSelectedItem = 0;
mPlotStyle = Preview;
// Note: scale 10 make it inacceptable slow: QgsComposerMap 900x900mm on paper 1500x1000
// cannot be smoothly moved even if mPreviewMode == Rectangle and no zoom in
// scale 2 results in minimum line width 0.5 mmm which is too much
// scale 3 is compromise
mScale = 5;
// Add paper sizes and set default.
mPapers.push_back ( QgsCompositionPaper( tr("Custom"), 0, 0, 1 ) );
mPapers.push_back ( QgsCompositionPaper( tr("A5 (148x210 mm)"), 148, 210 ) );
mPapers.push_back ( QgsCompositionPaper( tr("A4 (210x297 mm)"), 210, 297 ) );
mPapers.push_back ( QgsCompositionPaper( tr("A3 (297x420 mm)"), 297, 420 ) );
mPapers.push_back ( QgsCompositionPaper( tr("A2 (420x594 mm)"), 420, 594 ) );
mPapers.push_back ( QgsCompositionPaper( tr("A1 (594x841 mm)"), 594, 841 ) );
mPapers.push_back ( QgsCompositionPaper( tr("A0 (841x1189 mm)"), 841, 1189 ) );
mPapers.push_back ( QgsCompositionPaper( tr("B5 (176 x 250 mm)"), 176, 250 ) );
mPapers.push_back ( QgsCompositionPaper( tr("B4 (250 x 353 mm)"), 250, 353 ) );
mPapers.push_back ( QgsCompositionPaper( tr("B3 (353 x 500 mm)"), 353, 500 ) );
mPapers.push_back ( QgsCompositionPaper( tr("B2 (500 x 707 mm)"), 500, 707 ) );
mPapers.push_back ( QgsCompositionPaper( tr("B1 (707 x 1000 mm)"), 707, 1000 ) );
mPapers.push_back ( QgsCompositionPaper( tr("B0 (1000 x 1414 mm)"), 1000, 1414 ) );
mPapers.push_back ( QgsCompositionPaper( tr("Letter (8.5x11 inches)"), 216, 279 ) );
mPapers.push_back ( QgsCompositionPaper( tr("Legal (8.5x14 inches)"), 216, 356 ) );
mPaper = mDefaultPaper = mCustomPaper = 0;
for( int i = 0; i < mPapers.size(); i++ ) {
mPaperSizeComboBox->insertItem( mPapers[i].mName );
// Map - A4 land for now, if future read from template
if ( mPapers[i].mWidth == 210 && mPapers[i].mHeight == 297 ){
mDefaultPaper = i;
}
if ( mPapers[i].mCustom ) mCustomPaper = i;
}
// Orientation
mPaperOrientationComboBox->insertItem( tr("Portrait"), Portrait );
mPaperOrientationComboBox->insertItem( tr("Landscape"), Landscape );
mPaperOrientation = Landscape;
mPaperUnitsComboBox->insertItem( "mm" );
// Create canvas
mPaperWidth = 1;
mPaperHeight = 1;
createCanvas();
// Tool
mRectangleItem = 0;
mNewCanvasItem = 0;
mTool = Select;
mToolStep = 0;
}
void QgsComposition::createDefault(void)
{
mPaperSizeComboBox->setCurrentItem(mDefaultPaper);
mPaperOrientationComboBox->setCurrentItem(Landscape);
mUserPaperWidth = mPapers[mDefaultPaper].mWidth;
mUserPaperHeight = mPapers[mDefaultPaper].mHeight;
recalculate();
mResolution = 300;
setOptions();
// Add the map to coposition
/*
QgsComposerMap *m = new QgsComposerMap ( this, mNextItemId++,
mScale*15, mScale*15, mScale*180, mScale*180 );
mItems.push_back(m);
*/
// Add vector legend
/*
QgsComposerVectorLegend *vl = new QgsComposerVectorLegend ( this, mNextItemId++,
mScale*210, mScale*100, 10 );
mItems.push_back(vl);
*/
// Title
/*
QgsComposerLabel *tit = new QgsComposerLabel ( this, mNextItemId++,
mScale*238, mScale*40, "Map", 24 );
mItems.push_back(tit);
*/
// Tool
mRectangleItem = 0;
mNewCanvasItem = 0;
mTool = Select;
mToolStep = 0;
writeSettings();
}
void QgsComposition::createCanvas(void)
{
if ( mCanvas ) delete mCanvas;
mCanvas = new QCanvas ( (int) mPaperWidth * mScale, (int) mPaperHeight * mScale);
mCanvas->setBackgroundColor( QColor(180,180,180) );
// mCanvas->setDoubleBuffering( false ); // makes the move very unpleasant and doesn't make it faster
// Paper
if ( mPaperItem ) delete mPaperItem;
mPaperItem = new QCanvasRectangle( 0, 0, (int) mPaperWidth * mScale,
(int) mPaperHeight * mScale, mCanvas );
mPaperItem->setBrush( QColor(255,255,255) );
mPaperItem->setPen( QPen(QColor(0,0,0), 1) );
mPaperItem->setZ(0);
mPaperItem->setActive(false);
mPaperItem->show();
}
void QgsComposition::resizeCanvas(void)
{
mCanvas->resize ( (int) mPaperWidth * mScale, (int) mPaperHeight * mScale );
std::cout << "mCanvas width = " << mCanvas->width() << " height = " << mCanvas->height() << std::endl;
mPaperItem->setSize ( (int) mPaperWidth * mScale, (int) mPaperHeight * mScale );
}
QgsComposition::~QgsComposition()
{
std::cerr << "QgsComposition::~QgsComposition" << std::endl;
mView->setCanvas ( 0 );
if ( mPaperItem ) delete mPaperItem;
for (std::list < QgsComposerItem * >::iterator it = mItems.begin();
it != mItems.end(); ++it)
{
delete *it;
}
if ( mCanvas ) delete mCanvas;
}
QgsMapCanvas *QgsComposition::mapCanvas(void) { return mMapCanvas; }
void QgsComposition::setActive ( bool active )
{
if ( active ) {
mView->setCanvas ( mCanvas );
mComposer->showCompositionOptions ( this );
} else {
// TODO
}
}
void QgsComposition::contentsMousePressEvent(QMouseEvent* e)
{
std::cerr << "QgsComposition::contentsMousePressEvent() mTool = " << mTool << " mToolStep = "
<< mToolStep << std::endl;
QPoint p = mView->inverseWorldMatrix().map(e->pos());
switch ( mTool ) {
case Select:
{
QCanvasItemList l = mCanvas->collisions(p);
double x,y;
mView->inverseWorldMatrix().map( e->pos().x(), e->pos().y(), &x, &y );
QCanvasItem * newItem = 0;
for ( QCanvasItemList::Iterator it=l.fromLast(); it!=l.end(); --it) {
if (! (*it)->isActive() ) continue;
newItem = *it;
}
if ( newItem ) { // found
if ( newItem != mSelectedItem ) { // Show options
if ( mSelectedItem ) {
QgsComposerItem *coi = dynamic_cast <QgsComposerItem *> (mSelectedItem);
coi->setSelected ( false );
}
QgsComposerItem *coi = dynamic_cast <QgsComposerItem *> (newItem);
coi->setSelected ( true );
mComposer->showItemOptions ( coi->options() );
mSelectedItem = newItem;
}
mLastX = x;
mLastY = y;
} else { // not found
if ( mSelectedItem ) {
QgsComposerItem *coi = dynamic_cast <QgsComposerItem *> (mSelectedItem);
coi->setSelected ( false );
}
mSelectedItem = 0;
mComposer->showItemOptions ( (QWidget *) 0 ); // hide old options
}
mCanvas->update();
}
break;
case AddMap:
std::cerr << "AddMap" << std::endl;
if ( mToolStep == 0 ) {
mRectangleItem = new QCanvasRectangle( p.x(), p.y(), 0, 0, mCanvas );
mRectangleItem->setBrush( Qt::NoBrush );
mRectangleItem->setPen( QPen(QColor(0,0,0), 1) );
mRectangleItem->setZ(100);
mRectangleItem->setActive(false);
mRectangleItem->show();
mToolStep = 1;
}
std::cerr << "mToolStep = " << mToolStep << std::endl;
break;
case AddVectorLegend:
{
mNewCanvasItem->setX( p.x() );
mNewCanvasItem->setY( p.y() );
QgsComposerVectorLegend *vl = dynamic_cast <QgsComposerVectorLegend*> (mNewCanvasItem);
vl->writeSettings();
mItems.push_back(vl);
mNewCanvasItem = 0;
mComposer->selectItem(); // usually just one legend
// Select and show options
vl->setSelected ( true );
mComposer->showItemOptions ( vl->options() );
mSelectedItem = dynamic_cast <QCanvasItem*> (vl);
mCanvas->update();
}
break;
case AddLabel:
{
mNewCanvasItem->setX( p.x() );
mNewCanvasItem->setY( p.y() );
QgsComposerLabel *lab = dynamic_cast <QgsComposerLabel*> (mNewCanvasItem);
lab->writeSettings();
mItems.push_back(lab);
mNewCanvasItem = 0;
mComposer->selectItem(); // usually just one ???
// Select and show options
lab->setSelected ( true );
mComposer->showItemOptions ( lab->options() );
mSelectedItem = dynamic_cast <QCanvasItem*> (lab);
mCanvas->update();
}
break;
case AddScalebar:
{
mNewCanvasItem->setX( p.x() );
mNewCanvasItem->setY( p.y() );
QgsComposerScalebar *sb = dynamic_cast <QgsComposerScalebar*> (mNewCanvasItem);
sb->writeSettings();
mItems.push_back(sb);
mNewCanvasItem = 0;
mComposer->selectItem(); // usually just one ???
// Select and show options
sb->setSelected ( true );
mComposer->showItemOptions ( sb->options() );
mSelectedItem = dynamic_cast <QCanvasItem*> (sb);
mCanvas->update();
}
break;
}
}
void QgsComposition::contentsMouseMoveEvent(QMouseEvent* e)
{
std::cerr << "QgsComposition::contentsMouseMoveEvent() mTool = " << mTool << " mToolStep = "
<< mToolStep << std::endl;
QPoint p = mView->inverseWorldMatrix().map(e->pos());
switch ( mTool ) {
case Select:
if ( mSelectedItem ) {
double x,y;
mView->inverseWorldMatrix().map( e->pos().x(), e->pos().y(), &x, &y );
mSelectedItem->moveBy ( x - mLastX, y - mLastY );
mLastX = x;
mLastY = y;
mCanvas->update();
}
break;
case AddMap:
if ( mToolStep == 1 ) { // draw rectangle
double x, y;
int w, h;
x = p.x() < mRectangleItem->x() ? p.x() : mRectangleItem->x();
y = p.y() < mRectangleItem->y() ? p.y() : mRectangleItem->y();
w = abs ( p.x() - (int)mRectangleItem->x() );
h = abs ( p.y() - (int)mRectangleItem->y() );
mRectangleItem->setX(x);
mRectangleItem->setY(y);
mRectangleItem->setSize(w,h);
mCanvas->update();
}
break;
case AddVectorLegend:
case AddLabel:
case AddScalebar:
mNewCanvasItem->move ( p.x(), p.y() );
mCanvas->update();
break;
}
}
void QgsComposition::contentsMouseReleaseEvent(QMouseEvent* e)
{
std::cerr << "QgsComposition::contentsMouseReleaseEvent() mTool = " << mTool
<< " mToolStep = " << mToolStep << std::endl;
QPoint p = mView->inverseWorldMatrix().map(e->pos());
switch ( mTool ) {
case AddMap: // mToolStep should be always 1 but rectangle can be 0 size
{
int x = (int) mRectangleItem->x();
int y = (int) mRectangleItem->y();
int w = mRectangleItem->width();
int h = mRectangleItem->height();
delete mRectangleItem;
mRectangleItem = 0;
if ( w > 0 && h > 0 ) {
QgsComposerMap *m = new QgsComposerMap ( this, mNextItemId++, x, y, w, h );
m->setUserExtent( mMapCanvas->extent());
mItems.push_back(m);
m->setSelected ( true );
if ( mSelectedItem ) {
QgsComposerItem *coi = dynamic_cast <QgsComposerItem *> (mSelectedItem);
coi->setSelected ( false );
}
mComposer->selectItem(); // usually just one map
m->setSelected ( true );
mComposer->showItemOptions ( m->options() );
mSelectedItem = dynamic_cast <QCanvasItem *> (m);
} else {
mToolStep = 0;
}
mCanvas->setChanged ( QRect( x, y, w, h) ); // Should not be necessary
mCanvas->update();
}
break;
case Select:
if ( mSelectedItem ) {
// the object was probably moved
QgsComposerItem *ci = dynamic_cast <QgsComposerItem *> (mSelectedItem);
ci->writeSettings();
}
}
}
void QgsComposition::keyPressEvent ( QKeyEvent * e )
{
std::cout << "QgsComposition::keyPressEvent() key = " << e->key() << std::endl;
if ( e->key() == Qt::Key_Delete && mSelectedItem ) { // delete
QgsComposerItem *coi = dynamic_cast <QgsComposerItem *> (mSelectedItem);
coi->setSelected ( false );
coi->removeSettings();
for (std::list < QgsComposerItem * >::iterator it = mItems.begin();
it != mItems.end(); ++it)
{
if ( (*it) == coi ) {
mItems.erase ( it );
break;
}
}
std::cout << "mItems.size() = " << mItems.size() << std::endl;
delete (mSelectedItem);
mSelectedItem = 0;
mCanvas->update();
}
}
void QgsComposition::paperSizeChanged ( void )
{
std::cout << "QgsComposition::paperSizeChanged" << std::endl;
mPaper = mPaperSizeComboBox->currentItem();
mPaperOrientation = mPaperOrientationComboBox->currentItem();
std::cout << "custom = " << mPapers[mPaper].mCustom << std::endl;
std::cout << "orientation = " << mPaperOrientation << std::endl;
if ( mPapers[mPaper].mCustom ) {
mUserPaperWidth = mPaperWidthLineEdit->text().toDouble();
mUserPaperHeight = mPaperHeightLineEdit->text().toDouble();
mPaperWidthLineEdit->setEnabled( TRUE );
mPaperHeightLineEdit->setEnabled( TRUE );
} else {
mUserPaperWidth = mPapers[mPaper].mWidth;
mUserPaperHeight = mPapers[mPaper].mHeight;
mPaperWidthLineEdit->setEnabled( FALSE );
mPaperHeightLineEdit->setEnabled( FALSE );
setOptions();
}
recalculate();
mView->repaintContents();
writeSettings();
}
void QgsComposition::recalculate ( void )
{
if ( (mPaperOrientation == Portrait && mUserPaperWidth < mUserPaperHeight) ||
(mPaperOrientation == Landscape && mUserPaperWidth > mUserPaperHeight) )
{
mPaperWidth = mUserPaperWidth;
mPaperHeight = mUserPaperHeight;
} else {
mPaperWidth = mUserPaperHeight;
mPaperHeight = mUserPaperWidth;
}
std::cout << "mPaperWidth = " << mPaperWidth << " mPaperHeight = " << mPaperHeight << std::endl;
resizeCanvas();
mComposer->zoomFull();
}
void QgsComposition::resolutionChanged ( void )
{
mResolution = mResolutionLineEdit->text().toInt();
writeSettings();
}
void QgsComposition::setOptions ( void )
{
mPaperSizeComboBox->setCurrentItem(mPaper);
mPaperOrientationComboBox->setCurrentItem(mPaperOrientation);
mPaperWidthLineEdit->setText ( QString("%1").arg(mUserPaperWidth,0,'g') );
mPaperHeightLineEdit->setText ( QString("%1").arg(mUserPaperHeight,0,'g') );
mResolutionLineEdit->setText ( QString("%1").arg(mResolution) );
}
void QgsComposition::setPlotStyle ( PlotStyle p )
{
mPlotStyle = p;
// Set all items
for (std::list < QgsComposerItem * >::iterator it = mItems.begin(); it != mItems.end(); ++it) {
(*it)->setPlotStyle( p ) ;
}
// Remove paper if Print, reset if Preview
if ( mPlotStyle == Print ) {
mPaperItem->setCanvas(0);
mCanvas->setBackgroundColor( Qt::white );
} else {
mPaperItem->setCanvas(mCanvas);
mCanvas->setBackgroundColor( QColor(180,180,180) );
}
}
double QgsComposition::viewScale ( void )
{
double scale = mView->worldMatrix().m11();
return scale;
}
void QgsComposition::refresh()
{
// TODO add signals to map canvas
for (std::list < QgsComposerItem * >::iterator it = mItems.begin(); it != mItems.end(); ++it) {
QgsComposerItem *ci = (*it);
if ( typeid (*ci) == typeid(QgsComposerMap) ) {
QgsComposerMap *cm = dynamic_cast<QgsComposerMap*>(ci);
cm->setCacheUpdated(false);
} else if ( typeid (*ci) == typeid(QgsComposerVectorLegend) ) {
QgsComposerVectorLegend *vl = dynamic_cast<QgsComposerVectorLegend*>(ci);
vl->recalculate();
}
}
}
int QgsComposition::id ( void ) { return mId; }
QgsComposer *QgsComposition::composer(void) { return mComposer; }
QCanvas *QgsComposition::canvas(void) { return mCanvas; }
double QgsComposition::paperWidth ( void ) { return mPaperWidth; }
double QgsComposition::paperHeight ( void ) { return mPaperHeight; }
int QgsComposition::paperOrientation ( void ) { return mPaperOrientation; }
int QgsComposition::resolution ( void ) { return mResolution; }
int QgsComposition::scale( void ) {
return mScale;
}
double QgsComposition::toMM ( int v ) { return v/mScale ; }
int QgsComposition::fromMM ( double v ) { return (int) (v * mScale); }
void QgsComposition::setTool ( Tool tool )
{
// Stop old in progress
mView->viewport()->setMouseTracking ( false ); // stop mouse tracking
if ( mSelectedItem ) {
QgsComposerItem *coi = dynamic_cast <QgsComposerItem *> (mSelectedItem);
coi->setSelected ( false );
mCanvas->update();
}
mSelectedItem = 0;
mComposer->showItemOptions ( (QWidget *) 0 );
if ( mNewCanvasItem ) {
mNewCanvasItem->setX( -1000 );
mNewCanvasItem->setY( -1000 );
mCanvas->update();
delete mNewCanvasItem;
mNewCanvasItem = 0;
}
if ( mRectangleItem ) {
delete mRectangleItem;
mRectangleItem = 0;
}
// Start new
if ( tool == AddVectorLegend ) { // Create temporary object
if ( mNewCanvasItem ) delete mNewCanvasItem;
// Create new object outside the visible area
QgsComposerVectorLegend *vl = new QgsComposerVectorLegend ( this, mNextItemId++,
(-1000)*mScale, (-1000)*mScale, (int) (mScale*mPaperHeight/50) );
mNewCanvasItem = dynamic_cast <QCanvasItem *> (vl);
mComposer->showItemOptions ( vl->options() );
mView->viewport()->setMouseTracking ( true ); // to recieve mouse move
} else if ( tool == AddLabel ) {
if ( mNewCanvasItem ) delete mNewCanvasItem;
// Create new object outside the visible area
QgsComposerLabel *lab = new QgsComposerLabel ( this, mNextItemId++,
(-1000)*mScale, (-1000)*mScale, "Label", (int) (mScale*mPaperHeight/40) );
mNewCanvasItem = dynamic_cast <QCanvasItem *> (lab);
mComposer->showItemOptions ( lab->options() );
mView->viewport()->setMouseTracking ( true ); // to recieve mouse move
} else if ( tool == AddScalebar ) {
if ( mNewCanvasItem ) delete mNewCanvasItem;
// Create new object outside the visible area
QgsComposerScalebar *sb = new QgsComposerScalebar ( this, mNextItemId++,
(-1000)*mScale, (-1000)*mScale );
mNewCanvasItem = dynamic_cast <QCanvasItem *> (sb);
mComposer->showItemOptions ( sb->options() );
mView->viewport()->setMouseTracking ( true ); // to recieve mouse move
}
mTool = tool;
mToolStep = 0;
}
std::vector<QgsComposerMap*> QgsComposition::maps(void)
{
std::vector<QgsComposerMap*> v;
for (std::list < QgsComposerItem * >::iterator it = mItems.begin(); it != mItems.end(); ++it) {
QgsComposerItem *ci = (*it);
if ( typeid (*ci) == typeid(QgsComposerMap) ) {
v.push_back ( dynamic_cast<QgsComposerMap*>(ci) );
}
}
return v;
}
QgsComposerMap* QgsComposition::map ( int id )
{
for (std::list < QgsComposerItem * >::iterator it = mItems.begin(); it != mItems.end(); ++it) {
QgsComposerItem *ci = (*it);
if ( ci->id() == id ) {
return ( dynamic_cast<QgsComposerMap*>(ci) );
}
}
return 0;
}
int QgsComposition::selectionBoxSize ( void )
{
// Scale rectangle, keep rectangle of fixed size in screen points
return (int) (7/viewScale());
}
QPen QgsComposition::selectionPen ( void )
{
return QPen( QColor(0,0,255), 0) ;
}
QBrush QgsComposition::selectionBrush ( void )
{
return QBrush ( QBrush(QColor(0,0,255), Qt::SolidPattern) );
}
void QgsComposition::emitMapChanged ( int id )
{
emit mapChanged ( id );
}
bool QgsComposition::writeSettings ( void )
{
QString path, val;
path.sprintf("/composition_%d/", mId );
QgsProject::instance()->writeEntry( "Compositions", path+"width", mUserPaperWidth );
QgsProject::instance()->writeEntry( "Compositions", path+"height", mUserPaperHeight );
QgsProject::instance()->writeEntry( "Compositions", path+"resolution", mResolution );
if ( mPaperOrientation == Landscape ) {
val = "landscape";
} else {
val = "portrait";
}
QgsProject::instance()->writeEntry( "Compositions", path+"orientation", val );
return true;
}
bool QgsComposition::readSettings ( void )
{
std::cout << "QgsComposition::readSettings" << std::endl;
bool ok;
mPaper = mCustomPaper;
QString path, val;
path.sprintf("/composition_%d/", mId );
mUserPaperWidth = QgsProject::instance()->readDoubleEntry( "Compositions", path+"width", 297, &ok);
mUserPaperHeight = QgsProject::instance()->readDoubleEntry( "Compositions", path+"height", 210, &ok);
mResolution = QgsProject::instance()->readNumEntry( "Compositions", path+"resolution", 300, &ok);
val = QgsProject::instance()->readEntry( "Compositions", path+"orientation", "landscape", &ok);
if ( val.compare("landscape") == 0 ) {
mPaperOrientation = Landscape;
} else {
mPaperOrientation = Portrait;
}
recalculate();
setOptions();
// Create objects
path.sprintf("/composition_%d", mId );
QStringList el = QgsProject::instance()->subkeyList ( "Compositions", path );
// First maps because they can be used by other objects
for ( QStringList::iterator it = el.begin(); it != el.end(); ++it ) {
std::cout << "key: " << (*it).ascii() << std::endl;
QStringList l = QStringList::split( '_', (*it) );
if ( l.size() == 2 ) {
QString name = l.first();
QString ids = l.last();
int id = ids.toInt();
if ( name.compare("map") == 0 ) {
QgsComposerMap *map = new QgsComposerMap ( this, id );
mItems.push_back(map);
}
if ( id >= mNextItemId ) mNextItemId = id + 1;
}
}
for ( QStringList::iterator it = el.begin(); it != el.end(); ++it ) {
std::cout << "key: " << (*it).ascii() << std::endl;
QStringList l = QStringList::split( '_', (*it) );
if ( l.size() == 2 ) {
QString name = l.first();
QString ids = l.last();
int id = ids.toInt();
if ( name.compare("vectorlegend") == 0 ) {
QgsComposerVectorLegend *vl = new QgsComposerVectorLegend ( this, id );
mItems.push_back(vl);
} else if ( name.compare("label") == 0 ) {
QgsComposerLabel *lab = new QgsComposerLabel ( this, id );
mItems.push_back(lab);
} else if ( name.compare("scalebar") == 0 ) {
QgsComposerScalebar *sb = new QgsComposerScalebar ( this, id );
mItems.push_back(sb);
}
if ( id >= mNextItemId ) mNextItemId = id + 1;
}
}
mCanvas->update();
return true;
}