diff --git a/app/data/layoutdata.cpp b/app/data/layoutdata.cpp index 6dae3e027..c7e7541c8 100644 --- a/app/data/layoutdata.cpp +++ b/app/data/layoutdata.cpp @@ -38,6 +38,7 @@ Layout::Layout(Layout &&o) background(o.background), textColor(o.textColor), isActive(o.isActive), + isBroken(o.isBroken), isLocked(o.isLocked), isShownInMenu(o.isShownInMenu), isTemplate(o.isTemplate), @@ -54,6 +55,7 @@ Layout::Layout(const Layout &o) background(o.background), textColor(o.textColor), isActive(o.isActive), + isBroken(o.isBroken), isLocked(o.isLocked), isShownInMenu(o.isShownInMenu), isTemplate(o.isTemplate), @@ -72,6 +74,7 @@ Layout &Layout::operator=(Layout &&rhs) background = rhs.background; textColor = rhs.textColor; isActive = rhs.isActive; + isBroken = rhs.isBroken; isLocked = rhs.isLocked; isShownInMenu = rhs.isShownInMenu; isTemplate = rhs.isTemplate; @@ -91,6 +94,7 @@ Layout &Layout::operator=(const Layout &rhs) background = rhs.background; textColor = rhs.textColor; isActive = rhs.isActive; + isBroken = rhs.isBroken; isLocked = rhs.isLocked; isShownInMenu = rhs.isShownInMenu; isTemplate = rhs.isTemplate; @@ -109,6 +113,7 @@ bool Layout::operator==(const Layout &rhs) const && (color == rhs.color) && (background == rhs.background) && (textColor == rhs.textColor) + && (isBroken == rhs.isBroken) //&& (isActive == rhs.isActive) /*Disabled but this is not a data but a layout state*/ && (isLocked == rhs.isLocked) && (isShownInMenu == rhs.isShownInMenu) diff --git a/app/data/layoutdata.h b/app/data/layoutdata.h index 70e930050..466981ea0 100644 --- a/app/data/layoutdata.h +++ b/app/data/layoutdata.h @@ -50,6 +50,7 @@ public: QString background; QString textColor; bool isActive{false}; + bool isBroken{false}; bool isLocked{false}; bool isShownInMenu{false}; bool isTemplate{false}; diff --git a/app/layout/centrallayout.cpp b/app/layout/centrallayout.cpp index 1291de9fe..8a9c27d5d 100644 --- a/app/layout/centrallayout.cpp +++ b/app/layout/centrallayout.cpp @@ -147,6 +147,8 @@ Data::Layout CentralLayout::data() const cdata.color = color(); cdata.background = customBackground(); cdata.textColor = customTextColor(); + cdata.isActive = (m_corona != nullptr); + cdata.isBroken = isBroken(); cdata.isLocked = !isWritable(); cdata.isShownInMenu = showInMenu(); cdata.hasDisabledBorders = disableBordersForMaximizedWindows(); diff --git a/app/layouts/synchronizer.cpp b/app/layouts/synchronizer.cpp index bd2909481..e1c86b9ba 100644 --- a/app/layouts/synchronizer.cpp +++ b/app/layouts/synchronizer.cpp @@ -52,6 +52,8 @@ Synchronizer::Synchronizer(QObject *parent) { m_manager = qobject_cast(parent); + connect(this, &Synchronizer::layoutsChanged, this, &Synchronizer::reloadAssignedLayouts); + //! KWin update Disabled Borders connect(this, &Synchronizer::centralLayoutsChanged, this, &Synchronizer::updateKWinDisabledBorders); connect(m_manager->corona()->universalSettings(), &UniversalSettings::canDisableBordersChanged, this, &Synchronizer::updateKWinDisabledBorders); @@ -240,6 +242,24 @@ void Synchronizer::setLayoutsTable(const Data::LayoutsTable &table) emit layoutsChanged(); } +void Synchronizer::updateLayoutsTable() +{ + for (int i = 0; i < m_centralLayouts.size(); ++i) { + CentralLayout *layout = m_centralLayouts.at(i); + + if (m_layouts.containsId(layout->file())) { + m_layouts[layout->file()] = layout->data(); + } + } + + for (int i = 0; i < m_layouts.rowCount(); ++i) { + if (m_layouts[i].isBroken && !m_layouts[i].isActive) { + CentralLayout central(this, m_layouts[i].id); + m_layouts[i].isBroken = central.isBroken(); + } + } +} + CentralLayout *Synchronizer::centralLayout(QString layoutname) const { for (int i = 0; i < m_centralLayouts.size(); ++i) { @@ -444,7 +464,6 @@ void Synchronizer::unloadCentralLayout(CentralLayout *layout) void Synchronizer::initLayouts() { m_layouts.clear(); - m_assignedLayouts.clear(); QDir layoutDir(Layouts::Importer::layoutUserDir()); QStringList filter; @@ -473,15 +492,6 @@ void Synchronizer::initLayouts() void Synchronizer::onLayoutAdded(const QString &layout) { CentralLayout centralLayout(this, layout); - - for (const auto &activity : centralLayout.activities()) { - if (m_assignedLayouts.contains(activity)) { - m_assignedLayouts[activity] << centralLayout.name(); - } else { - m_assignedLayouts[activity] = QStringList(centralLayout.name()); - } - } - m_layouts.insertBasedOnName(centralLayout.data()); if (m_isLoaded) { @@ -489,6 +499,21 @@ void Synchronizer::onLayoutAdded(const QString &layout) } } +void Synchronizer::reloadAssignedLayouts() +{ + m_assignedLayouts.clear(); + + for (int i=0; i< m_layouts.rowCount(); ++i) { + for (const auto &activity : m_layouts[i].activities) { + if (m_assignedLayouts.contains(activity)) { + m_assignedLayouts[activity] << m_layouts[i].name; + } else { + m_assignedLayouts[activity] = QStringList(m_layouts[i].name); + } + } + } +} + void Synchronizer::unloadLayouts() { //! Unload all CentralLayouts @@ -654,6 +679,10 @@ void Synchronizer::syncMultipleLayoutsToActivities() addLayout(newLayout); newLayout->importToCorona(); + if (!defaultForcedLayout.isEmpty() && defaultForcedLayout == layoutName) { + emit newLayoutAdded(newLayout->data()); + } + newlyActivatedLayouts << newLayout->name(); } } diff --git a/app/layouts/synchronizer.h b/app/layouts/synchronizer.h index 0e77b2528..64db45cec 100644 --- a/app/layouts/synchronizer.h +++ b/app/layouts/synchronizer.h @@ -120,6 +120,8 @@ public slots: void initLayouts(); void updateKWinDisabledBorders(); + void updateLayoutsTable(); + signals: void centralLayoutsChanged(); void layoutsChanged(); @@ -127,10 +129,14 @@ signals: void currentLayoutIsSwitching(QString layoutName); + void newLayoutAdded(const Data::Layout &layout); + private slots: void onCurrentActivityChanged(const QString &id); void onLayoutAdded(const QString &layoutpath); + void reloadAssignedLayouts(); + private: void addLayout(CentralLayout *layout); void unloadCentralLayout(CentralLayout *layout); diff --git a/app/settings/controllers/layoutscontroller.cpp b/app/settings/controllers/layoutscontroller.cpp index 6d893512d..d3e967eab 100644 --- a/app/settings/controllers/layoutscontroller.cpp +++ b/app/settings/controllers/layoutscontroller.cpp @@ -31,11 +31,11 @@ #include "../handlers/tablayoutshandler.h" #include "../tools/settingstools.h" #include "../../data/uniqueidinfo.h" -#include "../../layout/genericlayout.h" #include "../../layout/centrallayout.h" #include "../../layouts/importer.h" #include "../../layouts/manager.h" #include "../../layouts/synchronizer.h" +#include "../../templates/templatesmanager.h" // Qt #include @@ -71,6 +71,8 @@ Layouts::Layouts(Settings::Handler::TabLayouts *parent) connect(m_model, &Model::Layouts::inMultipleModeChanged, this, &Layouts::applyColumnWidths); connect(m_handler->corona()->universalSettings(), &UniversalSettings::canDisableBordersChanged, this, &Layouts::applyColumnWidths); + connect(m_handler->corona()->layoutsManager()->synchronizer(), &Latte::Layouts::Synchronizer::newLayoutAdded, this, &Layouts::onLayoutAddedExternally); + connect(m_model, &QAbstractItemModel::dataChanged, this, &Layouts::dataChanged); connect(m_model, &Model::Layouts::rowsInserted, this, &Layouts::dataChanged); connect(m_model, &Model::Layouts::rowsRemoved, this, &Layouts::dataChanged); @@ -83,16 +85,13 @@ Layouts::Layouts(Settings::Handler::TabLayouts *parent) }); initView(); - loadLayouts(); + initLayouts(); } Layouts::~Layouts() { saveConfig(); - //! remove - qDeleteAll(m_layouts); - for (const auto &tempDir : m_tempDirectories) { QDir tDir(tempDir); @@ -364,7 +363,7 @@ void Layouts::setOriginalLayoutForFreeActivities(const QString &id) emit dataChanged(); } -void Layouts::loadLayouts() +void Layouts::initLayouts() { m_model->clear(); bool inMultiple{m_handler->corona()->layoutsManager()->memoryUsage() == MemoryUsage::MultipleLayouts}; @@ -377,43 +376,17 @@ void Layouts::loadLayouts() m_handler->corona()->layoutsManager()->synchronizer()->syncActiveLayoutsToOriginalFiles(); } - Latte::Data::LayoutsTable layoutsBuffer; - - for (const auto layout : m_handler->corona()->layoutsManager()->synchronizer()->layouts()) { - Latte::Data::Layout original; - original.id = Latte::Layouts::Importer::layoutUserFilePath(layout); - - CentralLayout *central = new CentralLayout(this, original.id); - - original.name = central->name(); - original.icon = central->icon(); - original.backgroundStyle = central->backgroundStyle(); - original.color = central->color(); - original.background = central->customBackground(); - original.textColor = central->customTextColor(); - original.isActive = (m_handler->corona()->layoutsManager()->synchronizer()->layout(original.name) != nullptr); - original.isLocked = !central->isWritable(); - original.isShownInMenu = central->showInMenu(); - original.hasDisabledBorders = central->disableBordersForMaximizedWindows(); - original.activities = central->activities(); - - m_layouts[original.id] = central; - - layoutsBuffer << original; - - qDebug() << "counter:" << i << " total:" << m_model->rowCount(); - - i++; - - Latte::Layout::GenericLayout *generic = m_handler->corona()->layoutsManager()->synchronizer()->layout(central->name()); + m_handler->corona()->layoutsManager()->synchronizer()->updateLayoutsTable(); + Latte::Data::LayoutsTable layouts = m_handler->corona()->layoutsManager()->synchronizer()->layoutsTable(); - if ((generic && generic->isBroken()) || (!generic && central->isBroken())) { - brokenLayouts.append(central->name()); + for (int i=0; isetOriginalData(layoutsBuffer, inMultiple); + m_model->setOriginalData(layouts, inMultiple); QStringList currentLayoutNames = m_handler->corona()->layoutsManager()->currentLayoutsNames(); if (currentLayoutNames.count() > 0) { @@ -436,6 +409,12 @@ void Layouts::loadLayouts() } } +void Layouts::onLayoutAddedExternally(const Data::Layout &layout) +{ + m_model->appendOriginalLayout(layout); + m_model->appendLayout(layout); +} + void Layouts::sortByColumn(int column, Qt::SortOrder order) { m_view->sortByColumn(column, order); @@ -464,13 +443,7 @@ const Latte::Data::Layout Layouts::addLayoutForFile(QString file, QString layout QFile(copied.id).setPermissions(QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ReadGroup | QFileDevice::ReadOther); } - if (m_layouts.contains(copied.id)) { - CentralLayout *oldSettings = m_layouts.take(copied.id); - delete oldSettings; - } - CentralLayout *settings = new CentralLayout(this, copied.id); - m_layouts[copied.id] = settings; copied.name = uniqueLayoutName(layoutName); copied.icon = settings->icon(); @@ -527,9 +500,9 @@ void Layouts::copySelectedLayout() //! Update original layout before copying if this layout is active if (m_handler->corona()->layoutsManager()->memoryUsage() == MemoryUsage::MultipleLayouts) { - Latte::Layout::GenericLayout *generic = m_handler->corona()->layoutsManager()->synchronizer()->layout(selectedLayoutOriginal.name); - if (generic) { - generic->syncToLayoutFile(); + Latte::CentralLayout *central = m_handler->corona()->layoutsManager()->synchronizer()->centralLayout(selectedLayoutOriginal.name); + if (central) { + central->syncToLayoutFile(); } } @@ -552,7 +525,6 @@ void Layouts::copySelectedLayout() settings->clearLastUsedActivity(); settings->setActivities(QStringList()); - m_layouts[copied.id] = settings; m_model->appendLayout(copied); m_view->selectRow(rowForId(copied.id)); @@ -630,7 +602,7 @@ void Layouts::save() QString switchToLayout; - QHash activeLayoutsToRename; + QHash activeLayoutsToRename; Latte::Data::LayoutsTable originalLayouts = m_model->originalLayoutsData(); Latte::Data::LayoutsTable currentLayouts = m_model->currentLayoutsData(); @@ -639,11 +611,6 @@ void Layouts::save() //! remove layouts that have been removed from the user for (int i=0; i alteredIdsInfo; @@ -658,27 +625,24 @@ void Layouts::save() //qDebug() << i << ". " << id << " - " << color << " - " << name << " - " << menu << " - " << lActivities; //! update the generic parts of the layouts bool isOriginalLayout = m_model->originalLayoutsData().containsId(iLayoutCurrentData.id); - Latte::Layout::GenericLayout *genericActive= isOriginalLayout ? m_handler->corona()->layoutsManager()->synchronizer()->layout(iLayoutOriginalData.name) : nullptr; - Latte::Layout::GenericLayout *generic = genericActive ? genericActive : m_layouts[iLayoutCurrentData.id]; + Latte::CentralLayout *centralActive= isOriginalLayout ? m_handler->corona()->layoutsManager()->synchronizer()->centralLayout(iLayoutOriginalData.name) : nullptr; + Latte::CentralLayout *central = centralActive ? centralActive : new Latte::CentralLayout(this, iLayoutCurrentData.id); //! unlock read-only layout - if (!generic->isWritable()) { - generic->unlock(); + if (!central->isWritable()) { + central->unlock(); } //! Icon - generic->setIcon(iLayoutCurrentData.icon); + central->setIcon(iLayoutCurrentData.icon); //! Backgrounds - generic->setBackgroundStyle(iLayoutCurrentData.backgroundStyle); - generic->setColor(iLayoutCurrentData.color); - generic->setCustomBackground(iLayoutCurrentData.background); - generic->setCustomTextColor(iLayoutCurrentData.textColor); - - //! update only the Central-specific layout parts - CentralLayout *centralActive = isOriginalLayout ? m_handler->corona()->layoutsManager()->synchronizer()->centralLayout(iLayoutOriginalData.name) : nullptr; - CentralLayout *central = centralActive ? centralActive : m_layouts[iLayoutCurrentData.id]; + central->setBackgroundStyle(iLayoutCurrentData.backgroundStyle); + central->setColor(iLayoutCurrentData.color); + central->setCustomBackground(iLayoutCurrentData.background); + central->setCustomTextColor(iLayoutCurrentData.textColor); + //! Extra Properties central->setShowInMenu(iLayoutCurrentData.isShownInMenu); central->setDisableBordersForMaximizedWindows(iLayoutCurrentData.hasDisabledBorders); central->setActivities(iLayoutCurrentData.activities); @@ -686,17 +650,14 @@ void Layouts::save() //! If the layout name changed OR the layout path is a temporary one if ((iLayoutCurrentData.name != iLayoutOriginalData.name) || iLayoutCurrentData.isTemporary()) { //! If the layout is Active in MultipleLayouts - if (m_handler->corona()->layoutsManager()->memoryUsage() == MemoryUsage::MultipleLayouts && generic->isActive()) { - qDebug() << " Active Layout Should Be Renamed From : " << generic->name() << " TO :: " << iLayoutCurrentData.name; - activeLayoutsToRename[iLayoutCurrentData.name] = generic; + if (m_handler->corona()->layoutsManager()->memoryUsage() == MemoryUsage::MultipleLayouts && central->isActive()) { + qDebug() << " Active Layout Should Be Renamed From : " << central->name() << " TO :: " << iLayoutCurrentData.name; + activeLayoutsToRename[iLayoutCurrentData.name] = central; } - QString tempFile = layoutTempDir.path() + "/" + QString(generic->name() + ".layout.latte"); + QString tempFile = layoutTempDir.path() + "/" + QString(central->name() + ".layout.latte"); qDebug() << "new temp file ::: " << tempFile; - generic = m_layouts.take(iLayoutCurrentData.id); - delete generic; - QFile(iLayoutCurrentData.id).rename(tempFile); Data::UniqueIdInfo idInfo; @@ -718,8 +679,6 @@ void Layouts::save() QString newFile = Latte::Layouts::Importer::layoutUserFilePath(idInfo.newName); QFile(idInfo.newId).rename(newFile); - CentralLayout *nLayout = new CentralLayout(this, newFile); - m_layouts[newFile] = nLayout; //! updating the #SETTINGSID in the model for the layout that was renamed for (int j = 0; j < m_model->rowCount(); ++j) { @@ -733,7 +692,7 @@ void Layouts::save() if (m_handler->corona()->layoutsManager()->memoryUsage() == MemoryUsage::MultipleLayouts) { for (const auto &newLayoutName : activeLayoutsToRename.keys()) { - Latte::Layout::GenericLayout *layoutPtr = activeLayoutsToRename[newLayoutName]; + Latte::CentralLayout *layoutPtr = activeLayoutsToRename[newLayoutName]; qDebug() << " Active Layout of Type: " << layoutPtr->type() << " Is Renamed From : " << activeLayoutsToRename[newLayoutName]->name() << " TO :: " << newLayoutName; layoutPtr->renameLayout(newLayoutName); } @@ -745,10 +704,10 @@ void Layouts::save() Latte::Data::Layout layoutOriginalData = m_model->originalData(layoutCurrentData.id); layoutOriginalData = layoutOriginalData.isEmpty() ? layoutCurrentData : layoutOriginalData; - Latte::Layout::GenericLayout *layoutPtr = m_handler->corona()->layoutsManager()->synchronizer()->layout(layoutOriginalData.name); + Latte::CentralLayout *layoutPtr = m_handler->corona()->layoutsManager()->synchronizer()->centralLayout(layoutOriginalData.name); - if (!layoutPtr && m_layouts.contains(layoutCurrentData.id)) { - layoutPtr = m_layouts[layoutCurrentData.id]; + if (!layoutPtr) { + layoutPtr = new Latte::CentralLayout(this, layoutCurrentData.id); } if (layoutCurrentData.isLocked && layoutPtr && layoutPtr->isWritable()) { diff --git a/app/settings/controllers/layoutscontroller.h b/app/settings/controllers/layoutscontroller.h index bb9981a4e..e5f2dd1a0 100644 --- a/app/settings/controllers/layoutscontroller.h +++ b/app/settings/controllers/layoutscontroller.h @@ -80,7 +80,6 @@ public: //! actions void reset(); void save(); - void loadLayouts(); void removeSelected(); void toggleLockedForSelected(); @@ -101,12 +100,14 @@ signals: void dataChanged(); private slots: + void initLayouts(); void loadConfig(); void saveConfig(); void storeColumnWidths(); void applyColumnWidths(); void onNameDuplicatedFrom(const QString &provenId, const QString &trialId); + void onLayoutAddedExternally(const Data::Layout &layout); private: void initView(); @@ -135,7 +136,6 @@ private: //! current data Model::Layouts *m_model{nullptr}; QSortFilterProxyModel *m_proxyModel{nullptr}; - QHash m_layouts; //! temp data QStringList m_tempDirectories; diff --git a/app/settings/models/layoutsmodel.cpp b/app/settings/models/layoutsmodel.cpp index 89aeed30a..1d8d397f0 100644 --- a/app/settings/models/layoutsmodel.cpp +++ b/app/settings/models/layoutsmodel.cpp @@ -130,6 +130,12 @@ void Layouts::appendLayout(const Latte::Data::Layout &layout) emit rowsInserted(); } +void Layouts::appendOriginalLayout(const Latte::Data::Layout &layout) +{ + int newRow = o_layoutsTable.sortedPosForName(layout.name); + o_layoutsTable.insert(newRow, layout); +} + void Layouts::applyData() { QVector roles; diff --git a/app/settings/models/layoutsmodel.h b/app/settings/models/layoutsmodel.h index db4577d40..b67f0ceca 100644 --- a/app/settings/models/layoutsmodel.h +++ b/app/settings/models/layoutsmodel.h @@ -114,6 +114,7 @@ public: //! all original data will become also current void resetData(); + void appendOriginalLayout(const Latte::Data::Layout &layout); void appendLayout(const Latte::Data::Layout &layout); void removeLayout(const QString &id); void setLayoutProperties(const Latte::Data::Layout &layout);