QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgslayoutview.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutview.h
3  ---------------
4  Date : July 2017
5  Copyright : (C) 2017 Nyall Dawson
6  Email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 #ifndef QGSLAYOUTVIEW_H
18 #define QGSLAYOUTVIEW_H
19 
20 #include "qgis_sip.h"
21 #include "qgsprevieweffect.h" // for QgsPreviewEffect::PreviewMode
22 #include "qgis_gui.h"
23 #include "qgslayoutitempage.h"
24 #include "qgslayoutaligner.h"
25 #include <QPointer>
26 #include <QGraphicsView>
27 #include <QGraphicsRectItem>
28 #include <memory>
29 
30 class QMenu;
31 class QgsLayout;
32 class QgsLayoutViewTool;
36 class QgsLayoutRuler;
38 class QgsLayoutViewSnapMarker;
39 class QgsLayoutReportSectionLabel;
40 
49 class GUI_EXPORT QgsLayoutView: public QGraphicsView
50 {
51 
52 #ifdef SIP_RUN
54  if ( qobject_cast<QgsLayoutView *>( sipCpp ) )
55  sipType = sipType_QgsLayoutView;
56  else
57  sipType = NULL;
58  SIP_END
59 #endif
60 
61  Q_OBJECT
62 
63  Q_PROPERTY( QgsLayout *currentLayout READ currentLayout WRITE setCurrentLayout NOTIFY layoutSet )
64  Q_PROPERTY( QgsLayoutViewTool *tool READ tool WRITE setTool NOTIFY toolSet )
65 
66  public:
67 
70  {
73  };
74 
76  enum PasteMode
77  {
81  };
82 
86  QgsLayoutView( QWidget *parent SIP_TRANSFERTHIS = nullptr );
87 
88  ~QgsLayoutView() override;
89 
96 
102  SIP_SKIP const QgsLayout *currentLayout() const;
103 
109  void setCurrentLayout( QgsLayout *layout SIP_KEEPREFERENCE );
110 
116 
122  void setTool( QgsLayoutViewTool *tool );
123 
131  void unsetTool( QgsLayoutViewTool *tool );
132 
138  void setPreviewModeEnabled( bool enabled );
139 
144  bool previewModeEnabled() const;
145 
152  void setPreviewMode( QgsPreviewEffect::PreviewMode mode );
153 
160  QgsPreviewEffect::PreviewMode previewMode() const;
161 
166  void scaleSafe( double scale );
167 
171  void setZoomLevel( double level );
172 
177  void setHorizontalRuler( QgsLayoutRuler *ruler );
178 
183  void setVerticalRuler( QgsLayoutRuler *ruler );
184 
189  void setMenuProvider( QgsLayoutViewMenuProvider *provider SIP_TRANSFER );
190 
195  QgsLayoutViewMenuProvider *menuProvider() const;
196 
203  int currentPage() const { return mCurrentPage; }
204 
209  QList< QgsLayoutItemPage * > visiblePages() const;
210 
215  QList< int > visiblePageNumbers() const;
216 
222  void alignSelectedItems( QgsLayoutAligner::Alignment alignment );
223 
229  void distributeSelectedItems( QgsLayoutAligner::Distribution distribution );
230 
236  void resizeSelectedItems( QgsLayoutAligner::Resize resize );
237 
243  void copySelectedItems( ClipboardOperation operation );
244 
250  void copyItems( const QList< QgsLayoutItem * > &items, ClipboardOperation operation );
251 
260  QList< QgsLayoutItem * > pasteItems( PasteMode mode );
261 
271  QList< QgsLayoutItem * > pasteItems( QPointF layoutPoint );
272 
277  bool hasItemsInClipboard() const;
278 
283  QPointF deltaForKeyEvent( QKeyEvent *event );
284 
290  void setPaintingEnabled( bool enabled ); SIP_SKIP
291 
296  void setSectionLabel( const QString &label );
297 
298  public slots:
299 
306  void zoomFull();
307 
314  void zoomWidth();
315 
322  void zoomIn();
323 
330  void zoomOut();
331 
338  void zoomActual();
339 
345  // NOTE - I realize these emitXXX methods are gross, but there's no clean
346  // alternative here. We can't override the non-virtual Qt QGraphicsView
347  // methods, and adding our own renamed methods which call the base class
348  // methods also adds noise to the API.
349  void emitZoomLevelChanged();
350 
351  // Why are these select methods in the view and not in the scene (QgsLayout)?
352  // Well, in my opinion selections are purely a GUI concept. Ideally
353  // NONE of the selection handling would be done in core, but we're restrained
354  // by the QGraphicsScene API here.
355 
363  void selectAll();
364 
370  void deselectAll();
371 
378  void invertSelection();
379 
386  void selectNextItemAbove();
387 
394  void selectNextItemBelow();
395 
402  void raiseSelectedItems();
403 
410  void lowerSelectedItems();
411 
418  void moveSelectedItemsToTop();
419 
426  void moveSelectedItemsToBottom();
427 
433  void lockSelectedItems();
434 
439  void unlockAllItems();
440 
445  void deleteSelectedItems();
446 
451  void deleteItems( const QList< QgsLayoutItem * > &items );
452 
457  void groupSelectedItems();
458 
463  void ungroupSelectedItems();
464 
471  void viewChanged();
472 
479  void pushStatusMessage( const QString &message );
480 
481  signals:
482 
488  void layoutSet( QgsLayout *layout );
489 
494  void toolSet( QgsLayoutViewTool *tool );
495 
500 
506  void cursorPosChanged( QPointF layoutPoint );
507 
514  void pageChanged( int page );
515 
521  void statusMessage( const QString &message );
522 
527  void itemFocused( QgsLayoutItem *item );
528 
534 
535  protected:
536  void mousePressEvent( QMouseEvent *event ) override;
537  void mouseReleaseEvent( QMouseEvent *event ) override;
538  void mouseMoveEvent( QMouseEvent *event ) override;
539  void mouseDoubleClickEvent( QMouseEvent *event ) override;
540  void wheelEvent( QWheelEvent *event ) override;
541  void keyPressEvent( QKeyEvent *event ) override;
542  void keyReleaseEvent( QKeyEvent *event ) override;
543  void resizeEvent( QResizeEvent *event ) override;
544  void scrollContentsBy( int dx, int dy ) override;
545  void dragEnterEvent( QDragEnterEvent *e ) override;
546  void paintEvent( QPaintEvent *event ) override;
547 
548  private slots:
549 
550  void invalidateCachedRenders();
551 
552  private:
553 
555  void wheelZoom( QWheelEvent *event );
556 
557  QPointer< QgsLayoutViewTool > mTool;
558 
559  QgsLayoutViewToolTemporaryKeyPan *mSpacePanTool = nullptr;
560  QgsLayoutViewToolTemporaryMousePan *mMidMouseButtonPanTool = nullptr;
561  QgsLayoutViewToolTemporaryKeyZoom *mSpaceZoomTool = nullptr;
562 
563  QPoint mMouseCurrentXY;
564 
565  QgsLayoutRuler *mHorizontalRuler = nullptr;
566  QgsLayoutRuler *mVerticalRuler = nullptr;
567  std::unique_ptr< QgsLayoutViewMenuProvider > mMenuProvider;
568 
569  QgsLayoutViewSnapMarker *mSnapMarker = nullptr;
570  QgsLayoutReportSectionLabel *mSectionLabel = nullptr;
571 
572  QGraphicsLineItem *mHorizontalSnapLine = nullptr;
573  QGraphicsLineItem *mVerticalSnapLine = nullptr;
574 
575  int mCurrentPage = 0;
576 
577  QgsPreviewEffect *mPreviewEffect = nullptr;
578 
579  bool mPaintingEnabled = true;
580 
581  friend class TestQgsLayoutView;
582  friend class QgsLayoutMouseHandles;
583 
584  QGraphicsLineItem *createSnapLine() const;
585 };
586 
587 
600 {
601  public:
602  virtual ~QgsLayoutViewMenuProvider() = default;
603 
605  virtual QMenu *createContextMenu( QWidget *parent SIP_TRANSFER, QgsLayout *layout, QPointF layoutPoint ) const = 0 SIP_FACTORY;
606 };
607 
608 
609 #ifndef SIP_RUN
610 
612 
617 class GUI_EXPORT QgsLayoutViewSnapMarker : public QGraphicsRectItem
618 {
619  public:
620 
621  QgsLayoutViewSnapMarker();
622 
623  void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr ) override;
624 
625  private:
626 
627  int mSize = 0;
628 
629 };
630 
632 #endif
633 
634 #endif // QGSLAYOUTVIEW_H
QgsLayoutViewToolTemporaryKeyZoom
Layout view tool for temporarily zooming a layout while a key is depressed.
Definition: qgslayoutviewtooltemporarykeyzoom.h:31
QgsLayoutView::cursorPosChanged
void cursorPosChanged(QPointF layoutPoint)
Emitted when the mouse cursor coordinates change within the view.
QgsLayoutViewToolTemporaryKeyPan
Layout view tool for temporarily panning a layout while a key is depressed.
Definition: qgslayoutviewtooltemporarykeypan.h:29
QgsLayoutView::tool
QgsLayoutViewTool * tool()
Returns the currently active tool for the view.
QgsLayoutView::PasteMode
PasteMode
Paste modes.
Definition: qgslayoutview.h:77
QgsLayoutView::PasteModeCenter
@ PasteModeCenter
Paste items in center of view.
Definition: qgslayoutview.h:79
QgsLayoutView::ClipboardOperation
ClipboardOperation
Clipboard operations.
Definition: qgslayoutview.h:70
QgsLayoutView::currentLayout
QgsLayout * currentLayout()
Returns the current layout associated with the view.
QgsLayoutView::ClipboardCopy
@ ClipboardCopy
Copy items.
Definition: qgslayoutview.h:72
SIP_KEEPREFERENCE
#define SIP_KEEPREFERENCE
Definition: qgis_sip.h:86
QgsLayoutViewToolTemporaryMousePan
Layout view tool for temporarily panning a layout while a mouse button is depressed.
Definition: qgslayoutviewtooltemporarymousepan.h:29
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
SIP_CONVERT_TO_SUBCLASS_CODE
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:177
QgsPreviewEffect::PreviewMode
PreviewMode
Definition: qgsprevieweffect.h:37
SIP_SKIP
#define SIP_SKIP
Definition: qgis_sip.h:126
QgsLayoutRuler
A custom ruler widget for use with QgsLayoutView, displaying the current zoom and position of the vis...
Definition: qgslayoutruler.h:39
QgsLayoutView::toolSet
void toolSet(QgsLayoutViewTool *tool)
Emitted when the current tool is changed.
qgis_sip.h
SIP_TRANSFER
#define SIP_TRANSFER
Definition: qgis_sip.h:36
QgsLayoutViewMenuProvider
Interface for a QgsLayoutView context menu.
Definition: qgslayoutview.h:600
QgsLayoutItem
Base class for graphical items within a QgsLayout.
Definition: qgslayoutitem.h:113
QgsLayoutView::PasteModeInPlace
@ PasteModeInPlace
Paste items in place.
Definition: qgslayoutview.h:80
QgsLayoutAligner::Alignment
Alignment
Alignment options.
Definition: qgslayoutaligner.h:43
QgsLayoutAligner::Distribution
Distribution
Distribution options.
Definition: qgslayoutaligner.h:54
qgslayoutitempage.h
QgsLayoutView::ClipboardCut
@ ClipboardCut
Cut items.
Definition: qgslayoutview.h:71
QgsLayoutView::itemFocused
void itemFocused(QgsLayoutItem *item)
Emitted when an item is "focused" in the view, i.e.
QgsLayoutView::currentPage
int currentPage() const
Returns the page visible in the view.
Definition: qgslayoutview.h:203
QgsLayoutAligner::Resize
Resize
Resize options.
Definition: qgslayoutaligner.h:67
QgsLayoutView::willBeDeleted
void willBeDeleted()
Emitted in the destructor when the view is about to be deleted, but is still in a perfectly valid sta...
QgsLayoutViewMenuProvider::createContextMenu
virtual QMenu * createContextMenu(QWidget *parent, QgsLayout *layout, QPointF layoutPoint) const =0
Returns a newly created menu instance (or nullptr on error)
QgsLayout
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:50
QgsLayoutView::zoomLevelChanged
void zoomLevelChanged()
Emitted whenever the zoom level of the view is changed.
QgsLayoutViewTool
Abstract base class for all layout view tools.
Definition: qgslayoutviewtool.h:47
qgsprevieweffect.h
QgsLayoutView
A graphical widget to display and interact with QgsLayouts.
Definition: qgslayoutview.h:50
QgsPreviewEffect
A graphics effect which can be applied to a widget to simulate various printing and color blindness m...
Definition: qgsprevieweffect.h:32
qgslayoutaligner.h
QgsLayoutViewMenuProvider::~QgsLayoutViewMenuProvider
virtual ~QgsLayoutViewMenuProvider()=default
SIP_END
#define SIP_END
Definition: qgis_sip.h:194
SIP_TRANSFERTHIS
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
QgsLayoutView::PasteModeCursor
@ PasteModeCursor
Paste items at cursor position.
Definition: qgslayoutview.h:78
QgsLayoutView::layoutSet
void layoutSet(QgsLayout *layout)
Emitted when a layout is set for the view.
QgsLayoutView::pageChanged
void pageChanged(int page)
Emitted when the page visible in the view is changed.
QgsLayoutView::statusMessage
void statusMessage(const QString &message)
Emitted when the view has a message for display in a parent window's status bar.