Skip to content

Commit 95806bb

Browse files
committedMar 13, 2017
Make extra map views either follow the main canvas layers/styles,
or allow them to be set to follow a map theme preset I.e. all styling and configuration operations for secondary views are done in the main map canvas. Theme presets can be made in the main canvas, and then assigned to the secondary views.
1 parent 419e53b commit 95806bb

File tree

5 files changed

+83
-13
lines changed

5 files changed

+83
-13
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3143,6 +3143,7 @@ QgsMapCanvas *QgisApp::createNewMapCanvas( const QString &name, bool isFloating,
31433143
mapCanvas->freeze( true );
31443144
mapCanvas->setObjectName( name );
31453145
connect( mapCanvas, &QgsMapCanvas::messageEmitted, this, &QgisApp::displayMessage );
3146+
connect( mLayerTreeCanvasBridge, &QgsLayerTreeMapCanvasBridge::canvasLayersChanged, mapCanvas, &QgsMapCanvas::setLayers );
31463147

31473148
applyProjectSettingsToCanvas( mapCanvas );
31483149
applyDefaultSettingsToCanvas( mapCanvas );

‎src/app/qgsmapcanvasdockwidget.cpp

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
#include "qgsdoublespinbox.h"
2222
#include "qgssettings.h"
2323
#include "qgsmaptoolpan.h"
24+
#include "qgsmapthemecollection.h"
25+
#include "qgsproject.h"
26+
#include "qgsmapthemes.h"
2427
#include <QMessageBox>
2528
#include <QMenu>
2629
#include <QToolBar>
@@ -49,24 +52,36 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa
4952

5053
connect( mActionSyncView, &QAction::toggled, this, &QgsMapCanvasDockWidget::syncView );
5154

52-
QMenu *menu = new QMenu();
53-
54-
QToolButton *toolButton = new QToolButton();
55-
toolButton->setMenu( menu );
56-
toolButton->setPopupMode( QToolButton::InstantPopup );
57-
toolButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionMapSettings.svg" ) ) );
58-
mToolbar->addWidget( toolButton );
55+
mMenu = new QMenu();
56+
connect( mMenu, &QMenu::aboutToShow, this, &QgsMapCanvasDockWidget::menuAboutToShow );
57+
58+
QToolButton *btnMapThemes = new QToolButton;
59+
btnMapThemes->setAutoRaise( true );
60+
btnMapThemes->setToolTip( tr( "Set View Theme" ) );
61+
btnMapThemes->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowAllLayers.svg" ) ) );
62+
btnMapThemes->setPopupMode( QToolButton::InstantPopup );
63+
btnMapThemes->setMenu( mMenu );
64+
mToolbar->addWidget( btnMapThemes );
65+
66+
QMenu *settingsMenu = new QMenu();
67+
QToolButton *settingsButton = new QToolButton();
68+
btnMapThemes->setAutoRaise( true );
69+
settingsButton->setMenu( settingsMenu );
70+
settingsButton->setPopupMode( QToolButton::InstantPopup );
71+
settingsButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionMapSettings.svg" ) ) );
72+
mToolbar->addWidget( settingsButton );
5973

6074
connect( mActionSetCrs, &QAction::triggered, this, &QgsMapCanvasDockWidget::setMapCrs );
6175
connect( mMapCanvas, &QgsMapCanvas::destinationCrsChanged, this, &QgsMapCanvasDockWidget::mapCrsChanged );
6276
mapCrsChanged();
6377

64-
QgsMapSettingsAction *settingsAction = new QgsMapSettingsAction( menu );
65-
menu->addAction( settingsAction );
78+
QgsMapSettingsAction *settingsAction = new QgsMapSettingsAction( settingsMenu );
79+
settingsMenu->addAction( settingsAction );
6680

67-
menu->addSeparator();
68-
menu->addAction( mActionSetCrs );
69-
menu->addAction( mActionRename );
81+
settingsMenu->addSeparator();
82+
settingsMenu->addAction( mActionSetCrs );
83+
settingsMenu->addAction( mActionRename );
84+
settingsMenu->addSeparator();
7085
connect( mActionRename, &QAction::triggered, this, &QgsMapCanvasDockWidget::renameTriggered );
7186

7287
mScaleCombo = settingsAction->scaleCombo();
@@ -219,6 +234,45 @@ void QgsMapCanvasDockWidget::mapCrsChanged()
219234
tr( "No projection" ) ) );
220235
}
221236

