Skip to content

Commit b7423cf

Browse files
manisandronyalldawson
authored andcommitted
[composer] Composer item controls in GUI show position relative to page origin (also save page number and relative position to xml) (fix #9411)
1 parent c0e9440 commit b7423cf

File tree

7 files changed

+145
-44
lines changed

7 files changed

+145
-44
lines changed

python/core/composer/qgscomposeritem.sip

+9
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,15 @@ class QgsComposerItem : QObject, QGraphicsRectItem
179179
@param y y-position of mouse cursor (in item coordinates)*/
180180
virtual void zoomContent( int delta, double x, double y );
181181

182+
/** gets the page the item is currently on */
183+
int page() const;
184+
185+
/** Returns the position relative to the current page */
186+
QPointF pagePos() const;
187+
188+
/** Updates the page relative position for the new paper size */
189+
void updatePagePos( double newPageWidth, double newPageHeight );
190+
182191
/**Moves the item to a new position (in canvas coordinates)*/
183192
void setItemPosition( double x, double y, ItemPositionMode itemPoint = UpperLeft );
184193

src/app/composer/qgscomposeritemwidget.cpp

+25-19
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgscomposeritemwidget.h"
1919
#include "qgscomposeritem.h"
2020
#include "qgscomposermap.h"
21+
#include "qgscomposition.h"
2122
#include "qgspoint.h"
2223
#include <QColorDialog>
2324
#include <QPen>
@@ -46,6 +47,7 @@ QgsComposerItemWidget::QgsComposerItemWidget( QWidget* parent, QgsComposerItem*
4647
mHeightLineEdit->setValidator( new QDoubleValidator( 0 ) );
4748

4849
setValuesForGuiElements();
50+
connect( mItem->composition(), SIGNAL( paperSizeChanged() ), this, SLOT( setValuesForGuiPositionElements() ) );
4951
connect( mItem, SIGNAL( sizeChanged() ), this, SLOT( setValuesForGuiPositionElements() ) );
5052
connect( mItem, SIGNAL( itemChanged() ), this, SLOT( setValuesForGuiNonPositionElements() ) );
5153

@@ -142,7 +144,7 @@ void QgsComposerItemWidget::changeItemPosition()
142144
return;
143145
}
144146

145-
mItem->setItemPosition( x, y, width, height, positionMode() );
147+
mItem->setItemPosition( x, y, width, height, positionMode(), false, mPageSpinBox->value() );
146148

147149
mItem->update();
148150
mItem->endCommand();
@@ -270,73 +272,76 @@ void QgsComposerItemWidget::setValuesForGuiPositionElements()
270272
mLowerLeftCheckBox->blockSignals( true );
271273
mLowerMiddleCheckBox->blockSignals( true );
272274
mLowerRightCheckBox->blockSignals( true );
275+
mPageSpinBox->blockSignals( true );
273276

277+
QPointF pos = mItem->pagePos();
274278

275279
if ( mItem->lastUsedPositionMode() == QgsComposerItem::UpperLeft )
276280
{
277281
mUpperLeftCheckBox->setChecked( true );
278-
mXLineEdit->setText( QString::number( mItem->pos().x() ) );
279-
mYLineEdit->setText( QString::number( mItem->pos().y() ) );
282+
mXLineEdit->setText( QString::number( pos.x() ) );
283+
mYLineEdit->setText( QString::number( pos.y() ) );
280284
}
281285

282286
if ( mItem->lastUsedPositionMode() == QgsComposerItem::UpperMiddle )
283287
{
284288
mUpperMiddleCheckBox->setChecked( true );
285-
mXLineEdit->setText( QString::number( mItem->pos().x() + mItem->rect().width() / 2.0 ) );
286-
mYLineEdit->setText( QString::number( mItem->pos().y() ) );
289+
mXLineEdit->setText( QString::number( pos.x() + mItem->rect().width() / 2.0 ) );
290+
mYLineEdit->setText( QString::number( pos.y() ) );
287291
}
288292

289293
if ( mItem->lastUsedPositionMode() == QgsComposerItem::UpperRight )
290294
{
291295
mUpperRightCheckBox->setChecked( true );
292-
mXLineEdit->setText( QString::number( mItem->pos().x() + mItem->rect().width() ) );
293-
mYLineEdit->setText( QString::number( mItem->pos().y() ) );
296+
mXLineEdit->setText( QString::number( pos.x() + mItem->rect().width() ) );
297+
mYLineEdit->setText( QString::number( pos.y() ) );
294298
}
295299

296300
if ( mItem->lastUsedPositionMode() == QgsComposerItem::MiddleLeft )
297301
{
298302
mMiddleLeftCheckBox->setChecked( true );
299-
mXLineEdit->setText( QString::number( mItem->pos().x() ) );
300-
mYLineEdit->setText( QString::number( mItem->pos().y() + mItem->rect().height() / 2.0 ) );
303+
mXLineEdit->setText( QString::number( pos.x() ) );
304+
mYLineEdit->setText( QString::number( pos.y() + mItem->rect().height() / 2.0 ) );
301305
}
302306

303307
if ( mItem->lastUsedPositionMode() == QgsComposerItem::Middle )
304308
{
305309
mMiddleCheckBox->setChecked( true );
306-
mXLineEdit->setText( QString::number( mItem->pos().x() + mItem->rect().width() / 2.0 ) );
307-
mYLineEdit->setText( QString::number( mItem->pos().y() + mItem->rect().height() / 2.0 ) );
310+
mXLineEdit->setText( QString::number( pos.x() + mItem->rect().width() / 2.0 ) );
311+
mYLineEdit->setText( QString::number( pos.y() + mItem->rect().height() / 2.0 ) );
308312
}
309313

310314
if ( mItem->lastUsedPositionMode() == QgsComposerItem::MiddleRight )
311315
{
312316
mMiddleRightCheckBox->setChecked( true );
313-
mXLineEdit->setText( QString::number( mItem->pos().x() + mItem->rect().width() ) );
314-
mYLineEdit->setText( QString::number( mItem->pos().y() + mItem->rect().height() / 2.0 ) );
317+
mXLineEdit->setText( QString::number( pos.x() + mItem->rect().width() ) );
318+
mYLineEdit->setText( QString::number( pos.y() + mItem->rect().height() / 2.0 ) );
315319
}
316320

317321
if ( mItem->lastUsedPositionMode() == QgsComposerItem::LowerLeft )
318322
{
319323
mLowerLeftCheckBox->setChecked( true );
320-
mXLineEdit->setText( QString::number( mItem->pos().x() ) );
321-
mYLineEdit->setText( QString::number( mItem->pos().y() + mItem->rect().height() ) );
324+
mXLineEdit->setText( QString::number( pos.x() ) );
325+
mYLineEdit->setText( QString::number( pos.y() + mItem->rect().height() ) );
322326
}
323327

324328
if ( mItem->lastUsedPositionMode() == QgsComposerItem::LowerMiddle )
325329
{
326330
mLowerMiddleCheckBox->setChecked( true );
327-
mXLineEdit->setText( QString::number( mItem->pos().x() + mItem->rect().width() / 2.0 ) );
328-
mYLineEdit->setText( QString::number( mItem->pos().y() + mItem->rect().height() ) );
331+
mXLineEdit->setText( QString::number( pos.x() + mItem->rect().width() / 2.0 ) );
332+
mYLineEdit->setText( QString::number( pos.y() + mItem->rect().height() ) );
329333
}
330334

331335
if ( mItem->lastUsedPositionMode() == QgsComposerItem::LowerRight )
332336
{
333337
mLowerRightCheckBox->setChecked( true );
334-
mXLineEdit->setText( QString::number( mItem->pos().x() + mItem->rect().width() ) );
335-
mYLineEdit->setText( QString::number( mItem->pos().y() + mItem->rect().height() ) );
338+
mXLineEdit->setText( QString::number( pos.x() + mItem->rect().width() ) );
339+
mYLineEdit->setText( QString::number( pos.y() + mItem->rect().height() ) );
336340
}
337341

338342
mWidthLineEdit->setText( QString::number( mItem->rect().width() ) );
339343
mHeightLineEdit->setText( QString::number( mItem->rect().height() ) );
344+
mPageSpinBox->setValue( mItem->page() );
340345

341346

342347
mXLineEdit->blockSignals( false );
@@ -352,6 +357,7 @@ void QgsComposerItemWidget::setValuesForGuiPositionElements()
352357
mLowerLeftCheckBox->blockSignals( false );
353358
mLowerMiddleCheckBox->blockSignals( false );
354359
mLowerRightCheckBox->blockSignals( false );
360+
mPageSpinBox->blockSignals( false );
355361
}
356362

