#4263 Fix saving of MDI window geometry without unmaximizing the window before saving

This commit is contained in:
Gaute Lindkvist
2019-03-29 12:00:29 +01:00
parent 22e0ab853b
commit 5695b8ada7
9 changed files with 84 additions and 84 deletions

View File

@@ -23,8 +23,9 @@
#include "cafPdmField.h" #include "cafPdmField.h"
class RimViewWindow;
class RiuMainWindowBase; class RiuMainWindowBase;
class RiuMdiSubWindow;
class RimViewWindow;
struct RimMdiWindowGeometry; struct RimMdiWindowGeometry;
//================================================================================================== //==================================================================================================
@@ -50,6 +51,7 @@ protected:
RimViewWindow* viewPdmObject(); RimViewWindow* viewPdmObject();
QWidget* viewWidget(); QWidget* viewWidget();
RiuMdiSubWindow* viewSubWindow();
RiuMainWindowBase* getMainWindow(); RiuMainWindowBase* getMainWindow();
// Overridden PDM methods // Overridden PDM methods

View File

@@ -1982,21 +1982,6 @@ void RiuMainWindow::customMenuRequested(const QPoint& pos)
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMdiWindowGeometry RiuMainWindow::windowGeometryForViewer(QWidget* viewer)
{
QMdiSubWindow* mdiWindow = findMdiSubWindow(viewer);
if (mdiWindow)
{
return RiuMdiSubWindow::windowGeometryForWidget(mdiWindow);
}
RimMdiWindowGeometry geo;
return geo;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -110,11 +110,9 @@ public:
void setExpanded(const caf::PdmUiItem* uiItem, bool expanded = true); void setExpanded(const caf::PdmUiItem* uiItem, bool expanded = true);
RimMdiWindowGeometry windowGeometryForViewer(QWidget* viewer) override;
void tileWindows(); void tileWindows();
bool isAnyMdiSubWindowVisible(); bool isAnyMdiSubWindowVisible();
QMdiSubWindow* findMdiSubWindow(QWidget* viewer); QMdiSubWindow* findMdiSubWindow(QWidget* viewer) override;
RimViewWindow* findViewWindowFromSubWindow(QMdiSubWindow* lhs); RimViewWindow* findViewWindowFromSubWindow(QMdiSubWindow* lhs);
QList<QMdiSubWindow*> subWindowList(QMdiArea::WindowOrder order); QList<QMdiSubWindow*> subWindowList(QMdiArea::WindowOrder order);

View File

@@ -41,6 +41,21 @@ RiuMainWindowBase::RiuMainWindowBase()
setDockNestingEnabled(true); setDockNestingEnabled(true);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMdiWindowGeometry RiuMainWindowBase::windowGeometryForViewer(QWidget* viewer)
{
RiuMdiSubWindow* mdiWindow = dynamic_cast<RiuMdiSubWindow*>(findMdiSubWindow(viewer));
if (mdiWindow)
{
return mdiWindow->windowGeometry();
}
RimMdiWindowGeometry geo;
return geo;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -30,6 +30,7 @@ namespace caf
} }
class QMdiArea; class QMdiArea;
class QMdiSubWindow;
//================================================================================================== //==================================================================================================
@@ -48,8 +49,9 @@ public:
virtual void addViewer(QWidget* viewer, const RimMdiWindowGeometry& windowsGeometry)= 0; virtual void addViewer(QWidget* viewer, const RimMdiWindowGeometry& windowsGeometry)= 0;
virtual void setActiveViewer(QWidget* subWindow) = 0; virtual void setActiveViewer(QWidget* subWindow) = 0;
virtual RimMdiWindowGeometry windowGeometryForViewer(QWidget* viewer) = 0; virtual QMdiSubWindow* findMdiSubWindow(QWidget* viewer) = 0;
RimMdiWindowGeometry windowGeometryForViewer(QWidget* viewer);
void loadWinGeoAndDockToolBarLayout(); void loadWinGeoAndDockToolBarLayout();
void saveWinGeoAndDockToolBarLayout(); void saveWinGeoAndDockToolBarLayout();
void showWindow(); void showWindow();

View File

