QGIS API Documentation  3.23.0-Master (dd0cd13a00)
qgsrelationeditorwidget.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrelationeditorwidget.h
3  --------------------------------------
4  Date : 17.5.2013
5  Copyright : (C) 2013 Matthias Kuhn
6  Email : matthias at opengis dot ch
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 QGSRELATIONEDITORWIDGET_H
17 #define QGSRELATIONEDITORWIDGET_H
18 
19 #include <QWidget>
20 #include <QToolButton>
21 #include <QButtonGroup>
22 #include <QGridLayout>
23 #include "qobjectuniqueptr.h"
24 
25 #include "ui_qgsrelationeditorconfigwidgetbase.h"
26 
28 #include "qobjectuniqueptr.h"
30 #include "qgsdualview.h"
31 #include "qgsrelation.h"
33 #include "qgis_gui.h"
34 
35 class QTreeWidget;
36 class QTreeWidgetItem;
37 class QgsFeature;
38 class QgsVectorLayer;
40 class QgsMapTool;
42 
43 #ifdef SIP_RUN
44 % ModuleHeaderCode
45 // fix to allow compilation with sip that for some reason
46 // doesn't add this include to the file where the code from
47 // ConvertToSubClassCode goes.
49 % End
50 #endif
51 
52 
54 #ifndef SIP_RUN
55 
60 class QgsFilteredSelectionManager : public QgsVectorLayerSelectionManager
61 {
62  Q_OBJECT
63 
64  public:
65  QgsFilteredSelectionManager( QgsVectorLayer *layer, const QgsFeatureRequest &request, QObject *parent = nullptr );
66 
67  const QgsFeatureIds &selectedFeatureIds() const override;
68  int selectedFeatureCount() override;
69 
70  private slots:
71 
72  void onSelectionChanged( const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect ) override;
73 
74  private:
75 
76  QgsFeatureRequest mRequest;
77  QgsFeatureIds mSelectedFeatureIds;
78 };
79 #endif
81 
82 
90 {
91 
92  Q_OBJECT
93  Q_PROPERTY( QgsDualView::ViewMode viewMode READ viewMode WRITE setViewMode )
94  Q_PROPERTY( Buttons visibleButtons READ visibleButtons WRITE setVisibleButtons )
95 
96  public:
97 
102  enum Button
103  {
104  NoButton = 0,
105  Link = 1 << 1,
106  Unlink = 1 << 2,
107  SaveChildEdits = 1 << 3,
108  AddChildFeature = 1 << 4,
109  DuplicateChildFeature = 1 << 5,
110  DeleteChildFeature = 1 << 6,
111  ZoomToChildFeature = 1 << 7,
112  AllButtons = Link | Unlink | SaveChildEdits | AddChildFeature | DuplicateChildFeature | DeleteChildFeature | ZoomToChildFeature
113  };
114  Q_ENUM( Button )
115  Q_DECLARE_FLAGS( Buttons, Button )
116  Q_FLAG( Buttons )
117 
118 
123  QgsRelationEditorWidget( const QVariantMap &config, QWidget *parent SIP_TRANSFERTHIS = nullptr );
124 
126  void setViewMode( QgsDualView::ViewMode mode );
127 
129  QgsDualView::ViewMode viewMode() {return mViewMode;}
130 
135  QgsIFeatureSelectionManager *featureSelectionManager();
136 
142  void setEditorContext( const QgsAttributeEditorContext &context ) override;
143 
147  void setVisibleButtons( const Buttons &buttons );
148 
152  Buttons visibleButtons() const;
153 
158  Q_DECL_DEPRECATED void duplicateFeature() SIP_DEPRECATED;
159 
164  void duplicateSelectedFeatures();
165 
169  void unlinkSelectedFeatures();
170 
174  void deleteSelectedFeatures();
175 
179  void zoomToSelectedFeatures();
180 
184  QVariantMap config() const override;
185 
189  void setConfig( const QVariantMap &config ) override;
190 
191  public slots:
192  void parentFormValueChanged( const QString &attribute, const QVariant &newValue ) override;
193 
194  protected:
195  virtual void updateUi() override;
196  void beforeSetRelationFeature( const QgsRelation &newRelation, const QgsFeature &newFeature ) override;
197  void afterSetRelationFeature() override;
198  void beforeSetRelations( const QgsRelation &newRelation, const QgsRelation &newNmRelation ) override;
199  void afterSetRelations() override;
200 
201  private slots:
202  void setViewMode( int mode ) {setViewMode( static_cast<QgsDualView::ViewMode>( mode ) );}
203  void updateButtons();
204 
205  void addFeature();
206  void addFeatureGeometry();
207  void toggleEditing( bool state );
208  void showContextMenu( QgsActionMenu *menu, QgsFeatureId fid );
209  void mapToolDeactivated();
210  void onKeyPressed( QKeyEvent *e );
211  void onDigitizingCompleted( const QgsFeature &feature );
212 
213  void multiEditItemSelectionChanged();
214 
215  private:
216 
217  enum class MultiEditFeatureType : int
218  {
219  Parent,
220  Child
221  };
222 
223  enum class MultiEditTreeWidgetRole : int
224  {
225  FeatureType = Qt::UserRole + 1,
226  FeatureId = Qt::UserRole + 2
227  };
228 
229  void initDualView( QgsVectorLayer *layer, const QgsFeatureRequest &request );
230  void setMapTool( QgsMapTool *mapTool );
231  void unsetMapTool();
232  QgsFeatureIds selectedChildFeatureIds() const;
233  void updateUiSingleEdit();
234  void updateUiMultiEdit();
235  QTreeWidgetItem *createMultiEditTreeWidgetItem( const QgsFeature &feature, QgsVectorLayer *layer, MultiEditFeatureType type );
236 
237  QgsDualView *mDualView = nullptr;
238  QPointer<QgsMessageBarItem> mMessageBarItem;
240 
241  QToolButton *mToggleEditingButton = nullptr;
242  QToolButton *mSaveEditsButton = nullptr;
243  QToolButton *mAddFeatureButton = nullptr;
244  QToolButton *mDuplicateFeatureButton = nullptr;
245  QToolButton *mDeleteFeatureButton = nullptr;
246  QToolButton *mLinkFeatureButton = nullptr;
247  QToolButton *mUnlinkFeatureButton = nullptr;
248  QToolButton *mZoomToFeatureButton = nullptr;
249  QToolButton *mFormViewButton = nullptr;
250  QToolButton *mTableViewButton = nullptr;
251  QToolButton *mAddFeatureGeometryButton = nullptr;
252  QLabel *mMultiEditInfoLabel = nullptr;
253  QStackedWidget *mStackedWidget = nullptr;
254  QWidget *mMultiEditStackedWidgetPage = nullptr;
255  QTreeWidget *mMultiEditTreeWidget = nullptr;
257  QButtonGroup *mViewModeButtonGroup = nullptr;
258  QgsVectorLayerSelectionManager *mFeatureSelectionMgr = nullptr;
259 
260  Buttons mButtonsVisibility = Button::AllButtons;
261  bool mShowFirstFeature = true;
262 
263  QList<QTreeWidgetItem *> mMultiEditPreviousSelectedItems;
264  QgsFeatureIds mMultiEdit1NJustAddedIds;
265 
266  friend class TestQgsRelationEditorWidget;
267 };
268 
269 
276 class GUI_EXPORT QgsRelationEditorConfigWidget : public QgsAbstractRelationEditorConfigWidget, private Ui::QgsRelationEditorConfigWidgetBase
277 {
278  Q_OBJECT
279 
280  public:
281 
288  explicit QgsRelationEditorConfigWidget( const QgsRelation &relation, QWidget *parent SIP_TRANSFERTHIS );
289 
295  QVariantMap config();
296 
302  void setConfig( const QVariantMap &config );
303 
304 };
305 
306 
307 #ifndef SIP_RUN
308 
317 {
318  public:
320 
321  QString type() const override;
322 
323  QString name() const override;
324 
325  QgsAbstractRelationEditorWidget *create( const QVariantMap &config, QWidget *parent = nullptr ) const override;
326 
327  QgsAbstractRelationEditorConfigWidget *configWidget( const QgsRelation &relation, QWidget *parent ) const override;
328 
329 };
330 #endif
331 
332 
333 #endif // QGSRELATIONEDITORWIDGET_H
This class should be subclassed for every configurable relation widget type.
Factory class for creating relation widgets and their corresponding config widgets.
Base class to build new relation widgets.
void toggleEditing(bool state)
Toggles editing state of the widget.
QgsFeatureIds addFeature(const QgsGeometry &geometry=QgsGeometry())
Adds new features with given geometry Returns the Id of added features.
virtual void setConfig(const QVariantMap &config)=0
Defines the widget configuration.
virtual void setEditorContext(const QgsAttributeEditorContext &context)
Sets the editor context.
virtual QVariantMap config() const =0
Returns the widget configuration.
void duplicateFeature(const QgsFeatureId &fid)
Duplicates a feature.
This class is a menu that is populated automatically with the actions defined for a given layer.
Definition: qgsactionmenu.h:38
This class contains context information for attribute editor widgets.
This widget is used to show the attributes of a set of features of a QgsVectorLayer.
Definition: qgsdualview.h:45
ViewMode
The view modes, in which this widget can present information.
Definition: qgsdualview.h:56
@ AttributeEditor
Show a list of the features, where one can be chosen and the according attribute dialog will be prese...
Definition: qgsdualview.h:68
This class wraps a request for features to a vector layer (or directly its vector data provider).
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Is an interface class to abstract feature selection handling.
This tool digitizes geometry of new point/line/polygon features on already existing vector layers Onc...
Abstract base class for all map tools.
Definition: qgsmaptool.h:71
Creates a new configuration widget for the relation editor widget.
Factory class for creating a relation editor widget and the respective config widget.
The default relation widget in QGIS.
Button
Possible buttons shown in the relation editor.
QgsDualView::ViewMode viewMode()
Gets the view mode for the dual view.
int selectedFeatureCount() override
Returns the number of features that are selected in this layer.
const QgsFeatureIds & selectedFeatureIds() const override
Returns reference to identifiers of selected features.
Methods in this class are used to handle basic operations on vector layers.
Represents a vector layer which manages a vector based data sets.
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
QSet< QgsFeatureId > QgsFeatureIds
Definition: qgsfeatureid.h:37
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28