QGIS API Documentation  3.21.0-Master (5b68dc587e)
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 "qgslayoutviewtool.h"
26 #include <QPointer>
27 #include <QGraphicsView>
28 #include <QGraphicsRectItem>
29 #include <memory>
30 
31 class QMenu;
32 class QgsLayout;
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  void showEvent( QShowEvent *event ) override;
548 
549  private slots:
550 
551  void invalidateCachedRenders();
552  void updateDevicePixelFromScreen();
553 
554  private:
555 
557  void wheelZoom( QWheelEvent *event );
558 
559  QPointer< QgsLayoutViewTool > mTool;
560 
561  QgsLayoutViewToolTemporaryKeyPan *mSpacePanTool = nullptr;
562  QgsLayoutViewToolTemporaryMousePan *mMidMouseButtonPanTool = nullptr;
563  QgsLayoutViewToolTemporaryKeyZoom *mSpaceZoomTool = nullptr;
564 
565  QPoint mMouseCurrentXY;
566 
567  QgsLayoutRuler *mHorizontalRuler = nullptr;
568  QgsLayoutRuler *mVerticalRuler = nullptr;
569  std::unique_ptr< QgsLayoutViewMenuProvider > mMenuProvider;
570 
571  QgsLayoutViewSnapMarker *mSnapMarker = nullptr;
572  QgsLayoutReportSectionLabel *mSectionLabel = nullptr;
573 
574  QGraphicsLineItem *mHorizontalSnapLine = nullptr;
575  QGraphicsLineItem *mVerticalSnapLine = nullptr;
576 
577  int mCurrentPage = 0;
578 
579  QgsPreviewEffect *mPreviewEffect = nullptr;
580 
581  bool mPaintingEnabled = true;
582 
583  double mScreenDpi = 96.0;
584  QMetaObject::Connection mScreenDpiChangedConnection;
585 
586  friend class TestQgsLayoutView;
587  friend class QgsLayoutMouseHandles;
588 
589  QGraphicsLineItem *createSnapLine() const;
590 };
591 
592 
605 {
606  public:
607  virtual ~QgsLayoutViewMenuProvider() = default;
608 
610  virtual QMenu *createContextMenu( QWidget *parent SIP_TRANSFER, QgsLayout *layout, QPointF layoutPoint ) const = 0 SIP_FACTORY;
611 };
612 
613 
614 #ifndef SIP_RUN
616 
617 
622 class GUI_EXPORT QgsLayoutViewSnapMarker : public QGraphicsRectItem
623 {
624  public:
625 
626  QgsLayoutViewSnapMarker();
627 
628  void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr ) override;
629 
630  private:
631 
632  int mSize = 0;
633 
634 };
635 
637 #endif
638 
639 #endif // QGSLAYOUTVIEW_H
Alignment
Alignment options.
Resize
Resize options.
Distribution
Distribution options.
Base class for graphical items within a QgsLayout.
A custom ruler widget for use with QgsLayoutView, displaying the current zoom and position of the vis...
Interface for a QgsLayoutView context menu.
virtual ~QgsLayoutViewMenuProvider()=default
virtual QMenu * createContextMenu(QWidget *parent, QgsLayout *layout, QPointF layoutPoint) const =0
Returns a newly created menu instance (or nullptr on error)
Layout view tool for temporarily panning a layout while a key is depressed.
Layout view tool for temporarily zooming a layout while a key is depressed.
Layout view tool for temporarily panning a layout while a mouse button is depressed.
Abstract base class for all layout view tools.
A graphical widget to display and interact with QgsLayouts.
Definition: qgslayoutview.h:50
void cursorPosChanged(QPointF layoutPoint)
Emitted when the mouse cursor coordinates change within the view.
PasteMode
Paste modes.
Definition: qgslayoutview.h:77
@ PasteModeCenter
Paste items in center of view.
Definition: qgslayoutview.h:79
@ PasteModeInPlace
Paste items in place.
Definition: qgslayoutview.h:80
@ PasteModeCursor
Paste items at cursor position.
Definition: qgslayoutview.h:78
QgsLayout * currentLayout()
Returns the current layout associated with the view.
void zoomLevelChanged()
Emitted whenever the zoom level of the view is changed.
void willBeDeleted()
Emitted in the destructor when the view is about to be deleted, but is still in a perfectly valid sta...
void statusMessage(const QString &message)
Emitted when the view has a message for display in a parent window's status bar.
void itemFocused(QgsLayoutItem *item)
Emitted when an item is "focused" in the view, i.e.
void layoutSet(QgsLayout *layout)
Emitted when a layout is set for the view.
int currentPage() const
Returns the page visible in the view.
ClipboardOperation
Clipboard operations.
Definition: qgslayoutview.h:70
@ ClipboardCut
Cut items.
Definition: qgslayoutview.h:71
@ ClipboardCopy
Copy items.
Definition: qgslayoutview.h:72
QgsLayoutViewTool * tool()
Returns the currently active tool for the view.
void toolSet(QgsLayoutViewTool *tool)
Emitted when the current tool is changed.
void pageChanged(int page)
Emitted when the page visible in the view is changed.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:51
A graphics effect which can be applied to a widget to simulate various printing and color blindness m...
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:177
#define SIP_KEEPREFERENCE
Definition: qgis_sip.h:86
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_END
Definition: qgis_sip.h:194