From 7dd6345d4ac2e08d7d81be726b804f3537a7ab02 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 14 Jan 2018 09:39:31 +0200 Subject: [PATCH] MultipleLayouts:Load/Unload on Activities changes --workaround an upstream issue, when closing an Activity all dock/panel windows in MultipleLayouts where become hidden. --- app/dockview.cpp | 36 ++++++++++++++++++++++--- app/layout.cpp | 4 ++- app/layoutmanager.cpp | 62 +++++++++++++++++++++++++++++++++---------- app/layoutmanager.h | 3 ++- 4 files changed, 86 insertions(+), 19 deletions(-) diff --git a/app/dockview.cpp b/app/dockview.cpp index f0d2fac55..7c5ca3fa4 100644 --- a/app/dockview.cpp +++ b/app/dockview.cpp @@ -41,6 +41,8 @@ #include #include +#include + #include #include #include @@ -302,6 +304,7 @@ void DockView::initSignalingForLocationChangeSliding() void DockView::disconnectSensitiveSignals() { disconnect(corona(), &Plasma::Corona::availableScreenRectChanged, this, &DockView::availableScreenRectChanged); + setManagedLayout(nullptr); if (visibility()) { visibility()->setEnabledDynamicBackground(false); @@ -1195,7 +1198,7 @@ void DockView::setMaskArea(QRect area) setMask(fixedMask); } - // qDebug() << "dock mask set:" << m_maskArea; + // qDebug() << "dock mask set:" << m_maskArea; emit maskAreaChanged(); } @@ -1292,8 +1295,35 @@ void DockView::setManagedLayout(Layout *layout) m_managedLayout = layout; - qDebug() << "DOCK VIEW FROM LAYOUT ::: " << layout->name() << " - activities: " << layout->appliedActivities(); - m_visibility->setDockOnActivities(layout->appliedActivities()); + if (m_managedLayout) { + qDebug() << "DOCK VIEW FROM LAYOUT ::: " << layout->name() << " - activities: " << layout->appliedActivities(); + m_visibility->setDockOnActivities(layout->appliedActivities()); + } + + DockCorona *dockCorona = qobject_cast(this->corona()); + + if (dockCorona->layoutManager()->memoryUsage() == Dock::MultipleLayouts) { + connect(dockCorona->activitiesConsumer(), &KActivities::Consumer::runningActivitiesChanged, this, [&]() { + if (m_managedLayout) { + m_visibility->setDockOnActivities(m_managedLayout->appliedActivities()); + } + }); + + //!IMPORTANT!!! ::: This fixes a bug when closing an Activity all docks from all Activities are + //! disappearing! With this they reappear!!! + connect(this, &QWindow::visibleChanged, this, [&]() { + if (!isVisible() && m_managedLayout) { + QTimer::singleShot(1, [this]() { + setVisible(true); + + if (m_managedLayout) { + m_visibility->setDockOnActivities(m_managedLayout->appliedActivities()); + } + }); + + } + }); + } emit managedLayoutChanged(); } diff --git a/app/layout.cpp b/app/layout.cpp index 072b5dd2b..e87d40255 100644 --- a/app/layout.cpp +++ b/app/layout.cpp @@ -64,7 +64,9 @@ void Layout::unloadContainments() return; } - qDebug() << "Layout - " + name() + " unload: containments ... size: " << m_containments.size(); + qDebug() << "Layout - " + name() + " unload: containments ... size ::: " << m_containments.size() + << " ,dockViews in memory ::: " << m_dockViews.size() + << " ,hidden dockViews in memory ::: " << m_waitingDockViews.size(); foreach (auto view, m_dockViews) { view->disconnectSensitiveSignals(); diff --git a/app/layoutmanager.cpp b/app/layoutmanager.cpp index 2e417f3e0..ab2eeb079 100644 --- a/app/layoutmanager.cpp +++ b/app/layoutmanager.cpp @@ -107,6 +107,13 @@ void LayoutManager::load() connect(m_corona->m_activityConsumer, &KActivities::Consumer::currentActivityChanged, this, &LayoutManager::currentActivityChanged); + connect(m_corona->m_activityConsumer, &KActivities::Consumer::runningActivitiesChanged, + this, [&]() { + if (memoryUsage() == Dock::MultipleLayouts) { + syncMultipleLayoutsToActivities(); + } + }); + loadLayouts(); } @@ -348,6 +355,7 @@ Layout *LayoutManager::activeLayout(QString id) const Layout *layout = m_activeLayouts.at(i); if (layout->name() == id) { + return layout; } } @@ -355,6 +363,20 @@ Layout *LayoutManager::activeLayout(QString id) const return nullptr; } +int LayoutManager::activeLayoutPos(QString id) const +{ + for (int i = 0; i < m_activeLayouts.size(); ++i) { + Layout *layout = m_activeLayouts.at(i); + + if (layout->name() == id) { + + return i; + } + } + + return -1; +} + void LayoutManager::currentActivityChanged(const QString &id) { m_currentActivityId = id; @@ -569,8 +591,9 @@ bool LayoutManager::switchToLayout(QString layoutName) void LayoutManager::syncMultipleLayoutsToActivities(QString layoutForOrphans) { - QList layoutsToUnload; + QStringList layoutsToUnload; QStringList layoutsToLoad; + layoutsToLoad << Layout::MultipleLayoutsName; bool allRunningActivitiesWillBeReserved{true}; @@ -589,28 +612,36 @@ void LayoutManager::syncMultipleLayoutsToActivities(QString layoutForOrphans) } foreach (auto layout, m_activeLayouts) { - Layout *tempLayout{nullptr}; + QString tempLayoutName; - if (!layoutsToLoad.contains(layout->name())) { - tempLayout = layout; + if (!layoutsToLoad.contains(layout->name()) && layout->name() != layoutForOrphans) { + tempLayoutName = layout->name(); } else if (layout->activities().isEmpty() && allRunningActivitiesWillBeReserved) { //! in such case the layout for the orphaned must be unloaded - tempLayout = layout; + tempLayoutName = layout->name(); } - if (tempLayout && !layoutsToUnload.contains(tempLayout)) { - layoutsToUnload << tempLayout; + if (!tempLayoutName.isEmpty() && !layoutsToUnload.contains(tempLayoutName)) { + layoutsToUnload << tempLayoutName; } } + qDebug() << " ---- --------- ------ syncMultipleLayoutsToActivities ------- "; + qDebug() << " ---- --------- ------ ------------------------------- ------- "; + //! Unload no needed Layouts - foreach (auto layout, layoutsToUnload) { - if (layout->name() != Layout::MultipleLayoutsName) { - Layout *tempLayout = layoutsToUnload.at(0); - layoutsToUnload.removeFirst(); - tempLayout->unloadContainments(); - tempLayout->unloadDockViews(); - delete tempLayout; + foreach (auto layoutName, layoutsToUnload) { + if (layoutName != Layout::MultipleLayoutsName) { + Layout *layout = activeLayout(layoutName); + int posLayout = activeLayoutPos(layoutName); + + if (posLayout >= 0) { + qDebug() << "REMOVING LAYOUT ::::: " << layoutName; + m_activeLayouts.removeAt(posLayout); + layout->unloadContainments(); + layout->unloadDockViews(); + delete layout; + } } } @@ -620,6 +651,8 @@ void LayoutManager::syncMultipleLayoutsToActivities(QString layoutForOrphans) Layout *newLayout = new Layout(this, layoutPath(layoutForOrphans), layoutForOrphans); if (newLayout) { + qDebug() << "ADDING ORPHANED LAYOUT ::::: " << layoutForOrphans; + m_activeLayouts.append(newLayout); newLayout->initToCorona(m_corona); newLayout->importToCorona(); @@ -633,6 +666,7 @@ void LayoutManager::syncMultipleLayoutsToActivities(QString layoutForOrphans) Layout *newLayout = new Layout(this, QString(layoutPath(layoutName)), layoutName); if (newLayout) { + qDebug() << "ADDING LAYOUT ::::: " << layoutName; m_activeLayouts.append(newLayout); newLayout->initToCorona(m_corona); newLayout->importToCorona(); diff --git a/app/layoutmanager.h b/app/layoutmanager.h index 92a443543..db36b7a49 100644 --- a/app/layoutmanager.h +++ b/app/layoutmanager.h @@ -87,6 +87,7 @@ public: //! returns an active layout with that #id (name), it returns null if such //! layout cant be found Layout *activeLayout(QString id) const; + int activeLayoutPos(QString id) const; LaunchersSignals *launchersSignals(); @@ -121,7 +122,7 @@ private slots: void currentActivityChanged(const QString &id); void showInfoWindowChanged(); void showWidgetsExplorer(); - void syncMultipleLayoutsToActivities(QString layoutForOrphans); + void syncMultipleLayoutsToActivities(QString layoutForOrphans = QString()); private: void confirmDynamicSwitch();