@@ -6,20 +6,20 @@ package ch.srgssr.pillarbox.demo.ui.player.playlist
66
77import androidx.compose.foundation.clickable
88import androidx.compose.foundation.layout.Arrangement
9- import androidx.compose.foundation.layout.Column
109import androidx.compose.foundation.layout.Row
1110import androidx.compose.foundation.layout.fillMaxWidth
12- import androidx.compose.foundation.layout.padding
13- import androidx.compose.foundation.layout.wrapContentHeight
14- import androidx.compose.foundation.layout.wrapContentWidth
1511import androidx.compose.foundation.lazy.LazyColumn
1612import androidx.compose.foundation.lazy.items
13+ import androidx.compose.material.icons.Icons
14+ import androidx.compose.material.icons.filled.Close
15+ import androidx.compose.material3.AlertDialog
1716import androidx.compose.material3.AlertDialogDefaults
18- import androidx.compose.material3.BasicAlertDialog
1917import androidx.compose.material3.Checkbox
2018import androidx.compose.material3.ExperimentalMaterial3Api
21- import androidx.compose.material3.MaterialTheme
22- import androidx.compose.material3.Surface
19+ import androidx.compose.material3.Icon
20+ import androidx.compose.material3.IconButton
21+ import androidx.compose.material3.ListItem
22+ import androidx.compose.material3.ListItemDefaults
2323import androidx.compose.material3.Text
2424import androidx.compose.material3.TextButton
2525import androidx.compose.runtime.Composable
@@ -30,12 +30,12 @@ import androidx.compose.runtime.remember
3030import androidx.compose.ui.Alignment
3131import androidx.compose.ui.Modifier
3232import androidx.compose.ui.res.stringResource
33+ import androidx.compose.ui.text.style.TextOverflow
3334import androidx.compose.ui.tooling.preview.Preview
3435import ch.srgssr.pillarbox.demo.R
3536import ch.srgssr.pillarbox.demo.shared.data.DemoItem
3637import ch.srgssr.pillarbox.demo.shared.data.samples.SamplesAll
3738import ch.srgssr.pillarbox.demo.ui.theme.PillarboxTheme
38- import ch.srgssr.pillarbox.demo.ui.theme.paddings
3939
4040/* *
4141 * A dialog allowing the user to add items to the current playlist.
@@ -53,59 +53,56 @@ fun MediaItemLibraryDialog(
5353 onAddClick : (items: List <DemoItem >) -> Unit ,
5454 onDismissRequest : () -> Unit ,
5555) {
56- val selectedItems = remember {
57- mutableStateListOf<DemoItem >()
58- }
56+ val selectedItems = remember { mutableStateListOf<DemoItem >() }
5957
60- BasicAlertDialog (
58+ AlertDialog (
6159 onDismissRequest = onDismissRequest,
60+ confirmButton = {
61+ TextButton (
62+ onClick = {
63+ onAddClick(selectedItems)
64+ onDismissRequest()
65+ },
66+ ) {
67+ Text (text = stringResource(android.R .string.ok))
68+ }
69+ },
6270 modifier = modifier,
63- ) {
64- Surface (
65- modifier = Modifier
66- .wrapContentWidth()
67- .wrapContentHeight(),
68- shape = AlertDialogDefaults .shape,
69- color = AlertDialogDefaults .containerColor,
70- tonalElevation = AlertDialogDefaults .TonalElevation ,
71- ) {
72- Column {
73- Text (
74- text = stringResource(R .string.add_to_playlist),
75- modifier = Modifier .padding(MaterialTheme .paddings.baseline),
76- color = AlertDialogDefaults .titleContentColor,
77- style = MaterialTheme .typography.headlineSmall,
78- )
79-
80- ItemList (
81- items = items,
82- selectedItems = selectedItems,
83- modifier = Modifier .weight(1f ),
84- onItemClick = { item, checked ->
85- if (checked) {
86- selectedItems.add(item)
87- } else {
88- selectedItems.remove(item)
89- }
90- }
91- )
71+ dismissButton = {
72+ TextButton (onClick = { selectedItems.addAll(items) }) {
73+ Text (text = stringResource(android.R .string.selectAll))
74+ }
75+ },
76+ title = {
77+ Row (
78+ modifier = Modifier .fillMaxWidth(),
79+ horizontalArrangement = Arrangement .SpaceBetween ,
80+ verticalAlignment = Alignment .CenterVertically ,
81+ ) {
82+ Text (text = stringResource(R .string.add_to_playlist))
9283
93- ButtonsRow (
94- modifier = Modifier
95- .fillMaxWidth()
96- .padding(MaterialTheme .paddings.small),
97- onAddClick = {
98- onAddClick(selectedItems)
99- onDismissRequest()
100- },
101- onCancelClick = onDismissRequest,
102- onSelectAllClick = {
103- selectedItems.addAll(items)
104- }
105- )
84+ IconButton (onClick = onDismissRequest) {
85+ Icon (
86+ imageVector = Icons .Default .Close ,
87+ contentDescription = null ,
88+ )
89+ }
10690 }
107- }
108- }
91+ },
92+ text = {
93+ ItemList (
94+ items = items,
95+ selectedItems = selectedItems,
96+ onItemClick = { item, checked ->
97+ if (checked) {
98+ selectedItems.add(item)
99+ } else {
100+ selectedItems.remove(item)
101+ }
102+ },
103+ )
104+ },
105+ )
109106}
110107
111108@Composable
@@ -118,57 +115,31 @@ private fun ItemList(
118115 LazyColumn (modifier = modifier) {
119116 items(items) { item ->
120117 val checked by remember(item) {
121- derivedStateOf {
122- item in selectedItems
123- }
118+ derivedStateOf { item in selectedItems }
124119 }
125120
126- Row (
127- modifier = Modifier
128- .fillMaxWidth()
129- .clickable { onItemClick(item, ! checked) }
130- .padding(
131- horizontal = MaterialTheme .paddings.baseline,
132- vertical = MaterialTheme .paddings.small,
133- ),
134- horizontalArrangement = Arrangement .spacedBy(MaterialTheme .paddings.baseline),
135- verticalAlignment = Alignment .CenterVertically ,
136- ) {
137- Checkbox (
138- checked = checked,
139- onCheckedChange = null ,
140- )
141-
142- Text (
143- text = item.title ? : " No title" ,
144- color = AlertDialogDefaults .textContentColor,
145- )
146- }
147- }
148- }
149- }
150-
151- @Composable
152- private fun ButtonsRow (
153- modifier : Modifier = Modifier ,
154- onAddClick : () -> Unit ,
155- onCancelClick : () -> Unit ,
156- onSelectAllClick : () -> Unit ,
157- ) {
158- Row (
159- modifier = modifier,
160- horizontalArrangement = Arrangement .SpaceBetween ,
161- ) {
162- TextButton (onClick = onCancelClick) {
163- Text (stringResource(android.R .string.cancel))
164- }
165-
166- TextButton (onClick = onSelectAllClick) {
167- Text (text = stringResource(android.R .string.selectAll))
168- }
169-
170- TextButton (onClick = onAddClick) {
171- Text (text = stringResource(android.R .string.ok))
121+ ListItem (
122+ headlineContent = {
123+ Text (
124+ text = item.title ? : " No title" ,
125+ overflow = TextOverflow .Ellipsis ,
126+ maxLines = 2 ,
127+ )
128+ },
129+ modifier = Modifier .clickable {
130+ onItemClick(item, ! checked)
131+ },
132+ leadingContent = {
133+ Checkbox (
134+ checked = checked,
135+ onCheckedChange = null ,
136+ )
137+ },
138+ colors = ListItemDefaults .colors(
139+ containerColor = AlertDialogDefaults .containerColor,
140+ headlineColor = AlertDialogDefaults .textContentColor,
141+ ),
142+ )
172143 }
173144 }
174145}
@@ -191,25 +162,19 @@ private fun MediaItemLibraryDialogPreview() {
191162@Composable
192163private fun ItemListPreview () {
193164 val items = SamplesAll .playlist.items.take(10 )
165+ val selectedItems = remember { mutableStateListOf(items[0 ], items[3 ], items[4 ], items[8 ]) }
194166
195167 PillarboxTheme {
196168 ItemList (
197169 items = items,
198- selectedItems = listOf (items[0 ], items[3 ], items[4 ], items[8 ]),
199- onItemClick = { _, _ -> },
200- )
201- }
202- }
203-
204- @Preview
205- @Composable
206- private fun ButtonsRowPreview () {
207- PillarboxTheme {
208- ButtonsRow (
209- modifier = Modifier .fillMaxWidth(),
210- onAddClick = {},
211- onCancelClick = {},
212- onSelectAllClick = {},
170+ selectedItems = selectedItems,
171+ onItemClick = { item, checked ->
172+ if (checked) {
173+ selectedItems.add(item)
174+ } else {
175+ selectedItems.remove(item)
176+ }
177+ },
213178 )
214179 }
215180}
0 commit comments