diff --git a/containments/homescreens/folio/favouritesmodel.cpp b/containments/homescreens/folio/favouritesmodel.cpp index 8df2a026..955fd140 100644 --- a/containments/homescreens/folio/favouritesmodel.cpp +++ b/containments/homescreens/folio/favouritesmodel.cpp @@ -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()); } diff --git a/containments/homescreens/folio/foliosettings.cpp b/containments/homescreens/folio/foliosettings.cpp index da5fefaf..e4a54feb 100644 --- a/containments/homescreens/folio/foliosettings.cpp +++ b/containments/homescreens/folio/foliosettings.cpp @@ -10,6 +10,14 @@ #include #include +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(m_homeScreen->config().readEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)SlideTransition)); - m_wallpaperBlurEffect = static_cast(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(generalGroup.readEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)SlideTransition)); + m_wallpaperBlurEffect = static_cast(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 - m_homeScreen->favouritesModel()->loadFromJson(obj[QStringLiteral("Favourites")].toArray()); + // 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](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(); +} diff --git a/containments/homescreens/folio/foliosettings.h b/containments/homescreens/folio/foliosettings.h index 74371d2e..9e2772cd 100644 --- a/containments/homescreens/folio/foliosettings.h +++ b/containments/homescreens/folio/foliosettings.h @@ -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}; diff --git a/containments/homescreens/folio/pagelistmodel.cpp b/containments/homescreens/folio/pagelistmodel.cpp index 7accb7b9..29a0e8a9 100644 --- a/containments/homescreens/folio/pagelistmodel.cpp +++ b/containments/homescreens/folio/pagelistmodel.cpp @@ -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()); }