Skip to content

Commit 5b17f2d

Browse files
committedJan 12, 2022
proper saving of the window geometry
1 parent 122892d commit 5b17f2d

File tree

7 files changed

+73
-71
lines changed

7 files changed

+73
-71
lines changed
 

‎src/app/3d/qgs3dmapcanvasdockwidget.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,29 +57,14 @@ Qgs3DMapCanvasDockWidget::~Qgs3DMapCanvasDockWidget()
5757
delete mDialog;
5858
}
5959

60-
void Qgs3DMapCanvasDockWidget::setMapSettings( Qgs3DMapSettings *map )
60+
Qgs3DMapCanvasWidget *Qgs3DMapCanvasDockWidget::widget()
6161
{
62-
mCanvasWidget->setMapSettings( map );
62+
return mCanvasWidget;
6363
}
6464

65-
void Qgs3DMapCanvasDockWidget::setMainCanvas( QgsMapCanvas *canvas )
65+
bool Qgs3DMapCanvasDockWidget::isDocked()
6666
{
67-
mCanvasWidget->setMainCanvas( canvas );
68-
}
69-
70-
Qgs3DMapCanvas *Qgs3DMapCanvasDockWidget::mapCanvas3D()
71-
{
72-
return mCanvasWidget->mapCanvas3D();
73-
}
74-
75-
Qgs3DAnimationWidget *Qgs3DMapCanvasDockWidget::animationWidget()
76-
{
77-
return mCanvasWidget->animationWidget();
78-
}
79-
80-
Qgs3DMapToolMeasureLine *Qgs3DMapCanvasDockWidget::measurementLineTool()
81-
{
82-
return mCanvasWidget->measurementLineTool();
67+
return mIsDocked;
8368
}
8469

8570
void Qgs3DMapCanvasDockWidget::toggleDockMode( bool docked )
@@ -110,6 +95,12 @@ void Qgs3DMapCanvasDockWidget::switchToWindowMode()
11095

11196
mDialog->show();
11297
mDock->setVisible( false );
98+
99+
// TODO: apply resizing in a better way
100+
mDialog->resize( mDialog->size() + QSize( 1, 1 ) );
101+
mDialog->resize( mDialog->size() - QSize( 1, 1 ) );
102+
103+
mCanvasWidget->setDocked( false );
113104
}
114105

115106
void Qgs3DMapCanvasDockWidget::switchToDockMode()
@@ -128,5 +119,7 @@ void Qgs3DMapCanvasDockWidget::switchToDockMode()
128119
// TODO: apply resizing in a better way
129120
mDock->resize( mDock->size() + QSize( 1, 1 ) );
130121
mDock->resize( mDock->size() - QSize( 1, 1 ) );
122+
123+
mCanvasWidget->setDocked( true );
131124
}
132125

‎src/app/3d/qgs3dmapcanvasdockwidget.h

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,30 +40,24 @@ class APP_EXPORT Qgs3DMapCanvasDockWidget : public QWidget
4040

4141
~Qgs3DMapCanvasDockWidget();
4242

43-
//! takes ownership
44-
void setMapSettings( Qgs3DMapSettings *map );
43+
Qgs3DMapCanvasWidget *widget();
4544

46-
void setMainCanvas( QgsMapCanvas *canvas );
45+
QgsDockWidget *dockWidget() { return mDock; }
4746

48-
Qgs3DMapCanvas *mapCanvas3D();
49-
Qgs3DAnimationWidget *animationWidget();
47+
QDialog *dialog() { return mDialog; }
5048

51-
Qgs3DMapToolMeasureLine *measurementLineTool();
49+
bool isDocked();
5250

53-
QgsDockWidget *dockWidget() { return mDock; }
51+
void switchToWindowMode();
5452

55-
QDialog *dialog() { return mDialog; }
53+
void switchToDockMode();
5654

5755
signals:
5856
void closed();
5957

6058
private slots:
6159
void toggleDockMode( bool docked );
6260

63-
private:
64-
void switchToWindowMode();
65-
66-
void switchToDockMode();
6761

6862
private:
6963
bool mIsDocked = true;