237+
void QgsMapCanvasDockWidget::menuAboutToShow()
238+
{
239+
qDeleteAll( mMenuPresetActions );
240+
mMenuPresetActions.clear();
241+
242+
QString currentTheme = mMapCanvas->theme();
243+
244+
QAction *actionFollowMain = new QAction( tr( "(default)" ), mMenu );
245+
actionFollowMain->setCheckable( true );
246+
if ( currentTheme.isEmpty() || !QgsProject::instance()->mapThemeCollection()->hasMapTheme( currentTheme ) )
247+
{
248+
actionFollowMain->setChecked( true );
249+
}
250+
connect( actionFollowMain, &QAction::triggered, this, [ = ]
251+
{
252+
mMapCanvas->setTheme( QString() );
253+
mMapCanvas->refresh();
254+
} );
255+
mMenuPresetActions.append( actionFollowMain );
256+
257+
Q_FOREACH ( const QString &grpName, QgsProject::instance()->mapThemeCollection()->mapThemes() )
258+
{
259+
QAction *a = new QAction( grpName, mMenu );
260+
a->setCheckable( true );
261+
if ( grpName == currentTheme )
262+
{
263+
a->setChecked( true );
264+
}
265+
connect( a, &QAction::triggered, this, [a, this]
266+
{
267+
mMapCanvas->setTheme( a->text() );
268+
mMapCanvas->refresh();
269+
} );
270+
mMenuPresetActions.append( a );
271+
}
272+
mMenu->addActions( mMenuPresetActions );
273+
}
274+
275+
222276
QgsMapSettingsAction::QgsMapSettingsAction( QWidget *parent )
223277
: QWidgetAction( parent )
224278
{

‎src/app/qgsmapcanvasdockwidget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,15 @@ class APP_EXPORT QgsMapCanvasDockWidget : public QgsDockWidget, private Ui::QgsM
6868
void syncView( bool enabled );
6969
void mapExtentChanged();
7070
void mapCrsChanged();
71+
void menuAboutToShow();
7172

7273
private:
7374

7475
QgsMapCanvas *mMapCanvas = nullptr;
7576
QgsMapCanvas *mMainCanvas = nullptr;
7677
bool mShowCloseWarning = true;
78+
QMenu *mMenu = nullptr;
79+
QList<QAction *> mMenuPresetActions;
7780
QgsScaleComboBox *mScaleCombo = nullptr;
7881
QgsDoubleSpinBox *mRotationEdit = nullptr;
7982
QgsDoubleSpinBox *mMagnificationEdit = nullptr;

‎src/gui/qgsmapcanvas.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1864,7 +1864,7 @@ void QgsMapCanvas::readProject( const QDomDocument &doc )
18641864
{
18651865
QDomElement elementNode = nodes.at( i ).toElement();
18661866

1867-
if ( elementNode.hasAttribute( "name" ) && elementNode.attribute( "name" ) == objectName() )
1867+
if ( elementNode.hasAttribute( QStringLiteral( "name" ) ) && elementNode.attribute( QStringLiteral( "name" ) ) == objectName() )
18681868
{
18691869
node = nodes.at( i );
18701870
break;
@@ -1881,6 +1881,15 @@ void QgsMapCanvas::readProject( const QDomDocument &doc )
18811881
enableMapTileRendering( tmpSettings.testFlag( QgsMapSettings::RenderMapTile ) );
18821882

18831883
clearExtentHistory(); // clear the extent history on project load
1884+
1885+
QDomElement elem = node.toElement();
1886+
if ( elem.hasAttribute( QStringLiteral( "theme" ) ) )
1887+
{
1888+
if ( QgsProject::instance()->mapThemeCollection()->hasMapTheme( elem.attribute( QStringLiteral( "theme" ) ) ) )
1889+
{
1890+
setTheme( elem.attribute( QStringLiteral( "theme" ) ) );
1891+
}
1892+
}
18841893
}
18851894
else
18861895
{
@@ -1902,6 +1911,8 @@ void QgsMapCanvas::writeProject( QDomDocument &doc )
19021911

19031912
QDomElement mapcanvasNode = doc.createElement( QStringLiteral( "mapcanvas" ) );
19041913
mapcanvasNode.setAttribute( "name", objectName() );
1914+
if ( !mTheme.isEmpty() )
1915+
mapcanvasNode.setAttribute( "theme", mTheme );
19051916
qgisNode.appendChild( mapcanvasNode );
19061917

19071918
mSettings.writeXml( mapcanvasNode, doc );

‎tests/src/python/test_qgsmapthemecollection.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,5 +211,6 @@ def testMasterVisibleLayers(self):
211211
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer2, layer3])
212212

213213

214+
214215
if __name__ == '__main__':
215216
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.