From fb9fd945a0df2fd1411421909cf28ce3a6059b47 Mon Sep 17 00:00:00 2001 From: Dmytro Syzov Date: Thu, 13 Nov 2025 14:33:27 +0100 Subject: [PATCH] feat: preserve the last selected account between runs Added an extra setting in the config that contains an account id to store the last one selected Modified usermodel logic to auto select the account using the id from the config Modified the account manager and user model to init user list after account restoration completes Signed-off-by: Dmytro Syzov --- src/gui/accountmanager.cpp | 5 +++++ src/gui/accountmanager.h | 1 + src/gui/tray/usermodel.cpp | 46 +++++++++++++++++++++++++++++++++----- src/gui/tray/usermodel.h | 2 ++ src/libsync/configfile.cpp | 14 ++++++++++++ src/libsync/configfile.h | 4 ++++ 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/gui/accountmanager.cpp b/src/gui/accountmanager.cpp index 4822d5f6212bd..c5f531b260bc0 100644 --- a/src/gui/accountmanager.cpp +++ b/src/gui/accountmanager.cpp @@ -107,6 +107,7 @@ AccountManager::AccountsRestoreResult AccountManager::restore(const bool alsoRes if (skipSettingsKeys.contains(settings->group())) { // Should not happen: bad container keys should have been deleted qCWarning(lcAccountManager) << "Accounts structure is too new, ignoring"; + emit(accountListInitialized()); return AccountsRestoreSuccessWithSkipped; } @@ -114,11 +115,13 @@ AccountManager::AccountsRestoreResult AccountManager::restore(const bool alsoRes #if !DISABLE_ACCOUNT_MIGRATION if (settings->childGroups().isEmpty() && !settings->contains(QLatin1String(versionC)) && alsoRestoreLegacySettings) { restoreFromLegacySettings(); + emit(accountListInitialized()); return AccountsRestoreSuccessFromLegacyVersion; } #endif if (settings->childGroups().isEmpty()) { + emit(accountListInitialized()); return AccountsNotFound; } @@ -148,6 +151,8 @@ AccountManager::AccountsRestoreResult AccountManager::restore(const bool alsoRes } } + emit(accountListInitialized()); + ConfigFile().cleanupGlobalNetworkConfiguration(); ClientProxy().cleanupGlobalNetworkConfiguration(); diff --git a/src/gui/accountmanager.h b/src/gui/accountmanager.h index ea597594d08ad..a9a3303fe9fa6 100644 --- a/src/gui/accountmanager.h +++ b/src/gui/accountmanager.h @@ -108,6 +108,7 @@ public slots: void removeAccountFolders(OCC::AccountState *account); void forceLegacyImportChanged(); void capabilitiesChanged(); + void accountListInitialized(); private: // saving and loading Account to settings diff --git a/src/gui/tray/usermodel.cpp b/src/gui/tray/usermodel.cpp index 88318371b7467..7781b09d1c249 100644 --- a/src/gui/tray/usermodel.cpp +++ b/src/gui/tray/usermodel.cpp @@ -1334,13 +1334,14 @@ UserModel *UserModel::instance() UserModel::UserModel(QObject *parent) : QAbstractListModel(parent) { - // TODO: Remember selected user from last quit via settings file if (AccountManager::instance()->accounts().size() > 0) { - buildUserList(); + setInitialUser(); } connect(AccountManager::instance(), &AccountManager::accountAdded, - this, &UserModel::buildUserList); + this, &UserModel::addAccsToUserList); + connect(AccountManager::instance(), &AccountManager::accountListInitialized, + this, &UserModel::setInitialUser); } void UserModel::buildUserList() @@ -1349,10 +1350,41 @@ void UserModel::buildUserList() auto user = AccountManager::instance()->accounts().at(i); addUser(user); } +} + +void UserModel::addAccsToUserList() +{ if (_init) { - _users.first()->setCurrentUser(true); - _init = false; + return; } + + buildUserList(); +} + +void UserModel::setInitialUser() +{ + if (!_init) { + return; + } + + buildUserList(); + + if(!_users.isEmpty()) { + ConfigFile cfg; + const uint lastSelectedAccountId = cfg.lastSelectedAccount(); + + for (int i = 0; i < _users.size(); i++) { + if (_users.at(i)->account()->id().toUInt() == lastSelectedAccountId) { + setCurrentUserId(i); + } + } + + if (_currentUserId < 0) { + setCurrentUserId(0); + } + } + + _init = false; } int UserModel::numUsers() @@ -1430,7 +1462,7 @@ void UserModel::addUser(AccountStatePtr &user, const bool &isCurrent) }); _users << u; - if (isCurrent || _currentUserId < 0) { + if (isCurrent || (_currentUserId < 0 && !_init)) { setCurrentUserId(_users.size() - 1); } @@ -1524,6 +1556,8 @@ void UserModel::setCurrentUserId(const int id) // order has changed, index remained the same emit currentUserChanged(); } else if (_currentUserId != id) { + ConfigFile cfg; + cfg.setLastSelectedAccount(_users[id]->account()->id().toUInt()); _currentUserId = id; emit currentUserChanged(); } diff --git a/src/gui/tray/usermodel.h b/src/gui/tray/usermodel.h index ec416007b2f68..611f5dc05dfa3 100644 --- a/src/gui/tray/usermodel.h +++ b/src/gui/tray/usermodel.h @@ -292,6 +292,8 @@ public slots: bool _init = true; void buildUserList(); + void addAccsToUserList(); + void setInitialUser(); }; class ImageProvider : public QQuickAsyncImageProvider diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index 9f9ad7df61270..3c0f7ee472f3a 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -96,6 +96,8 @@ static const QString defaultEnterpriseChannel = "enterprise"; static constexpr char languageC[] = "language"; +static constexpr char lastSelectedAccountC[] = "lastSelectedAccount"; + static constexpr int deleteFilesThresholdDefaultValue = 100; } @@ -1255,6 +1257,18 @@ void ConfigFile::setLanguage(const QString& language) settings.setValue(QLatin1String(languageC), language); } +uint ConfigFile::lastSelectedAccount() const +{ + QSettings settings(configFile(), QSettings::IniFormat); + return settings.value(QLatin1String(lastSelectedAccountC), QLatin1String("")).toUInt(); +} + +void ConfigFile::setLastSelectedAccount(const uint accountId) +{ + QSettings settings(configFile(), QSettings::IniFormat); + settings.setValue(QLatin1String(lastSelectedAccountC), accountId); +} + Q_GLOBAL_STATIC(QString, g_configFileName) std::unique_ptr ConfigFile::settingsWithGroup(const QString &group, QObject *parent) diff --git a/src/libsync/configfile.h b/src/libsync/configfile.h index dd865020272b1..0ba2099b2a486 100644 --- a/src/libsync/configfile.h +++ b/src/libsync/configfile.h @@ -238,6 +238,10 @@ class OWNCLOUDSYNC_EXPORT ConfigFile [[nodiscard]] QString language() const; void setLanguage(const QString &language); + /// Store and retrieve the last selected account identifier + [[nodiscard]] uint lastSelectedAccount() const; + void setLastSelectedAccount(const uint accountId); + /** Returns a new settings pre-set in a specific group. The Settings will be created with the given parent. If no parent is specified, the caller must destroy the settings */ static std::unique_ptr settingsWithGroup(const QString &group, QObject *parent = nullptr);