From 97baff4e0f9b8111cd13539abbe9697e2aec07e8 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 26 Apr 2018 19:52:27 +0200 Subject: [PATCH] #2798 Dock Widgets : Add RiuDockWidgetTools --- .../UserInterface/CMakeLists_files.cmake | 2 + .../UserInterface/RiuDockWidgetTools.cpp | 290 ++++++++++++++++++ .../UserInterface/RiuDockWidgetTools.h | 74 +++++ 3 files changed, 366 insertions(+) create mode 100644 ApplicationCode/UserInterface/RiuDockWidgetTools.cpp create mode 100644 ApplicationCode/UserInterface/RiuDockWidgetTools.h diff --git a/ApplicationCode/UserInterface/CMakeLists_files.cmake b/ApplicationCode/UserInterface/CMakeLists_files.cmake index 5c12f75e59..0ea3d2d894 100644 --- a/ApplicationCode/UserInterface/CMakeLists_files.cmake +++ b/ApplicationCode/UserInterface/CMakeLists_files.cmake @@ -69,6 +69,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiuTools.h ${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.h ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindowTools.h ${CMAKE_CURRENT_LIST_DIR}/Riu3DMainWindowTools.h +${CMAKE_CURRENT_LIST_DIR}/RiuDockWidgetTools.h ) set (SOURCE_GROUP_SOURCE_FILES @@ -138,6 +139,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiuTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.cpp ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindowTools.cpp ${CMAKE_CURRENT_LIST_DIR}/Riu3DMainWindowTools.cpp +${CMAKE_CURRENT_LIST_DIR}/RiuDockWidgetTools.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/UserInterface/RiuDockWidgetTools.cpp b/ApplicationCode/UserInterface/RiuDockWidgetTools.cpp new file mode 100644 index 0000000000..36dc01aff6 --- /dev/null +++ b/ApplicationCode/UserInterface/RiuDockWidgetTools.cpp @@ -0,0 +1,290 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2018 Statoil ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiuDockWidgetTools.h" + +#include "RimEclipseView.h" +#include "RimGeoMechView.h" + +#include "RiuMainWindow.h" + +#include "cvfAssert.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuDockWidgetTools::RiuDockWidgetTools() +{ + loadDockWidgetsState(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuDockWidgetTools* RiuDockWidgetTools::instance() +{ + static RiuDockWidgetTools staticInstance; + + return &staticInstance; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::projectTreeName() const +{ + return "dockProjectTree"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::propertyEditorName() const +{ + return "dockpropertyEditor"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::resultInfoName() const +{ + return "dockResultInfo"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::processMonitorName() const +{ + return "dockProcessMonitor"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::resultPlotName() const +{ + return "dockResultPlot"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::relPermPlotName() const +{ + return "dockRelPermPlot"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::pvtPlotName() const +{ + return "dockPvtPlot"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::mohrsCirclePlotName() const +{ + return "dockMohrsCirclePlot"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiuDockWidgetTools::messagesName() const +{ + return "dockMessages"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QDockWidget* RiuDockWidgetTools::findDockWidget(const QObject* parent, const QString& dockWidgetName) +{ + QList dockWidgets = parent->findChildren(); + + for (QDockWidget* dock : dockWidgets) + { + if (dock->objectName() == dockWidgetName) + { + return dock; + } + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QAction* RiuDockWidgetTools::toggleActionForWidget(const QObject* parent, const QString& dockWidgetName) +{ + auto w = RiuDockWidgetTools::findDockWidget(parent, dockWidgetName); + CVF_ASSERT(w); + + return w->toggleViewAction(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::setVisibleDockingWindowsForEclipse() +{ + RiuMainWindow* mainWindow = RiuMainWindow::instance(); + + { + QDockWidget* dockWidget = findDockWidget(mainWindow, RiuDockWidgetTools::mohrsCirclePlotName()); + if (dockWidget) + { + dockWidget->hide(); + } + } + + RiuDockWidgetTools::instance()->trySetDockWidgetVisibility(mainWindow, RiuDockWidgetTools::relPermPlotName(), true); + RiuDockWidgetTools::instance()->trySetDockWidgetVisibility(mainWindow, RiuDockWidgetTools::pvtPlotName(), true); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::setVisibleDockingWindowsForGeoMech() +{ + RiuMainWindow* mainWindow = RiuMainWindow::instance(); + + RiuDockWidgetTools::instance()->trySetDockWidgetVisibility(mainWindow, RiuDockWidgetTools::mohrsCirclePlotName(), false); + + { + QDockWidget* dockWidget = findDockWidget(mainWindow, RiuDockWidgetTools::relPermPlotName()); + if (dockWidget) + { + dockWidget->hide(); + } + } + + { + QDockWidget* dockWidget = findDockWidget(mainWindow, RiuDockWidgetTools::pvtPlotName()); + if (dockWidget) + { + dockWidget->hide(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::trySetDockWidgetVisibility(const QObject* parent, const QString& dockWidgetName, bool isVisible) +{ + QDockWidget* dockWidget = findDockWidget(parent, dockWidgetName); + if (dockWidget) + { + bool unifiedIsVisible = isVisible; + + auto state = visibilityForWidget(dockWidgetName); + if (state != RiuDockWidgetTools::USER_DEFINED_UNKNOWN) + { + if (state == RiuDockWidgetTools::USER_DEFINED_ON) + { + unifiedIsVisible = true; + } + else if (state == RiuDockWidgetTools::USER_DEFINED_OFF) + { + unifiedIsVisible = false; + } + } + + dockWidget->setVisible(unifiedIsVisible); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuDockWidgetTools::UserDefinedVisibility RiuDockWidgetTools::visibilityForWidget(const QString& objectName) +{ + RiuDockWidgetTools::UserDefinedVisibility visibility = USER_DEFINED_UNKNOWN; + + auto windowStateIt = m_userDefinedDockWidgetVisibility.find(objectName); + if (windowStateIt != m_userDefinedDockWidgetVisibility.end()) + { + bool isVisible = windowStateIt.value().toBool(); + if (isVisible) + { + visibility = USER_DEFINED_ON; + } + else + { + visibility = USER_DEFINED_OFF; + } + } + + return visibility; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::setDockWidgetVisibility(const QString& dockingWindowName, bool isVisible) +{ + m_userDefinedDockWidgetVisibility[dockingWindowName] = isVisible; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::loadDockWidgetsState() +{ + // Company and appname set through QCoreApplication + QSettings settings; + + m_userDefinedDockWidgetVisibility = settings.value("dockWindowStates").toMap(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::saveDockWidgetsState() +{ + // Company and appname set through QCoreApplication + QSettings settings; + + QVariant v(m_userDefinedDockWidgetVisibility); + settings.setValue("dockWindowStates", v); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuDockWidgetTools::changeDockWidgetVisibilityBasedOnView(Rim3dView* view) +{ + if (dynamic_cast(view)) + { + setVisibleDockingWindowsForEclipse(); + } + else if (dynamic_cast(view)) + { + setVisibleDockingWindowsForGeoMech(); + } +} diff --git a/ApplicationCode/UserInterface/RiuDockWidgetTools.h b/ApplicationCode/UserInterface/RiuDockWidgetTools.h new file mode 100644 index 0000000000..7e071d67e4 --- /dev/null +++ b/ApplicationCode/UserInterface/RiuDockWidgetTools.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2018 Statoil ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include + +class QDockWidget; +class QObject; +class QAction; + +class Rim3dView; + +//================================================================================================== +// +// +// +//================================================================================================== +class RiuDockWidgetTools +{ +public: + static RiuDockWidgetTools* instance(); + + QString projectTreeName() const; + QString propertyEditorName() const; + QString resultInfoName() const; + QString processMonitorName() const; + QString resultPlotName() const; + QString relPermPlotName() const; + QString pvtPlotName() const; + QString messagesName() const; + QString mohrsCirclePlotName() const; + + QAction* toggleActionForWidget(const QObject* parent, const QString& dockWidgetName); + void setDockWidgetVisibility(const QString& dockWidgetName, bool isVisible); + void changeDockWidgetVisibilityBasedOnView(Rim3dView* view); + void saveDockWidgetsState(); + +private: + enum UserDefinedVisibility + { + USER_DEFINED_ON, + USER_DEFINED_OFF, + USER_DEFINED_UNKNOWN + }; + + RiuDockWidgetTools(); + void setVisibleDockingWindowsForEclipse(); + void setVisibleDockingWindowsForGeoMech(); + void loadDockWidgetsState(); + UserDefinedVisibility visibilityForWidget(const QString& dockWidgetName); + static QDockWidget* findDockWidget(const QObject* parent, const QString& dockWidgetName); + void trySetDockWidgetVisibility(const QObject* parent, const QString& dockWidgetName, bool isVisible); + +private: + QMap m_userDefinedDockWidgetVisibility; +};