Skip to content

Commit 9d3140c

Browse files
YoannQDQnyalldawson
authored andcommittedMar 29, 2023
Add a context menu to QgsBookmarks
1 parent 7ea839b commit 9d3140c

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed
 

‎src/app/qgsbookmarks.cpp

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ QgsBookmarks::QgsBookmarks( QWidget *parent )
4949
QgsGui::enableAutoGeometryRestore( this );
5050

5151
connect( lstBookmarks, &QTreeView::doubleClicked, this, &QgsBookmarks::lstBookmarks_doubleClicked );
52+
lstBookmarks->setContextMenuPolicy( Qt::CustomContextMenu );
53+
connect( lstBookmarks, &QTreeView::customContextMenuRequested, this, &QgsBookmarks::lstBookmarks_customContextMenuRequested );
5254

5355
bookmarksDockContents->layout()->setContentsMargins( 0, 0, 0, 0 );
5456
static_cast< QGridLayout * >( bookmarksDockContents->layout() )->setVerticalSpacing( 0 );
@@ -60,17 +62,15 @@ QgsBookmarks::QgsBookmarks( QWidget *parent )
6062
btnImpExp->setPopupMode( QToolButton::InstantPopup );
6163

6264
QMenu *share = new QMenu( this );
63-
QAction *btnExport = share->addAction( tr( "&Export" ) );
64-
QAction *btnImport = share->addAction( tr( "&Import" ) );
65-
btnExport->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionSharingExport.svg" ) ) );
66-
btnImport->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionSharingImport.svg" ) ) );
67-
connect( btnExport, &QAction::triggered, this, &QgsBookmarks::exportToXml );
68-
connect( btnImport, &QAction::triggered, this, &QgsBookmarks::importFromXml );
65+
share->addAction( actionExport );
66+
share->addAction( actionImport );
6967
btnImpExp->setMenu( share );
7068

7169
connect( actionAdd, &QAction::triggered, this, &QgsBookmarks::addClicked );
7270
connect( actionDelete, &QAction::triggered, this, &QgsBookmarks::deleteClicked );
7371
connect( actionZoomTo, &QAction::triggered, this, &QgsBookmarks::zoomToBookmark );
72+
connect( actionExport, &QAction::triggered, this, &QgsBookmarks::exportToXml );
73+
connect( actionImport, &QAction::triggered, this, &QgsBookmarks::importFromXml );
7474

7575
mBookmarkToolbar->addWidget( btnImpExp );
7676

@@ -145,6 +145,51 @@ void QgsBookmarks::lstBookmarks_doubleClicked( const QModelIndex &index )
145145
zoomToBookmark();
146146
}
147147

148+
void QgsBookmarks::lstBookmarks_customContextMenuRequested( QPoint pos )
149+
{
150+
// Get index of item under mouse
151+
QModelIndex index = lstBookmarks->indexAt( pos );
152+
if ( !index.isValid() )
153+
{
154+
// No bookmark under mouse, display generic menu
155+
QMenu menu;
156+
menu.addAction( actionAdd );
157+
menu.addSeparator();
158+
menu.addAction( actionExport );
159+
menu.addAction( actionImport );
160+
menu.exec( lstBookmarks->mapToGlobal( pos ) );
161+
return;
162+
}
163+
164+
// Create the context menu
165+
QMenu menu;
166+
167+
// Add zoom and delete actions
168+
menu.addAction( actionZoomTo );
169+
menu.addAction( actionDelete );
170+
171+
// Get the bookmark
172+
const QString id = lstBookmarks->model()->data( index, QgsBookmarkManagerModel::RoleId ).toString();
173+
QgsBookmark bookmark = QgsApplication::bookmarkManager()->bookmarkById( id );
174+
bool inProject = false;
175+
if ( bookmark.id().isEmpty() )
176+
{
177+
inProject = true;
178+
bookmark = QgsProject::instance()->bookmarkManager()->bookmarkById( id );
179+
}
180+
181+
// Add an edit action (similar to the one in QgsBookmarksItemGuiProvider)
182+
QAction *actionEdit = new QAction( tr( "Edit Spatial Bookmark…" ), &menu );
183+
connect( actionEdit, &QAction::triggered, this, [bookmark, inProject]
184+
{
185+
QgsBookmarkEditorDialog *dlg = new QgsBookmarkEditorDialog( bookmark, inProject, QgisApp::instance(), QgisApp::instance()->mapCanvas() );
186+
dlg->setAttribute( Qt::WA_DeleteOnClose );
187+
dlg->show();
188+
} );
189+
menu.addAction( actionEdit );
190+
menu.exec( lstBookmarks->viewport()->mapToGlobal( pos ) );
191+
}
192+
148193
void QgsBookmarks::zoomToBookmark()
149194
{
150195
const QModelIndex index = lstBookmarks->currentIndex();

‎src/app/qgsbookmarks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class APP_EXPORT QgsBookmarks : public QgsDockWidget, private Ui::QgsBookmarksBa
7373
void importFromXml();
7474

7575
void lstBookmarks_doubleClicked( const QModelIndex & );
76+
void lstBookmarks_customContextMenuRequested( QPoint pos );
7677

7778
private:
7879
QgsBookmarkManagerProxyModel *mBookmarkModel = nullptr;

‎src/ui/qgsbookmarksbase.ui

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,24 @@
103103
<string>Zoom to bookmark</string>
104104
</property>
105105
</action>
106+
<action name="actionExport">
107+
<property name="icon">
108+
<iconset resource="../../images/images.qrc">
109+
<normaloff>:/images/themes/default/mActionSharingExport.svg</normaloff>:/images/themes/default/mActionSharingExport.svg</iconset>
110+
</property>
111+
<property name="text">
112+
<string>&amp;Export</string>
113+
</property>
114+
</action>
115+
<action name="actionImport">
116+
<property name="icon">
117+
<iconset resource="../../images/images.qrc">
118+
<normaloff>:/images/themes/default/mActionSharingImport.svg</normaloff>:/images/themes/default/mActionSharingImport.svg</iconset>
119+
</property>
120+
<property name="text">
121+
<string>&amp;Import</string>
122+
</property>
123+
</action>
106124
</widget>
107125
<customwidgets>
108126
<customwidget>

0 commit comments

Comments
 (0)
Please sign in to comment.