Skip to content

Commit b14173e

Browse files
committed
refactor(SettingsScreen): improve layout and arrangement for HomeScreenSection
1 parent 5925f0b commit b14173e

File tree

3 files changed

+67
-75
lines changed

3 files changed

+67
-75
lines changed

core-ui/src/main/java/dev/halim/shelfdroid/core/ui/components/DropDown.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package dev.halim.shelfdroid.core.ui.components
22

33
import androidx.compose.material3.DropdownMenuItem
44
import androidx.compose.material3.ExperimentalMaterial3Api
5+
import androidx.compose.material3.ExposedDropdownMenuAnchorType
56
import androidx.compose.material3.ExposedDropdownMenuBox
67
import androidx.compose.material3.ExposedDropdownMenuDefaults
7-
import androidx.compose.material3.MenuAnchorType
88
import androidx.compose.material3.OutlinedTextField
99
import androidx.compose.material3.Text
1010
import androidx.compose.runtime.Composable
@@ -34,7 +34,7 @@ fun ExposedDropdownMenu(
3434
onExpandedChange = { expanded = it },
3535
) {
3636
OutlinedTextField(
37-
modifier = modifier.menuAnchor(MenuAnchorType.PrimaryNotEditable, true),
37+
modifier = modifier.menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable, true),
3838
readOnly = true,
3939
value = textFieldValue,
4040
onValueChange = { textFieldValue = it },

core-ui/src/main/java/dev/halim/shelfdroid/core/ui/screen/settings/SettingsDropDown.kt

Lines changed: 0 additions & 38 deletions
This file was deleted.

core-ui/src/main/java/dev/halim/shelfdroid/core/ui/screen/settings/SettingsScreen.kt

Lines changed: 65 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package dev.halim.shelfdroid.core.ui.screen.settings
33
import android.os.Build
44
import androidx.compose.foundation.layout.Arrangement
55
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Row
67
import androidx.compose.foundation.layout.Spacer
78
import androidx.compose.foundation.layout.fillMaxSize
89
import androidx.compose.foundation.layout.fillMaxWidth
910
import androidx.compose.foundation.layout.height
1011
import androidx.compose.foundation.layout.padding
12+
import androidx.compose.foundation.layout.width
1113
import androidx.compose.material3.Text
1214
import androidx.compose.material3.TextButton
1315
import androidx.compose.runtime.Composable
@@ -26,6 +28,7 @@ import dev.halim.shelfdroid.core.PodcastSort
2628
import dev.halim.shelfdroid.core.SortOrder
2729
import dev.halim.shelfdroid.core.data.screen.settings.SettingsUiState
2830
import dev.halim.shelfdroid.core.ui.R
31+
import dev.halim.shelfdroid.core.ui.components.ExposedDropdownMenu
2932
import dev.halim.shelfdroid.core.ui.components.MyAlertDialog
3033
import dev.halim.shelfdroid.core.ui.event.DisplayPrefsEvent
3134
import dev.halim.shelfdroid.core.ui.preview.Defaults
@@ -60,14 +63,7 @@ fun SettingsScreenContent(
6063

6164
Spacer(modifier = Modifier.height(16.dp))
6265

63-
SettingsLabel(text = stringResource(R.string.others))
64-
Spacer(modifier = Modifier.height(4.dp))
65-
SettingsBody(text = stringResource(R.string.args_version, version))
66-
val userText =
67-
user +
68-
if (uiState.isAdmin) stringResource(R.string.is_an_admin)
69-
else stringResource(R.string.is_not_an_admin)
70-
SettingsBody(text = userText)
66+
OthersSection(version, user, uiState)
7167

7268
Spacer(modifier = Modifier.height(16.dp))
7369

@@ -80,12 +76,14 @@ private fun DisplaySection(uiState: SettingsUiState, onEvent: (SettingsEvent) ->
8076
SettingsLabel(text = stringResource(R.string.display))
8177
Spacer(modifier = Modifier.height(4.dp))
8278
SettingsSwitchItem(
79+
modifier = Modifier.padding(start = 16.dp),
8380
title = stringResource(R.string.dark_mode),
8481
checked = uiState.isDarkMode,
8582
onCheckedChange = { onEvent(SettingsEvent.SwitchDarkTheme(it)) },
8683
contentDescription = stringResource(R.string.dark_mode),
8784
)
8885
SettingsSwitchItem(
86+
modifier = Modifier.padding(start = 16.dp),
8987
title = stringResource(R.string.dynamic_theme),
9088
checked = uiState.isDynamicTheme,
9189
onCheckedChange = { onEvent(SettingsEvent.SwitchDynamicTheme(it)) },
@@ -97,15 +95,16 @@ private fun DisplaySection(uiState: SettingsUiState, onEvent: (SettingsEvent) ->
9795
@Composable
9896
private fun HomeScreenSection(uiState: SettingsUiState, onEvent: (SettingsEvent) -> Unit) {
9997
SettingsLabel(Modifier.padding(top = 16.dp), text = stringResource(R.string.home_screen))
98+
val paddingStart = Modifier.padding(start = 8.dp)
10099
SettingsSwitchItem(
101-
modifier = Modifier,
100+
modifier = paddingStart,
102101
title = stringResource(R.string.list_view),
103102
checked = uiState.displayPrefs.listView,
104103
onCheckedChange = { onEvent(SettingsEvent.SwitchListView(it)) },
105104
contentDescription = stringResource(R.string.list_view),
106105
)
107106
SettingsSwitchItem(
108-
modifier = Modifier,
107+
modifier = paddingStart,
109108
title = stringResource(R.string.show_only_downloaded),
110109
checked = uiState.displayPrefs.filter.isDownloaded(),
111110
onCheckedChange = {
@@ -114,34 +113,65 @@ private fun HomeScreenSection(uiState: SettingsUiState, onEvent: (SettingsEvent)
114113
},
115114
contentDescription = stringResource(R.string.show_only_downloaded),
116115
)
116+
val paddingStartTwo = Modifier.padding(start = 16.dp, top = 4.dp)
117+
SettingsSublabel(Modifier.padding(start = 8.dp, top = 4.dp), text = "Book Library")
118+
Row(modifier = paddingStartTwo.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
119+
ExposedDropdownMenu(
120+
modifier = Modifier.weight(1f),
121+
label = stringResource(R.string.sort),
122+
options = BookSort.entries.map { it.name },
123+
initialValue = uiState.displayPrefs.bookSort.name,
124+
onClick = { onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.BookSort(it))) },
125+
)
126+
Spacer(Modifier.width(8.dp))
127+
ExposedDropdownMenu(
128+
modifier = Modifier.weight(1f),
129+
label = stringResource(R.string.order),
130+
options = SortOrder.entries.map { it.name },
131+
initialValue = uiState.displayPrefs.sortOrder.name,
132+
onClick = {
133+
onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.SortOrder(it)))
134+
},
135+
)
136+
}
117137

118-
SettingsSublabel(Modifier.padding(top = 16.dp), text = "Book Library")
119-
SettingsDropDown(
120-
"Sort",
121-
BookSort.entries.map { it.name },
122-
uiState.displayPrefs.bookSort.name,
123-
{ onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.BookSort(it))) },
124-
)
125-
SettingsDropDown(
126-
"Sort Order",
127-
SortOrder.entries.map { it.name },
128-
uiState.displayPrefs.sortOrder.name,
129-
{ onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.SortOrder(it))) },
130-
)
138+
SettingsSublabel(Modifier.padding(start = 8.dp, top = 4.dp), text = "Podcast Library")
139+
Row(modifier = paddingStartTwo.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
140+
ExposedDropdownMenu(
141+
modifier = Modifier.weight(1f),
142+
label = stringResource(R.string.sort),
143+
options = PodcastSort.entries.map { it.name },
144+
initialValue = uiState.displayPrefs.podcastSort.name,
145+
onClick = {
146+
onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.PodcastSort(it)))
147+
},
148+
)
149+
Spacer(Modifier.width(8.dp))
150+
ExposedDropdownMenu(
151+
modifier = Modifier.weight(1f),
152+
label = stringResource(R.string.order),
153+
options = SortOrder.entries.map { it.name },
154+
initialValue = uiState.displayPrefs.podcastSortOrder.name,
155+
onClick = {
156+
onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.PodcastSortOrder(it)))
157+
},
158+
)
159+
}
160+
}
131161