357363
void QgsComposerItemWidget::setValuesForGuiNonPositionElements()

src/app/composer/qgscomposeritemwidget.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class QgsComposerItemWidget: public QWidget, private Ui::QgsComposerItemWidgetBa
6060
void on_mItemIdLineEdit_editingFinished();
6161

6262
//adjust coordinates in line edits
63+
void on_mPageSpinBox_valueChanged( int ) { changeItemPosition(); }
6364
void on_mXLineEdit_editingFinished() { changeItemPosition(); }
6465
void on_mYLineEdit_editingFinished() { changeItemPosition(); }
6566
void on_mWidthLineEdit_editingFinished() { changeItemPosition(); }

src/core/composer/qgscomposeritem.cpp

+56-5
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,12 @@ bool QgsComposerItem::_writeXML( QDomElement& itemElem, QDomDocument& doc ) cons
172172
}
173173

174174
//scene rect
175+
QPointF pagepos = pagePos();
175176
composerItemElem.setAttribute( "x", QString::number( pos().x() ) );
176177
composerItemElem.setAttribute( "y", QString::number( pos().y() ) );
178+
composerItemElem.setAttribute( "page", page() );
179+
composerItemElem.setAttribute( "pagex", QString::number( pagepos.x() ) );
180+
composerItemElem.setAttribute( "pagey", QString::number( pagepos.y() ) );
177181
composerItemElem.setAttribute( "width", QString::number( rect().width() ) );
178182
composerItemElem.setAttribute( "height", QString::number( rect().height() ) );
179183
composerItemElem.setAttribute( "positionMode", QString::number(( int ) mLastUsedPositionMode ) );
@@ -280,18 +284,29 @@ bool QgsComposerItem::_readXML( const QDomElement& itemElem, const QDomDocument&
280284
}
281285

