diff --git a/app/src/main/java/com/droiddeck/launcher/files/FileManagerScreen.kt b/app/src/main/java/com/droiddeck/launcher/files/FileManagerScreen.kt index 9fbd251ff..789b5112e 100644 --- a/app/src/main/java/com/droiddeck/launcher/files/FileManagerScreen.kt +++ b/app/src/main/java/com/droiddeck/launcher/files/FileManagerScreen.kt @@ -153,6 +153,8 @@ fun FileManagerScreen( var operationJob by remember { mutableStateOf(null) } var pendingBulkDelete by remember { mutableStateOf>(emptyList()) } var searchQuery by remember { mutableStateOf("") } + val visibleEntries = if (searchQuery.isBlank()) entries + else entries.filter { it.name.contains(searchQuery, ignoreCase = true) } var showSearch by remember { mutableStateOf(false) } var sortBy by remember { mutableStateOf(browsePrefs.getString("fmSortBy", "name") ?: "name") } var sortDesc by remember { mutableStateOf(browsePrefs.getBoolean("fmSortDesc", false)) } @@ -791,19 +793,21 @@ fun FileManagerScreen( fontSize = 13.sp, modifier = Modifier.weight(1f), ) + val allVisibleSelected = visibleEntries.isNotEmpty() && visibleEntries.all { it.absolutePath in selectedPaths } + val anyVisibleSelected = visibleEntries.any { it.absolutePath in selectedPaths } val selBarPadding = PaddingValues(horizontal = 10.dp, vertical = 2.dp) OutlinedButton( onClick = { - selectedPaths = if (selectedPaths.size == entries.size) emptySet() - else entries.map { it.absolutePath }.toSet() + val shown = visibleEntries.map { it.absolutePath } + selectedPaths = if (allVisibleSelected) selectedPaths - shown.toSet() else selectedPaths + shown }, contentPadding = selBarPadding, - ) { Text(if (selectedPaths.size == entries.size) stringResource(R.string.fm_select_none) else stringResource(R.string.fm_select_all), fontSize = 12.sp) } + ) { Text(if (allVisibleSelected) stringResource(R.string.fm_select_none) else stringResource(R.string.fm_select_all), fontSize = 12.sp) } Spacer(Modifier.width(4.dp)) OutlinedButton( - enabled = selectedPaths.isNotEmpty(), + enabled = anyVisibleSelected, onClick = { - clipboardFiles = entries.filter { it.absolutePath in selectedPaths } + clipboardFiles = visibleEntries.filter { it.absolutePath in selectedPaths } isCutOperation = false selectionMode = false selectedPaths = emptySet() @@ -812,9 +816,9 @@ fun FileManagerScreen( ) { Text(stringResource(R.string.fm_copy), fontSize = 12.sp) } Spacer(Modifier.width(4.dp)) OutlinedButton( - enabled = selectedPaths.isNotEmpty(), + enabled = anyVisibleSelected, onClick = { - clipboardFiles = entries.filter { it.absolutePath in selectedPaths } + clipboardFiles = visibleEntries.filter { it.absolutePath in selectedPaths } isCutOperation = true selectionMode = false selectedPaths = emptySet() @@ -823,8 +827,8 @@ fun FileManagerScreen( ) { Text(stringResource(R.string.fm_cut), fontSize = 12.sp) } Spacer(Modifier.width(4.dp)) OutlinedButton( - enabled = selectedPaths.isNotEmpty(), - onClick = { pendingBulkDelete = entries.filter { it.absolutePath in selectedPaths } }, + enabled = anyVisibleSelected, + onClick = { pendingBulkDelete = visibleEntries.filter { it.absolutePath in selectedPaths } }, contentPadding = selBarPadding, border = BorderStroke(1.dp, MaterialTheme.colorScheme.error), ) { Text(stringResource(R.string.common_delete), color = MaterialTheme.colorScheme.error, fontSize = 12.sp) } @@ -964,8 +968,7 @@ fun FileManagerScreen( .fillMaxSize() .nestedScroll(pullState.nestedScrollConnection), ) { - val shownEntries = if (searchQuery.isBlank()) entries - else entries.filter { it.name.contains(searchQuery, ignoreCase = true) } + val shownEntries = visibleEntries if (showGrid && entries.isNotEmpty()) { LazyVerticalGrid(