From 0b930514554369898596529867977e699a83c9fc Mon Sep 17 00:00:00 2001 From: Rifat Azad Date: Sun, 5 Jan 2025 11:13:48 +0600 Subject: [PATCH] manager: proper alphabetical module list sorting --- .../com/rifsxd/ksunext/ui/screen/Module.kt | 89 +++++++++++-------- .../ksunext/ui/viewmodel/ModuleViewModel.kt | 16 ++-- .../app/src/main/res/values-in/strings.xml | 2 + .../src/main/res/values-zh-rCN/strings.xml | 4 +- manager/app/src/main/res/values/strings.xml | 4 +- 5 files changed, 66 insertions(+), 49 deletions(-) diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt index 60de555b..3b08af89 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt @@ -120,8 +120,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) { LaunchedEffect(Unit) { if (viewModel.moduleList.isEmpty() || viewModel.isNeedRefresh) { - viewModel.sortEnabledFirst = prefs.getBoolean("module_sort_enabled_first", false) - viewModel.sortActionFirst = prefs.getBoolean("module_sort_action_first", false) + viewModel.sortAToZ = prefs.getBoolean("module_sort_a_to_z", true) + viewModel.sortZToA = prefs.getBoolean("module_sort_z_to_a", false) viewModel.fetchModuleList() } } @@ -152,43 +152,56 @@ fun ModuleScreen(navigator: DestinationsNavigator) { imageVector = Icons.Filled.MoreVert, contentDescription = stringResource(id = R.string.settings) ) - DropdownMenu(expanded = showDropdown, onDismissRequest = { - showDropdown = false - }) { - DropdownMenuItem(text = { - Text(stringResource(R.string.module_sort_action_first)) - }, trailingIcon = { - Checkbox(viewModel.sortActionFirst, null) - }, onClick = { - viewModel.sortActionFirst = - !viewModel.sortActionFirst - prefs.edit() - .putBoolean( - "module_sort_action_first", - viewModel.sortActionFirst - ) - .apply() - scope.launch { - viewModel.fetchModuleList() + DropdownMenu( + expanded = showDropdown, + onDismissRequest = { + showDropdown = false + } + ) { + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_a_to_z)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortAToZ, onCheckedChange = null) + }, + onClick = { + if (viewModel.sortAToZ) { + viewModel.sortAToZ = false + } else { + viewModel.sortAToZ = true + viewModel.sortZToA = false + } + prefs.edit() + .putBoolean("module_sort_a_to_z", viewModel.sortAToZ) + .apply() + scope.launch { + viewModel.fetchModuleList() + } } - }) - DropdownMenuItem(text = { - Text(stringResource(R.string.module_sort_enabled_first)) - }, trailingIcon = { - Checkbox(viewModel.sortEnabledFirst, null) - }, onClick = { - viewModel.sortEnabledFirst = - !viewModel.sortEnabledFirst - prefs.edit() - .putBoolean( - "module_sort_enabled_first", - viewModel.sortEnabledFirst - ) - .apply() - scope.launch { - viewModel.fetchModuleList() + ) + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_z_to_a)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortZToA, onCheckedChange = null) + }, + onClick = { + if (viewModel.sortZToA) { + viewModel.sortZToA = false + } else { + viewModel.sortZToA = true + viewModel.sortAToZ = false + } + prefs.edit() + .putBoolean("module_sort_z_to_a", viewModel.sortZToA) + .apply() + scope.launch { + viewModel.fetchModuleList() + } } - }) + ) } } }, @@ -574,7 +587,7 @@ private fun ModuleList( } }, onClick = { - onClickModule(it.id, it.name, it.hasWebUi) + onClickModule(it.dirId, it.name, it.hasWebUi) } ) diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt index 73442eef..34f262e3 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt @@ -51,19 +51,21 @@ class ModuleViewModel : ViewModel() { var isRefreshing by mutableStateOf(false) private set - var sortEnabledFirst by mutableStateOf(false) - var sortActionFirst by mutableStateOf(false) + var sortAToZ by mutableStateOf(false) + var sortZToA by mutableStateOf(false) + val moduleList by derivedStateOf { - val comparator = - compareBy( - { if (sortEnabledFirst) !it.enabled else 0 }, - { if (sortActionFirst) !it.hasWebUi && !it.hasActionScript else 0 }, - { it.id }) + val comparator = when { + sortAToZ -> compareBy { it.name.lowercase() } + sortZToA -> compareByDescending { it.name.lowercase() } + else -> compareBy { it.dirId } + } modules.sortedWith(comparator).also { isRefreshing = false } } + var isNeedRefresh by mutableStateOf(false) private set diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml index 24bfd987..ac6e32ba 100644 --- a/manager/app/src/main/res/values-in/strings.xml +++ b/manager/app/src/main/res/values-in/strings.xml @@ -33,6 +33,8 @@ Modul Yakin instal Anda ingin melanjutkan pemasangan modul %1$s? + Menyortir (A - Z) + Menyortir (Z - A) Hapus Pulihkan Instal diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml index 84e60497..2de70edd 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -33,8 +33,8 @@ 模块 确认安装 是否要继续安装模块 %1$s ? - 可执行优先 - 已启用优先 + 种类 (A - Z) + 种类 (Z - A) 卸载 重启 安装 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 7935a15b..51b61c48 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -33,8 +33,8 @@ Module Confirm Installation Do you want to continue installing module %1$s? - Sort (Action First) - Sort (Enabled First) + Sort (A - Z) + Sort (Z - A) Uninstall Restore Install