From bcf51dc9bceff919a26aed18acf540fadb944328 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Sat, 7 May 2022 11:39:35 -0400 Subject: [PATCH] Support changing download directory for internal server --- .../jui/data/server/ServerHostPreferences.kt | 5 +++ .../data/server/host/ServerHostPreference.kt | 5 +++ .../resources/MR/values/base/strings.xml | 3 ++ .../settings/DesktopSettingsServerScreen.kt | 25 +++++++++++++ .../ca/gosyer/jui/ui/util/system/File.kt | 36 +++++++++++++++++-- 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/ServerHostPreferences.kt b/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/ServerHostPreferences.kt index aaac914f..22256cb0 100644 --- a/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/ServerHostPreferences.kt +++ b/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/ServerHostPreferences.kt @@ -48,6 +48,10 @@ class ServerHostPreferences(private val preferenceStore: PreferenceStore) { fun systemTrayEnabled(): Preference { return systemTrayEnabled.preference() } + private val downloadPath = ServerHostPreference.DownloadPath(preferenceStore) + fun downloadPath(): Preference { + return downloadPath.preference() + } // WebUI private val webUIEnabled = ServerHostPreference.WebUIEnabled(preferenceStore) @@ -82,6 +86,7 @@ class ServerHostPreferences(private val preferenceStore: PreferenceStore) { socksProxyPort, debugLogsEnabled, systemTrayEnabled, + downloadPath, webUIEnabled, openInBrowserEnabled, basicAuthEnabled, diff --git a/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/host/ServerHostPreference.kt b/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/host/ServerHostPreference.kt index d59e5497..778d3002 100644 --- a/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/host/ServerHostPreference.kt +++ b/data/src/desktopMain/kotlin/ca/gosyer/jui/data/server/host/ServerHostPreference.kt @@ -106,6 +106,11 @@ sealed class ServerHostPreference { false, true ) + class DownloadPath(preferenceStore: PreferenceStore) : StringServerHostPreference( + preferenceStore, + "downloadsPath", + "" + ) // WebUI class WebUIEnabled(preferenceStore: PreferenceStore) : BooleanServerHostPreference( diff --git a/i18n/src/commonMain/resources/MR/values/base/strings.xml b/i18n/src/commonMain/resources/MR/values/base/strings.xml index 6068a82c..2184488a 100644 --- a/i18n/src/commonMain/resources/MR/values/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/values/base/strings.xml @@ -263,6 +263,9 @@ Output debug logs from the server to JUI Server system tray icon Use the system tray icon to view whether the server is running + Download path + Current download path: %1$s + Using default download path Server WebUI Whether the server\'s default WebUI is enabled, makes you able to use Tachidesk in your browser Open Server WebUI on startup diff --git a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/settings/DesktopSettingsServerScreen.kt b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/settings/DesktopSettingsServerScreen.kt index 59722157..3c9c5ad2 100644 --- a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/settings/DesktopSettingsServerScreen.kt +++ b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/settings/DesktopSettingsServerScreen.kt @@ -23,6 +23,7 @@ import ca.gosyer.jui.i18n.MR import ca.gosyer.jui.ui.base.prefs.EditTextPreference import ca.gosyer.jui.ui.base.prefs.PreferenceRow import ca.gosyer.jui.ui.base.prefs.SwitchPreference +import ca.gosyer.jui.ui.util.system.folderPicker import ca.gosyer.jui.uicore.prefs.PreferenceMutableStateFlow import ca.gosyer.jui.uicore.prefs.asStateIn import ca.gosyer.jui.uicore.prefs.asStringStateIn @@ -60,6 +61,7 @@ actual fun getServerHostItems(viewModel: @Composable () -> SettingsServerHostVie socksProxyPort = serverVm.socksProxyPort, debugLogsEnabled = serverVm.debugLogsEnabled, systemTrayEnabled = serverVm.systemTrayEnabled, + downloadPath = serverVm.downloadPath, webUIEnabled = serverVm.webUIEnabled, openInBrowserEnabled = serverVm.openInBrowserEnabled, basicAuthEnabled = serverVm.basicAuthEnabled, @@ -87,6 +89,7 @@ actual class SettingsServerHostViewModel @Inject constructor( // Misc val debugLogsEnabled = serverHostPreferences.debugLogsEnabled().asStateIn(scope) val systemTrayEnabled = serverHostPreferences.systemTrayEnabled().asStateIn(scope) + val downloadPath = serverHostPreferences.downloadPath().asStateIn(scope) // WebUI val webUIEnabled = serverHostPreferences.webUIEnabled().asStateIn(scope) @@ -141,6 +144,7 @@ fun LazyListScope.ServerHostItems( socksProxyPort: PreferenceMutableStateFlow, debugLogsEnabled: PreferenceMutableStateFlow, systemTrayEnabled: PreferenceMutableStateFlow, + downloadPath: PreferenceMutableStateFlow, webUIEnabled: PreferenceMutableStateFlow, openInBrowserEnabled: PreferenceMutableStateFlow, basicAuthEnabled: PreferenceMutableStateFlow, @@ -217,6 +221,27 @@ fun LazyListScope.ServerHostItems( changeListener = serverSettingChanged ) } + item { + val downloadPathValue by downloadPath.collectAsState() + PreferenceRow( + title = stringResource(MR.strings.host_download_path), + subtitle = if (downloadPathValue.isEmpty()) { + stringResource(MR.strings.host_download_path_sub_empty) + } else { + stringResource(MR.strings.host_download_path_sub, downloadPathValue) + }, + onClick = { + folderPicker { + downloadPath.value = it.toString() + serverSettingChanged() + } + }, + onLongClick = { + downloadPath.value = "" + serverSettingChanged() + } + ) + } item { SwitchPreference( preference = webUIEnabled, diff --git a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/system/File.kt b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/system/File.kt index f18402a8..4dcfadb7 100644 --- a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/system/File.kt +++ b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/system/File.kt @@ -19,7 +19,29 @@ fun filePicker( onCancel: () -> Unit = {}, onError: () -> Unit = {}, onApprove: (Path) -> Unit -) = fileChooser(false, onCancel, onError, onApprove, extensions = extensions) +) = fileChooser( + saving = false, + selectFolders = false, + selectFiles = true, + onCancel = onCancel, + onError = onError, + onApprove = onApprove, + defaultFileName = "", + extensions = extensions +) + +fun folderPicker( + onCancel: () -> Unit = {}, + onError: () -> Unit = {}, + onApprove: (Path) -> Unit +) = fileChooser( + saving = false, + selectFolders = true, + selectFiles = false, + onCancel = onCancel, + onError = onError, + onApprove = onApprove +) fun fileSaver( defaultFileName: String, @@ -28,6 +50,8 @@ fun fileSaver( onError: () -> Unit = {}, onApprove: (Path) -> Unit ) = fileChooser( + true, + false, true, onCancel, onError, @@ -45,8 +69,10 @@ fun fileSaver( * @param onApprove the listener that is called when picking a file is completed */ @OptIn(DelicateCoroutinesApi::class) -internal fun fileChooser( +private fun fileChooser( saving: Boolean = false, + selectFolders: Boolean = false, + selectFiles: Boolean = true, onCancel: () -> Unit = {}, onError: () -> Unit = {}, onApprove: (Path) -> Unit, @@ -63,6 +89,12 @@ internal fun fileChooser( if (saving) { selectedFile = Path(defaultFileName).toFile() } + fileSelectionMode = when { + selectFiles && selectFolders -> JFileChooser.FILES_AND_DIRECTORIES + selectFiles -> JFileChooser.FILES_ONLY + selectFolders -> JFileChooser.DIRECTORIES_ONLY + else -> fileSelectionMode + } } val result = fileChooser.let {