@@ -10,30 +10,39 @@ import androidx.compose.foundation.layout.padding
1010import androidx.compose.foundation.layout.width
1111import androidx.compose.foundation.shape.CircleShape
1212import androidx.compose.material3.LocalContentColor
13+ import androidx.compose.material3.MaterialTheme
1314import androidx.compose.material3.NavigationDrawerItemColors
1415import androidx.compose.material3.NavigationDrawerItemDefaults
1516import androidx.compose.material3.Surface
17+ import androidx.compose.material3.Text
1618import androidx.compose.runtime.Composable
1719import androidx.compose.runtime.CompositionLocalProvider
1820import androidx.compose.ui.Alignment
1921import androidx.compose.ui.Modifier
2022import androidx.compose.ui.draw.clip
23+ import androidx.compose.ui.graphics.Color
2124import androidx.compose.ui.graphics.Shape
2225import androidx.compose.ui.semantics.Role
26+ import androidx.compose.ui.tooling.preview.Preview
2327import androidx.compose.ui.unit.dp
28+ import com.capyreader.app.preferences.AppTheme
29+ import com.capyreader.app.ui.theme.CapyTheme
30+ import com.capyreader.app.ui.theme.LocalAppTheme
2431
2532@Composable
2633fun DrawerItem (
2734 label : @Composable () -> Unit ,
2835 selected : Boolean ,
2936 onClick : () -> Unit ,
30- onLongClick : () -> Unit ,
3137 modifier : Modifier = Modifier ,
38+ onLongClick : () -> Unit = {},
3239 icon : (@Composable () -> Unit )? = null,
3340 badge : (@Composable () -> Unit )? = null,
3441 shape : Shape = CircleShape ,
35- colors : NavigationDrawerItemColors = NavigationDrawerItemDefaults .colors(),
3642) {
43+ val colors = NavigationDrawerItemDefaults .colors()
44+ val mappedColors = colors.mapToTheme(selected = selected)
45+
3746 Surface (
3847 modifier = modifier
3948 .heightIn(min = 56 .dp)
@@ -45,26 +54,111 @@ fun DrawerItem(
4554 role = Role .Tab ,
4655 ),
4756 shape = shape,
48- color = colors .containerColor(selected).value ,
57+ color = mappedColors .containerColor,
4958 ) {
5059 Row (
5160 Modifier .padding(start = 16 .dp, end = 24 .dp),
5261 verticalAlignment = Alignment .CenterVertically
5362 ) {
5463 if (icon != null ) {
55- val iconColor = colors.iconColor(selected).value
56- CompositionLocalProvider (LocalContentColor provides iconColor, content = icon)
64+ CompositionLocalProvider (
65+ LocalContentColor provides mappedColors.iconColor,
66+ content = icon
67+ )
5768 Spacer (Modifier .width(12 .dp))
5869 }
5970 Box (Modifier .weight(1f )) {
60- val labelColor = colors.textColor(selected).value
61- CompositionLocalProvider (LocalContentColor provides labelColor, content = label)
71+ CompositionLocalProvider (
72+ LocalContentColor provides mappedColors.textColor,
73+ content = label
74+ )
6275 }
6376 if (badge != null ) {
6477 Spacer (Modifier .width(12 .dp))
65- val badgeColor = colors.badgeColor(selected).value
66- CompositionLocalProvider (LocalContentColor provides badgeColor, content = badge)
78+ CompositionLocalProvider (
79+ LocalContentColor provides mappedColors.badgeColor,
80+ content = badge
81+ )
6782 }
6883 }
6984 }
7085}
86+
87+ private data class DrawerColors (
88+ val containerColor : Color ,
89+ val iconColor : Color ,
90+ val textColor : Color ,
91+ val badgeColor : Color ,
92+ )
93+
94+ @Composable
95+ private fun NavigationDrawerItemColors.mapToTheme (
96+ selected : Boolean ,
97+ ): DrawerColors {
98+ val isMonochrome = LocalAppTheme .current == AppTheme .MONOCHROME
99+ val useMonochromeSelected = selected && isMonochrome
100+ val unselectedTextColor = textColor(false ).value
101+ val surfaceColor = MaterialTheme .colorScheme.surface
102+
103+ return DrawerColors (
104+ containerColor = if (useMonochromeSelected) {
105+ unselectedTextColor
106+ } else {
107+ containerColor(selected).value
108+ },
109+ iconColor = if (useMonochromeSelected) {
110+ surfaceColor
111+ } else {
112+ iconColor(selected).value
113+ },
114+ textColor = if (useMonochromeSelected) {
115+ surfaceColor
116+ } else {
117+ textColor(selected).value
118+ },
119+ badgeColor = if (useMonochromeSelected) {
120+ surfaceColor
121+ } else {
122+ badgeColor(selected).value
123+ },
124+ )
125+ }
126+
127+ @Preview
128+ @Composable
129+ fun DrawerItemSelectedPreview () {
130+ CapyTheme {
131+ DrawerItem (
132+ label = { Text (" Title Goes Here" ) },
133+ selected = true ,
134+ onClick = {},
135+ onLongClick = {},
136+ )
137+ }
138+ }
139+
140+ @Preview
141+ @Composable
142+ fun DrawerItemSelectedMonochromePreview () {
143+ CapyTheme (AppTheme .MONOCHROME ) {
144+ DrawerItem (
145+ label = { Text (" Title Goes Here" ) },
146+ selected = true ,
147+ onClick = {},
148+ onLongClick = {},
149+ )
150+ }
151+ }
152+
153+ @Preview
154+ @Composable
155+ fun DrawerItemPreview () {
156+ CapyTheme {
157+ DrawerItem (
158+ label = { Text (" Title Goes Here" ) },
159+ selected = false ,
160+ onClick = {},
161+ onLongClick = {},
162+ )
163+ }
164+ }
0 commit comments