From 3acf085b9235594a52b86ed50da74d90737f0f9b Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 31 Oct 2015 01:17:09 +0100 Subject: [PATCH] refs #477, allow to detect an invisible dock widget parent by using CEnableForDockWidgetInfoArea for the view base (by that I can tell if the parent dock widget is visible) --- src/blackgui/components/enablefordockwidgetinfoarea.cpp | 8 +++++++- src/blackgui/components/enablefordockwidgetinfoarea.h | 5 ++++- src/blackgui/dockwidgetinfoarea.cpp | 4 ---- src/blackgui/dockwidgetinfoarea.h | 1 - src/blackgui/views/viewbase.cpp | 5 +++++ src/blackgui/views/viewbase.h | 4 +++- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/blackgui/components/enablefordockwidgetinfoarea.cpp b/src/blackgui/components/enablefordockwidgetinfoarea.cpp index 9222a06c9..1a978d6e2 100644 --- a/src/blackgui/components/enablefordockwidgetinfoarea.cpp +++ b/src/blackgui/components/enablefordockwidgetinfoarea.cpp @@ -9,6 +9,7 @@ #include "enablefordockwidgetinfoarea.h" #include "blackgui/guiutility.h" +#include using namespace BlackGui; @@ -16,7 +17,6 @@ namespace BlackGui { namespace Components { - CEnableForDockWidgetInfoArea::CEnableForDockWidgetInfoArea(CDockWidgetInfoArea *parentInfoArea) { // it the parent is already an info area at this time, we keep it @@ -36,6 +36,12 @@ namespace BlackGui } m_parentDockableInfoArea = parentDockableWidget; + QMetaObject::Connection con = QDockWidget::connect(parentDockableWidget, &QDockWidget::destroyed, [this] + { + // break dependency to dockable widget + this->m_parentDockableInfoArea = nullptr; + }); + Q_ASSERT_X(con, Q_FUNC_INFO, "Connection failed"); return true; } diff --git a/src/blackgui/components/enablefordockwidgetinfoarea.h b/src/blackgui/components/enablefordockwidgetinfoarea.h index d7270f094..2ec7af859 100644 --- a/src/blackgui/components/enablefordockwidgetinfoarea.h +++ b/src/blackgui/components/enablefordockwidgetinfoarea.h @@ -16,13 +16,13 @@ #include "blackgui/dockwidgetinfoarea.h" #include "blackgui/infoarea.h" #include "blackgui/enableforframelesswindow.h" +#include "blackmisc/qtconnectionlist.h" #include namespace BlackGui { namespace Components { - //! Helper class: If a component is residing in an dockable widget. //! This class provides access to its info area and dockable widget. class BLACKGUI_EXPORT CEnableForDockWidgetInfoArea @@ -34,6 +34,9 @@ namespace BlackGui //! Corresponding dockable widget in info area const BlackGui::CDockWidgetInfoArea *getDockWidgetInfoArea() const { return m_parentDockableInfoArea; } + //! Has dock area? + bool hasDockWidgetArea() const { return m_parentDockableInfoArea; } + //! Corresponding dockable widget in info area //! \remarks Usually set from CDockWidgetInfoArea when it is fully initialized virtual bool setParentDockWidgetInfoArea(BlackGui::CDockWidgetInfoArea *parentDockableWidget); diff --git a/src/blackgui/dockwidgetinfoarea.cpp b/src/blackgui/dockwidgetinfoarea.cpp index cc1bc851f..a312fc03e 100644 --- a/src/blackgui/dockwidgetinfoarea.cpp +++ b/src/blackgui/dockwidgetinfoarea.cpp @@ -97,10 +97,6 @@ namespace BlackGui foreach(CEnableForDockWidgetInfoArea * dwia, infoAreaDockWidgets) { Q_ASSERT_X(dwia, Q_FUNC_INFO, "Missing info area"); - - // KWB: potentially a risk when this object is deleted - // but under normal situations the child object will be deleted as well, and we have - // no multi-threaded GUI dwia->setParentDockWidgetInfoArea(this); } } diff --git a/src/blackgui/dockwidgetinfoarea.h b/src/blackgui/dockwidgetinfoarea.h index 7ec5ab51d..4ed076985 100644 --- a/src/blackgui/dockwidgetinfoarea.h +++ b/src/blackgui/dockwidgetinfoarea.h @@ -61,7 +61,6 @@ namespace BlackGui //! The parent info areas const QList findParentInfoAreas() const; - }; } // namespace diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 2d83a9dfa..2c9564bfb 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -257,6 +257,11 @@ namespace BlackGui { if (!m_enabledLoadIndicator) { return; } if (this->m_showingLoadIndicator) { return; } + if (this->hasDockWidgetArea()) + { + if (!this->isVisibleWidget()) { return; } + } + if (containerSizeDependent >= 0) { // really with indicator? diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index f299ffb51..30ceadbcf 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -12,6 +12,7 @@ #ifndef BLACKGUI_VIEWBASE_H #define BLACKGUI_VIEWBASE_H +#include "blackgui/components/enablefordockwidgetinfoarea.h" #include "blackgui/filters/filterdialog.h" #include "blackgui/filters/filterwidget.h" #include "blackgui/models/modelfilter.h" @@ -35,7 +36,8 @@ namespace BlackGui namespace Views { //! Non templated base class, allows Q_OBJECT and signals / slots to be used - class BLACKGUI_EXPORT CViewBaseNonTemplate : public QTableView + class BLACKGUI_EXPORT CViewBaseNonTemplate : + public QTableView, public BlackGui::Components::CEnableForDockWidgetInfoArea { Q_OBJECT