MultipleLayouts:Load/Unload on Activities changes

--workaround an upstream issue, when closing an Activity
all dock/panel windows in MultipleLayouts where become
hidden.
pull/2/head
Michail Vourlakos 7 years ago
parent 132410d848
commit 7dd6345d4a

@ -41,6 +41,8 @@
#include <KWindowEffects>
#include <KWindowSystem>
#include <KActivities/Consumer>
#include <Plasma/Containment>
#include <Plasma/ContainmentActions>
#include <PlasmaQuick/AppletQuickItem>
@ -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<DockCorona *>(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();
}

@ -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();

@ -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<Layout *> 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();

@ -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();

Loading…
Cancel
Save