Skip to content

Commit

Permalink
address Martin reviews
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem committed Jan 18, 2022
1 parent 6c9517d commit c10885a
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 47 deletions.
21 changes: 7 additions & 14 deletions src/app/3d/qgs3dmapcanvaswidget.cpp
Expand Up @@ -135,16 +135,6 @@ Qgs3DMapCanvasWidget::Qgs3DMapCanvasWidget( const QString &name, bool isDocked )

toolBar->addWidget( mBtnOptions );

mDockUnDockBtn = new QToolButton;
mDockUnDockBtn->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mDockify.svg" ) ) );
mDockUnDockBtn->setToolTip( tr( "Dock 3D Map View" ) );
mDockUnDockBtn->setCheckable( true );
mDockUnDockBtn->setChecked( isDocked );
mDockUnDockBtn->setEnabled( true );
connect( mDockUnDockBtn, &QToolButton::toggled, this, &Qgs3DMapCanvasWidget::toggleDockModeRequested );

toolBar->addWidget( mDockUnDockBtn );

mActionEnableShadows = new QAction( tr( "Show Shadows" ), this );
mActionEnableShadows->setCheckable( true );
connect( mActionEnableShadows, &QAction::toggled, this, [ = ]( bool enabled )
Expand Down Expand Up @@ -222,17 +212,20 @@ Qgs3DMapCanvasWidget::Qgs3DMapCanvasWidget( const QString &name, bool isDocked )
layout->addWidget( mCanvas );
layout->addWidget( mAnimationWidget );

this->setLayout( layout );
setLayout( layout );

onTotalPendingJobsCountChanged();

mDockableWidget = new QgsDockableWidgetHelper( isDocked, mCanvasName, this );
connect( this, &Qgs3DMapCanvasWidget::toggleDockModeRequested, mDockableWidget, &QgsDockableWidgetHelper::toggleDockMode );
mDockableWidget = new QgsDockableWidgetHelper( isDocked, mCanvasName, this, QgisApp::instance() );
toolBar->addWidget( mDockableWidget->toggleButton() );
connect( mDockableWidget, &QgsDockableWidgetHelper::closed, [ = ]()
{
QgisApp::instance()->close3DMapView( canvasName() );
} );
}

Qgs3DMapCanvasWidget::~Qgs3DMapCanvasWidget()
{
this->setParent( QgisApp::instance() );
mDockableWidget->setWidget( nullptr );
delete mDockableWidget;
}
Expand Down
3 changes: 1 addition & 2 deletions src/app/3d/qgs3dmapcanvaswidget.h
Expand Up @@ -52,7 +52,7 @@ class APP_EXPORT Qgs3DMapCanvasWidget : public QWidget

Qgs3DMapToolMeasureLine *measurementLineTool() { return mMapToolMeasureLine; }

QgsDockableWidgetHelper *dockableWidget() { return mDockableWidget; }
QgsDockableWidgetHelper *dockableWidgetHelper() { return mDockableWidget; }

void setCanvasName( const QString &name );
QString canvasName() const { return mCanvasName; }
Expand Down Expand Up @@ -100,7 +100,6 @@ class APP_EXPORT Qgs3DMapCanvasWidget : public QWidget
QAction *mActionEnableShadows = nullptr;
QAction *mActionEnableEyeDome = nullptr;
QToolButton *mBtnOptions = nullptr;
QToolButton *mDockUnDockBtn = nullptr;
QgsDockableWidgetHelper *mDockableWidget = nullptr;
};

