refactor:settings layouts controller

--the controller does not need to host its own
CentralLayouts any more. It retrieves original
data for Synchronizer, updates layouts accordingly
and sends back to Synchronizer all the updated
layouts data
pull/20/head
Michail Vourlakos 5 years ago
parent d5e83280d2
commit d8f1f7e4b9

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

@ -50,6 +50,7 @@ public:
QString background;
QString textColor;
bool isActive{false};
bool isBroken{false};
bool isLocked{false};
bool isShownInMenu{false};
bool isTemplate{false};

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

@ -52,6 +52,8 @@ Synchronizer::Synchronizer(QObject *parent)
{
m_manager = qobject_cast<Manager *>(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();
}
}

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

@ -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 <QDir>
@ -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; i<layouts.rowCount(); ++i) {
if (layouts[i].isBroken) {
brokenLayouts.append(layouts[i].name);
}
}
//! Send original loaded data to model
m_model->setOriginalData(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<QString, Latte::Layout::GenericLayout *> activeLayoutsToRename;
QHash<QString, Latte::CentralLayout *> 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<removedLayouts.rowCount(); ++i) {
QFile(removedLayouts[i].id).remove();
if (m_layouts.contains(removedLayouts[i].id)) {
CentralLayout *removedLayout = m_layouts.take(removedLayouts[i].id);
delete removedLayout;
}
}
QList<Data::UniqueIdInfo> 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()) {

@ -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<const QString, Latte::CentralLayout *> m_layouts;
//! temp data
QStringList m_tempDirectories;

@ -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<int> roles;

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

Loading…
Cancel
Save