Skip to content

Commit

Permalink
fix docking undocking
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem committed Jan 12, 2022
1 parent 3638da1 commit 122892d
Show file tree
Hide file tree
Showing 4 changed files with 259 additions and 42 deletions.
98 changes: 66 additions & 32 deletions src/app/3d/qgs3dmapcanvasdockwidget.cpp
Expand Up @@ -22,13 +22,39 @@
#include <QWidget>

Qgs3DMapCanvasDockWidget::Qgs3DMapCanvasDockWidget( QWidget *parent )
: QDialog( parent )
: QWidget( parent )
{
mCanvasWidget = new Qgs3DMapCanvasWidget( this );
mDock = new QgsDockWidget( this );
mDock->setWidget( mCanvasWidget );
mCanvasWidget = new Qgs3DMapCanvasWidget;

mDock = new QgsDockWidget( QgisApp::instance() );
mDock->setWidget( nullptr );
mDock->setAllowedAreas( Qt::AllDockWidgetAreas );

mDock->setVisible( false );

mDialog = new QDialog( QgisApp::instance(), Qt::Window );
QVBoxLayout *vl = new QVBoxLayout();
vl->setContentsMargins( 0, 0, 0, 0 );
mDialog->setLayout( vl );
mDialog->hide();

connect( mDock, &QgsDockWidget::closed, this, &Qgs3DMapCanvasDockWidget::closed );
connect( mDialog, &QDialog::finished, [ = ]()
{
emit this->closed();
} );

connect( mCanvasWidget, &Qgs3DMapCanvasWidget::toggleDockMode, this, &Qgs3DMapCanvasDockWidget::toggleDockMode );

mIsDocked = false;
switchToDockMode();
}

Qgs3DMapCanvasDockWidget::~Qgs3DMapCanvasDockWidget()
{
delete mCanvasWidget;
delete mDock;
delete mDialog;
}

void Qgs3DMapCanvasDockWidget::setMapSettings( Qgs3DMapSettings *map )
Expand Down Expand Up @@ -62,37 +88,45 @@ void Qgs3DMapCanvasDockWidget::toggleDockMode( bool docked )
if ( docked )
{
// going from window -> dock
if ( mDialog )
{
mDialog->setLayout( nullptr );
mDialog->deleteLater();
mDialog = nullptr;
}

mDock = new QgsDockWidget( QString(), QgisApp::instance() );
mDock->setWidget( mCanvasWidget );
connect( this, &QObject::destroyed, mDock, &QWidget::close );
QgisApp::instance()->addTabifiedDockWidget( Qt::BottomDockWidgetArea, mDock, QStringList(), true );
switchToDockMode();
}
else
{
// going from dock -> window
mDialog = new QDialog( QgisApp::instance(), Qt::Window );
mDialog->setAttribute( Qt::WA_DeleteOnClose );

QVBoxLayout *vl = new QVBoxLayout();
vl->setContentsMargins( 0, 0, 0, 0 );
vl->addWidget( mCanvasWidget );
mDialog->setLayout( vl );

if ( mDock )
{
mDock->setWidget( nullptr );
disconnect( this, &QObject::destroyed, mDock, &QWidget::close );
mDock->deleteLater();
mDock = nullptr;
}

mDialog->show();
switchToWindowMode();
}
}


