diff --git a/src/app/qgsbookmarks.cpp b/src/app/qgsbookmarks.cpp index 6e7498d642a..bb0059ad128 100644 --- a/src/app/qgsbookmarks.cpp +++ b/src/app/qgsbookmarks.cpp @@ -49,6 +49,8 @@ QgsBookmarks::QgsBookmarks( QWidget *parent ) QgsGui::enableAutoGeometryRestore( this ); connect( lstBookmarks, &QTreeView::doubleClicked, this, &QgsBookmarks::lstBookmarks_doubleClicked ); + lstBookmarks->setContextMenuPolicy( Qt::CustomContextMenu ); + connect( lstBookmarks, &QTreeView::customContextMenuRequested, this, &QgsBookmarks::lstBookmarks_customContextMenuRequested ); bookmarksDockContents->layout()->setContentsMargins( 0, 0, 0, 0 ); static_cast< QGridLayout * >( bookmarksDockContents->layout() )->setVerticalSpacing( 0 ); @@ -60,17 +62,15 @@ QgsBookmarks::QgsBookmarks( QWidget *parent ) btnImpExp->setPopupMode( QToolButton::InstantPopup ); QMenu *share = new QMenu( this ); - QAction *btnExport = share->addAction( tr( "&Export" ) ); - QAction *btnImport = share->addAction( tr( "&Import" ) ); - btnExport->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionSharingExport.svg" ) ) ); - btnImport->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionSharingImport.svg" ) ) ); - connect( btnExport, &QAction::triggered, this, &QgsBookmarks::exportToXml ); - connect( btnImport, &QAction::triggered, this, &QgsBookmarks::importFromXml ); + share->addAction( actionExport ); + share->addAction( actionImport ); btnImpExp->setMenu( share ); connect( actionAdd, &QAction::triggered, this, &QgsBookmarks::addClicked ); connect( actionDelete, &QAction::triggered, this, &QgsBookmarks::deleteClicked ); connect( actionZoomTo, &QAction::triggered, this, &QgsBookmarks::zoomToBookmark ); + connect( actionExport, &QAction::triggered, this, &QgsBookmarks::exportToXml ); + connect( actionImport, &QAction::triggered, this, &QgsBookmarks::importFromXml ); mBookmarkToolbar->addWidget( btnImpExp ); @@ -145,6 +145,51 @@ void QgsBookmarks::lstBookmarks_doubleClicked( const QModelIndex &index ) zoomToBookmark(); } +void QgsBookmarks::lstBookmarks_customContextMenuRequested( QPoint pos ) +{ + // Get index of item under mouse + QModelIndex index = lstBookmarks->indexAt( pos ); + if ( !index.isValid() ) + { + // No bookmark under mouse, display generic menu + QMenu menu; + menu.addAction( actionAdd ); + menu.addSeparator(); + menu.addAction( actionExport ); + menu.addAction( actionImport ); + menu.exec( lstBookmarks->mapToGlobal( pos ) ); + return; + } + + // Create the context menu + QMenu menu; + + // Add zoom and delete actions + menu.addAction( actionZoomTo ); + menu.addAction( actionDelete ); + + // Get the bookmark + const QString id = lstBookmarks->model()->data( index, QgsBookmarkManagerModel::RoleId ).toString(); + QgsBookmark bookmark = QgsApplication::bookmarkManager()->bookmarkById( id ); + bool inProject = false; + if ( bookmark.id().isEmpty() ) + { + inProject = true; + bookmark = QgsProject::instance()->bookmarkManager()->bookmarkById( id ); + } + + // Add an edit action (similar to the one in QgsBookmarksItemGuiProvider) + QAction *actionEdit = new QAction( tr( "Edit Spatial Bookmark…" ), &menu ); + connect( actionEdit, &QAction::triggered, this, [bookmark, inProject] + { + QgsBookmarkEditorDialog *dlg = new QgsBookmarkEditorDialog( bookmark, inProject, QgisApp::instance(), QgisApp::instance()->mapCanvas() ); + dlg->setAttribute( Qt::WA_DeleteOnClose ); + dlg->show(); + } ); + menu.addAction( actionEdit ); + menu.exec( lstBookmarks->viewport()->mapToGlobal( pos ) ); +} + void QgsBookmarks::zoomToBookmark() { const QModelIndex index = lstBookmarks->currentIndex(); diff --git a/src/app/qgsbookmarks.h b/src/app/qgsbookmarks.h index fda5bf953fe..8adfbf06619 100644 --- a/src/app/qgsbookmarks.h +++ b/src/app/qgsbookmarks.h @@ -73,6 +73,7 @@ class APP_EXPORT QgsBookmarks : public QgsDockWidget, private Ui::QgsBookmarksBa void importFromXml(); void lstBookmarks_doubleClicked( const QModelIndex & ); + void lstBookmarks_customContextMenuRequested( QPoint pos ); private: QgsBookmarkManagerProxyModel *mBookmarkModel = nullptr; diff --git a/src/ui/qgsbookmarksbase.ui b/src/ui/qgsbookmarksbase.ui index 3dffb720444..79224be0444 100644 --- a/src/ui/qgsbookmarksbase.ui +++ b/src/ui/qgsbookmarksbase.ui @@ -103,6 +103,24 @@ Zoom to bookmark + + + + :/images/themes/default/mActionSharingExport.svg:/images/themes/default/mActionSharingExport.svg + + + &Export + + + + + + :/images/themes/default/mActionSharingImport.svg:/images/themes/default/mActionSharingImport.svg + + + &Import + +