‎src/app/3d/qgs3dmapcanvaswidget.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ void Qgs3DMapCanvasWidget::measureLine()
280280
mCanvas->setMapTool( action->isChecked() ? mMapToolMeasureLine : nullptr );
281281
}
282282

283+
void Qgs3DMapCanvasWidget::setDocked( bool docked )
284+
{
285+
mDockUnDockBtn->setChecked( docked );
286+
}
287+
283288
void Qgs3DMapCanvasWidget::toggleNavigationWidget( bool visibility )
284289
{
285290
mCanvas->setOnScreenNavigationVisibility( visibility );

‎src/app/3d/qgs3dmapcanvaswidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class APP_EXPORT Qgs3DMapCanvasWidget : public QWidget
5151

5252
Qgs3DMapToolMeasureLine *measurementLineTool() { return mMapToolMeasureLine; }
5353

54+
void setDocked( bool docked );
55+
5456
signals:
5557
void toggleDockMode( bool docked );
5658

‎src/app/3d/qgs3dviewsmanagerdialog.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsnewnamedialog.h"
2121
#include "qgs3dmapcanvas.h"
2222
#include "qgsmapviewsmanager.h"
23+
#include "qgs3dmapcanvaswidget.h"
2324

2425
#include <QMessageBox>
2526

@@ -137,7 +138,7 @@ void Qgs3DViewsManagerDialog::renameClicked()
137138
if ( Qgs3DMapCanvasDockWidget *widget = QgisApp::instance()->get3DMapViewDock( oldTitle ) )
138139
{
139140
widget->setWindowTitle( newTitle );
140-
widget->mapCanvas3D()->setObjectName( newTitle );
141+
widget->widget()->mapCanvas3D()->setObjectName( newTitle );
141142
}
142143

143144
QgsProject::instance()->setDirty();

‎src/app/layout/qgslayout3dmapwidget.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#include "qgs3dmapsettings.h"
2222
#include "qgscameracontroller.h"
2323
#include <QMenu>
24-
24+
#include "qgs3dmapcanvaswidget.h"
2525

2626
float _normalizedAngle( float x )
2727
{
@@ -39,9 +39,9 @@ void _prepare3DViewsMenu( QMenu *menu, QgsLayout3DMapWidget *w, Func1 slot )
3939
menu->clear();
4040
for ( auto dock : lst )
4141
{
42-
QAction *a = menu->addAction( dock->mapCanvas3D()->objectName(), w, slot );
42+
QAction *a = menu->addAction( dock->widget()->mapCanvas3D()->objectName(), w, slot );
4343
// need to use a custom property for identification because Qt likes to add "&" to the action text
44-
a->setProperty( "name", dock->mapCanvas3D()->objectName() );
44+
a->setProperty( "name", dock->widget()->mapCanvas3D()->objectName() );
4545
}
4646
if ( lst.isEmpty() )
4747
{
@@ -60,7 +60,7 @@ Qgs3DMapCanvasDockWidget *_dock3DViewFromSender( QObject *sender )
6060
const QList<Qgs3DMapCanvasDockWidget *> lst = QgisApp::instance()->findChildren<Qgs3DMapCanvasDockWidget *>();
6161
for ( auto dock : lst )
6262
{
63-
QString objName = dock->mapCanvas3D()->objectName();
63+
QString objName = dock->widget()->mapCanvas3D()->objectName();
6464
if ( objName == actionText )
6565
{
6666
return dock;
@@ -124,7 +124,7 @@ void QgsLayout3DMapWidget::copy3DMapSettings()
124124
if ( !dock )
125125
return;
126126

127-
Qgs3DMapSettings *settings = new Qgs3DMapSettings( *dock->mapCanvas3D()->map() );
127+
Qgs3DMapSettings *settings = new Qgs3DMapSettings( *dock->widget()->mapCanvas3D()->map() );
128128

129129
// first setting passed on
130130
if ( !mMap3D->mapSettings() )
@@ -133,7 +133,7 @@ void QgsLayout3DMapWidget::copy3DMapSettings()
133133
mMap3D->setBackgroundColor( settings->backgroundColor() );
134134

135135
// copy camera position details
136-
mMap3D->setCameraPose( dock->mapCanvas3D()->cameraController()->cameraPose() );
136+
mMap3D->setCameraPose( dock->widget()->mapCanvas3D()->cameraController()->cameraPose() );
137137
updateCameraPoseWidgetsFromItem();
138138
}
139139

@@ -145,7 +145,7 @@ void QgsLayout3DMapWidget::copeCameraPose()
145145
Qgs3DMapCanvasDockWidget *dock = _dock3DViewFromSender( sender() );
146146
if ( dock )
147147
{
148-
mMap3D->setCameraPose( dock->mapCanvas3D()->cameraController()->cameraPose() );
148+
mMap3D->setCameraPose( dock->widget()->mapCanvas3D()->cameraController()->cameraPose() );
149149
updateCameraPoseWidgetsFromItem();
150150
}
151151
}

‎src/app/qgisapp.cpp

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
136136
#include "qgs3dapputils.h"
137137
#include "qgs3doptions.h"
138138
#include "qgsmapviewsmanager.h"
139+
#include "qgs3dmapcanvaswidget.h"
139140
#endif
140141

141142
#ifdef HAVE_GEOREFERENCER
@@ -9944,11 +9945,11 @@ Qgs3DMapCanvasDockWidget *QgisApp::duplicate3DMapView( const QString &existingVi
99449945
// settings from m3DMapViewsWidgets
99459946
if ( Qgs3DMapCanvasDockWidget *w = get3DMapViewDock( existingViewName ) )
99469947
{
9947-
Qgs3DMapSettings *map = new Qgs3DMapSettings( *w->mapCanvas3D()->map() );
9948-
mapCanvasDock3D->setMapSettings( map );
9948+
Qgs3DMapSettings *map = new Qgs3DMapSettings( *w->widget()->mapCanvas3D()->map() );
9949+
mapCanvasDock3D->widget()->setMapSettings( map );
99499950

9950-
mapCanvasDock3D->mapCanvas3D()->cameraController()->readXml( w->mapCanvas3D()->cameraController()->writeXml( doc ) );
9951-
mapCanvasDock3D->animationWidget()->setAnimation( w->animationWidget()->animation() );
9951+
mapCanvasDock3D->widget()->mapCanvas3D()->cameraController()->readXml( w->widget()->mapCanvas3D()->cameraController()->writeXml( doc ) );
9952+
mapCanvasDock3D->widget()->animationWidget()->setAnimation( w->widget()->animationWidget()->animation() );
99529953

99539954
QMetaObject::Connection conn = connect( QgsProject::instance(), &QgsProject::transformContextChanged, map, [map]
99549955
{
@@ -13248,7 +13249,7 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString &currentPage, in
1324813249
const QList< Qgs3DMapCanvasDockWidget * > canvases3D = findChildren< Qgs3DMapCanvasDockWidget * >();
1324913250
for ( Qgs3DMapCanvasDockWidget *canvas3D : canvases3D )
1325013251
{
13251-
canvas3D->measurementLineTool()->updateSettings();
13252+
canvas3D->widget()->measurementLineTool()->updateSettings();
1325213253
}
1325313254
#endif
1325413255

@@ -13974,9 +13975,9 @@ Qgs3DMapCanvasDockWidget *QgisApp::createNew3DMapCanvasDock( const QString &name
1397413975
Qgs3DMapCanvasDockWidget *map3DWidget = new Qgs3DMapCanvasDockWidget( this );
1397513976
mOpen3DDocks.insert( map3DWidget );
1397613977
map3DWidget->setWindowTitle( name );
13977-
map3DWidget->mapCanvas3D()->setObjectName( name );
13978-
map3DWidget->setMainCanvas( mMapCanvas );
13979-
map3DWidget->mapCanvas3D()->setTemporalController( mTemporalControllerWidget->temporalController() );
13978+
map3DWidget->widget()->mapCanvas3D()->setObjectName( name );
13979+
map3DWidget->widget()->setMainCanvas( mMapCanvas );
13980+
map3DWidget->widget()->mapCanvas3D()->setTemporalController( mTemporalControllerWidget->temporalController() );
1398013981

1398113982
connect( map3DWidget, &Qgs3DMapCanvasDockWidget::closed, [ = ]()
1398213983
{
@@ -13986,7 +13987,7 @@ Qgs3DMapCanvasDockWidget *QgisApp::createNew3DMapCanvasDock( const QString &name
1398613987
QStringLiteral( "qgis" ), QStringLiteral( "http://mrcc.com/qgis.dtd" ), QStringLiteral( "SYSTEM" ) );
1398713988
QDomDocument doc( documentType );
1398813989

13989-
QString viewName = map3DWidget->mapCanvas3D()->objectName();
13990+
QString viewName = map3DWidget->widget()->mapCanvas3D()->objectName();
1399013991
if ( !QgsProject::instance()->getViewsManager()->get3DViewSettings( viewName ).isNull() )
1399113992
{
1399213993
QDomElement elem3DMap;
@@ -14086,15 +14087,15 @@ void QgisApp::new3DMapCanvas()
1408614087
disconnect( conn );
1408714088
} );
1408814089

14089-
dock->setMapSettings( map );
14090+
dock->widget()->setMapSettings( map );
1409014091

1409114092
QgsRectangle extent = mMapCanvas->extent();
1409214093
float dist = static_cast< float >( std::max( extent.width(), extent.height() ) );
14093-
dock->mapCanvas3D()->setViewFromTop( mMapCanvas->extent().center(), dist, static_cast< float >( mMapCanvas->rotation() ) );
14094+
dock->widget()->mapCanvas3D()->setViewFromTop( mMapCanvas->extent().center(), dist, static_cast< float >( mMapCanvas->rotation() ) );
1409414095

1409514096
const QgsCameraController::VerticalAxisInversion axisInversion = settings.enumValue( QStringLiteral( "map3d/axisInversion" ), QgsCameraController::WhenDragging, QgsSettings::App );
14096-
if ( dock->mapCanvas3D()->cameraController() )
14097-
dock->mapCanvas3D()->cameraController()->setVerticalAxisInversion( axisInversion );
14097+
if ( dock->widget()->mapCanvas3D()->cameraController() )
14098+
dock->widget()->mapCanvas3D()->cameraController()->setVerticalAxisInversion( axisInversion );
1409814099

1409914100
QDomImplementation DomImplementation;
1410014101
QDomDocumentType documentType =
@@ -16710,25 +16711,25 @@ void QgisApp::write3DMapViewSettings( Qgs3DMapCanvasDockWidget *w, QDomDocument
1671016711
{
1671116712
QgsReadWriteContext readWriteContext;
1671216713
readWriteContext.setPathResolver( QgsProject::instance()->pathResolver() );
16713-
elem3DMap.setAttribute( QStringLiteral( "name" ), w->mapCanvas3D()->objectName() );
16714-
QDomElement elem3DMapSettings = w->mapCanvas3D()->map()->writeXml( doc, readWriteContext );
16714+
elem3DMap.setAttribute( QStringLiteral( "name" ), w->widget()->mapCanvas3D()->objectName() );
16715+
QDomElement elem3DMapSettings = w->widget()->mapCanvas3D()->map()->writeXml( doc, readWriteContext );
1671516716
elem3DMap.appendChild( elem3DMapSettings );
16716-
QDomElement elemCamera = w->mapCanvas3D()->cameraController()->writeXml( doc );
16717+
QDomElement elemCamera = w->widget()->mapCanvas3D()->cameraController()->writeXml( doc );
1671716718
elem3DMap.appendChild( elemCamera );
16718-
QDomElement elemAnimation = w->animationWidget()->animation().writeXml( doc );
16719+
QDomElement elemAnimation = w->widget()->animationWidget()->animation().writeXml( doc );
1671916720
elem3DMap.appendChild( elemAnimation );
1672016721

16722+
elem3DMap.setAttribute( QStringLiteral( "isDocked" ), w->isDocked() );
16723+
1672116724
QgsDockWidget *dw = w->dockWidget();
1672216725
if ( dw )
1672316726
{
16724-
elem3DMap.setAttribute( QStringLiteral( "isDock" ), QStringLiteral( "1" ) );
1672516727
writeDockWidgetSettings( dw, elem3DMap );
1672616728
}
1672716729

1672816730
QDialog *d = w->dialog();
1672916731
if ( d )
1673016732
{
16731-
elem3DMap.setAttribute( QStringLiteral( "isDialog" ), QStringLiteral( "1" ) );
1673216733
elem3DMap.setAttribute( QStringLiteral( "d_x" ), d->x() );
1673316734
elem3DMap.setAttribute( QStringLiteral( "d_y" ), d->y() );
1673416735
elem3DMap.setAttribute( QStringLiteral( "d_width" ), d->width() );
@@ -16769,20 +16770,20 @@ void QgisApp::read3DMapViewSettings( Qgs3DMapCanvasDockWidget *w, QDomElement &e
1676916770
}
1677016771
map->setOutputDpi( QgsApplication::desktop()->logicalDpiX() );
1677116772

16772-
w->setMapSettings( map );
16773+
w->widget()->setMapSettings( map );
1677316774

1677416775
QDomElement elemCamera = elem3DMap.firstChildElement( QStringLiteral( "camera" ) );
1677516776
if ( !elemCamera.isNull() )
1677616777
{
16777-
w->mapCanvas3D()->cameraController()->readXml( elemCamera );
16778+
w->widget()->mapCanvas3D()->cameraController()->readXml( elemCamera );
1677816779
}
1677916780

1678016781
QDomElement elemAnimation = elem3DMap.firstChildElement( QStringLiteral( "animation3d" ) );
1678116782
if ( !elemAnimation.isNull() )
1678216783
{
1678316784
Qgs3DAnimationSettings animationSettings;
1678416785
animationSettings.readXml( elemAnimation );
16785-
w->animationWidget()->setAnimation( animationSettings );
16786+
w->widget()->animationWidget()->setAnimation( animationSettings );
1678616787
}
1678716788

1678816789
QgsDockWidget *dw = w->dockWidget();
@@ -16791,15 +16792,21 @@ void QgisApp::read3DMapViewSettings( Qgs3DMapCanvasDockWidget *w, QDomElement &e
1679116792
readDockWidgetSettings( dw, elem3DMap );
1679216793
}
1679316794

16794-
// QDialog *d = w->dialog();
16795-
// if ( d )
16796-
// {
16797-
// elem3DMap.setAttribute( QStringLiteral( "isDialog" ), QStringLiteral( "1" ) );
16798-
// elem3DMap.setAttribute( QStringLiteral( "d_x" ), d->x() );
16799-
// elem3DMap.setAttribute( QStringLiteral( "d_y" ), d->y() );
16800-
// elem3DMap.setAttribute( QStringLiteral( "d_width" ), d->width() );
16801-
// elem3DMap.setAttribute( QStringLiteral( "d_height" ), d->height() );
16802-
// }
16795+
QDialog *d = w->dialog();
16796+
if ( d )
16797+
{
16798+
int dx = elem3DMap.attribute( QStringLiteral( "d_x" ), "0" ).toInt();
16799+
int dy = elem3DMap.attribute( QStringLiteral( "d_x" ), "0" ).toInt();
16800+
int dw = elem3DMap.attribute( QStringLiteral( "d_width" ), "0" ).toInt();
16801+
int dh = elem3DMap.attribute( QStringLiteral( "d_height" ), "0" ).toInt();
16802+
d->setGeometry( dx, dy, dw, dh );
16803+
}
16804+
16805+
bool isDocked = elem3DMap.attribute( QStringLiteral( "isDocked" ), "1" ).toInt() == 1;
16806+
if ( !isDocked )
16807+
{
16808+
w->switchToWindowMode();
16809+
}
1680316810
}
1680416811
#endif
1680516812

@@ -16845,7 +16852,7 @@ void QgisApp::writeProject( QDomDocument &doc )
1684516852
#ifdef HAVE_3D
1684616853
for ( Qgs3DMapCanvasDockWidget *widget : findChildren< Qgs3DMapCanvasDockWidget * >() )
1684716854
{
16848-
QString viewName = widget->mapCanvas3D()->objectName();
16855+
QString viewName = widget->widget()->mapCanvas3D()->objectName();
1684916856
QDomElement elem3DMap = doc.createElement( QStringLiteral( "view" ) );
1685016857
elem3DMap.setAttribute( QStringLiteral( "isOpen" ), 1 );
1685116858
write3DMapViewSettings( widget, doc, elem3DMap );

0 commit comments

Comments
 (0)
Please sign in to comment.