Skip to content

Commit

Permalink
proper saving of the window geometry
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem committed Jan 12, 2022
1 parent 122892d commit 5b17f2d
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 71 deletions.
31 changes: 12 additions & 19 deletions src/app/3d/qgs3dmapcanvasdockwidget.cpp
Expand Up @@ -57,29 +57,14 @@ Qgs3DMapCanvasDockWidget::~Qgs3DMapCanvasDockWidget()
delete mDialog;
}

void Qgs3DMapCanvasDockWidget::setMapSettings( Qgs3DMapSettings *map )
Qgs3DMapCanvasWidget *Qgs3DMapCanvasDockWidget::widget()
{
mCanvasWidget->setMapSettings( map );
return mCanvasWidget;
}

void Qgs3DMapCanvasDockWidget::setMainCanvas( QgsMapCanvas *canvas )
bool Qgs3DMapCanvasDockWidget::isDocked()
{
mCanvasWidget->setMainCanvas( canvas );
}

Qgs3DMapCanvas *Qgs3DMapCanvasDockWidget::mapCanvas3D()
{
return mCanvasWidget->mapCanvas3D();
}

Qgs3DAnimationWidget *Qgs3DMapCanvasDockWidget::animationWidget()
{
return mCanvasWidget->animationWidget();
}

Qgs3DMapToolMeasureLine *Qgs3DMapCanvasDockWidget::measurementLineTool()
{
return mCanvasWidget->measurementLineTool();
return mIsDocked;
}

void Qgs3DMapCanvasDockWidget::toggleDockMode( bool docked )
Expand Down Expand Up @@ -110,6 +95,12 @@ void Qgs3DMapCanvasDockWidget::switchToWindowMode()

mDialog->show();
mDock->setVisible( false );

// TODO: apply resizing in a better way
mDialog->resize( mDialog->size() + QSize( 1, 1 ) );
mDialog->resize( mDialog->size() - QSize( 1, 1 ) );

mCanvasWidget->setDocked( false );
}

void Qgs3DMapCanvasDockWidget::switchToDockMode()
Expand All @@ -128,5 +119,7 @@ void Qgs3DMapCanvasDockWidget::switchToDockMode()
// TODO: apply resizing in a better way
mDock->resize( mDock->size() + QSize( 1, 1 ) );
mDock->resize( mDock->size() - QSize( 1, 1 ) );

mCanvasWidget->setDocked( true );
}

18 changes: 6 additions & 12 deletions src/app/3d/qgs3dmapcanvasdockwidget.h
Expand Up @@ -40,30 +40,24 @@ class APP_EXPORT Qgs3DMapCanvasDockWidget : public QWidget

~Qgs3DMapCanvasDockWidget();

//! takes ownership
void setMapSettings( Qgs3DMapSettings *map );
Qgs3DMapCanvasWidget *widget();

void setMainCanvas( QgsMapCanvas *canvas );
QgsDockWidget *dockWidget() { return mDock; }

Qgs3DMapCanvas *mapCanvas3D();
Qgs3DAnimationWidget *animationWidget();
QDialog *dialog() { return mDialog; }

Qgs3DMapToolMeasureLine *measurementLineTool();
bool isDocked();

QgsDockWidget *dockWidget() { return mDock; }
void switchToWindowMode();

QDialog *dialog() { return mDialog; }
void switchToDockMode();

signals:
void closed();

private slots:
void toggleDockMode( bool docked );

private:
void switchToWindowMode();

void switchToDockMode();

private:
bool mIsDocked = true;
Expand Down
5 changes: 5 additions & 0 deletions src/app/3d/qgs3dmapcanvaswidget.cpp
Expand Up @@ -280,6 +280,11 @@ void Qgs3DMapCanvasWidget::measureLine()
mCanvas->setMapTool( action->isChecked() ? mMapToolMeasureLine : nullptr );
}

void Qgs3DMapCanvasWidget::setDocked( bool docked )
{
mDockUnDockBtn->setChecked( docked );
}