Expand Down
8 changes: 4 additions & 4 deletions src/app/qgisapp.cpp
Expand Up @@ -9949,7 +9949,7 @@ void QgisApp::close3DMapView( const QString &viewName )
QgsProject::instance()->viewsManager()->register3DViewSettings( viewName, elem3DMap );
QgsProject::instance()->viewsManager()->set3DViewInitiallyVisible( viewName, false );
}
delete widget;
widget->deleteLater();
#else
Q_UNUSED( viewName );
#endif
Expand Down Expand Up @@ -16706,7 +16706,7 @@ void QgisApp::write3DMapViewSettings( Qgs3DMapCanvasWidget *widget, QDomDocument
QDomElement elemAnimation = widget->animationWidget()->animation().writeXml( doc );
elem3DMap.appendChild( elemAnimation );

QgsDockableWidgetHelper *w = widget->dockableWidget();
QgsDockableWidgetHelper *w = widget->dockableWidgetHelper();
elem3DMap.setAttribute( QStringLiteral( "isDocked" ), w->isDocked() );

QRect dockGeom = w->dockGeometry();
Expand Down Expand Up @@ -16773,7 +16773,7 @@ void QgisApp::read3DMapViewSettings( Qgs3DMapCanvasWidget *widget, QDomElement &
int dy = elem3DMap.attribute( QStringLiteral( "d_x" ), "0" ).toInt();
int dw = elem3DMap.attribute( QStringLiteral( "d_width" ), "200" ).toInt();
int dh = elem3DMap.attribute( QStringLiteral( "d_height" ), "200" ).toInt();
widget->dockableWidget()->setDialogGeometry( QRect( dx, dy, dw, dh ) );
widget->dockableWidgetHelper()->setDialogGeometry( QRect( dx, dy, dw, dh ) );
}

{
Expand All @@ -16784,7 +16784,7 @@ void QgisApp::read3DMapViewSettings( Qgs3DMapCanvasWidget *widget, QDomElement &
bool floating = elem3DMap.attribute( QStringLiteral( "floating" ), QStringLiteral( "0" ) ).toInt();
Qt::DockWidgetArea area = static_cast< Qt::DockWidgetArea >( elem3DMap.attribute( QStringLiteral( "area" ), QString::number( Qt::RightDockWidgetArea ) ).toInt() );

widget->dockableWidget()->setDockGeometry( QRect( x, y, w, h ), floating, area );
widget->dockableWidgetHelper()->setDockGeometry( QRect( x, y, w, h ), floating, area );
}
}
#endif
Expand Down
58 changes: 34 additions & 24 deletions src/app/qgsdockablewidgethelper.cpp
Expand Up @@ -15,21 +15,27 @@

#include "qgsdockablewidgethelper.h"

#include "qgisapp.h"
#include "qgsdockwidget.h"
#include "qgsapplication.h"

#include <QWidget>

QgsDockableWidgetHelper::QgsDockableWidgetHelper( bool isDocked, const QString &windowTitle, QWidget *widget )
QgsDockableWidgetHelper::QgsDockableWidgetHelper( bool isDocked, const QString &windowTitle, QWidget *widget, QMainWindow *ownerWindow )
: QObject( nullptr )
, mWidget( widget )
, mDialogGeometry( 0, 0, 200, 200 )
, mDockGeometry( QRect() )
, mIsDockFloating( true )
, mWindowTitle( windowTitle )
, mDockArea( Qt::RightDockWidgetArea )
, mWindowTitle( windowTitle )
, mOwnerWindow( ownerWindow )
{
toggleDockMode( isDocked );
mToggleButton.setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mDockify.svg" ) ) );
mToggleButton.setToolTip( tr( "Dock 3D Map View" ) );
mToggleButton.setCheckable( true );
mToggleButton.setChecked( isDocked );
mToggleButton.setEnabled( true );

connect( &mToggleButton, &QToolButton::toggled, this, &QgsDockableWidgetHelper::toggleDockMode );
}

QgsDockableWidgetHelper::~QgsDockableWidgetHelper()
Expand All @@ -38,11 +44,11 @@ QgsDockableWidgetHelper::~QgsDockableWidgetHelper()
{
mDockGeometry = mDock->geometry();
mIsDockFloating = mDock->isFloating();
mDockArea = QgisApp::instance()->dockWidgetArea( mDock );
mDockArea = mOwnerWindow->dockWidgetArea( mDock );

mDock->setWidget( nullptr );
QgisApp::instance()->removeDockWidget( mDock );
delete mDock;
mOwnerWindow->removeDockWidget( mDock );
mDock->deleteLater();
mDock = nullptr;
}

Expand All @@ -51,7 +57,7 @@ QgsDockableWidgetHelper::~QgsDockableWidgetHelper()
mDialogGeometry = mDialog->geometry();

mDialog->layout()->removeWidget( mWidget );
delete mDialog;
mDialog->deleteLater();
mDialog = nullptr;
}
}
Expand All @@ -61,7 +67,7 @@ void QgsDockableWidgetHelper::setWidget( QWidget *widget )
// Make sure the old mWidget is not stuck as a child of mDialog or mDock
if ( mWidget )
{
mWidget->setParent( QgisApp::instance() );
mWidget->setParent( mOwnerWindow );
}
if ( mDialog )
{
Expand All @@ -86,18 +92,18 @@ void QgsDockableWidgetHelper::toggleDockMode( bool docked )
// Make sure the old mWidget is not stuck as a child of mDialog or mDock
if ( mWidget )
{
mWidget->setParent( QgisApp::instance() );
mWidget->setParent( mOwnerWindow );
}

// Remove both the dialog and the dock widget first
if ( mDock )
{
mDockGeometry = mDock->geometry();
mIsDockFloating = mDock->isFloating();
mDockArea = QgisApp::instance()->dockWidgetArea( mDock );
mDockArea = mOwnerWindow->dockWidgetArea( mDock );

mDock->setWidget( nullptr );
QgisApp::instance()->removeDockWidget( mDock );
mOwnerWindow->removeDockWidget( mDock );
delete mDock;
mDock = nullptr;
}
Expand All @@ -120,7 +126,7 @@ void QgsDockableWidgetHelper::toggleDockMode( bool docked )
if ( docked )
{
// going from window -> dock
mDock = new QgsDockWidget( QgisApp::instance() );
mDock = new QgsDockWidget( mOwnerWindow );
mDock->setWindowTitle( mWindowTitle );
mDock->setWidget( mWidget );
setupDockWidget();
Expand All @@ -129,14 +135,14 @@ void QgsDockableWidgetHelper::toggleDockMode( bool docked )
{
mDockGeometry = mDock->geometry();
mIsDockFloating = mDock->isFloating();
mDockArea = QgisApp::instance()->dockWidgetArea( mDock );
QgisApp::instance()->close3DMapView( windowTitle() );
mDockArea = mOwnerWindow->dockWidgetArea( mDock );
emit closed();
} );
}
else
{
// going from dock -> window
mDialog = new QDialog( QgisApp::instance(), Qt::Window );
mDialog = new QDialog( mOwnerWindow, Qt::Window );

mDialog->setWindowTitle( mWindowTitle );
QVBoxLayout *vl = new QVBoxLayout();
Expand All @@ -149,7 +155,7 @@ void QgsDockableWidgetHelper::toggleDockMode( bool docked )
connect( mDialog, &QDialog::finished, [ = ]()
{
mDialogGeometry = mDialog->geometry();
QgisApp::instance()->close3DMapView( windowTitle() );
emit closed();
} );

mDialog->setGeometry( mDialogGeometry );
Expand All @@ -159,7 +165,6 @@ void QgsDockableWidgetHelper::toggleDockMode( bool docked )
void QgsDockableWidgetHelper::setWindowTitle( const QString &title )
{
mWindowTitle = title;
qDebug() << __PRETTY_FUNCTION__ << title;
if ( mDialog )
{
mDialog->setWindowTitle( title );
Expand Down Expand Up @@ -211,7 +216,7 @@ bool QgsDockableWidgetHelper::isDockFloating() const
Qt::DockWidgetArea QgsDockableWidgetHelper::dockFloatingArea() const
{
if ( mDock )
return QgisApp::instance()->dockWidgetArea( mDock );
return mOwnerWindow->dockWidgetArea( mDock );
return mDockArea;
}

Expand All @@ -224,23 +229,28 @@ void QgsDockableWidgetHelper::setupDockWidget()
{
// try to guess a nice initial placement for view - about 3/4 along, half way down
mDock->setGeometry( QRect( static_cast< int >( mWidget->rect().width() * 0.75 ), static_cast< int >( mWidget->rect().height() * 0.5 ), 400, 400 ) );
QgisApp::instance()->addDockWidget( mDockArea, mDock );
mOwnerWindow->addDockWidget( mDockArea, mDock );
}
else
{
if ( !mIsDockFloating )
{
// ugly hack, but only way to set dock size correctly for Qt < 5.6
mDock->setFixedSize( mDockGeometry.size() );
QgisApp::instance()->addDockWidget( mDockArea, mDock );
mOwnerWindow->addDockWidget( mDockArea, mDock );
mDock->resize( mDockGeometry.size() );
// QgsApplication::processEvents(); // required!
QgsApplication::processEvents(); // required!
mDock->setFixedSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX );
}
else
{
mDock->setGeometry( mDockGeometry );
QgisApp::instance()->addDockWidget( mDockArea, mDock );
mOwnerWindow->addDockWidget( mDockArea, mDock );
}
}
}

QToolButton *QgsDockableWidgetHelper::toggleButton()
{
return &mToggleButton;
}
17 changes: 14 additions & 3 deletions src/app/qgsdockablewidgethelper.h
Expand Up @@ -17,20 +17,27 @@
#define QGSDOCKABLEWIDGETHELPER_H

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

#include <QDialog>
#include <QVBoxLayout>
#include <QToolButton>
#include <QMainWindow>

#define SIP_NO_FILE

class QgsDockWidget;

/**
* This class is responible of displaying a QWidget inside a dialog or a dock widget (only one of the 2 is alive at most).
* The widget is not owned by this class and its ownership is passed to the owner window before this class's object is deleted or
* another widget is set using setWidget() function
*
* \since QGIS 3.24
*/
class APP_EXPORT QgsDockableWidgetHelper : public QObject
{
Q_OBJECT
public:
QgsDockableWidgetHelper( bool isDocked, const QString &windowTitle, QWidget *widget );
QgsDockableWidgetHelper( bool isDocked, const QString &windowTitle, QWidget *widget, QMainWindow *ownerWindow );
~QgsDockableWidgetHelper();

void setWidget( QWidget *widget );
Expand All @@ -54,6 +61,8 @@ class APP_EXPORT QgsDockableWidgetHelper : public QObject
bool isDockFloating() const;
Qt::DockWidgetArea dockFloatingArea() const;

QToolButton *toggleButton();

signals:
void closed();

Expand All @@ -75,6 +84,8 @@ class APP_EXPORT QgsDockableWidgetHelper : public QObject
Qt::DockWidgetArea mDockArea;

QString mWindowTitle;
QToolButton mToggleButton;
QMainWindow *mOwnerWindow;
};

#endif // QGSDOCKABLEWIDGETHELPER_H

0 comments on commit c10885a

Please sign in to comment.