Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import androidx.compose.material.icons.automirrored.filled.Sort
import androidx.compose.material.icons.filled.Storage
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.DropdownMenu
Expand Down Expand Up @@ -120,6 +121,7 @@ fun BrowseScreen(
val volumes by viewModel.volumes.collectAsState()
val sortOrder by viewModel.sortOrder.collectAsState()
val groupBy by viewModel.groupBy.collectAsState()
val showHiddenFiles by viewModel.showHiddenFiles.collectAsState()
val isSearchActive by viewModel.isSearchActive.collectAsState()
val searchQuery by viewModel.searchQuery.collectAsState()
val searchResults by viewModel.searchResults.collectAsState()
Expand Down Expand Up @@ -266,9 +268,11 @@ fun BrowseScreen(
onDismiss = { showSortMenu = false },
sortOrder = sortOrder,
groupBy = groupBy,
showHiddenFiles = showHiddenFiles,
onSortByChanged = viewModel::onSortByChanged,
onDirectionToggle = viewModel::onSortDirectionToggled,
onGroupByChanged = viewModel::onGroupByChanged,
onToggleShowHiddenFiles = viewModel::onToggleShowHiddenFiles,
)
}
},
Expand Down Expand Up @@ -500,9 +504,11 @@ private fun SortMenu(
onDismiss: () -> Unit,
sortOrder: SortOrder,
groupBy: GroupBy,
showHiddenFiles: Boolean,
onSortByChanged: (SortBy) -> Unit,
onDirectionToggle: () -> Unit,
onGroupByChanged: (GroupBy) -> Unit,
onToggleShowHiddenFiles: () -> Unit,
) {
DropdownMenu(expanded = expanded, onDismissRequest = onDismiss) {
listOf(
Expand Down Expand Up @@ -534,6 +540,14 @@ private fun SortMenu(
onClick = { onGroupByChanged(group) },
)
}
HorizontalDivider()
DropdownMenuItem(
text = { Text(stringResource(R.string.browse_show_hidden_files)) },
leadingIcon = {
Checkbox(checked = showHiddenFiles, onCheckedChange = null)
},
onClick = onToggleShowHiddenFiles,
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import dev.anmitali.nook.core.domain.WrongPasswordException
import dev.anmitali.nook.core.model.Bookmark
import dev.anmitali.nook.core.model.FileConflictPolicy
import dev.anmitali.nook.core.model.FileDetails
import dev.anmitali.nook.core.model.FileGroup
import dev.anmitali.nook.core.model.FileItem
import dev.anmitali.nook.core.model.FileOperationProgress
import dev.anmitali.nook.core.model.GroupBy
Expand Down Expand Up @@ -113,6 +114,9 @@ class BrowseViewModel @Inject constructor(
private val _isSearching = MutableStateFlow(false)
val isSearching: StateFlow<Boolean> = _isSearching.asStateFlow()

private val _showHiddenFiles = MutableStateFlow(false)
val showHiddenFiles: StateFlow<Boolean> = _showHiddenFiles.asStateFlow()

private val _bookmarks = MutableStateFlow<List<Bookmark>>(emptyList())
val bookmarks: StateFlow<List<Bookmark>> = _bookmarks.asStateFlow()

Expand Down Expand Up @@ -183,6 +187,11 @@ class BrowseViewModel @Inject constructor(
applySortAndGroup()
}

fun onToggleShowHiddenFiles() {
_showHiddenFiles.update { !it }
applySortAndGroup()
}

fun onSearchActivated() {
_isSearchActive.value = true
}
Expand All @@ -207,7 +216,9 @@ class BrowseViewModel @Inject constructor(
delay(SEARCH_DEBOUNCE_MILLIS)
_isSearching.value = true
searchFilesUseCase(currentPath, query)
.onEach { results -> _searchResults.value = results }
.onEach { results ->
_searchResults.value = if (_showHiddenFiles.value) results else results.filterNot { it.isHidden }
}
.onCompletion { _isSearching.value = false }
.catch { _isSearching.value = false }
.launchIn(this)
Expand Down Expand Up @@ -459,8 +470,13 @@ class BrowseViewModel @Inject constructor(

private fun applySortAndGroup() {
val state = _uiState.value as? BrowseUiState.Content ?: return
val sorted = sortFilesUseCase(rawItems, _sortOrder.value)
_uiState.value = state.copy(groups = groupFilesUseCase(sorted, _groupBy.value))
_uiState.value = state.copy(groups = buildGroups(rawItems))
}

private fun buildGroups(items: List<FileItem>): List<FileGroup> {
val visible = if (_showHiddenFiles.value) items else items.filterNot { it.isHidden }
val sorted = sortFilesUseCase(visible, _sortOrder.value)
return groupFilesUseCase(sorted, _groupBy.value)
}

private fun checkPermissionAndLoad(path: String) {
Expand All @@ -474,11 +490,10 @@ class BrowseViewModel @Inject constructor(
listFilesUseCase(path)
.onEach { items ->
rawItems = items
val sorted = sortFilesUseCase(items, _sortOrder.value)
_uiState.value = BrowseUiState.Content(
currentPath = path,
breadcrumbs = path.split(File.separatorChar).filter { it.isNotBlank() },
groups = groupFilesUseCase(sorted, _groupBy.value),
groups = buildGroups(items),
)
}
.catch { throwable ->
Expand Down
1 change: 1 addition & 0 deletions feature/browse/src/main/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
<string name="browse_group_none">Без группировки</string>
<string name="browse_group_by_type">Группировать по типу</string>
<string name="browse_group_by_date">Группировать по дате</string>
<string name="browse_show_hidden_files">Показывать скрытые файлы</string>

<string name="browse_group_type_directory">Папки</string>
<string name="browse_group_type_image">Изображения</string>
Expand Down
1 change: 1 addition & 0 deletions feature/browse/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
<string name="browse_group_none">No grouping</string>
<string name="browse_group_by_type">Group by type</string>
<string name="browse_group_by_date">Group by date</string>
<string name="browse_show_hidden_files">Show hidden files</string>

<string name="browse_group_type_directory">Folders</string>
<string name="browse_group_type_image">Images</string>
Expand Down
Loading