Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgslayoutguidecollection.cpp
3 : : ----------------------------
4 : : begin : July 2017
5 : : copyright : (C) 2017 by Nyall Dawson
6 : : email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************/
8 : : /***************************************************************************
9 : : * *
10 : : * This program is free software; you can redistribute it and/or modify *
11 : : * it under the terms of the GNU General Public License as published by *
12 : : * the Free Software Foundation; either version 2 of the License, or *
13 : : * (at your option) any later version. *
14 : : * *
15 : : ***************************************************************************/
16 : :
17 : : #include "qgslayoutguidecollection.h"
18 : : #include "qgslayout.h"
19 : : #include "qgsproject.h"
20 : : #include "qgsreadwritecontext.h"
21 : : #include "qgslayoutpagecollection.h"
22 : : #include "qgslayoutundostack.h"
23 : : #include <QGraphicsLineItem>
24 : :
25 : :
26 : : //
27 : : // QgsLayoutGuide
28 : : //
29 : :
30 : 0 : QgsLayoutGuide::QgsLayoutGuide( Qt::Orientation orientation, QgsLayoutMeasurement position, QgsLayoutItemPage *page )
31 : 0 : : QObject( nullptr )
32 : 0 : , mOrientation( orientation )
33 : 0 : , mPosition( position )
34 : 0 : , mPage( page )
35 : 0 : {}
36 : :
37 : 0 : QgsLayoutGuide::~QgsLayoutGuide()
38 : 0 : {
39 : 0 : if ( mLayout && mLineItem )
40 : : {
41 : 0 : mLayout->removeItem( mLineItem );
42 : 0 : delete mLineItem;
43 : 0 : }
44 : 0 : }
45 : :
46 : 0 : QgsLayoutMeasurement QgsLayoutGuide::position() const
47 : : {
48 : 0 : return mPosition;
49 : : }
50 : :
51 : 0 : void QgsLayoutGuide::setPosition( QgsLayoutMeasurement position )
52 : : {
53 : 0 : mPosition = position;
54 : 0 : update();
55 : 0 : emit positionChanged();
56 : 0 : }
57 : :
58 : 0 : QgsLayoutItemPage *QgsLayoutGuide::page()
59 : : {
60 : 0 : return mPage;
61 : : }
62 : :
63 : 0 : void QgsLayoutGuide::setPage( QgsLayoutItemPage *page )
64 : : {
65 : 0 : mPage = page;
66 : 0 : update();
67 : 0 : }
68 : :
69 : 0 : void QgsLayoutGuide::update()
70 : : {
71 : 0 : if ( !mLayout || !mLineItem )
72 : 0 : return;
73 : :
74 : : // first find matching page
75 : 0 : if ( !mPage )
76 : : {
77 : 0 : mLineItem->hide();
78 : 0 : return;
79 : : }
80 : :
81 : 0 : double layoutPos = mLayout->convertToLayoutUnits( mPosition );
82 : 0 : bool showGuide = mLayout->guides().visible();
83 : 0 : switch ( mOrientation )
84 : : {
85 : : case Qt::Horizontal:
86 : 0 : if ( layoutPos > mPage->rect().height() )
87 : : {
88 : 0 : mLineItem->hide();
89 : 0 : }
90 : : else
91 : : {
92 : 0 : mLineItem->setLine( 0, layoutPos + mPage->y(), mPage->rect().width(), layoutPos + mPage->y() );
93 : 0 : mLineItem->setVisible( showGuide );
94 : : }
95 : :
96 : 0 : break;
97 : :
98 : : case Qt::Vertical:
99 : 0 : if ( layoutPos > mPage->rect().width() )
100 : : {
101 : 0 : mLineItem->hide();
102 : 0 : }
103 : : else
104 : : {
105 : 0 : mLineItem->setLine( layoutPos, mPage->y(), layoutPos, mPage->y() + mPage->rect().height() );
106 : 0 : mLineItem->setVisible( showGuide );
107 : : }
108 : :
109 : 0 : break;
110 : : }
111 : 0 : }
112 : :
113 : 0 : QGraphicsLineItem *QgsLayoutGuide::item()
114 : : {
115 : 0 : return mLineItem;
116 : : }
117 : :
118 : 0 : double QgsLayoutGuide::layoutPosition() const
119 : : {
120 : 0 : if ( !mLineItem )
121 : 0 : return -999;
122 : :
123 : 0 : switch ( mOrientation )
124 : : {
125 : : case Qt::Horizontal:
126 : 0 : return mLineItem->mapToScene( mLineItem->line().p1() ).y();
127 : :
128 : : case Qt::Vertical:
129 : 0 : return mLineItem->mapToScene( mLineItem->line().p1() ).x();
130 : : }
131 : 0 : return -999; // avoid warning
132 : 0 : }
133 : :
134 : 0 : void QgsLayoutGuide::setLayoutPosition( double position )
135 : : {
136 : 0 : if ( !mLayout )
137 : 0 : return;
138 : :
139 : 0 : double p = 0;
140 : 0 : switch ( mOrientation )
141 : : {
142 : : case Qt::Horizontal:
143 : 0 : p = mPage->mapFromScene( QPointF( 0, position ) ).y();
144 : 0 : break;
145 : :
146 : : case Qt::Vertical:
147 : 0 : p = mPage->mapFromScene( QPointF( position, 0 ) ).x();
148 : 0 : break;
149 : : }
150 : 0 : mPosition = mLayout->convertFromLayoutUnits( p, mPosition.units() );
151 : 0 : update();
152 : 0 : emit positionChanged();
153 : 0 : }
154 : :
155 : 0 : QgsLayout *QgsLayoutGuide::layout() const
156 : : {
157 : 0 : return mLayout;
158 : 0 : }
159 : :
160 : 0 : void QgsLayoutGuide::setLayout( QgsLayout *layout )
161 : : {
162 : 0 : mLayout = layout;
163 : :
164 : 0 : if ( !mLineItem )
165 : : {
166 : 0 : mLineItem = new QGraphicsLineItem();
167 : 0 : mLineItem->hide();
168 : 0 : mLineItem->setZValue( QgsLayout::ZGuide );
169 : 0 : QPen linePen( Qt::DotLine );
170 : 0 : linePen.setColor( Qt::red );
171 : : // use a pen width of 0, since this activates a cosmetic pen
172 : : // which doesn't scale with the layout and keeps a constant size
173 : 0 : linePen.setWidthF( 0 );
174 : 0 : mLineItem->setPen( linePen );
175 : 0 : }
176 : :
177 : 0 : mLayout->addItem( mLineItem );
178 : 0 : update();
179 : 0 : }
180 : :
181 : 0 : Qt::Orientation QgsLayoutGuide::orientation() const
182 : : {
183 : 0 : return mOrientation;
184 : : }
185 : :
186 : :
187 : :
188 : : //
189 : : // QgsLayoutGuideCollection
190 : : //
191 : :
192 : 0 : QgsLayoutGuideCollection::QgsLayoutGuideCollection( QgsLayout *layout, QgsLayoutPageCollection *pageCollection )
193 : 0 : : QAbstractTableModel( layout )
194 : 0 : , mLayout( layout )
195 : 0 : , mPageCollection( pageCollection )
196 : 0 : {
197 : 0 : QFont f;
198 : 0 : mHeaderSize = QFontMetrics( f ).boundingRect( QStringLiteral( "XX" ) ).width();
199 : :
200 : 0 : connect( mPageCollection, &QgsLayoutPageCollection::pageAboutToBeRemoved, this, &QgsLayoutGuideCollection::pageAboutToBeRemoved );
201 : 0 : }
202 : :
203 : 0 : QgsLayoutGuideCollection::~QgsLayoutGuideCollection()
204 : 0 : {
205 : 0 : qDeleteAll( mGuides );
206 : 0 : }
207 : :
208 : 0 : QgsLayout *QgsLayoutGuideCollection::layout()
209 : : {
210 : 0 : return mLayout;
211 : : }
212 : :
213 : 0 : int QgsLayoutGuideCollection::rowCount( const QModelIndex & ) const
214 : : {
215 : 0 : return mGuides.count();
216 : : }
217 : :
218 : 0 : int QgsLayoutGuideCollection::columnCount( const QModelIndex &parent ) const
219 : : {
220 : 0 : if ( parent.isValid() )
221 : 0 : return 0;
222 : :
223 : 0 : return 2;
224 : 0 : }
225 : :
226 : 0 : QVariant QgsLayoutGuideCollection::data( const QModelIndex &index, int role ) const
227 : : {
228 : 0 : if ( !index.isValid() )
229 : 0 : return QVariant();
230 : :
231 : 0 : if ( index.row() >= mGuides.count() || index.row() < 0 )
232 : 0 : return QVariant();
233 : :
234 : 0 : QgsLayoutGuide *guide = mGuides.at( index.row() );
235 : 0 : switch ( role )
236 : : {
237 : : case Qt::DisplayRole:
238 : : case Qt::EditRole:
239 : : {
240 : 0 : if ( index.column() == 0 )
241 : 0 : return guide->position().length();
242 : : else
243 : 0 : return QgsUnitTypes::toAbbreviatedString( guide->position().units() );
244 : : }
245 : :
246 : : case OrientationRole:
247 : 0 : return guide->orientation();
248 : :
249 : : case PositionRole:
250 : 0 : return guide->position().length();
251 : :
252 : : case UnitsRole:
253 : 0 : return guide->position().units();
254 : :
255 : : case PageRole:
256 : 0 : return mPageCollection->pageNumber( guide->page() );
257 : :
258 : : case LayoutPositionRole:
259 : 0 : return guide->layoutPosition();
260 : :
261 : : default:
262 : 0 : return QVariant();
263 : : }
264 : 0 : }
265 : :
266 : 0 : bool QgsLayoutGuideCollection::setData( const QModelIndex &index, const QVariant &value, int role )
267 : : {
268 : 0 : if ( !index.isValid() )
269 : 0 : return false;
270 : :
271 : 0 : if ( index.row() >= mGuides.count() || index.row() < 0 )
272 : 0 : return false;
273 : :
274 : 0 : QgsLayoutGuide *guide = mGuides.at( index.row() );
275 : :
276 : 0 : switch ( role )
277 : : {
278 : : case Qt::EditRole:
279 : : {
280 : 0 : bool ok = false;
281 : 0 : double newPos = value.toDouble( &ok );
282 : 0 : if ( !ok )
283 : 0 : return false;
284 : :
285 : 0 : QgsLayoutMeasurement m = guide->position();
286 : 0 : m.setLength( newPos );
287 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Move Guide" ), Move + index.row() );
288 : 0 : whileBlocking( guide )->setPosition( m );
289 : 0 : guide->update();
290 : 0 : mLayout->undoStack()->endCommand();
291 : 0 : emit dataChanged( index, index, QVector<int>() << role );
292 : 0 : return true;
293 : : }
294 : : case PositionRole:
295 : : {
296 : 0 : bool ok = false;
297 : 0 : double newPos = value.toDouble( &ok );
298 : 0 : if ( !ok )
299 : 0 : return false;
300 : 0 :
301 : 0 : QgsLayoutMeasurement m = guide->position();
302 : 0 : if ( qgsDoubleNear( m.length(), newPos ) )
303 : 0 : return true;
304 : :
305 : 0 : m.setLength( newPos );
306 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Move Guide" ), Move + index.row() );
307 : 0 : whileBlocking( guide )->setPosition( m );
308 : 0 : guide->update();
309 : 0 : mLayout->undoStack()->endCommand();
310 : 0 : emit dataChanged( index, index, QVector<int>() << role );
311 : 0 : return true;
312 : : }
313 : :
314 : : case LayoutPositionRole:
315 : : {
316 : 0 : bool ok = false;
317 : 0 : double newPos = value.toDouble( &ok );
318 : 0 : if ( !ok )
319 : 0 : return false;
320 : :
321 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Move Guide" ), Move + index.row() );
322 : 0 : whileBlocking( guide )->setLayoutPosition( newPos );
323 : 0 : mLayout->undoStack()->endCommand();
324 : 0 : emit dataChanged( index, index, QVector<int>() << role );
325 : 0 : return true;
326 : : }
327 : :
328 : : case UnitsRole:
329 : : {
330 : 0 : bool ok = false;
331 : 0 : int units = value.toInt( &ok );
332 : 0 : if ( !ok )
333 : 0 : return false;
334 : :
335 : 0 : QgsLayoutMeasurement m = guide->position();
336 : 0 : m.setUnits( static_cast< QgsUnitTypes::LayoutUnit >( units ) );
337 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Move Guide" ), Move + index.row() );
338 : 0 : whileBlocking( guide )->setPosition( m );
339 : 0 : guide->update();
340 : 0 : mLayout->undoStack()->endCommand();
341 : 0 : emit dataChanged( index, index, QVector<int>() << role );
342 : 0 : return true;
343 : : }
344 : : }
345 : :
346 : 0 : return false;
347 : 0 : }
348 : :
349 : 0 : Qt::ItemFlags QgsLayoutGuideCollection::flags( const QModelIndex &index ) const
350 : : {
351 : 0 : if ( !index.isValid() )
352 : 0 : return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
353 : 0 : return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
354 : 0 : }
355 : :
356 : 0 : QVariant QgsLayoutGuideCollection::headerData( int section, Qt::Orientation orientation, int role ) const
357 : : {
358 : 0 : if ( role == Qt::DisplayRole )
359 : 0 : return QVariant();
360 : 0 : else if ( role == Qt::SizeHintRole )
361 : : {
362 : 0 : return QSize( mHeaderSize, mHeaderSize );
363 : : }
364 : 0 : return QAbstractTableModel::headerData( section, orientation, role );
365 : 0 : }
366 : :
367 : 0 : bool QgsLayoutGuideCollection::removeRows( int row, int count, const QModelIndex &parent )
368 : : {
369 : 0 : if ( parent.isValid() )
370 : 0 : return false;
371 : :
372 : 0 : if ( !mBlockUndoCommands )
373 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Remove Guide(s)" ), Remove + row );
374 : 0 : beginRemoveRows( parent, row, row + count - 1 );
375 : 0 : for ( int i = 0; i < count; ++ i )
376 : : {
377 : 0 : delete mGuides.takeAt( row );
378 : 0 : }
379 : 0 : endRemoveRows();
380 : 0 : if ( !mBlockUndoCommands )
381 : 0 : mLayout->undoStack()->endCommand();
382 : 0 : return true;
383 : 0 : }
384 : :
385 : 0 : void QgsLayoutGuideCollection::addGuide( QgsLayoutGuide *guide )
386 : : {
387 : 0 : guide->setLayout( mLayout );
388 : :
389 : 0 : if ( !mBlockUndoCommands )
390 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Create Guide" ) );
391 : 0 : beginInsertRows( QModelIndex(), mGuides.count(), mGuides.count() );
392 : 0 : mGuides.append( guide );
393 : 0 : endInsertRows();
394 : 0 : if ( !mBlockUndoCommands )
395 : 0 : mLayout->undoStack()->endCommand();
396 : :
397 : 0 : QModelIndex index = createIndex( mGuides.length() - 1, 0 );
398 : 0 : connect( guide, &QgsLayoutGuide::positionChanged, this, [ this, index ]
399 : : {
400 : 0 : emit dataChanged( index, index );
401 : 0 : } );
402 : 0 : }
403 : :
404 : 0 : void QgsLayoutGuideCollection::removeGuide( QgsLayoutGuide *guide )
405 : : {
406 : 0 : int row = mGuides.indexOf( guide );
407 : 0 : if ( row < 0 )
408 : 0 : return;
409 : :
410 : 0 : removeRow( row );
411 : 0 : }
412 : :
413 : 0 : void QgsLayoutGuideCollection::setGuideLayoutPosition( QgsLayoutGuide *guide, double position )
414 : : {
415 : 0 : int row = mGuides.indexOf( guide );
416 : 0 : if ( row < 0 )
417 : 0 : return;
418 : :
419 : 0 : setData( index( row, 0 ), position, LayoutPositionRole );
420 : 0 : }
421 : :
422 : 0 : void QgsLayoutGuideCollection::clear()
423 : : {
424 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Clear Guides" ) );
425 : 0 : beginResetModel();
426 : 0 : qDeleteAll( mGuides );
427 : 0 : mGuides.clear();
428 : 0 : endResetModel();
429 : 0 : mLayout->undoStack()->endCommand();
430 : 0 : }
431 : :
432 : 0 : void QgsLayoutGuideCollection::applyGuidesToAllOtherPages( int sourcePage )
433 : : {
434 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Apply Guides" ) );
435 : 0 : mBlockUndoCommands = true;
436 : 0 : QgsLayoutItemPage *page = mPageCollection->page( sourcePage );
437 : : // remove other page's guides
438 : 0 : const auto constMGuides = mGuides;
439 : 0 : for ( QgsLayoutGuide *guide : constMGuides )
440 : : {
441 : 0 : if ( guide->page() != page )
442 : 0 : removeGuide( guide );
443 : : }
444 : :
445 : : // remaining guides belong to source page - clone them to other pages
446 : 0 : for ( QgsLayoutGuide *guide : std::as_const( mGuides ) )
447 : : {
448 : 0 : for ( int p = 0; p < mPageCollection->pageCount(); ++p )
449 : : {
450 : 0 : if ( p == sourcePage )
451 : 0 : continue;
452 : :
453 : 0 : std::unique_ptr< QgsLayoutGuide> newGuide( new QgsLayoutGuide( guide->orientation(), guide->position(), mPageCollection->page( p ) ) );
454 : 0 : newGuide->setLayout( mLayout );
455 : 0 : if ( newGuide->item()->isVisible() )
456 : : {
457 : : // if invisible, new guide is outside of page bounds
458 : 0 : addGuide( newGuide.release() );
459 : 0 : }
460 : 0 : }
461 : : }
462 : 0 : mLayout->undoStack()->endCommand();
463 : 0 : mBlockUndoCommands = false;
464 : 0 : }
465 : :
466 : 0 : void QgsLayoutGuideCollection::update()
467 : : {
468 : 0 : const auto constMGuides = mGuides;
469 : 0 : for ( QgsLayoutGuide *guide : constMGuides )
470 : : {
471 : 0 : guide->update();
472 : : }
473 : 0 : }
474 : :
475 : 0 : QList<QgsLayoutGuide *> QgsLayoutGuideCollection::guides()
476 : : {
477 : 0 : return mGuides;
478 : : }
479 : :
480 : 0 : QList<QgsLayoutGuide *> QgsLayoutGuideCollection::guides( Qt::Orientation orientation, int page )
481 : : {
482 : 0 : QList<QgsLayoutGuide *> res;
483 : 0 : const auto constMGuides = mGuides;
484 : 0 : for ( QgsLayoutGuide *guide : constMGuides )
485 : : {
486 : 0 : if ( guide->orientation() == orientation && guide->item()->isVisible() &&
487 : 0 : ( page < 0 || mPageCollection->page( page ) == guide->page() ) )
488 : 0 : res << guide;
489 : : }
490 : 0 : return res;
491 : 0 : }
492 : :
493 : 0 : QList<QgsLayoutGuide *> QgsLayoutGuideCollection::guidesOnPage( int page )
494 : : {
495 : 0 : QList<QgsLayoutGuide *> res;
496 : 0 : const auto constMGuides = mGuides;
497 : 0 : for ( QgsLayoutGuide *guide : constMGuides )
498 : : {
499 : 0 : if ( mPageCollection->page( page ) == guide->page() )
500 : 0 : res << guide;
501 : : }
502 : 0 : return res;
503 : 0 : }
504 : :
505 : 0 : bool QgsLayoutGuideCollection::visible() const
506 : : {
507 : 0 : return mGuidesVisible;
508 : : }
509 : :
510 : 0 : void QgsLayoutGuideCollection::setVisible( bool visible )
511 : : {
512 : 0 : mLayout->undoStack()->beginCommand( mPageCollection, tr( "Change Guide Visibility" ) );
513 : 0 : mGuidesVisible = visible;
514 : 0 : mLayout->undoStack()->endCommand();
515 : 0 : update();
516 : 0 : }
517 : :
518 : 0 : void QgsLayoutGuideCollection::pageAboutToBeRemoved( int pageNumber )
519 : : {
520 : 0 : mBlockUndoCommands = true;
521 : 0 : const auto constGuidesOnPage = guidesOnPage( pageNumber );
522 : 0 : for ( QgsLayoutGuide *guide : constGuidesOnPage )
523 : : {
524 : 0 : removeGuide( guide );
525 : : }
526 : 0 : mBlockUndoCommands = false;
527 : 0 : }
528 : :
529 : 0 : bool QgsLayoutGuideCollection::writeXml( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext & ) const
530 : : {
531 : 0 : QDomElement element = document.createElement( QStringLiteral( "GuideCollection" ) );
532 : 0 : element.setAttribute( QStringLiteral( "visible" ), mGuidesVisible );
533 : 0 : const auto constMGuides = mGuides;
534 : 0 : for ( QgsLayoutGuide *guide : constMGuides )
535 : : {
536 : 0 : QDomElement guideElement = document.createElement( QStringLiteral( "Guide" ) );
537 : 0 : guideElement.setAttribute( QStringLiteral( "orientation" ), guide->orientation() );
538 : 0 : guideElement.setAttribute( QStringLiteral( "page" ), mPageCollection->pageNumber( guide->page() ) );
539 : 0 : guideElement.setAttribute( QStringLiteral( "position" ), guide->position().length() );
540 : 0 : guideElement.setAttribute( QStringLiteral( "units" ), QgsUnitTypes::encodeUnit( guide->position().units() ) );
541 : 0 : element.appendChild( guideElement );
542 : 0 : }
543 : :
544 : 0 : parentElement.appendChild( element );
545 : : return true;
546 : 0 : }
547 : :
548 : 0 : bool QgsLayoutGuideCollection::readXml( const QDomElement &e, const QDomDocument &, const QgsReadWriteContext & )
549 : : {
550 : 0 : QDomElement element = e;
551 : 0 : if ( element.nodeName() != QLatin1String( "GuideCollection" ) )
552 : : {
553 : 0 : element = element.firstChildElement( QStringLiteral( "GuideCollection" ) );
554 : 0 : }
555 : :
556 : 0 : if ( element.nodeName() != QLatin1String( "GuideCollection" ) )
557 : : {
558 : 0 : return false;
559 : : }
560 : :
561 : 0 : mBlockUndoCommands = true;
562 : 0 : beginResetModel();
563 : 0 : qDeleteAll( mGuides );
564 : 0 : mGuides.clear();
565 : :
566 : 0 : mGuidesVisible = element.attribute( QStringLiteral( "visible" ), QStringLiteral( "0" ) ) != QLatin1String( "0" );
567 : 0 : QDomNodeList guideNodeList = element.elementsByTagName( QStringLiteral( "Guide" ) );
568 : 0 : for ( int i = 0; i < guideNodeList.size(); ++i )
569 : : {
570 : 0 : QDomElement element = guideNodeList.at( i ).toElement();
571 : 0 : Qt::Orientation orientation = static_cast< Qt::Orientation >( element.attribute( QStringLiteral( "orientation" ), QStringLiteral( "1" ) ).toInt() );
572 : 0 : double pos = element.attribute( QStringLiteral( "position" ), QStringLiteral( "0" ) ).toDouble();
573 : 0 : QgsUnitTypes::LayoutUnit unit = QgsUnitTypes::decodeLayoutUnit( element.attribute( QStringLiteral( "units" ) ) );
574 : 0 : int page = element.attribute( QStringLiteral( "page" ), QStringLiteral( "0" ) ).toInt();
575 : 0 : std::unique_ptr< QgsLayoutGuide > guide( new QgsLayoutGuide( orientation, QgsLayoutMeasurement( pos, unit ), mPageCollection->page( page ) ) );
576 : 0 : guide->update();
577 : 0 : addGuide( guide.release() );
578 : 0 : }
579 : :
580 : 0 : endResetModel();
581 : 0 : mBlockUndoCommands = false;
582 : 0 : return true;
583 : 0 : }
584 : :
585 : : //
586 : : // QgsLayoutGuideProxyModel
587 : : //
588 : :
589 : 0 : QgsLayoutGuideProxyModel::QgsLayoutGuideProxyModel( QObject *parent, Qt::Orientation orientation, int page )
590 : 0 : : QSortFilterProxyModel( parent )
591 : 0 : , mOrientation( orientation )
592 : 0 : , mPage( page )
593 : 0 : {
594 : 0 : setDynamicSortFilter( true );
595 : 0 : sort( 0 );
596 : 0 : }
597 : :
598 : 0 : void QgsLayoutGuideProxyModel::setPage( int page )
599 : : {
600 : 0 : mPage = page;
601 : 0 : invalidateFilter();
602 : 0 : }
603 : :
604 : 0 : bool QgsLayoutGuideProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
605 : : {
606 : 0 : QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
607 : 0 : Qt::Orientation orientation = static_cast< Qt::Orientation>( sourceModel()->data( index, QgsLayoutGuideCollection::OrientationRole ).toInt() );
608 : 0 : if ( orientation != mOrientation )
609 : 0 : return false;
610 : :
611 : 0 : int page = sourceModel()->data( index, QgsLayoutGuideCollection::PageRole ).toInt();
612 : 0 : return page == mPage;
613 : 0 : }
614 : :
615 : 0 : bool QgsLayoutGuideProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
616 : : {
617 : 0 : double leftPos = sourceModel()->data( left, QgsLayoutGuideCollection::LayoutPositionRole ).toDouble();
618 : 0 : double rightPos = sourceModel()->data( right, QgsLayoutGuideCollection::LayoutPositionRole ).toDouble();
619 : 0 : return leftPos < rightPos;
620 : 0 : }
|