282286
//position
283-
double x, y, width, height;
284-
bool xOk, yOk, widthOk, heightOk, positionModeOK;
287+
int page;
288+
double x, y, pagex, pagey, width, height;
289+
bool xOk, yOk, pageOk, pagexOk, pageyOk, widthOk, heightOk, positionModeOK;
285290

286291
x = itemElem.attribute( "x" ).toDouble( &xOk );
287292
y = itemElem.attribute( "y" ).toDouble( &yOk );
293+
page = itemElem.attribute( "page" ).toInt( &pageOk );
294+
pagex = itemElem.attribute( "pagex" ).toDouble( &pagexOk );
295+
pagey = itemElem.attribute( "pagey" ).toDouble( &pageyOk );
288296
width = itemElem.attribute( "width" ).toDouble( &widthOk );
289297
height = itemElem.attribute( "height" ).toDouble( &heightOk );
290298
mLastUsedPositionMode = ( ItemPositionMode )itemElem.attribute( "positionMode" ).toInt( &positionModeOK );
291299
if ( !positionModeOK )
292300
{
293301
mLastUsedPositionMode = UpperLeft;
294302
}
303+
if ( pageOk && pagexOk && pageyOk )
304+
{
305+
xOk = true;
306+
yOk = true;
307+
x = pagex;
308+
y = ( page - 1 ) * ( mComposition->paperHeight() + composition()->spaceBetweenPages() ) + pagey;
309+
}
295310

