Multiple Layouts:Fixes for storage synchronization

--fix also a crash when removing a dock
pull/2/head
Michail Vourlakos 7 years ago
parent 7dd6345d4a
commit 667a451499

@ -1309,15 +1309,23 @@ void DockView::setManagedLayout(Layout *layout)
}
});
/* connect(m_managedLayout, &Layout::activitiesChanged, 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 (containment() && !containment()->destroyed()) {
setVisible(true);
if (m_managedLayout) {
m_visibility->setDockOnActivities(m_managedLayout->appliedActivities());
if (m_managedLayout) {
m_visibility->setDockOnActivities(m_managedLayout->appliedActivities());
}
}
});

@ -58,6 +58,25 @@ Layout::~Layout()
}
}
void Layout::syncToLayoutFile()
{
if (!m_corona) {
return;
}
KConfigGroup oldContainments = KConfigGroup(m_filePtr, "Containments");
oldContainments.deleteGroup();
oldContainments.sync();
foreach (auto containment, m_containments) {
containment->config().writeEntry("layoutId", "");
KConfigGroup newGroup = oldContainments.group(QString::number(containment->id()));
containment->config().copyTo(&newGroup);
}
oldContainments.sync();
}
void Layout::unloadContainments()
{
if (!m_corona) {
@ -256,6 +275,26 @@ void Layout::setActivities(QStringList activities)
emit activitiesChanged();
}
bool Layout::isActiveLayout() const
{
if (!m_corona) {
return false;
}
Layout *activeLayout = m_corona->layoutManager()->activeLayout(m_layoutName);
if (activeLayout) {
return true;
} else {
return false;
}
}
bool Layout::isOriginalLayout() const
{
return m_layoutName != MultipleLayoutsName;
}
bool Layout::fileIsBroken() const
{
if (m_layoutFile.isEmpty() || !QFile(m_layoutFile).exists()) {
@ -760,7 +799,7 @@ void Layout::importToCorona()
copyGroup.sync();
//! update ids to unique ones
QString temp2File = newUniqueIdsLayoutFromFile(temp1File);
QString temp2File = newUniqueIdsLayoutFromFile(temp1File, false);
//! Finally import the configuration
@ -786,7 +825,7 @@ QString Layout::availableId(QStringList all, QStringList assigned, int base)
return QString("");
}
QString Layout::newUniqueIdsLayoutFromFile(QString file)
QString Layout::newUniqueIdsLayoutFromFile(QString file, bool enforceNewIds)
{
if (!m_corona) {
return QString();
@ -848,13 +887,23 @@ QString Layout::newUniqueIdsLayoutFromFile(QString file)
//! Reassign containment and applet ids to unique ones
foreach (auto contId, toInvestigateContainmentIds) {
QString newId = availableId(allIds, assignedIds, 12);
QString newId = contId;
if (enforceNewIds || assignedIds.contains(newId)) {
newId = availableId(allIds, assignedIds, 12);
}
assignedIds << newId;
assigned[contId] = newId;
}
foreach (auto appId, toInvestigateAppletIds) {
QString newId = availableId(allIds, assignedIds, 40);
QString newId = appId;
if (enforceNewIds || assignedIds.contains(newId)) {
newId = availableId(allIds, assignedIds, 40);
}
assignedIds << newId;
assigned[appId] = newId;
}

@ -51,6 +51,7 @@ public:
static const QString MultipleLayoutsName;
void initToCorona(DockCorona *corona);
void syncToLayoutFile();
void unloadContainments();
void unloadDockViews();
@ -59,6 +60,11 @@ public:
bool fileIsBroken() const;
//!this layout is loaded and running
bool isActiveLayout() const;
//!it is original layout compared to pseudo-layouts that are combinations of multiple-original layouts
bool isOriginalLayout() const;
int version() const;
void setVersion(int ver);
@ -114,7 +120,7 @@ private:
//! provides a new file path based the provided file. The new file
//! has updated ids for containments and applets based on the corona
//! loaded ones
QString newUniqueIdsLayoutFromFile(QString file);
QString newUniqueIdsLayoutFromFile(QString file, bool enforceNewIds = true);
//! imports a layout file and returns the containments for the docks
QList<Plasma::Containment *> importLayoutFile(QString file);

@ -119,18 +119,26 @@ void LayoutManager::load()
void LayoutManager::unload()
{
//! Unload all Layouts
foreach (auto layout, m_activeLayouts) {
if (memoryUsage() == Dock::MultipleLayouts && layout->isOriginalLayout()) {
layout->syncToLayoutFile();
}
layout->unloadContainments();
layout->unloadDockViews();
layout->deleteLater();
}
//! Cleanup pseudo-layout from Containments
if (memoryUsage() == Dock::MultipleLayouts) {
auto containmentsEntries = m_corona->config()->group("Containments");
containmentsEntries.deleteGroup();
containmentsEntries.sync();
}
//! Remove no-needed temp files
QString temp1File = QDir::homePath() + "/.config/lattedock.copy1.bak";
QString temp2File = QDir::homePath() + "/.config/lattedock.copy2.bak";
@ -312,13 +320,6 @@ void LayoutManager::recreateDock(Plasma::Containment *containment)
}
}
void LayoutManager::syncDockViewsToScreens()
{
foreach (auto layout, m_activeLayouts) {
layout->syncDockViewsToScreens();
}
}
QHash<const Plasma::Containment *, DockView *> *LayoutManager::currentDockViews() const
{
if (memoryUsage() == Dock::SingleLayout) {
@ -638,6 +639,11 @@ void LayoutManager::syncMultipleLayoutsToActivities(QString layoutForOrphans)
if (posLayout >= 0) {
qDebug() << "REMOVING LAYOUT ::::: " << layoutName;
m_activeLayouts.removeAt(posLayout);
if (layout->isOriginalLayout()) {
layout->syncToLayoutFile();
}
layout->unloadContainments();
layout->unloadDockViews();
delete layout;
@ -677,6 +683,13 @@ void LayoutManager::syncMultipleLayoutsToActivities(QString layoutForOrphans)
emit activeLayoutsChanged();
}
void LayoutManager::syncDockViewsToScreens()
{
foreach (auto layout, m_activeLayouts) {
layout->syncDockViewsToScreens();
}
}
QString LayoutManager::newLayout(QString layoutName, QString preset)
{
QDir layoutDir(QDir::homePath() + "/.config/latte");

Loading…
Cancel
Save