folio: Move settings to config group, and consolidate

Currently Folio's settings are being written to the main KConfigGroup of the
containment, when can interfere with other generic containment settings.
ShellCorona in plasma-workspace also expects the settings to be in
sub-config group when it preserves them when changing containments.

This commit moves all of the settings to its own config group, and also
consolidates config read/write for favourites and pages into
FolioSettings.
This commit is contained in:
Devin Lin 2025-07-16 00:26:00 -04:00
parent 5139984e94
commit 7dc2d980aa
4 changed files with 127 additions and 29 deletions

View file

@ -252,8 +252,7 @@ void FavouritesModel::save()
QJsonArray arr = exportToJson();
QByteArray data = QJsonDocument(arr).toJson(QJsonDocument::Compact);
m_homeScreen->config().writeEntry("Favourites", QString::fromStdString(data.toStdString()));
Q_EMIT m_homeScreen->configNeedsSaving();
m_homeScreen->folioSettings()->setFavorites(QString::fromStdString(data.toStdString()));
}
void FavouritesModel::load()
@ -262,7 +261,7 @@ void FavouritesModel::load()
return;
}
QJsonDocument doc = QJsonDocument::fromJson(m_homeScreen->config().readEntry("Favourites", "{}").toUtf8());
QJsonDocument doc = QJsonDocument::fromJson(m_homeScreen->folioSettings()->favorites().toUtf8());
loadFromJson(doc.array());
}

View file

