1
0
mirror of https://github.com/qgis/QGIS.git synced 2025-04-29 00:03:59 -04:00

Add an interface for creation of QgsLayoutView context menus

Allows display of custom right click menus when right click
events are not handled by the current layout view tool.
This commit is contained in:
Nyall Dawson 2017-07-22 19:04:49 +10:00
parent cbc5782cd8
commit f1dfd3dbe2
3 changed files with 97 additions and 0 deletions

@ -90,6 +90,19 @@ class QgsLayoutView: QGraphicsView
.. seealso:: setHorizontalRuler() .. seealso:: setHorizontalRuler()
%End %End
void setMenuProvider( QgsLayoutViewMenuProvider *provider /Transfer/ );
%Docstring
Sets a ``provider`` for context menus. Ownership of the provider is transferred to the view.
.. seealso:: menuProvider()
%End
QgsLayoutViewMenuProvider *menuProvider() const;
%Docstring
Returns the provider for context menus. Returned value may be None if no provider is set.
.. seealso:: setMenuProvider()
:rtype: QgsLayoutViewMenuProvider
%End
public slots: public slots:
void zoomFull(); void zoomFull();
@ -191,6 +204,33 @@ class QgsLayoutView: QGraphicsView
}; };
class QgsLayoutViewMenuProvider
{
%Docstring
Interface for a QgsLayoutView context menu.
Implementations of this interface can be made to allow QgsLayoutView
instances to provide custom context menus (opened upon right-click).
.. seealso:: QgsLayoutView
.. versionadded:: 3.0
%End
%TypeHeaderCode
#include "qgslayoutview.h"
%End
public:
virtual ~QgsLayoutViewMenuProvider();
virtual QMenu *createContextMenu( QWidget *parent /Transfer/, QgsLayout *layout, QPointF layoutPoint ) const = 0 /Factory/;
%Docstring
Return a newly created menu instance (or null pointer on error)
:rtype: QMenu
%End
};
/************************************************************************ /************************************************************************
* This file has been generated automatically from * * This file has been generated automatically from *
* * * *

@ -28,6 +28,7 @@
#include "qgsapplication.h" #include "qgsapplication.h"
#include <memory> #include <memory>
#include <QDesktopWidget> #include <QDesktopWidget>
#include <QMenu>
#define MIN_VIEW_SCALE 0.05 #define MIN_VIEW_SCALE 0.05
#define MAX_VIEW_SCALE 1000.0 #define MAX_VIEW_SCALE 1000.0
@ -139,6 +140,16 @@ void QgsLayoutView::setVerticalRuler( QgsLayoutRuler *ruler )
updateRulers(); updateRulers();
} }
void QgsLayoutView::setMenuProvider( QgsLayoutViewMenuProvider *provider )
{
mMenuProvider.reset( provider );
}
QgsLayoutViewMenuProvider *QgsLayoutView::menuProvider() const
{
return mMenuProvider.get();
}
void QgsLayoutView::zoomFull() void QgsLayoutView::zoomFull()
{ {
fitInView( scene()->sceneRect(), Qt::KeepAspectRatio ); fitInView( scene()->sceneRect(), Qt::KeepAspectRatio );
@ -205,6 +216,15 @@ void QgsLayoutView::mousePressEvent( QMouseEvent *event )
setTool( mMidMouseButtonPanTool ); setTool( mMidMouseButtonPanTool );
event->accept(); event->accept();
} }
else if ( event->button() == Qt::RightButton && mMenuProvider )
{
QMenu *menu = mMenuProvider->createContextMenu( this, currentLayout(), mapToScene( event->pos() ) );
if ( menu )
{
menu->exec( event->globalPos() );
delete menu;
}
}
else else
{ {
QGraphicsView::mousePressEvent( event ); QGraphicsView::mousePressEvent( event );

@ -22,13 +22,16 @@
#include "qgis_gui.h" #include "qgis_gui.h"
#include <QPointer> #include <QPointer>
#include <QGraphicsView> #include <QGraphicsView>
#include <memory>
class QMenu;
class QgsLayout; class QgsLayout;
class QgsLayoutViewTool; class QgsLayoutViewTool;
class QgsLayoutViewToolTemporaryKeyPan; class QgsLayoutViewToolTemporaryKeyPan;
class QgsLayoutViewToolTemporaryKeyZoom; class QgsLayoutViewToolTemporaryKeyZoom;
class QgsLayoutViewToolTemporaryMousePan; class QgsLayoutViewToolTemporaryMousePan;
class QgsLayoutRuler; class QgsLayoutRuler;
class QgsLayoutViewMenuProvider;
/** /**
* \ingroup gui * \ingroup gui
@ -112,6 +115,18 @@ class GUI_EXPORT QgsLayoutView: public QGraphicsView
*/ */
void setVerticalRuler( QgsLayoutRuler *ruler ); void setVerticalRuler( QgsLayoutRuler *ruler );
/**
* Sets a \a provider for context menus. Ownership of the provider is transferred to the view.
* \see menuProvider()
*/
void setMenuProvider( QgsLayoutViewMenuProvider *provider SIP_TRANSFER );
/**
* Returns the provider for context menus. Returned value may be nullptr if no provider is set.
* \see setMenuProvider()
*/
QgsLayoutViewMenuProvider *menuProvider() const;
public slots: public slots:
/** /**
@ -228,9 +243,31 @@ class GUI_EXPORT QgsLayoutView: public QGraphicsView
QgsLayoutRuler *mHorizontalRuler = nullptr; QgsLayoutRuler *mHorizontalRuler = nullptr;
QgsLayoutRuler *mVerticalRuler = nullptr; QgsLayoutRuler *mVerticalRuler = nullptr;
std::unique_ptr< QgsLayoutViewMenuProvider > mMenuProvider;
friend class TestQgsLayoutView; friend class TestQgsLayoutView;
}; };
/**
* \ingroup gui
*
* Interface for a QgsLayoutView context menu.
*
* Implementations of this interface can be made to allow QgsLayoutView
* instances to provide custom context menus (opened upon right-click).
*
* \see QgsLayoutView
* \since QGIS 3.0
*/
class GUI_EXPORT QgsLayoutViewMenuProvider
{
public:
virtual ~QgsLayoutViewMenuProvider() = default;
//! Return a newly created menu instance (or null pointer on error)
virtual QMenu *createContextMenu( QWidget *parent SIP_TRANSFER, QgsLayout *layout, QPointF layoutPoint ) const = 0 SIP_FACTORY;
};
#endif // QGSLAYOUTVIEW_H #endif // QGSLAYOUTVIEW_H