mirror of
https://github.com/smyalygames/checklist-tester.git
synced 2025-05-18 06:24:12 +02:00
feat(connector): move actions to separate screen
This commit is contained in:
parent
931e65c35e
commit
d8efe32b87
@ -1 +1 @@
|
|||||||
Subproject commit cfed89f7d5435027e9046987416d22bdaf174c85
|
Subproject commit 9018e2898f075dd6ec3922cbc15919b0e4740784
|
@ -3,6 +3,8 @@ import org.koin.core.component.KoinComponent
|
|||||||
class InterfaceState : KoinComponent {
|
class InterfaceState : KoinComponent {
|
||||||
var simConnection: Boolean = false
|
var simConnection: Boolean = false
|
||||||
var projectId: Int? = null
|
var projectId: Int? = null
|
||||||
|
var procedureId: Int? = null
|
||||||
|
|
||||||
val projectSelected: Boolean
|
val projectSelected: Boolean
|
||||||
get() = projectId != null
|
get() = projectId != null
|
||||||
|
|
||||||
|
@ -0,0 +1,81 @@
|
|||||||
|
package tab.procedure
|
||||||
|
|
||||||
|
import InterfaceState
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.automirrored.outlined.ArrowBack
|
||||||
|
import androidx.compose.material.icons.outlined.Add
|
||||||
|
import androidx.compose.material3.*
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import cafe.adriel.voyager.core.screen.Screen
|
||||||
|
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||||
|
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||||
|
import org.koin.compose.koinInject
|
||||||
|
|
||||||
|
class Actions : Screen {
|
||||||
|
@Composable
|
||||||
|
override fun Content() {
|
||||||
|
val navigator = LocalNavigator.currentOrThrow
|
||||||
|
val viewModel = koinInject<InterfaceState>()
|
||||||
|
val columnPadding = 24.dp
|
||||||
|
|
||||||
|
// Checks if a project has been selected before viewing contents
|
||||||
|
if (viewModel.procedureId == null) {
|
||||||
|
navigator.pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
Scaffold(
|
||||||
|
topBar = {
|
||||||
|
IconButton(
|
||||||
|
onClick = {
|
||||||
|
navigator.pop()
|
||||||
|
viewModel.procedureId = null
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
Icon(Icons.AutoMirrored.Outlined.ArrowBack, "Back Arrow")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxHeight()
|
||||||
|
.fillMaxWidth()
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
.padding(top = columnPadding, bottom = columnPadding),
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
Modifier.fillMaxWidth(0.7F),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(24.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = "Edit Actions",
|
||||||
|
style = MaterialTheme.typography.headlineSmall
|
||||||
|
)
|
||||||
|
|
||||||
|
Button(
|
||||||
|
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
|
||||||
|
onClick = {
|
||||||
|
// TODO make checks
|
||||||
|
navigator.pop()
|
||||||
|
viewModel.procedureId = null
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
Icon(Icons.Outlined.Add, "Create Procedure", modifier = Modifier.size(18.dp))
|
||||||
|
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
|
||||||
|
Text(
|
||||||
|
"Create",
|
||||||
|
style = MaterialTheme.typography.labelLarge,
|
||||||
|
color = MaterialTheme.colorScheme.onPrimary
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -32,11 +32,6 @@ class CreateProcedure : Screen {
|
|||||||
var procedureName by remember { mutableStateOf("") }
|
var procedureName by remember { mutableStateOf("") }
|
||||||
var procedureDescription by remember { mutableStateOf("") }
|
var procedureDescription by remember { mutableStateOf("") }
|
||||||
|
|
||||||
// Actions
|
|
||||||
val actionTypeOptions = listOf("Switch", "Button", "Lever")
|
|
||||||
var actionType by remember { mutableStateOf(procedureTypeOptions[0]) }
|
|
||||||
var actionTypeExpanded by remember { mutableStateOf(false) }
|
|
||||||
|
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
@ -114,44 +109,6 @@ class CreateProcedure : Screen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HorizontalDivider()
|
|
||||||
|
|
||||||
Text(
|
|
||||||
text = "Actions",
|
|
||||||
style = MaterialTheme.typography.headlineSmall
|
|
||||||
)
|
|
||||||
|
|
||||||
ExposedDropdownMenuBox(
|
|
||||||
expanded = actionTypeExpanded,
|
|
||||||
onExpandedChange = { actionTypeExpanded = it }
|
|
||||||
) {
|
|
||||||
TextField(
|
|
||||||
modifier = Modifier.menuAnchor(),
|
|
||||||
value = actionType,
|
|
||||||
onValueChange = {},
|
|
||||||
readOnly = true,
|
|
||||||
singleLine = true,
|
|
||||||
label = { Text("Type") },
|
|
||||||
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = actionTypeExpanded) },
|
|
||||||
colors = ExposedDropdownMenuDefaults.textFieldColors()
|
|
||||||
)
|
|
||||||
ExposedDropdownMenu(
|
|
||||||
expanded = actionTypeExpanded,
|
|
||||||
onDismissRequest = { actionTypeExpanded = false },
|
|
||||||
) {
|
|
||||||
actionTypeOptions.forEach { option ->
|
|
||||||
DropdownMenuItem(
|
|
||||||
text = { Text(option, style = MaterialTheme.typography.bodyLarge) },
|
|
||||||
onClick = {
|
|
||||||
actionType = option
|
|
||||||
actionTypeExpanded = false
|
|
||||||
},
|
|
||||||
contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button(
|
Button(
|
||||||
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
|
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
|
||||||
onClick = {
|
onClick = {
|
||||||
@ -159,7 +116,6 @@ class CreateProcedure : Screen {
|
|||||||
procedureName.isNotBlank() and
|
procedureName.isNotBlank() and
|
||||||
procedureType.isNotBlank() and
|
procedureType.isNotBlank() and
|
||||||
procedureDescription.isNotBlank()
|
procedureDescription.isNotBlank()
|
||||||
// TODO add checks for actions
|
|
||||||
) {
|
) {
|
||||||
screenModel.createProcedure(
|
screenModel.createProcedure(
|
||||||
procedureName = procedureName,
|
procedureName = procedureName,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package tab.procedure
|
package tab.procedure
|
||||||
|
|
||||||
|
import InterfaceState
|
||||||
import androidx.compose.foundation.VerticalScrollbar
|
import androidx.compose.foundation.VerticalScrollbar
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
@ -19,8 +20,10 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import cafe.adriel.voyager.core.screen.Screen
|
import cafe.adriel.voyager.core.screen.Screen
|
||||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||||
|
import cafe.adriel.voyager.navigator.Navigator
|
||||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||||
import io.anthonyberg.connector.shared.entity.Procedure
|
import io.anthonyberg.connector.shared.entity.Procedure
|
||||||
|
import org.koin.compose.koinInject
|
||||||
|
|
||||||
class ListProcedures (
|
class ListProcedures (
|
||||||
private val procedures: List<Procedure>
|
private val procedures: List<Procedure>
|
||||||
@ -28,6 +31,8 @@ class ListProcedures (
|
|||||||
@Composable
|
@Composable
|
||||||
override fun Content() {
|
override fun Content() {
|
||||||
val navigator = LocalNavigator.currentOrThrow
|
val navigator = LocalNavigator.currentOrThrow
|
||||||
|
val viewModel = koinInject<InterfaceState>()
|
||||||
|
|
||||||
val state = rememberLazyListState(0)
|
val state = rememberLazyListState(0)
|
||||||
|
|
||||||
Scaffold (
|
Scaffold (
|
||||||
@ -50,7 +55,7 @@ class ListProcedures (
|
|||||||
) {
|
) {
|
||||||
LazyColumn(state = state) {
|
LazyColumn(state = state) {
|
||||||
items(procedures) { procedure ->
|
items(procedures) { procedure ->
|
||||||
procedureItem(procedure)
|
procedureItem(procedure, viewModel, navigator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VerticalScrollbar(
|
VerticalScrollbar(
|
||||||
@ -67,13 +72,15 @@ class ListProcedures (
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun procedureItem(procedure: Procedure) {
|
private fun procedureItem(procedure: Procedure, viewModel: InterfaceState, navigator: Navigator) {
|
||||||
ListItem(
|
ListItem(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clickable(
|
.clickable(
|
||||||
enabled = true,
|
enabled = true,
|
||||||
onClick = {
|
onClick = {
|
||||||
// TODO add procedure editor
|
viewModel.procedureId = procedure.id
|
||||||
|
|
||||||
|
navigator.push(Actions())
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
overlineContent = { Text(procedure.type) },
|
overlineContent = { Text(procedure.type) },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user