@@ -29,11 +29,16 @@
#include "RiuViewer.h" #include "RiuViewer.h"
#include "RiuWellLogPlot.h" #include "RiuWellLogPlot.h"
#include <QWindowStateChangeEvent>
#include <QDebug>
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RiuMdiSubWindow::RiuMdiSubWindow(QWidget* parent /*= 0*/, Qt::WindowFlags flags /*= 0*/) RiuMdiSubWindow::RiuMdiSubWindow(QWidget* parent /*= 0*/, Qt::WindowFlags flags /*= 0*/)
: QMdiSubWindow(parent, flags) : QMdiSubWindow(parent, flags)
, m_normalWindowGeometry(QRect())
{ {
} }
@@ -45,6 +50,38 @@ RiuMdiSubWindow::~RiuMdiSubWindow()
RiuMainWindow::instance()->slotRefreshViewActions(); RiuMainWindow::instance()->slotRefreshViewActions();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMdiWindowGeometry RiuMdiSubWindow::windowGeometry() const
{
RimMdiWindowGeometry geo;
int mainWinID = 0;
if (window() == RiaApplication::instance()->mainPlotWindow())
{
mainWinID = 1;
}
geo.mainWindowID = mainWinID;
geo.isMaximized = isMaximized();
// Save normal/non-maximized size and position so this can be restored
QRect currentGeometry = frameGeometry();
if (isMaximized() && !m_normalWindowGeometry.isNull())
{
currentGeometry = m_normalWindowGeometry;
}
geo.x = currentGeometry.topLeft().x();
geo.y = currentGeometry.topLeft().y();
geo.width = currentGeometry.width();
geo.height = currentGeometry.height();
return geo;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -55,14 +92,14 @@ void RiuMdiSubWindow::closeEvent(QCloseEvent* event)
RimViewWindow* viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget(mainWidget); RimViewWindow* viewWindow = RiuInterfaceToViewWindow::viewWindowFromWidget(mainWidget);
if (viewWindow) if (viewWindow)
{ {
viewWindow->setMdiWindowGeometry(windowGeometryForWidget(this)); viewWindow->setMdiWindowGeometry(windowGeometry());
} }
else else
{ {
RiuViewer* viewer = mainWidget->findChild<RiuViewer*>(); RiuViewer* viewer = mainWidget->findChild<RiuViewer*>();
if (viewer) if (viewer)
{ {
viewer->ownerReservoirView()->setMdiWindowGeometry(windowGeometryForWidget(this)); viewer->ownerReservoirView()->setMdiWindowGeometry(windowGeometry());
} }
} }
QMdiSubWindow::closeEvent(event); QMdiSubWindow::closeEvent(event);
@@ -71,50 +108,23 @@ void RiuMdiSubWindow::closeEvent(QCloseEvent* event)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimMdiWindowGeometry RiuMdiSubWindow::windowGeometryForWidget(QWidget* widget) void RiuMdiSubWindow::resizeEvent(QResizeEvent* resizeEvent)
{ {
RimMdiWindowGeometry geo; if (!isMaximized())
if (widget)
{ {
// Find topmost parent m_normalWindowGeometry = frameGeometry();
QWidget* nextParent = widget->parentWidget();
QWidget* parent = nullptr;
while (nextParent)
{
parent = nextParent;
nextParent = nextParent->parentWidget();
} }
QMdiSubWindow::resizeEvent(resizeEvent);
int mainWinID = 0; }
if (parent)
{ //--------------------------------------------------------------------------------------------------
if (parent == RiaApplication::instance()->mainPlotWindow()) ///
{ //--------------------------------------------------------------------------------------------------
mainWinID = 1; void RiuMdiSubWindow::moveEvent(QMoveEvent* moveEvent)
} {
} if (!isMaximized())
{
geo.mainWindowID = mainWinID; m_normalWindowGeometry = frameGeometry();
bool isMaximized = widget->isMaximized(); }
QMdiSubWindow::moveEvent(moveEvent);
if (isMaximized)
{
// Temporarily set to normal to be able to store normal window size
widget->showNormal();
}
geo.x = widget->pos().x();
geo.y = widget->pos().y();
geo.width = widget->size().width();
geo.height = widget->size().height();
geo.isMaximized = isMaximized;
if (isMaximized)
{
widget->showMaximized();
}
}
return geo;
} }

View File

@@ -29,9 +29,14 @@ public:
~RiuMdiSubWindow() override; ~RiuMdiSubWindow() override;
static RimMdiWindowGeometry windowGeometryForWidget(QWidget* widget); RimMdiWindowGeometry windowGeometry() const;
protected: protected:
void closeEvent(QCloseEvent* event) override; void closeEvent(QCloseEvent* event) override;
void resizeEvent(QResizeEvent* resizeEvent) override;
void moveEvent(QMoveEvent *moveEvent) override;
private:
QRect m_normalWindowGeometry;
}; };

View File

@@ -839,20 +839,6 @@ void RiuPlotMainWindow::customMenuRequested(const QPoint& pos)
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMdiWindowGeometry RiuPlotMainWindow::windowGeometryForViewer(QWidget* viewer)
{
QMdiSubWindow* mdiWindow = findMdiSubWindow(viewer);
if (mdiWindow)
{
return RiuMdiSubWindow::windowGeometryForWidget(mdiWindow);
}
RimMdiWindowGeometry geo;
return geo;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -69,12 +69,9 @@ public:
void setDefaultWindowSize(); void setDefaultWindowSize();
RimMdiWindowGeometry windowGeometryForViewer(QWidget* viewer) override;
void tileWindows(); void tileWindows();
bool isAnyMdiSubWindowVisible(); bool isAnyMdiSubWindowVisible();
QMdiSubWindow* findMdiSubWindow(QWidget* viewer); QMdiSubWindow* findMdiSubWindow(QWidget* viewer) override;
QList<QMdiSubWindow*> subWindowList(QMdiArea::WindowOrder order); QList<QMdiSubWindow*> subWindowList(QMdiArea::WindowOrder order);
void setWidthOfMdiWindow(QWidget* mdiWindowWidget, int newWidth); void setWidthOfMdiWindow(QWidget* mdiWindowWidget, int newWidth);