void Qgs3DMapCanvasDockWidget::switchToWindowMode()
{
if ( !mIsDocked )
return;

mIsDocked = false;

mDialog->layout()->addWidget( mCanvasWidget );
mDock->setWidget( nullptr );

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

void Qgs3DMapCanvasDockWidget::switchToDockMode()
{
if ( mIsDocked )
return;

mIsDocked = true;

mDialog->layout()->removeWidget( mCanvasWidget );
mDock->setWidget( mCanvasWidget );

mDialog->hide();
mDock->setVisible( true );

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

131 changes: 131 additions & 0 deletions src/app/3d/qgs3dmapcanvasdockwidget.cpp.bom
@@ -0,0 +1,131 @@
/***************************************************************************
qgs3dmapcanvasdockwidget.cpp
--------------------------------------
Date : July 2017
Copyright : (C) 2017 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgs3dmapcanvasdockwidget.h"

#include "qgisapp.h"
#include "qgs3dmapcanvaswidget.h"
#include "qgsdockwidget.h"

#include <QWidget>

Qgs3DMapCanvasDockWidget::Qgs3DMapCanvasDockWidget( QWidget *parent )
: QWidget( parent )
{
mCanvasWidget = new Qgs3DMapCanvasWidget;

mDock = new QgsDockWidget( QgisApp::instance() );
mDock->setWidget( nullptr );
mDock->setAllowedAreas( Qt::AllDockWidgetAreas );

mDock->setVisible( false );

mDialog = new QDialog( QgisApp::instance(), Qt::Window );
QVBoxLayout *vl = new QVBoxLayout();
vl->setContentsMargins( 0, 0, 0, 0 );
mDialog->setLayout( vl );
mDialog->hide();

connect( mDock, &QgsDockWidget::closed, this, &Qgs3DMapCanvasDockWidget::closed );
connect( mDialog, &QDialog::finished, [=]() {
emit this->closed();
} );

connect( mCanvasWidget, &Qgs3DMapCanvasWidget::toggleDockMode, this, &Qgs3DMapCanvasDockWidget::toggleDockMode );

mIsDocked = false;
switchToDockMode();
}

Qgs3DMapCanvasDockWidget::~Qgs3DMapCanvasDockWidget()
{
delete mCanvasWidget;
delete mDock;
delete mDialog;
}

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

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

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

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

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

void Qgs3DMapCanvasDockWidget::toggleDockMode( bool docked )
{
// TODO: handle window/dock widget sizes and window titles
if ( docked )
{
// going from window -> dock
switchToDockMode();
}
else
{
// going from dock -> window
switchToWindowMode();
}
}


void Qgs3DMapCanvasDockWidget::switchToWindowMode()
{
if ( !mIsDocked )
return;

mIsDocked = false;

mDialog->layout()->addWidget( mCanvasWidget );
mDock->setWidget( nullptr );

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

void Qgs3DMapCanvasDockWidget::switchToDockMode()
{
if ( mIsDocked )
return;

mIsDocked = true;

mDialog->layout()->removeWidget( mCanvasWidget );
mDock->setWidget( mCanvasWidget );

mDialog->hide();
mDock->setVisible( true );

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

21 changes: 20 additions & 1 deletion src/app/3d/qgs3dmapcanvasdockwidget.h
Expand Up @@ -17,8 +17,10 @@
#define QGS3DMAPCANVASDOCKWIDGET_H

#include "qgis_app.h"
#include "qgsdockwidget.h"

#include <QDialog>
#include <QVBoxLayout>

#define SIP_NO_FILE

Expand All @@ -30,12 +32,14 @@ class QgsMapCanvas;
class Qgs3DMapCanvasWidget;
class QgsDockWidget;

class APP_EXPORT Qgs3DMapCanvasDockWidget : public QDialog
class APP_EXPORT Qgs3DMapCanvasDockWidget : public QWidget
{
Q_OBJECT
public:
Qgs3DMapCanvasDockWidget( QWidget *parent = nullptr );

~Qgs3DMapCanvasDockWidget();

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

Expand All @@ -47,13 +51,28 @@ class APP_EXPORT Qgs3DMapCanvasDockWidget : public QDialog
Qgs3DMapToolMeasureLine *measurementLineTool();

QgsDockWidget *dockWidget() { return mDock; }

QDialog *dialog() { return mDialog; }

signals:
void closed();

private slots:
void toggleDockMode( bool docked );

private:
void switchToWindowMode();

void switchToDockMode();

private:
bool mIsDocked = true;
Qgs3DMapCanvasWidget *mCanvasWidget = nullptr;

QgsDockWidget *mDock = nullptr;

QDialog *mDialog = nullptr;
QVBoxLayout *mDialogLayout = nullptr;
};

#endif // QGS3DMAPCANVASDOCKWIDGET_H

0 comments on commit 122892d

Please sign in to comment.