From 4dbbb315b4192ba06ba144096c5cb8bcba36d49a Mon Sep 17 00:00:00 2001 From: Julian Thanner Date: Fri, 10 Oct 2025 18:55:10 +0200 Subject: [PATCH 1/2] add dir name option Signed-off-by: Julian Thanner --- .../macOS/fileproviderdomainmanager_mac.mm | 14 +++++ .../macOS/fileprovidersettingscontroller.h | 3 + .../fileprovidersettingscontroller_mac.mm | 60 +++++++++++++++++++ src/gui/macOS/ui/FileProviderSettings.qml | 29 +++++++++ 4 files changed, 106 insertions(+) diff --git a/src/gui/macOS/fileproviderdomainmanager_mac.mm b/src/gui/macOS/fileproviderdomainmanager_mac.mm index 89690f01a3c82..5362e0b7c3ca4 100644 --- a/src/gui/macOS/fileproviderdomainmanager_mac.mm +++ b/src/gui/macOS/fileproviderdomainmanager_mac.mm @@ -72,6 +72,20 @@ inline QString uuidDomainIdentifierForAccount(const OCC::AccountPtr account) inline QString domainDisplayNameForAccount(const OCC::Account * const account) { Q_ASSERT(account); + + // Check if there's a custom folder name set for this account + const auto accountId = account->userIdAtHostWithPort(); + const auto controller = OCC::Mac::FileProviderSettingsController::instance(); + const auto customFolderName = controller->customFolderNameForAccount(accountId); + + if (!customFolderName.isEmpty()) { + qCDebug(OCC::lcMacFileProviderDomainManager) << "Using custom folder name" + << customFolderName + << "for account" + << accountId; + return customFolderName; + } + return account->displayName(); } diff --git a/src/gui/macOS/fileprovidersettingscontroller.h b/src/gui/macOS/fileprovidersettingscontroller.h index 0633978dad034..1f85eb8dd69c5 100644 --- a/src/gui/macOS/fileprovidersettingscontroller.h +++ b/src/gui/macOS/fileprovidersettingscontroller.h @@ -37,6 +37,7 @@ class FileProviderSettingsController : public QObject [[nodiscard]] Q_INVOKABLE float remoteStorageUsageGbForAccount(const QString &userIdAtHost) const; [[nodiscard]] Q_INVOKABLE bool trashDeletionEnabledForAccount(const QString &userIdAtHost) const; [[nodiscard]] Q_INVOKABLE bool trashDeletionSetForAccount(const QString &userIdAtHost) const; + [[nodiscard]] Q_INVOKABLE QString customFolderNameForAccount(const QString &userIdAtHost) const; [[nodiscard]] Q_INVOKABLE QAbstractListModel *materialisedItemsModelForAccount(const QString &userIdAtHost); [[nodiscard]] Q_INVOKABLE FileProviderDomainSyncStatus *domainSyncStatusForAccount(const QString &userIdAtHost) const; @@ -44,6 +45,7 @@ class FileProviderSettingsController : public QObject public slots: void setVfsEnabledForAccount(const QString &userIdAtHost, const bool setEnabled, const bool showInformationDialog = true); void setTrashDeletionEnabledForAccount(const QString &userIdAtHost, const bool setEnabled); + void setCustomFolderNameForAccount(const QString &userIdAtHost, const QString &folderName); void resetVfsForAccount(const QString &userIdAtHost); void createEvictionWindowForAccount(const QString &userIdAtHost); @@ -57,6 +59,7 @@ public slots: void materialisedItemsForAccountChanged(const QString &userIdAtHost); void trashDeletionEnabledForAccountChanged(const QString &userIdAtHost); void trashDeletionSetForAccountChanged(const QString &userIdAtHost); + void customFolderNameForAccountChanged(const QString &userIdAtHost); private: explicit FileProviderSettingsController(QObject *parent = nullptr); diff --git a/src/gui/macOS/fileprovidersettingscontroller_mac.mm b/src/gui/macOS/fileprovidersettingscontroller_mac.mm index 8a19ba10f3a0f..c1cc68ecc44ff 100644 --- a/src/gui/macOS/fileprovidersettingscontroller_mac.mm +++ b/src/gui/macOS/fileprovidersettingscontroller_mac.mm @@ -31,6 +31,7 @@ // NSUserDefaults entries constexpr auto enabledAccountsSettingsKey = "enabledAccounts"; +constexpr auto customFolderNamesSettingsKey = "customFolderNames"; float gbFromBytesWithOneDecimal(const unsigned long long bytes) { @@ -182,6 +183,48 @@ void signalFileProviderDomain(const QString &userIdAtHost) const return _fileProviderDomainSyncStatuses.value(userIdAtHost); } + [[nodiscard]] QString customFolderNameForAccount(const QString &userIdAtHost) const + { + NSDictionary *const customFolderNames = nsCustomFolderNames(); + + if (customFolderNames == nil) { + return QString(); + } + + NSString *const folderName = [customFolderNames objectForKey:userIdAtHost.toNSString()]; + + if (folderName == nil) { + return QString(); + } + + return QString::fromNSString(folderName); + } + + void setCustomFolderNameForAccount(const QString &userIdAtHost, const QString &folderName) + { + qCInfo(lcFileProviderSettingsController) << "Setting custom folder name for account" + << userIdAtHost + << "to" + << folderName; + + NSDictionary *customFolderNames = nsCustomFolderNames(); + + if (customFolderNames == nil) { + customFolderNames = @{}; + } + + NSMutableDictionary *const mutableCustomFolderNames = customFolderNames.mutableCopy; + + if (folderName.isEmpty()) { + [mutableCustomFolderNames removeObjectForKey:userIdAtHost.toNSString()]; + } else { + [mutableCustomFolderNames setObject:folderName.toNSString() forKey:userIdAtHost.toNSString()]; + } + + [_userDefaults setObject:mutableCustomFolderNames forKey:_customFolderNamesKey]; + [_userDefaults synchronize]; + } + public slots: // NOTE: This method will release the provided args so make sure to retain them beforehand void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const managerForDomain, @@ -253,6 +296,11 @@ void updateDomainSyncStatuses() { return (NSArray *)[_userDefaults objectForKey:_accountsKey]; } + + [[nodiscard]] NSDictionary *nsCustomFolderNames() const + { + return (NSDictionary *)[_userDefaults objectForKey:_customFolderNamesKey]; + } void fetchMaterialisedFilesStorageUsage() { @@ -313,6 +361,7 @@ void initialCheck() FileProviderSettingsController *q = nullptr; NSUserDefaults *_userDefaults = NSUserDefaults.standardUserDefaults; NSString *_accountsKey = [NSString stringWithUTF8String:enabledAccountsSettingsKey]; + NSString *_customFolderNamesKey = [NSString stringWithUTF8String:customFolderNamesSettingsKey]; QHash> _materialisedFiles; QHash _storageUsage; QHash _fileProviderDomainSyncStatuses; @@ -514,6 +563,17 @@ void initialCheck() return d->domainSyncStatusForAccount(userIdAtHost); } +QString FileProviderSettingsController::customFolderNameForAccount(const QString &userIdAtHost) const +{ + return d->customFolderNameForAccount(userIdAtHost); +} + +void FileProviderSettingsController::setCustomFolderNameForAccount(const QString &userIdAtHost, const QString &folderName) +{ + d->setCustomFolderNameForAccount(userIdAtHost, folderName); + emit customFolderNameForAccountChanged(userIdAtHost); +} + void FileProviderSettingsController::resetVfsForAccount(const QString &userIdAtHost) { qCInfo(lcFileProviderSettingsController) << "Resetting virtual files environment for account" << userIdAtHost; diff --git a/src/gui/macOS/ui/FileProviderSettings.qml b/src/gui/macOS/ui/FileProviderSettings.qml index ef78665bbed43..91c450bfe684f 100644 --- a/src/gui/macOS/ui/FileProviderSettings.qml +++ b/src/gui/macOS/ui/FileProviderSettings.qml @@ -54,6 +54,35 @@ Page { onClicked: root.controller.setVfsEnabledForAccount(root.accountUserIdAtHost, checked) } + RowLayout { + Layout.fillWidth: true + spacing: Style.standardSpacing + + EnforcedPlainTextLabel { + text: qsTr("Custom folder name:") + Layout.preferredWidth: 150 + } + + TextField { + id: customFolderNameField + Layout.fillWidth: true + placeholderText: qsTr("Enter custom folder name (leave empty for default)") + text: root.controller.customFolderNameForAccount(root.accountUserIdAtHost) + onEditingFinished: root.controller.setCustomFolderNameForAccount(root.accountUserIdAtHost, text) + + Connections { + target: root.controller + + function onCustomFolderNameForAccountChanged(accountUserIdAtHost) { + if (root.accountUserIdAtHost !== accountUserIdAtHost) { + return; + } + customFolderNameField.text = root.controller.customFolderNameForAccount(root.accountUserIdAtHost); + } + } + } + } + Loader { id: vfsSettingsLoader From 006f6be2c18577639689e714c351acce01464a82 Mon Sep 17 00:00:00 2001 From: Julian Thanner Date: Sat, 11 Oct 2025 01:11:01 +0200 Subject: [PATCH 2/2] add option to set the Directory name - got rid of circular dependency Signed-off-by: Julian Thanner --- .../macOS/fileproviderdomainmanager_mac.mm | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/gui/macOS/fileproviderdomainmanager_mac.mm b/src/gui/macOS/fileproviderdomainmanager_mac.mm index 5362e0b7c3ca4..e7e75fe42f490 100644 --- a/src/gui/macOS/fileproviderdomainmanager_mac.mm +++ b/src/gui/macOS/fileproviderdomainmanager_mac.mm @@ -29,6 +29,30 @@ // are consistent throughout these classes namespace { +// Helper function to get custom folder name directly from NSUserDefaults +// without going through FileProviderSettingsController singleton to avoid +// circular dependency during initialization +QString customFolderNameFromUserDefaults(const QString &accountId) +{ + NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults; + NSString *customFolderNamesKey = @"customFolderNames"; + + NSDictionary *customFolderNames = + (NSDictionary *)[userDefaults objectForKey:customFolderNamesKey]; + + if (customFolderNames == nil) { + return QString(); + } + + NSString *folderName = [customFolderNames objectForKey:accountId.toNSString()]; + + if (folderName == nil) { + return QString(); + } + + return QString::fromNSString(folderName); +} + QString uuidDomainIdentifierForAccount(const OCC::Account * const account) { Q_ASSERT(account); @@ -72,12 +96,12 @@ inline QString uuidDomainIdentifierForAccount(const OCC::AccountPtr account) inline QString domainDisplayNameForAccount(const OCC::Account * const account) { Q_ASSERT(account); - - // Check if there's a custom folder name set for this account const auto accountId = account->userIdAtHostWithPort(); - const auto controller = OCC::Mac::FileProviderSettingsController::instance(); - const auto customFolderName = controller->customFolderNameForAccount(accountId); - + + // Access custom folder name directly from NSUserDefaults to avoid circular dependency + // with FileProviderSettingsController singleton during initialization + const auto customFolderName = customFolderNameFromUserDefaults(accountId); + if (!customFolderName.isEmpty()) { qCDebug(OCC::lcMacFileProviderDomainManager) << "Using custom folder name" << customFolderName @@ -85,7 +109,7 @@ inline QString domainDisplayNameForAccount(const OCC::Account * const account) << accountId; return customFolderName; } - + return account->displayName(); }