296311
if ( !xOk || !yOk || !widthOk || !heightOk )
297312
{
@@ -481,18 +496,54 @@ void QgsComposerItem::move( double dx, double dy )
481496
setSceneRect( newSceneRect );
482497
}
483498

484-
void QgsComposerItem::setItemPosition( double x, double y, ItemPositionMode itemPoint )
499+
int QgsComposerItem::page() const
500+
{
501+
double y = pos().y();
502+
double h = composition()->paperHeight() + composition()->spaceBetweenPages();
503+
int page = 1;
504+
while ( y - h >= 0. )
505+
{
506+
y -= h;
507+
++page;
508+
}
509+
return page;
510+
}
511+
512+
QPointF QgsComposerItem::pagePos() const
513+
{
514+
QPointF p = pos();
515+
double h = composition()->paperHeight() + composition()->spaceBetweenPages();
516+
p.ry() -= ( page() - 1 ) * h;
517+
return p;
518+
}
519+
520+
void QgsComposerItem::updatePagePos( double newPageWidth, double newPageHeight )
521+
{
522+
Q_UNUSED( newPageWidth )
523+
QPointF curPagePos = pagePos();
524+
int curPage = page() - 1;
525+
setY( curPage * ( newPageHeight + composition()->spaceBetweenPages() ) + curPagePos.y() );
526+
emit sizeChanged();
527+
}
528+
529+
void QgsComposerItem::setItemPosition( double x, double y, ItemPositionMode itemPoint, int page )
485530
{
486531
double width = rect().width();
487532
double height = rect().height();
488-
setItemPosition( x, y, width, height, itemPoint );
533+
setItemPosition( x, y, width, height, itemPoint, false, page );
489534
}
490535