@ -10,6 +10,14 @@
#include <QJsonDocument>
#include <QTextStream>
using namespace Qt::Literals::StringLiterals;
// The config group all of the settings are under
const QString CFG_GROUP_FOLIO = QStringLiteral("Folio");
const QString CFG_KEY_FAVORITES = QStringLiteral("favorites");
const QString CFG_KEY_PAGES = QStringLiteral("pages");
const QString CFG_KEY_HOMESCREEN_ROWS = QStringLiteral("homeScreenRows");
const QString CFG_KEY_HOMESCREEN_COLS = QStringLiteral("homeScreenColumns");
const QString CFG_KEY_SHOW_PAGES_APPLABELS = QStringLiteral("showPagesAppLabels");
@ -27,6 +35,30 @@ FolioSettings::FolioSettings(HomeScreen *parent)
{
}
QString FolioSettings::favorites() const
{
return generalConfigGroup().readEntry(CFG_KEY_FAVORITES, u"{}"_s);
}
void FolioSettings::setFavorites(const QString &favoritesJson)
{
// Saved separately from other options, since it's changed from the homescreen (not settings window)
generalConfigGroup().writeEntry(CFG_KEY_FAVORITES, favoritesJson);
Q_EMIT m_homeScreen->configNeedsSaving();
}
QString FolioSettings::pages() const
{
return generalConfigGroup().readEntry(CFG_KEY_PAGES, u"{}"_s);
}
void FolioSettings::setPages(const QString &pagesJson)
{
// Saved separately from other options, since it's changed from the homescreen (not settings window)
generalConfigGroup().writeEntry(CFG_KEY_PAGES, pagesJson);
Q_EMIT m_homeScreen->configNeedsSaving();
}
int FolioSettings::homeScreenRows() const
{
// ensure that this is fetched fast and cached (it is called extremely often)
@ -174,16 +206,18 @@ void FolioSettings::save()
return;
}
m_homeScreen->config().writeEntry(CFG_KEY_HOMESCREEN_ROWS, m_homeScreenRows);
m_homeScreen->config().writeEntry(CFG_KEY_HOMESCREEN_COLS, m_homeScreenColumns);
m_homeScreen->config().writeEntry(CFG_KEY_SHOW_PAGES_APPLABELS, m_showPagesAppLabels);
m_homeScreen->config().writeEntry(CFG_KEY_SHOW_FAVORITES_APPLABELS, m_showFavouritesAppLabels);
m_homeScreen->config().writeEntry(CFG_KEY_LOCK_LAYOUT, m_lockLayout);
m_homeScreen->config().writeEntry(CFG_KEY_DELEGATE_ICON_SIZE, m_delegateIconSize);
m_homeScreen->config().writeEntry(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, m_showFavouritesBarBackground);
m_homeScreen->config().writeEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)m_pageTransitionEffect);
m_homeScreen->config().writeEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, (int)m_wallpaperBlurEffect);
m_homeScreen->config().writeEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, m_doubleTapToLock);
auto generalGroup = generalConfigGroup();
generalGroup.writeEntry(CFG_KEY_HOMESCREEN_ROWS, m_homeScreenRows);
generalGroup.writeEntry(CFG_KEY_HOMESCREEN_COLS, m_homeScreenColumns);
generalGroup.writeEntry(CFG_KEY_SHOW_PAGES_APPLABELS, m_showPagesAppLabels);
generalGroup.writeEntry(CFG_KEY_SHOW_FAVORITES_APPLABELS, m_showFavouritesAppLabels);
generalGroup.writeEntry(CFG_KEY_LOCK_LAYOUT, m_lockLayout);
generalGroup.writeEntry(CFG_KEY_DELEGATE_ICON_SIZE, m_delegateIconSize);
generalGroup.writeEntry(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, m_showFavouritesBarBackground);
generalGroup.writeEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)m_pageTransitionEffect);
generalGroup.writeEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, (int)m_wallpaperBlurEffect);
generalGroup.writeEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, m_doubleTapToLock);
Q_EMIT m_homeScreen->configNeedsSaving();
}
@ -194,16 +228,20 @@ void FolioSettings::load()
return;
}
m_homeScreenRows = m_homeScreen->config().readEntry(CFG_KEY_HOMESCREEN_ROWS, 5);
m_homeScreenColumns = m_homeScreen->config().readEntry(CFG_KEY_HOMESCREEN_COLS, 4);
m_showPagesAppLabels = m_homeScreen->config().readEntry(CFG_KEY_SHOW_PAGES_APPLABELS, true);
m_showFavouritesAppLabels = m_homeScreen->config().readEntry(CFG_KEY_SHOW_FAVORITES_APPLABELS, false);
m_lockLayout = m_homeScreen->config().readEntry(CFG_KEY_LOCK_LAYOUT, false);
m_delegateIconSize = m_homeScreen->config().readEntry(CFG_KEY_DELEGATE_ICON_SIZE, 48);
m_showFavouritesBarBackground = m_homeScreen->config().readEntry(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, true);
m_pageTransitionEffect = static_cast<PageTransitionEffect>(m_homeScreen->config().readEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)SlideTransition));
m_wallpaperBlurEffect = static_cast<WallpaperBlurEffect>(m_homeScreen->config().readEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, (int)Full));
m_doubleTapToLock = m_homeScreen->config().readEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, true);
migrateConfigFromPlasma6_4();
auto generalGroup = generalConfigGroup();
m_homeScreenRows = generalGroup.readEntry(CFG_KEY_HOMESCREEN_ROWS, 5);
m_homeScreenColumns = generalGroup.readEntry(CFG_KEY_HOMESCREEN_COLS, 4);
m_showPagesAppLabels = generalGroup.readEntry(CFG_KEY_SHOW_PAGES_APPLABELS, true);
m_showFavouritesAppLabels = generalGroup.readEntry(CFG_KEY_SHOW_FAVORITES_APPLABELS, false);
m_lockLayout = generalGroup.readEntry(CFG_KEY_LOCK_LAYOUT, false);
m_delegateIconSize = generalGroup.readEntry(CFG_KEY_DELEGATE_ICON_SIZE, 48);
m_showFavouritesBarBackground = generalGroup.readEntry(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, true);
m_pageTransitionEffect = static_cast<PageTransitionEffect>(generalGroup.readEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)SlideTransition));
m_wallpaperBlurEffect = static_cast<WallpaperBlurEffect>(generalGroup.readEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, (int)Full));
m_doubleTapToLock = generalGroup.readEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, true);
Q_EMIT homeScreenRowsChanged();
Q_EMIT homeScreenColumnsChanged();
@ -211,6 +249,8 @@ void FolioSettings::load()
Q_EMIT showFavouritesAppLabelsChanged();
Q_EMIT lockLayoutChanged();
Q_EMIT delegateIconSizeChanged();
Q_EMIT showFavouritesBarBackgroundChanged();
Q_EMIT pageTransitionEffectChanged();
Q_EMIT wallpaperBlurEffectChanged();
Q_EMIT doubleTapToLockChanged();
}
@ -229,7 +269,7 @@ bool FolioSettings::saveLayoutToFile(QString path)
QJsonArray pages = m_homeScreen->pageListModel()->exportToJson();
QJsonObject obj;
obj[QStringLiteral("Favourites")] = favourites;
obj[QStringLiteral("Favorites")] = favourites;
obj[QStringLiteral("Pages")] = pages;
QByteArray data = QJsonDocument(obj).toJson(QJsonDocument::Compact);
@ -269,8 +309,15 @@ bool FolioSettings::loadLayoutFromFile(QString path)
QJsonDocument doc = QJsonDocument::fromJson(contents.toUtf8());
QJsonObject obj = doc.object();
// TODO error checking
// Parse JSON
// TODO: error checking
if (obj.find(QStringLiteral("Favorites")) != obj.end()) {
m_homeScreen->favouritesModel()->loadFromJson(obj[QStringLiteral("Favorites")].toArray());
} else {
// For legacy purposes, the key used to have a different spelling
m_homeScreen->favouritesModel()->loadFromJson(obj[QStringLiteral("Favourites")].toArray());
}
m_homeScreen->pageListModel()->loadFromJson(obj[QStringLiteral("Pages")].toArray());
m_homeScreen->favouritesModel()->save();
@ -278,3 +325,44 @@ bool FolioSettings::loadLayoutFromFile(QString path)
return true;
}
KConfigGroup FolioSettings::generalConfigGroup() const
{
if (!m_homeScreen) {
return KConfigGroup{};
}
return m_homeScreen->config().group(CFG_GROUP_FOLIO);
}
void FolioSettings::migrateConfigFromPlasma6_4()
{
// Migrate config options (from before Plasma 6.5) from the root config group to [General]
// When adding new config options, do not update this function!
auto oldConfigGroup = m_homeScreen->config();
auto generalGroup = generalConfigGroup();
// Function to migrate a single key
auto migrate = [&oldConfigGroup, &generalGroup]<typename T>(const QString &newKey, const QString &oldKey, const T &oldDefaultValue) {
if (!oldConfigGroup.hasKey(oldKey) || generalGroup.hasKey(newKey)) {
return;
}
generalGroup.writeEntry(newKey, oldConfigGroup.readEntry(oldKey, oldDefaultValue));
oldConfigGroup.deleteEntry(oldKey);
};
migrate(CFG_KEY_FAVORITES, u"Favourites"_s, u"{}"_s);
migrate(CFG_KEY_PAGES, u"Pages"_s, u"[[]]"_s);
migrate(CFG_KEY_HOMESCREEN_ROWS, u"homeScreenRows"_s, 5);
migrate(CFG_KEY_HOMESCREEN_COLS, u"homeScreenColumns"_s, 4);
migrate(CFG_KEY_SHOW_PAGES_APPLABELS, u"showPagesAppLabels"_s, true);
migrate(CFG_KEY_SHOW_FAVORITES_APPLABELS, u"showFavoritesAppLabels"_s, false);
migrate(CFG_KEY_LOCK_LAYOUT, u"lockLayout"_s, false);
migrate(CFG_KEY_DELEGATE_ICON_SIZE, u"delegateIconSize"_s, 48);
migrate(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, u"showFavoritesBarBackground"_s, true);
migrate(CFG_KEY_PAGE_TRANSITION_EFFECT, u"pageTransitionEffect"_s, (int)SlideTransition);
migrate(CFG_KEY_SHOW_WALLPAPER_BLUR, u"wallpaperBlurEffect"_s, (int)Full);
m_homeScreen->config().sync();
}

