QGIS API Documentation  3.27.0-Master (e113457133)
qgsidentifymenu.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsidentifymenu.h - menu to be used in identify map tool
3  ---------------------
4  begin : August 2014
5  copyright : (C) 2014 by Denis Rouzaud
6  email : [email protected]
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #ifndef QGSIDENTIFYMENU_H
17 #define QGSIDENTIFYMENU_H
18 
19 #include <QMenu>
20 
22 #include "qgsmaptoolidentify.h"
23 #include "qgsexpressioncontext.h"
24 #include "qgis_gui.h"
25 #include "qgis_sip.h"
26 
27 #ifndef SIP_RUN
29 class CustomActionRegistry : public QgsMapLayerActionRegistry
30 {
31  Q_OBJECT
32 
33  public:
34 
35  CustomActionRegistry() = default;
36  // remove all actions
37  void clear() { mMapLayerActionList.clear(); }
38 };
40 #endif
41 
49 class GUI_EXPORT QgsIdentifyMenu : public QMenu
50 {
51 
52  Q_OBJECT
53 
54  public:
55  enum MenuLevel
56  {
58  FeatureLevel
59  };
60 
61  struct ActionData
62  {
64  ActionData() = default;
65 
66  ActionData( QgsMapLayer *layer, QgsMapLayerAction *mapLayerAction = nullptr )
67  : mIsValid( true )
68  , mAllResults( !layer )
69  , mIsExternalAction( nullptr != mapLayerAction )
70  , mLayer( layer )
71  , mMapLayerAction( mapLayerAction )
72  {}
73 
74  ActionData( QgsMapLayer *layer, QgsFeatureId fid, QgsMapLayerAction *mapLayerAction = nullptr )
75  : mIsValid( true )
76  , mIsExternalAction( nullptr != mapLayerAction )
77  , mLayer( layer )
78  , mFeatureId( fid )
79  , mLevel( FeatureLevel )
80  , mMapLayerAction( mapLayerAction )
81  {}
82 
83  bool mIsValid = false;
84  bool mAllResults = false;
85  bool mIsExternalAction = false;
86  QgsMapLayer *mLayer = nullptr;
87  QgsFeatureId mFeatureId = 0;
88  QgsIdentifyMenu::MenuLevel mLevel = LayerLevel;
89  QgsMapLayerAction *mMapLayerAction = nullptr;
90  };
91 
95  explicit QgsIdentifyMenu( QgsMapCanvas *canvas );
96 
97  ~QgsIdentifyMenu() override;
98 
99 
110  static QList<QgsMapToolIdentify::IdentifyResult> findFeaturesOnCanvas( QgsMapMouseEvent *event, QgsMapCanvas *canvas, const QList<QgsWkbTypes::GeometryType> &geometryTypes );
111 
113  void setAllowMultipleReturn( bool multipleReturn ) { mAllowMultipleReturn = multipleReturn;}
114  bool allowMultipleReturn() { return mAllowMultipleReturn;}
115 
117  void setExecWithSingleResult( bool execWithSingleResult ) { mExecWithSingleResult = execWithSingleResult;}
118  bool execWithSingleResult() { return mExecWithSingleResult;}
119 
125  void setExpressionContextScope( const QgsExpressionContextScope &scope );
126 
132  QgsExpressionContextScope expressionContextScope() const;
133 
140  void setShowFeatureActions( bool showFeatureActions ) { mShowFeatureActions = showFeatureActions; }
141  bool showFeatureActions() { return mShowFeatureActions;}
142 
147  void setResultsIfExternalAction( bool resultsIfExternalAction ) {mResultsIfExternalAction = resultsIfExternalAction;}
148  bool resultsIfExternalAction() {return mResultsIfExternalAction;}
149 
154  void setMaxLayerDisplay( int maxLayerDisplay );
155  int maxLayerDisplay() {return mMaxLayerDisplay;}
156 
161  void setMaxFeatureDisplay( int maxFeatureDisplay );
162  int maxFeatureDisplay() {return mMaxFeatureDisplay;}
163 
165  void addCustomAction( QgsMapLayerAction *action ) {mCustomActionRegistry.addMapLayerAction( action );}
166 
168  void removeCustomActions();
169 
175  QList<QgsMapToolIdentify::IdentifyResult> exec( const QList<QgsMapToolIdentify::IdentifyResult> &idResults, QPoint pos );
176 
182  static void styleHighlight( QgsHighlight *highlight );
183 
184  protected:
185  void closeEvent( QCloseEvent *e ) override;
186 
187  private slots:
188  void handleMenuHover();
189  void deleteRubberBands();
190  void layerDestroyed();
191  void triggerMapLayerAction();
192 
193  private:
194 
196  void addRasterLayer( QgsMapLayer *layer );
197 
202  void addVectorLayer( QgsVectorLayer *layer, const QList<QgsMapToolIdentify::IdentifyResult> &results, bool singleLayer = false );
203 
205  QList<QgsMapToolIdentify::IdentifyResult> results( QAction *action, bool &externalAction );
206 
207  QgsMapCanvas *mCanvas = nullptr;
208  QList<QgsHighlight *> mRubberBands;
209  bool mAllowMultipleReturn;
210  bool mExecWithSingleResult;
211  bool mShowFeatureActions;
212  bool mResultsIfExternalAction;
213  int mMaxLayerDisplay;
214  int mMaxFeatureDisplay;
215 
216  QgsExpressionContextScope mExpressionContextScope;
217 
218  // name of the action to be displayed for feature default action, if other actions are shown
219  QString mDefaultActionName;
220 
221  // custom menu actions regirstry
222  CustomActionRegistry mCustomActionRegistry;
223 
224  // map layers with their results, this is the odering of the menu
225  QMap <QgsMapLayer *, QList<QgsMapToolIdentify::IdentifyResult> > mLayerIdResults;
226 };
227 
229 
230 #endif // QGSIDENTIFYMENU_H
Single scope for storing variables and functions for use within a QgsExpressionContext.
A class for highlight features on the map.
Definition: qgshighlight.h:62
The QgsIdentifyMenu class builds a menu to be used with identify results (.
bool execWithSingleResult()
bool allowMultipleReturn()
void setAllowMultipleReturn(bool multipleReturn)
define if the menu executed can return multiple results (e.g. all results or all identified features ...
void setResultsIfExternalAction(bool resultsIfExternalAction)
setResultsIfExternalAction if set to false (default) the menu will not return any results if an exter...
void addCustomAction(QgsMapLayerAction *action)
adds a new custom action to the menu
void setShowFeatureActions(bool showFeatureActions)
define if attribute actions(1) and map layer actions(2) can be listed and run from the menu
void setExecWithSingleResult(bool execWithSingleResult)
define if the menu will be shown with a single identify result
bool resultsIfExternalAction()
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:90
This class tracks map layer actions.
An action which can run on map layers The class can be used in two manners:
Base class for all map layer types.
Definition: qgsmaplayer.h:73
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
Represents a vector layer which manages a vector based data sets.
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28
ActionData(QgsMapLayer *layer, QgsMapLayerAction *mapLayerAction=nullptr)
ActionData()=default
Constructor for ActionData.
ActionData(QgsMapLayer *layer, QgsFeatureId fid, QgsMapLayerAction *mapLayerAction=nullptr)