491-
void QgsComposerItem::setItemPosition( double x, double y, double width, double height, ItemPositionMode itemPoint, bool posIncludesFrame )
536+
void QgsComposerItem::setItemPosition( double x, double y, double width, double height, ItemPositionMode itemPoint, bool posIncludesFrame, int page )
492537
{
493538
double upperLeftX = x;
494539
double upperLeftY = y;
495540

541+
if ( page > 0 )
542+
{
543+
double h = composition()->paperHeight() + composition()->spaceBetweenPages();
544+
upperLeftY += ( page - 1 ) * h;
545+
}
546+
496547
//store the item position mode
497548
mLastUsedPositionMode = itemPoint;
498549

src/core/composer/qgscomposeritem.h

+12-3
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,17 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
133133
@param y y-position of mouse cursor (in item coordinates)*/
134134
virtual void zoomContent( int delta, double x, double y ) { Q_UNUSED( delta ); Q_UNUSED( x ); Q_UNUSED( y ); }
135135

136+
/** gets the page the item is currently on */
137+
int page() const;
138+
139+
/** Returns the position relative to the current page */
140+
QPointF pagePos() const;
141+
142+
/** Updates the page relative position for the new paper size */
143+
void updatePagePos( double newPageWidth, double newPageHeight );
144+
136145
/**Moves the item to a new position (in canvas coordinates)*/
137-
void setItemPosition( double x, double y, ItemPositionMode itemPoint = UpperLeft );
146+
void setItemPosition( double x, double y, ItemPositionMode itemPoint = UpperLeft, int page = -1 );
138147

139148
/**Sets item position and width / height in one go
140149
@param x item position x
@@ -143,9 +152,9 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
143152
@param height item height
144153
@param itemPoint item position mode
145154
@param posIncludesFrame set to true if the position and size arguments include the item's frame border
146-
155+
@param page if page > 0, y is interpreted as relative to the origin of the specified page, if page <= 0, y is in absolute canvas coordinates
147156
@note: this method was added in version 1.6*/
148-
void setItemPosition( double x, double y, double width, double height, ItemPositionMode itemPoint = UpperLeft, bool posIncludesFrame = false );
157+
void setItemPosition( double x, double y, double width, double height, ItemPositionMode itemPoint = UpperLeft, bool posIncludesFrame = false, int page = -1 );
149158

150159
/**Returns item's last used position mode.
151160
@note: This property has no effect on actual's item position, which is always the top-left corner.

src/core/composer/qgscomposition.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,17 @@ QRectF QgsComposition::compositionBounds() const
220220

221221
void QgsComposition::setPaperSize( double width, double height )
222222
{
223+
QList<QGraphicsItem *> itemList = items();
224+
QList<QGraphicsItem *>::iterator itemIt = itemList.begin();
225+
for ( ; itemIt != itemList.end(); ++itemIt )
226+
{
227+
QgsComposerItem* composerItem = dynamic_cast<QgsComposerItem *>( *itemIt );
228+
if ( composerItem )
229+
{
230+
composerItem->updatePagePos( width, height );
231+
}
232+
}
233+
223234
mPageWidth = width;
224235
mPageHeight = height;
225236
double currentY = 0;

src/ui/qgscomposeritemwidgetbase.ui

+31-17
Original file line numberDiff line numberDiff line change
@@ -179,45 +179,59 @@
179179
</item>
180180
<item row="0" column="0" rowspan="2">
181181
<layout class="QGridLayout" name="gridLayout_3">
182-
<item row="0" column="0">
183-
<widget class="QLabel" name="mXLabel">
184-
<property name="text">
185-
<string>X</string>
186-
</property>
187-
</widget>
182+
<item row="4" column="1">
183+
<widget class="QLineEdit" name="mHeightLineEdit"/>
188184
</item>
189-
<item row="0" column="1">
185+
<item row="1" column="1">
190186
<widget class="QLineEdit" name="mXLineEdit"/>
191187
</item>
192-
<item row="1" column="0">
188+
<item row="3" column="1">
189+
<widget class="QLineEdit" name="mWidthLineEdit"/>
190+
</item>
191+
<item row="2" column="0">
193192
<widget class="QLabel" name="mYLabel">
194193
<property name="text">
195194
<string>Y</string>
196195
</property>
197196
</widget>
198197
</item>
199-
<item row="1" column="1">
200-
<widget class="QLineEdit" name="mYLineEdit"/>
201-
</item>
202-
<item row="2" column="0">
198+
<item row="3" column="0">
203199
<widget class="QLabel" name="mWidthLabel">
204200
<property name="text">
205201
<string>Width</string>
206202
</property>
207203
</widget>
208204
</item>
209-
<item row="2" column="1">
210-
<widget class="QLineEdit" name="mWidthLineEdit"/>
205+
<item row="1" column="0">
206+
<widget class="QLabel" name="mXLabel">
207+
<property name="text">
208+
<string>X</string>
209+
</property>
210+
</widget>
211211
</item>
212-
<item row="3" column="0">
212+
<item row="4" column="0">
213213
<widget class="QLabel" name="mHeightLabel">
214214
<property name="text">
215215
<string>Height</string>
216216
</property>
217217
</widget>
218218
</item>
219-
<item row="3" column="1">
220-
<widget class="QLineEdit" name="mHeightLineEdit"/>
219+
<item row="2" column="1">
220+
<widget class="QLineEdit" name="mYLineEdit"/>
221+
</item>
222+
<item row="0" column="0">
223+
<widget class="QLabel" name="mPageLabel">
224+
<property name="text">
225+
<string>Page</string>
226+
</property>
227+
</widget>
228+
</item>
229+
<item row="0" column="1">
230+
<widget class="QSpinBox" name="mPageSpinBox">
231+
<property name="minimum">
232+
<number>1</number>
233+
</property>
234+
</widget>
221235
</item>
222236
</layout>
223237
</item>

0 commit comments

Comments
 (0)