View file

@ -46,6 +46,14 @@ public:
};
Q_ENUM(WallpaperBlurEffect)
// JSON object
QString favorites() const;
void setFavorites(const QString &favoritesJson);
// JSON object
QString pages() const;
void setPages(const QString &pagesJson);
// number of rows and columns in the config for the homescreen
// NOTE: use HomeScreenState.pageRows() instead in UI logic since we may have the rows and
// columns swapped (in landscape layouts)
@ -98,6 +106,10 @@ Q_SIGNALS:
private:
void save();
KConfigGroup generalConfigGroup() const;
// Legacy
void migrateConfigFromPlasma6_4();
HomeScreen *m_homeScreen{nullptr};

View file

@ -117,8 +117,7 @@ void PageListModel::save()
QJsonArray arr = exportToJson();
QByteArray data = QJsonDocument(arr).toJson(QJsonDocument::Compact);
m_homeScreen->config().writeEntry("Pages", QString::fromStdString(data.toStdString()));
Q_EMIT m_homeScreen->configNeedsSaving();
m_homeScreen->folioSettings()->setPages(QString::fromStdString(data.toStdString()));
}
void PageListModel::load()
@ -127,7 +126,7 @@ void PageListModel::load()
return;
}
QJsonDocument doc = QJsonDocument::fromJson(m_homeScreen->config().readEntry("Pages", "{}").toUtf8());
QJsonDocument doc = QJsonDocument::fromJson(m_homeScreen->folioSettings()->pages().toUtf8());
loadFromJson(doc.array());
}