mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-20 19:42:35 +01:00
Support changing download directory for internal server
This commit is contained in:
@@ -48,6 +48,10 @@ class ServerHostPreferences(private val preferenceStore: PreferenceStore) {
|
|||||||
fun systemTrayEnabled(): Preference<Boolean> {
|
fun systemTrayEnabled(): Preference<Boolean> {
|
||||||
return systemTrayEnabled.preference()
|
return systemTrayEnabled.preference()
|
||||||
}
|
}
|
||||||
|
private val downloadPath = ServerHostPreference.DownloadPath(preferenceStore)
|
||||||
|
fun downloadPath(): Preference<String> {
|
||||||
|
return downloadPath.preference()
|
||||||
|
}
|
||||||
|
|
||||||
// WebUI
|
// WebUI
|
||||||
private val webUIEnabled = ServerHostPreference.WebUIEnabled(preferenceStore)
|
private val webUIEnabled = ServerHostPreference.WebUIEnabled(preferenceStore)
|
||||||
@@ -82,6 +86,7 @@ class ServerHostPreferences(private val preferenceStore: PreferenceStore) {
|
|||||||
socksProxyPort,
|
socksProxyPort,
|
||||||
debugLogsEnabled,
|
debugLogsEnabled,
|
||||||
systemTrayEnabled,
|
systemTrayEnabled,
|
||||||
|
downloadPath,
|
||||||
webUIEnabled,
|
webUIEnabled,
|
||||||
openInBrowserEnabled,
|
openInBrowserEnabled,
|
||||||
basicAuthEnabled,
|
basicAuthEnabled,
|
||||||
|
|||||||
@@ -106,6 +106,11 @@ sealed class ServerHostPreference<T : Any> {
|
|||||||
false,
|
false,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
|
class DownloadPath(preferenceStore: PreferenceStore) : StringServerHostPreference(
|
||||||
|
preferenceStore,
|
||||||
|
"downloadsPath",
|
||||||
|
""
|
||||||
|
)
|
||||||
|
|
||||||
// WebUI
|
// WebUI
|
||||||
class WebUIEnabled(preferenceStore: PreferenceStore) : BooleanServerHostPreference(
|
class WebUIEnabled(preferenceStore: PreferenceStore) : BooleanServerHostPreference(
|
||||||
|
|||||||
@@ -263,6 +263,9 @@
|
|||||||
<string name="host_debug_logging_sub">Output debug logs from the server to JUI</string>
|
<string name="host_debug_logging_sub">Output debug logs from the server to JUI</string>
|
||||||
<string name="host_system_tray">Server system tray icon</string>
|
<string name="host_system_tray">Server system tray icon</string>
|
||||||
<string name="host_system_tray_sub">Use the system tray icon to view whether the server is running</string>
|
<string name="host_system_tray_sub">Use the system tray icon to view whether the server is running</string>
|
||||||
|
<string name="host_download_path">Download path</string>
|
||||||
|
<string name="host_download_path_sub">Current download path: %1$s</string>
|
||||||
|
<string name="host_download_path_sub_empty">Using default download path</string>
|
||||||
<string name="host_webui">Server WebUI</string>
|
<string name="host_webui">Server WebUI</string>
|
||||||
<string name="host_webui_sub">Whether the server\'s default WebUI is enabled, makes you able to use Tachidesk in your browser</string>
|
<string name="host_webui_sub">Whether the server\'s default WebUI is enabled, makes you able to use Tachidesk in your browser</string>
|
||||||
<string name="host_open_in_browser">Open Server WebUI on startup</string>
|
<string name="host_open_in_browser">Open Server WebUI on startup</string>
|
||||||
|
|||||||
@@ -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.EditTextPreference
|
||||||
import ca.gosyer.jui.ui.base.prefs.PreferenceRow
|
import ca.gosyer.jui.ui.base.prefs.PreferenceRow
|
||||||
import ca.gosyer.jui.ui.base.prefs.SwitchPreference
|
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.PreferenceMutableStateFlow
|
||||||
import ca.gosyer.jui.uicore.prefs.asStateIn
|
import ca.gosyer.jui.uicore.prefs.asStateIn
|
||||||
import ca.gosyer.jui.uicore.prefs.asStringStateIn
|
import ca.gosyer.jui.uicore.prefs.asStringStateIn
|
||||||
@@ -60,6 +61,7 @@ actual fun getServerHostItems(viewModel: @Composable () -> SettingsServerHostVie
|
|||||||
socksProxyPort = serverVm.socksProxyPort,
|
socksProxyPort = serverVm.socksProxyPort,
|
||||||
debugLogsEnabled = serverVm.debugLogsEnabled,
|
debugLogsEnabled = serverVm.debugLogsEnabled,
|
||||||
systemTrayEnabled = serverVm.systemTrayEnabled,
|
systemTrayEnabled = serverVm.systemTrayEnabled,
|
||||||
|
downloadPath = serverVm.downloadPath,
|
||||||
webUIEnabled = serverVm.webUIEnabled,
|
webUIEnabled = serverVm.webUIEnabled,
|
||||||
openInBrowserEnabled = serverVm.openInBrowserEnabled,
|
openInBrowserEnabled = serverVm.openInBrowserEnabled,
|
||||||
basicAuthEnabled = serverVm.basicAuthEnabled,
|
basicAuthEnabled = serverVm.basicAuthEnabled,
|
||||||
@@ -87,6 +89,7 @@ actual class SettingsServerHostViewModel @Inject constructor(
|
|||||||
// Misc
|
// Misc
|
||||||
val debugLogsEnabled = serverHostPreferences.debugLogsEnabled().asStateIn(scope)
|
val debugLogsEnabled = serverHostPreferences.debugLogsEnabled().asStateIn(scope)
|
||||||
val systemTrayEnabled = serverHostPreferences.systemTrayEnabled().asStateIn(scope)
|
val systemTrayEnabled = serverHostPreferences.systemTrayEnabled().asStateIn(scope)
|
||||||
|
val downloadPath = serverHostPreferences.downloadPath().asStateIn(scope)
|
||||||
|
|
||||||
// WebUI
|
// WebUI
|
||||||
val webUIEnabled = serverHostPreferences.webUIEnabled().asStateIn(scope)
|
val webUIEnabled = serverHostPreferences.webUIEnabled().asStateIn(scope)
|
||||||
@@ -141,6 +144,7 @@ fun LazyListScope.ServerHostItems(
|
|||||||
socksProxyPort: PreferenceMutableStateFlow<String>,
|
socksProxyPort: PreferenceMutableStateFlow<String>,
|
||||||
debugLogsEnabled: PreferenceMutableStateFlow<Boolean>,
|
debugLogsEnabled: PreferenceMutableStateFlow<Boolean>,
|
||||||
systemTrayEnabled: PreferenceMutableStateFlow<Boolean>,
|
systemTrayEnabled: PreferenceMutableStateFlow<Boolean>,
|
||||||
|
downloadPath: PreferenceMutableStateFlow<String>,
|
||||||
webUIEnabled: PreferenceMutableStateFlow<Boolean>,
|
webUIEnabled: PreferenceMutableStateFlow<Boolean>,
|
||||||
openInBrowserEnabled: PreferenceMutableStateFlow<Boolean>,
|
openInBrowserEnabled: PreferenceMutableStateFlow<Boolean>,
|
||||||
basicAuthEnabled: PreferenceMutableStateFlow<Boolean>,
|
basicAuthEnabled: PreferenceMutableStateFlow<Boolean>,
|
||||||
@@ -217,6 +221,27 @@ fun LazyListScope.ServerHostItems(
|
|||||||
changeListener = serverSettingChanged
|
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 {
|
item {
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
preference = webUIEnabled,
|
preference = webUIEnabled,
|
||||||
|
|||||||
@@ -19,7 +19,29 @@ fun filePicker(
|
|||||||
onCancel: () -> Unit = {},
|
onCancel: () -> Unit = {},
|
||||||
onError: () -> Unit = {},
|
onError: () -> Unit = {},
|
||||||
onApprove: (Path) -> 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(
|
fun fileSaver(
|
||||||
defaultFileName: String,
|
defaultFileName: String,
|
||||||
@@ -28,6 +50,8 @@ fun fileSaver(
|
|||||||
onError: () -> Unit = {},
|
onError: () -> Unit = {},
|
||||||
onApprove: (Path) -> Unit
|
onApprove: (Path) -> Unit
|
||||||
) = fileChooser(
|
) = fileChooser(
|
||||||
|
true,
|
||||||
|
false,
|
||||||
true,
|
true,
|
||||||
onCancel,
|
onCancel,
|
||||||
onError,
|
onError,
|
||||||
@@ -45,8 +69,10 @@ fun fileSaver(
|
|||||||
* @param onApprove the listener that is called when picking a file is completed
|
* @param onApprove the listener that is called when picking a file is completed
|
||||||
*/
|
*/
|
||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
internal fun fileChooser(
|
private fun fileChooser(
|
||||||
saving: Boolean = false,
|
saving: Boolean = false,
|
||||||
|
selectFolders: Boolean = false,
|
||||||
|
selectFiles: Boolean = true,
|
||||||
onCancel: () -> Unit = {},
|
onCancel: () -> Unit = {},
|
||||||
onError: () -> Unit = {},
|
onError: () -> Unit = {},
|
||||||
onApprove: (Path) -> Unit,
|
onApprove: (Path) -> Unit,
|
||||||
@@ -63,6 +89,12 @@ internal fun fileChooser(
|
|||||||
if (saving) {
|
if (saving) {
|
||||||
selectedFile = Path(defaultFileName).toFile()
|
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 {
|
val result = fileChooser.let {
|
||||||
|
|||||||
Reference in New Issue
Block a user