-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathToolsMenu.kt
150 lines (140 loc) · 4.2 KB
/
ToolsMenu.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package live.ditto.tools.toolsviewer
import androidx.annotation.StringRes
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import live.ditto.tools.R
import live.ditto.tools.toolsviewer.navigation.Screens
import live.ditto.tools.toolsviewer.theme.MenuCardContainerColor
import live.ditto.tools.toolsviewer.theme.MenuItemSelectedBackgroundColor
import live.ditto.tools.toolsviewer.theme.MenuItemTextColor
import live.ditto.tools.toolsviewer.theme.ToolsMenuHeaderBackground
import live.ditto.tools.toolsviewer.theme.ToolsMenuHeaderTextColor
@Composable
fun ToolsMenu(
navController: NavHostController,
menuItems: List<ToolMenuItem>
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
shape = RoundedCornerShape(16.dp),
colors = CardDefaults.cardColors(
containerColor = MenuCardContainerColor
)
) {
ToolsMenuHeader()
ToolsMenuItems(
menuItems = menuItems,
navController = navController
)
}
}
@Composable
private fun ToolsMenuItems(
navController: NavHostController,
menuItems: List<ToolMenuItem>
) {
Column(
modifier = Modifier.padding(8.dp).verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
menuItems.forEach { toolMenuItem ->
ToolMenuItem(
name = stringResource(id = toolMenuItem.label),
onClick = {
navController.navigate(toolMenuItem.route) {
popUpTo(route = Screens.MainScreen.route)
}
}
)
}
}
}
@Composable
private fun ToolMenuItem(
name: String,
containerColor: Color = MenuItemSelectedBackgroundColor,
onClick: () -> Unit
) {
Card(
modifier = Modifier
.fillMaxWidth()
.clickable { onClick() },
colors = CardDefaults.cardColors(
containerColor = containerColor
),
shape = RoundedCornerShape(24.dp),
) {
Box(modifier = Modifier.padding(16.dp)) {
Text(
text = name,
style = MaterialTheme.typography.titleMedium,
color = MenuItemTextColor
)
}
}
}
@Composable
private fun ToolsMenuHeader() {
Box(
modifier = Modifier
.fillMaxWidth()
.background(color = ToolsMenuHeaderBackground)
.padding(8.dp)
) {
Text(
modifier = Modifier.fillMaxWidth(),
text = stringResource(R.string.tools_menu_title),
style = MaterialTheme.typography.titleLarge,
textAlign = TextAlign.Center,
color = ToolsMenuHeaderTextColor
)
}
}
@Preview
@Composable
private fun ToolMenuItemPreview() {
ToolMenuItem(
name = "Tool Menu Item",
onClick = { }
)
}
@Preview
@Composable
private fun ToolsMenuHeaderPreview() {
ToolsMenuHeader()
}
@Preview
@Composable
private fun ToolsMenuPreview() {
ToolsMenu(
navController = rememberNavController(),
menuItems = emptyList()
)
}
data class ToolMenuItem(
@StringRes val label: Int,
val route: String
)