provide a new Layouts::Storage singleton

--this class will be the replacement for layout::storage
and will be responsible for any containment actions for
all layouts either loaded or offloaded. Through this
refactor loading and checking CentralLayouts should become
lighter and also memory efficient
pull/19/head
Michail Vourlakos 5 years ago
parent 9ff834ccae
commit d97fe4c59c

@ -27,6 +27,7 @@
#include "../screenpool.h"
#include "../layouts/importer.h"
#include "../layouts/manager.h"
#include "../layouts/storage.h"
#include "../layouts/synchronizer.h"
#include "../shortcuts/shortcutstracker.h"
#include "../view/view.h"
@ -797,8 +798,9 @@ void GenericLayout::addView(Plasma::Containment *containment, bool forceOnPrimar
qDebug() << "step 1...";
if (!m_storage->isLatteContainment(containment))
if (!Layouts::Storage::self()->isLatteContainment(containment)) {
return;
}
qDebug() << "step 2...";
@ -1164,7 +1166,7 @@ bool GenericLayout::explicitDockOccupyEdge(int screen, Plasma::Types::Location l
}
for (const auto containment : m_containments) {
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
bool onPrimary = containment->config().readEntry("onPrimary", true);
int id = containment->lastScreen();
Plasma::Types::Location contLocation = containment->location();
@ -1185,7 +1187,7 @@ bool GenericLayout::primaryDockOccupyEdge(Plasma::Types::Location location) cons
}
for (const auto containment : m_containments) {
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
bool onPrimary{false};
if (m_latteViews.contains(containment)) {
@ -1238,7 +1240,7 @@ Layout::ViewsMap GenericLayout::validViewsMap(Layout::ViewsMap *occupiedMap)
//! first step: primary docks must be placed in primary screen free edges
for (const auto containment : m_containments) {
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
int screenId = 0;
//! valid screen id
@ -1274,7 +1276,7 @@ Layout::ViewsMap GenericLayout::validViewsMap(Layout::ViewsMap *occupiedMap)
//! second step: explicit docks must be placed in their screens if the screen edge is free
for (const auto containment : m_containments) {
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
int screenId = 0;
//! valid screen id
@ -1392,7 +1394,7 @@ QList<int> GenericLayout::containmentSystrays(Plasma::Containment *containment)
{
QList<int> trays;
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
auto applets = containment->config().group("Applets");
for (const auto &applet : applets.groupList()) {
@ -1469,7 +1471,7 @@ QString GenericLayout::reportHtml(const ScreenPool *screenPool)
//! orphan systrays
for (const auto containment : m_containments) {
if (!m_storage->isLatteContainment(containment) && !assignedSystrays.contains(containment->id())) {
if (!Layouts::Storage::self()->isLatteContainment(containment) && !assignedSystrays.contains(containment->id())) {
orphanSystrays << containment->id();
}
}
@ -1501,7 +1503,7 @@ QString GenericLayout::reportHtml(const ScreenPool *screenPool)
if (isActive()) {
//! collect viewData results
for (const auto containment : m_containments) {
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
ViewData vData;
vData.id = containment->id();
vData.active = latteViewExists(containment);
@ -1628,7 +1630,7 @@ QList<int> GenericLayout::viewsScreens()
if (isActive()) {
for (const auto containment : m_containments) {
if (m_storage->isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
int screenId = -1;
//! valid screen id
@ -1659,17 +1661,17 @@ QList<int> GenericLayout::viewsScreens()
bool GenericLayout::isWritable() const
{
return m_storage->isWritable();
return Layouts::Storage::self()->isWritable(this);
}
void GenericLayout::lock()
{
m_storage->lock();
Layouts::Storage::self()->lock(this);
}
void GenericLayout::unlock()
{
m_storage->unlock();
Layouts::Storage::self()->unlock(this);
}
void GenericLayout::syncToLayoutFile(bool removeLayoutId)

@ -25,7 +25,9 @@
#include "../screenpool.h"
#include "../layouts/manager.h"
#include "../layouts/importer.h"
#include "../layouts/storage.h"
#include "../view/view.h"
// Qt
#include <QDir>
#include <QFile>
@ -53,54 +55,6 @@ Storage::~Storage()
{
}
bool Storage::isWritable() const
{
QFileInfo layoutFileInfo(m_layout->file());
if (layoutFileInfo.exists() && !layoutFileInfo.isWritable()) {
return false;
} else {
return true;
}
}
bool Storage::isLatteContainment(Plasma::Containment *containment) const
{
if (!containment) {
return false;
}
if (containment->pluginMetaData().pluginId() == "org.kde.latte.containment") {
return true;
}
return false;
}
bool Storage::isLatteContainment(const KConfigGroup &group) const
{
QString pluginId = group.readEntry("plugin", "");
return pluginId == "org.kde.latte.containment";
}
void Storage::lock()
{
QFileInfo layoutFileInfo(m_layout->file());
if (layoutFileInfo.exists() && layoutFileInfo.isWritable()) {
QFile(m_layout->file()).setPermissions(QFileDevice::ReadUser | QFileDevice::ReadGroup | QFileDevice::ReadOther);
}
}
void Storage::unlock()
{
QFileInfo layoutFileInfo(m_layout->file());
if (layoutFileInfo.exists() && !layoutFileInfo.isWritable()) {
QFile(m_layout->file()).setPermissions(QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ReadGroup | QFileDevice::ReadOther);
}
}
void Storage::setStorageTmpDir(const QString &tmpDir)
{
m_storageTmpDir = tmpDir;
@ -155,7 +109,7 @@ void Storage::importToCorona()
void Storage::syncToLayoutFile(bool removeLayoutId)
{
if (!m_layout->corona() || !isWritable()) {
if (!m_layout->corona() || !Layouts::Storage::self()->isWritable(m_layout)) {
return;
}
@ -341,7 +295,7 @@ QList<Plasma::Containment *> Storage::importLayoutFile(QString file)
//QList<Plasma::Containment *> systrays;
for (const auto containment : newContainments) {
if (isLatteContainment(containment)) {
if (Layouts::Storage::self()->isLatteContainment(containment)) {
qDebug() << "new latte containment id: " << containment->id();
importedDocks << containment;
}
@ -361,7 +315,7 @@ void Storage::systraysInformation(QHash<int, QList<int>> &systrays, QList<int> &
//! assigned systrays
for (const auto &cId : containmentGroups.groupList()) {
if (isLatteContainment(containmentGroups.group(cId))) {
if (Layouts::Storage::self()->isLatteContainment(containmentGroups.group(cId))) {
auto applets = containmentGroups.group(cId).group("Applets");
for (const auto &applet : applets.groupList()) {
@ -378,7 +332,7 @@ void Storage::systraysInformation(QHash<int, QList<int>> &systrays, QList<int> &
//! orphan systrays
for (const auto &cId : containmentGroups.groupList()) {
if (!isLatteContainment(containmentGroups.group(cId)) && !assignedSystrays.contains(cId.toInt())) {
if (!Layouts::Storage::self()->isLatteContainment(containmentGroups.group(cId)) && !assignedSystrays.contains(cId.toInt())) {
orphanSystrays << cId.toInt();
}
}
@ -392,7 +346,7 @@ QList<ViewData> Storage::viewsData(const QHash<int, QList<int>> &systrays)
KConfigGroup containmentGroups = KConfigGroup(lFile, "Containments");
for (const auto &cId : containmentGroups.groupList()) {
if (isLatteContainment(containmentGroups.group(cId))) {
if (Layouts::Storage::self()->isLatteContainment(containmentGroups.group(cId))) {
ViewData vData;
int id = cId.toInt();
@ -430,7 +384,7 @@ QList<int> Storage::viewsScreens()
KConfigGroup containmentGroups = KConfigGroup(lFile, "Containments");
for (const auto &cId : containmentGroups.groupList()) {
if (isLatteContainment(containmentGroups.group(cId))) {
if (Layouts::Storage::self()->isLatteContainment(containmentGroups.group(cId))) {
int screenId = containmentGroups.group(cId).readEntry("lastScreen", -1);
if (screenId != -1 && !screens.contains(screenId)) {

@ -40,14 +40,9 @@ public:
Storage(GenericLayout *parent);
~Storage() override;
bool isWritable() const;
bool isLatteContainment(Plasma::Containment *containment) const;
bool isLatteContainment(const KConfigGroup &group) const;
bool layoutIsBroken(QStringList &errors) const;
void importToCorona();
void lock(); //! make it only read-only
void unlock(); //! make it writable which it should be the default
void copyView(Plasma::Containment *containment);
void syncToLayoutFile(bool removeLayoutId);

@ -3,6 +3,7 @@ set(lattedock-app_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/importer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/launcherssignals.cpp
${CMAKE_CURRENT_SOURCE_DIR}/manager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/storage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/synchronizer.cpp
PARENT_SCOPE
)

@ -0,0 +1,107 @@
/*
* Copyright 2020 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Latte-Dock
*
* Latte-Dock is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Latte-Dock is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "storage.h"
// local
#include "../layout/storage.h"
// Qt
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QFileInfo>
// KDE
#include <KConfigGroup>
#include <KSharedConfig>
// Plasma
#include <Plasma>
#include <Plasma/Applet>
#include <Plasma/Containment>
namespace Latte {
namespace Layouts {
Storage::Storage()
{
qDebug() << " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LAYOUTS::STORAGE, TEMP DIR ::: " << m_storageTmpDir.path();
}
Storage::~Storage()
{
}
Storage *Storage::self()
{
static Storage store;
return &store;
}
bool Storage::isWritable(const Layout::GenericLayout *layout) const
{
QFileInfo layoutFileInfo(layout->file());
if (layoutFileInfo.exists() && !layoutFileInfo.isWritable()) {
return false;
} else {
return true;
}
}
bool Storage::isLatteContainment(Plasma::Containment *containment) const
{
if (!containment) {
return false;
}
if (containment->pluginMetaData().pluginId() == "org.kde.latte.containment") {
return true;
}
return false;
}
bool Storage::isLatteContainment(const KConfigGroup &group) const
{
QString pluginId = group.readEntry("plugin", "");
return pluginId == "org.kde.latte.containment";
}
void Storage::lock(Layout::GenericLayout *layout) const
{
QFileInfo layoutFileInfo(layout->file());
if (layoutFileInfo.exists() && layoutFileInfo.isWritable()) {
QFile(layout->file()).setPermissions(QFileDevice::ReadUser | QFileDevice::ReadGroup | QFileDevice::ReadOther);
}
}
void Storage::unlock(Layout::GenericLayout *layout) const
{
QFileInfo layoutFileInfo(layout->file());
if (layoutFileInfo.exists() && !layoutFileInfo.isWritable()) {
QFile(layout->file()).setPermissions(QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ReadGroup | QFileDevice::ReadOther);
}
}
}
}

@ -0,0 +1,66 @@
/*
* Copyright 2020 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Latte-Dock
*
* Latte-Dock is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Latte-Dock is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LAYOUTSSTORAGE_H
#define LAYOUTSSTORAGE_H
// Qt
#include <QTemporaryDir>
// KDE
#include <KConfigGroup>
// Plasma
#include <Plasma/Containment>
namespace Latte {
namespace Layout {
class GenericLayout;
}
}
namespace Latte {
namespace Layouts {
class Storage
{
public:
static Storage *self();
~Storage();
bool isWritable(const Layout::GenericLayout *layout) const;
bool isLatteContainment(Plasma::Containment *containment) const;
bool isLatteContainment(const KConfigGroup &group) const;
void lock(Layout::GenericLayout *layout) const; //! make it only read-only
void unlock(Layout::GenericLayout *layout) const; //! make it writable which it should be the default
private:
Storage();
private:
QTemporaryDir m_storageTmpDir;
};
}
}
#endif
Loading…
Cancel
Save