void Qgs3DMapCanvasWidget::toggleNavigationWidget( bool visibility )
{
mCanvas->setOnScreenNavigationVisibility( visibility );
Expand Down
2 changes: 2 additions & 0 deletions src/app/3d/qgs3dmapcanvaswidget.h
Expand Up @@ -51,6 +51,8 @@ class APP_EXPORT Qgs3DMapCanvasWidget : public QWidget

Qgs3DMapToolMeasureLine *measurementLineTool() { return mMapToolMeasureLine; }

void setDocked( bool docked );

signals:
void toggleDockMode( bool docked );

Expand Down
3 changes: 2 additions & 1 deletion src/app/3d/qgs3dviewsmanagerdialog.cpp
Expand Up @@ -20,6 +20,7 @@
#include "qgsnewnamedialog.h"
#include "qgs3dmapcanvas.h"
#include "qgsmapviewsmanager.h"
#include "qgs3dmapcanvaswidget.h"

#include <QMessageBox>

Expand Down Expand Up @@ -137,7 +138,7 @@ void Qgs3DViewsManagerDialog::renameClicked()
if ( Qgs3DMapCanvasDockWidget *widget = QgisApp::instance()->get3DMapViewDock( oldTitle ) )
{
widget->setWindowTitle( newTitle );
widget->mapCanvas3D()->setObjectName( newTitle );
widget->widget()->mapCanvas3D()->setObjectName( newTitle );
}

QgsProject::instance()->setDirty();
Expand Down
14 changes: 7 additions & 7 deletions src/app/layout/qgslayout3dmapwidget.cpp
Expand Up @@ -21,7 +21,7 @@
#include "qgs3dmapsettings.h"
#include "qgscameracontroller.h"
#include <QMenu>

#include "qgs3dmapcanvaswidget.h"

float _normalizedAngle( float x )
{
Expand All @@ -39,9 +39,9 @@ void _prepare3DViewsMenu( QMenu *menu, QgsLayout3DMapWidget *w, Func1 slot )
menu->clear();
for ( auto dock : lst )
{
QAction *a = menu->addAction( dock->mapCanvas3D()->objectName(), w, slot );
QAction *a = menu->addAction( dock->widget()->mapCanvas3D()->objectName(), w, slot );
// need to use a custom property for identification because Qt likes to add "&" to the action text
a->setProperty( "name", dock->mapCanvas3D()->objectName() );
a->setProperty( "name", dock->widget()->mapCanvas3D()->objectName() );
}
if ( lst.isEmpty() )
{
Expand All @@ -60,7 +60,7 @@ Qgs3DMapCanvasDockWidget *_dock3DViewFromSender( QObject *sender )
const QList<Qgs3DMapCanvasDockWidget *> lst = QgisApp::instance()->findChildren<Qgs3DMapCanvasDockWidget *>();
for ( auto dock : lst )
{
QString objName = dock->mapCanvas3D()->objectName();
QString objName = dock->widget()->mapCanvas3D()->objectName();
if ( objName == actionText )
{
return dock;
Expand Down Expand Up @@ -124,7 +124,7 @@ void QgsLayout3DMapWidget::copy3DMapSettings()
if ( !dock )
return;

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

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

// copy camera position details
mMap3D->setCameraPose( dock->mapCanvas3D()->cameraController()->cameraPose() );
mMap3D->setCameraPose( dock->widget()->mapCanvas3D()->cameraController()->cameraPose() );
updateCameraPoseWidgetsFromItem();
}

Expand All @@ -145,7 +145,7 @@ void QgsLayout3DMapWidget::copeCameraPose()
Qgs3DMapCanvasDockWidget *dock = _dock3DViewFromSender( sender() );
if ( dock )
{
mMap3D->setCameraPose( dock->mapCanvas3D()->cameraController()->cameraPose() );
mMap3D->setCameraPose( dock->widget()->mapCanvas3D()->cameraController()->cameraPose() );
updateCameraPoseWidgetsFromItem();
}
}
Expand Down
71 changes: 39 additions & 32 deletions src/app/qgisapp.cpp
Expand Up @@ -136,6 +136,7 @@
#include "qgs3dapputils.h"
#include "qgs3doptions.h"
#include "qgsmapviewsmanager.h"
#include "qgs3dmapcanvaswidget.h"
#endif

#ifdef HAVE_GEOREFERENCER
Expand Down Expand Up @@ -9944,11 +9945,11 @@ Qgs3DMapCanvasDockWidget *QgisApp::duplicate3DMapView( const QString &existingVi
// settings from m3DMapViewsWidgets
if ( Qgs3DMapCanvasDockWidget *w = get3DMapViewDock( existingViewName ) )
{
Qgs3DMapSettings *map = new Qgs3DMapSettings( *w->mapCanvas3D()->map() );
mapCanvasDock3D->setMapSettings( map );
Qgs3DMapSettings *map = new Qgs3DMapSettings( *w->widget()->mapCanvas3D()->map() );
mapCanvasDock3D->widget()->setMapSettings( map );

mapCanvasDock3D->mapCanvas3D()->cameraController()->readXml( w->mapCanvas3D()->cameraController()->writeXml( doc ) );
mapCanvasDock3D->animationWidget()->setAnimation( w->animationWidget()->animation() );
mapCanvasDock3D->widget()->mapCanvas3D()->cameraController()->readXml( w->widget()->mapCanvas3D()->cameraController()->writeXml( doc ) );
mapCanvasDock3D->widget()->animationWidget()->setAnimation( w->widget()->animationWidget()->animation() );

QMetaObject::Connection conn = connect( QgsProject::instance(), &QgsProject::transformContextChanged, map, [map]
{
Expand Down Expand Up @@ -13248,7 +13249,7 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString &currentPage, in
const QList< Qgs3DMapCanvasDockWidget * > canvases3D = findChildren< Qgs3DMapCanvasDockWidget * >();
for ( Qgs3DMapCanvasDockWidget *canvas3D : canvases3D )
{
canvas3D->measurementLineTool()->updateSettings();
canvas3D->widget()->measurementLineTool()->updateSettings();
}
#endif

Expand Down Expand Up @@ -13974,9 +13975,9 @@ Qgs3DMapCanvasDockWidget *QgisApp::createNew3DMapCanvasDock( const QString &name
Qgs3DMapCanvasDockWidget *map3DWidget = new Qgs3DMapCanvasDockWidget( this );
mOpen3DDocks.insert( map3DWidget );
map3DWidget->setWindowTitle( name );
map3DWidget->mapCanvas3D()->setObjectName( name );
map3DWidget->setMainCanvas( mMapCanvas );
map3DWidget->mapCanvas3D()->setTemporalController( mTemporalControllerWidget->temporalController() );
map3DWidget->widget()->mapCanvas3D()->setObjectName( name );
map3DWidget->widget()->setMainCanvas( mMapCanvas );
map3DWidget->widget()->mapCanvas3D()->setTemporalController( mTemporalControllerWidget->temporalController() );

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

QString viewName = map3DWidget->mapCanvas3D()->objectName();
QString viewName = map3DWidget->widget()->mapCanvas3D()->objectName();
if ( !QgsProject::instance()->getViewsManager()->get3DViewSettings( viewName ).isNull() )
{
QDomElement elem3DMap;
Expand Down Expand Up @@ -14086,15 +14087,15 @@ void QgisApp::new3DMapCanvas()
disconnect( conn );
} );

dock->setMapSettings( map );
dock->widget()->setMapSettings( map );

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

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

QDomImplementation DomImplementation;
QDomDocumentType documentType =
Expand Down Expand Up @@ -16710,25 +16711,25 @@ void QgisApp::write3DMapViewSettings( Qgs3DMapCanvasDockWidget *w, QDomDocument
{
QgsReadWriteContext readWriteContext;
readWriteContext.setPathResolver( QgsProject::instance()->pathResolver() );
elem3DMap.setAttribute( QStringLiteral( "name" ), w->mapCanvas3D()->objectName() );
QDomElement elem3DMapSettings = w->mapCanvas3D()->map()->writeXml( doc, readWriteContext );
elem3DMap.setAttribute( QStringLiteral( "name" ), w->widget()->mapCanvas3D()->objectName() );
QDomElement elem3DMapSettings = w->widget()->mapCanvas3D()->map()->writeXml( doc, readWriteContext );
elem3DMap.appendChild( elem3DMapSettings );
QDomElement elemCamera = w->mapCanvas3D()->cameraController()->writeXml( doc );
QDomElement elemCamera = w->widget()->mapCanvas3D()->cameraController()->writeXml( doc );
elem3DMap.appendChild( elemCamera );
QDomElement elemAnimation = w->animationWidget()->animation().writeXml( doc );
QDomElement elemAnimation = w->widget()->animationWidget()->animation().writeXml( doc );
elem3DMap.appendChild( elemAnimation );

elem3DMap.setAttribute( QStringLiteral( "isDocked" ), w->isDocked() );

QgsDockWidget *dw = w->dockWidget();
if ( dw )
{
elem3DMap.setAttribute( QStringLiteral( "isDock" ), QStringLiteral( "1" ) );
writeDockWidgetSettings( dw, elem3DMap );
}

QDialog *d = w->dialog();
if ( d )
{
elem3DMap.setAttribute( QStringLiteral( "isDialog" ), QStringLiteral( "1" ) );
elem3DMap.setAttribute( QStringLiteral( "d_x" ), d->x() );
elem3DMap.setAttribute( QStringLiteral( "d_y" ), d->y() );
elem3DMap.setAttribute( QStringLiteral( "d_width" ), d->width() );
Expand Down Expand Up @@ -16769,20 +16770,20 @@ void QgisApp::read3DMapViewSettings( Qgs3DMapCanvasDockWidget *w, QDomElement &e
}
map->setOutputDpi( QgsApplication::desktop()->logicalDpiX() );

w->setMapSettings( map );
w->widget()->setMapSettings( map );

QDomElement elemCamera = elem3DMap.firstChildElement( QStringLiteral( "camera" ) );
if ( !elemCamera.isNull() )
{
w->mapCanvas3D()->cameraController()->readXml( elemCamera );
w->widget()->mapCanvas3D()->cameraController()->readXml( elemCamera );
}

QDomElement elemAnimation = elem3DMap.firstChildElement( QStringLiteral( "animation3d" ) );
if ( !elemAnimation.isNull() )
{
Qgs3DAnimationSettings animationSettings;
animationSettings.readXml( elemAnimation );
w->animationWidget()->setAnimation( animationSettings );
w->widget()->animationWidget()->setAnimation( animationSettings );
}

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

// QDialog *d = w->dialog();
// if ( d )
// {
// elem3DMap.setAttribute( QStringLiteral( "isDialog" ), QStringLiteral( "1" ) );
// elem3DMap.setAttribute( QStringLiteral( "d_x" ), d->x() );
// elem3DMap.setAttribute( QStringLiteral( "d_y" ), d->y() );
// elem3DMap.setAttribute( QStringLiteral( "d_width" ), d->width() );
// elem3DMap.setAttribute( QStringLiteral( "d_height" ), d->height() );
// }
QDialog *d = w->dialog();
if ( d )
{
int dx = elem3DMap.attribute( QStringLiteral( "d_x" ), "0" ).toInt();
int dy = elem3DMap.attribute( QStringLiteral( "d_x" ), "0" ).toInt();
int dw = elem3DMap.attribute( QStringLiteral( "d_width" ), "0" ).toInt();
int dh = elem3DMap.attribute( QStringLiteral( "d_height" ), "0" ).toInt();
d->setGeometry( dx, dy, dw, dh );
}

bool isDocked = elem3DMap.attribute( QStringLiteral( "isDocked" ), "1" ).toInt() == 1;
if ( !isDocked )
{
w->switchToWindowMode();
}
}
#endif

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

0 comments on commit 5b17f2d

Please sign in to comment.