From f3b49723e8e0fb09e723ee18c23b3ece7ce2a0fb Mon Sep 17 00:00:00 2001 From: rifsxd Date: Sun, 1 Jun 2025 21:03:04 +0600 Subject: [PATCH] manager: add sorting by size for module list --- .../com/rifsxd/ksunext/ui/screen/Module.kt | 58 +++++++++++++++++++ .../ksunext/ui/viewmodel/ModuleViewModel.kt | 4 ++ manager/app/src/main/res/values/strings.xml | 6 +- 3 files changed, 66 insertions(+), 2 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 04c48d12..aa037e74 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 @@ -127,6 +127,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) { LaunchedEffect(Unit) { viewModel.sortAToZ = prefs.getBoolean("module_sort_a_to_z", true) viewModel.sortZToA = prefs.getBoolean("module_sort_z_to_a", false) + viewModel.sortSizeLowToHigh = prefs.getBoolean("module_sort_size_low_to_high", false) + viewModel.sortSizeHighToLow = prefs.getBoolean("module_sort_size_high_to_low", false) if (viewModel.moduleList.isEmpty() || viewModel.isNeedRefresh) { viewModel.fetchModuleList() } @@ -180,9 +182,13 @@ fun ModuleScreen(navigator: DestinationsNavigator) { onClick = { viewModel.sortAToZ = !viewModel.sortAToZ viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false prefs.edit() .putBoolean("module_sort_a_to_z", viewModel.sortAToZ) .putBoolean("module_sort_z_to_a", false) + .putBoolean("module_sort_size_low_to_high", false) + .putBoolean("module_sort_size_high_to_low", false) .apply() scope.launch { viewModel.fetchModuleList() @@ -200,9 +206,61 @@ fun ModuleScreen(navigator: DestinationsNavigator) { onClick = { viewModel.sortZToA = !viewModel.sortZToA viewModel.sortAToZ = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false prefs.edit() .putBoolean("module_sort_z_to_a", viewModel.sortZToA) .putBoolean("module_sort_a_to_z", false) + .putBoolean("module_sort_size_low_to_high", false) + .putBoolean("module_sort_size_high_to_low", false) + .apply() + scope.launch { + viewModel.fetchModuleList() + } + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_size_low_to_high)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortSizeLowToHigh, onCheckedChange = null) + }, + onClick = { + viewModel.sortSizeLowToHigh = !viewModel.sortSizeLowToHigh + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeHighToLow = false + prefs.edit() + .putBoolean("module_sort_size_low_to_high", viewModel.sortSizeLowToHigh) + .putBoolean("module_sort_a_to_z", false) + .putBoolean("module_sort_z_to_a", false) + .putBoolean("module_sort_size_high_to_low", false) + .apply() + scope.launch { + viewModel.fetchModuleList() + } + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_size_high_to_low)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortSizeHighToLow, onCheckedChange = null) + }, + onClick = { + viewModel.sortSizeHighToLow = !viewModel.sortSizeHighToLow + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + prefs.edit() + .putBoolean("module_sort_size_high_to_low", viewModel.sortSizeHighToLow) + .putBoolean("module_sort_a_to_z", false) + .putBoolean("module_sort_z_to_a", false) + .putBoolean("module_sort_size_low_to_high", false) .apply() scope.launch { viewModel.fetchModuleList() 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 c48cf89b..4a7aafd8 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 @@ -63,11 +63,15 @@ class ModuleViewModel : ViewModel() { var sortAToZ by mutableStateOf(false) var sortZToA by mutableStateOf(false) + var sortSizeLowToHigh by mutableStateOf(false) + var sortSizeHighToLow by mutableStateOf(false) val moduleList by derivedStateOf { val comparator = when { sortAToZ -> compareBy { it.name.lowercase() } sortZToA -> compareByDescending { it.name.lowercase() } + sortSizeLowToHigh -> compareBy { it.size } + sortSizeHighToLow -> compareByDescending { it.size } else -> compareBy { it.dirId } }.thenBy(Collator.getInstance(Locale.getDefault()), ModuleInfo::id) diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 65029bf9..485841d3 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -45,8 +45,10 @@ No module installed Module The following module(s) will be installed: %1$s - Sort (A-Z) - Sort (Z-A) + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) Uninstall Restore Install