Skip to content

Commit

Permalink
[FEATURE][layouts] Allow setting layout map item extent to an
Browse files Browse the repository at this point in the history
existing bookmark

This new button in the map item properties toolbar shows a menu
which allows directly setting a map item to the extent of that
bookmark.

Fixes qgis#20279
  • Loading branch information
nyalldawson committed Sep 4, 2019
1 parent a76f127 commit 3f3aa2a
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
80 changes: 80 additions & 0 deletions src/app/layout/qgslayoutmapwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#include "qgslayoutatlas.h"
#include "qgslayoutdesignerinterface.h"
#include "qgsguiutils.h"
#include "qgsbookmarkmodel.h"
#include "qgsreferencedgeometry.h"

#include <QMenu>
#include <QMessageBox>
Expand Down Expand Up @@ -89,6 +91,17 @@ QgsLayoutMapWidget::QgsLayoutMapWidget( QgsLayoutItemMap *item )

mDockToolbar->setIconSize( QgsGuiUtils::iconSize( true ) );

mBookmarkMenu = new QMenu( this );
QToolButton *btnBookmarks = new QToolButton( this );
btnBookmarks->setAutoRaise( true );
btnBookmarks->setToolTip( tr( "Bookmarks" ) );
btnBookmarks->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowBookmarks.svg" ) ) );
btnBookmarks->setPopupMode( QToolButton::InstantPopup );
btnBookmarks->setMenu( mBookmarkMenu );

mDockToolbar->insertWidget( mActionMoveContent, btnBookmarks );
connect( mBookmarkMenu, &QMenu::aboutToShow, this, &QgsLayoutMapWidget::aboutToShowBookmarkMenu );

//add widget for general composer item properties
mItemPropertiesWidget = new QgsLayoutItemPropertiesWidget( this, item );
mainLayout->addWidget( mItemPropertiesWidget );
Expand Down Expand Up @@ -382,6 +395,73 @@ void QgsLayoutMapWidget::switchToMoveContentTool()
mInterface->activateTool( QgsLayoutDesignerInterface::ToolMoveItemContent );
}

void QgsLayoutMapWidget::aboutToShowBookmarkMenu()
{
mBookmarkMenu->clear();

// query the bookmarks now? or once during widget creation... Hmm. Either way, there's potentially a
// delay if there's LOTS of bookmarks. Let's avoid the cost until bookmarks are actually required.
if ( !mBookmarkModel )
mBookmarkModel = new QgsBookmarkManagerProxyModel( QgsApplication::bookmarkManager(), QgsProject::instance()->bookmarkManager(), this );

QMap< QString, QMenu * > groupMenus;
for ( int i = 0; i < mBookmarkModel->rowCount(); ++i )
{
const QString group = mBookmarkModel->data( mBookmarkModel->index( i, 0 ), QgsBookmarkManagerModel::RoleGroup ).toString();
QMenu *destMenu = mBookmarkMenu;
if ( !group.isEmpty() )
{
destMenu = groupMenus.value( group );
if ( !destMenu )
{
destMenu = new QMenu( group, mBookmarkMenu );
groupMenus[ group ] = destMenu;
}
}
QAction *action = new QAction( mBookmarkModel->data( mBookmarkModel->index( i, 0 ), QgsBookmarkManagerModel::RoleName ).toString(), mBookmarkMenu );
const QgsReferencedRectangle extent = mBookmarkModel->data( mBookmarkModel->index( i, 0 ), QgsBookmarkManagerModel::RoleExtent ).value< QgsReferencedRectangle >();
connect( action, &QAction::triggered, this, [ = ]
{
if ( !mMapItem )
{
return;
}

QgsRectangle newExtent = extent;

//transform?
if ( extent.crs() != mMapItem->crs() )
{
try
{
QgsCoordinateTransform xForm( extent.crs(), mMapItem->crs(), QgsProject::instance() );
newExtent = xForm.transformBoundingBox( newExtent );
}
catch ( QgsCsException & )
{
//transform failed, better not proceed
return;
}
}

mMapItem->layout()->undoStack()->beginCommand( mMapItem, tr( "Change Map Extent" ) );
mMapItem->zoomToExtent( newExtent );
mMapItem->layout()->undoStack()->endCommand();
} );
destMenu->addAction( action );
}

QStringList groupKeys = groupMenus.keys();
groupKeys.sort( Qt::CaseInsensitive );
for ( int i = 0; i < groupKeys.count(); ++i )
{
if ( mBookmarkMenu->actions().at( i ) )
mBookmarkMenu->insertMenu( mBookmarkMenu->actions().at( i ), groupMenus.value( groupKeys.at( i ) ) );
else
mBookmarkMenu->addMenu( groupMenus.value( groupKeys.at( i ) ) );
}
}

void QgsLayoutMapWidget::mAtlasCheckBox_toggled( bool checked )
{
if ( !mMapItem )
Expand Down
4 changes: 4 additions & 0 deletions src/app/layout/qgslayoutmapwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class QgsMapLayer;
class QgsLayoutItemMap;
class QgsLayoutItemMapOverview;
class QgsLayoutMapLabelingWidget;
class QgsBookmarkManagerProxyModel;

/**
* \ingroup app
Expand Down Expand Up @@ -124,12 +125,15 @@ class QgsLayoutMapWidget: public QgsLayoutItemBaseWidget, private Ui::QgsLayoutM
void overviewSymbolChanged();
void showLabelSettings();
void switchToMoveContentTool();
void aboutToShowBookmarkMenu();

private:
QPointer< QgsLayoutItemMap > mMapItem;
QgsLayoutItemPropertiesWidget *mItemPropertiesWidget = nullptr;
QgsLayoutDesignerInterface *mInterface = nullptr;
QPointer< QgsLayoutMapLabelingWidget > mLabelWidget;
QMenu *mBookmarkMenu = nullptr;
QgsBookmarkManagerProxyModel *mBookmarkModel = nullptr;

//! Sets extent of composer map from line edits
void updateComposerExtentFromGui();
Expand Down

0 comments on commit 3f3aa2a

Please sign in to comment.