132-
SettingsSublabel(Modifier.padding(top = 16.dp), text = "Podcast Library")
133-
SettingsDropDown(
134-
"Sort",
135-
PodcastSort.entries.map { it.name },
136-
uiState.displayPrefs.podcastSort.name,
137-
{ onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.PodcastSort(it))) },
138-
)
139-
SettingsDropDown(
140-
"Sort Order",
141-
SortOrder.entries.map { it.name },
142-
uiState.displayPrefs.podcastSortOrder.name,
143-
{ onEvent(SettingsEvent.SettingsDisplayPrefsEvent(DisplayPrefsEvent.PodcastSortOrder(it))) },
162+
@Composable
163+
private fun OthersSection(version: String, user: String, uiState: SettingsUiState) {
164+
SettingsLabel(text = stringResource(R.string.others))
165+
Spacer(modifier = Modifier.height(4.dp))
166+
SettingsBody(
167+
modifier = Modifier.padding(start = 8.dp),
168+
text = stringResource(R.string.args_version, version),
144169
)
170+
val userText =
171+
user +
172+
if (uiState.isAdmin) stringResource(R.string.is_an_admin)
173+
else stringResource(R.string.is_not_an_admin)
174+
SettingsBody(modifier = Modifier.padding(start = 8.dp), text = userText)
145175
}
146176

147177
@Composable

0 commit comments

Comments
 (0)