mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
114 lines
4.5 KiB
Kotlin
114 lines
4.5 KiB
Kotlin
/*
|
|
* Copyright (c) 2025 Meshtastic LLC
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package com.geeksville.mesh.ui
|
|
|
|
import androidx.compose.animation.AnimatedContentScope
|
|
import androidx.compose.animation.ExperimentalSharedTransitionApi
|
|
import androidx.compose.animation.SharedTransitionScope
|
|
import androidx.compose.foundation.combinedClickable
|
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
import androidx.compose.foundation.layout.Box
|
|
import androidx.compose.foundation.layout.IntrinsicSize
|
|
import androidx.compose.foundation.layout.defaultMinSize
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
import androidx.compose.foundation.layout.width
|
|
import androidx.compose.material3.AssistChipDefaults
|
|
import androidx.compose.material3.ElevatedAssistChip
|
|
import androidx.compose.material3.MaterialTheme
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.setValue
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.text.style.TextAlign
|
|
import androidx.compose.ui.text.style.TextDecoration
|
|
import androidx.compose.ui.unit.dp
|
|
import com.geeksville.mesh.model.Node
|
|
import com.geeksville.mesh.ui.components.NodeMenu
|
|
import com.geeksville.mesh.ui.components.NodeMenuAction
|
|
|
|
@OptIn(ExperimentalSharedTransitionApi::class)
|
|
@Composable
|
|
fun NodeChip(
|
|
modifier: Modifier = Modifier,
|
|
node: Node,
|
|
isThisNode: Boolean,
|
|
isConnected: Boolean,
|
|
onAction: (NodeMenuAction) -> Unit,
|
|
sharedTransitionScope: SharedTransitionScope,
|
|
animatedContentScope: AnimatedContentScope,
|
|
) {
|
|
val isIgnored = node.isIgnored
|
|
val (textColor, nodeColor) = node.colors
|
|
var menuExpanded by remember { mutableStateOf(false) }
|
|
val inputChipInteractionSource = remember { MutableInteractionSource() }
|
|
Box {
|
|
with(sharedTransitionScope) {
|
|
ElevatedAssistChip(
|
|
modifier = modifier
|
|
.width(IntrinsicSize.Min)
|
|
.defaultMinSize(minHeight = 32.dp, minWidth = 72.dp)
|
|
.sharedElement(
|
|
rememberSharedContentState("node_chip_${node.num}"),
|
|
animatedContentScope
|
|
),
|
|
colors = AssistChipDefaults.assistChipColors(
|
|
containerColor = Color(nodeColor),
|
|
labelColor = Color(textColor),
|
|
),
|
|
label = {
|
|
Text(
|
|
modifier = Modifier.Companion.fillMaxWidth().sharedElement(
|
|
rememberSharedContentState("node_shortname_${node.num}"),
|
|
animatedContentScope
|
|
),
|
|
text = node.user.shortName.ifEmpty { "???" },
|
|
fontSize = MaterialTheme.typography.labelLarge.fontSize,
|
|
textDecoration = TextDecoration.Companion.LineThrough.takeIf { isIgnored },
|
|
textAlign = TextAlign.Companion.Center,
|
|
)
|
|
},
|
|
onClick = {},
|
|
interactionSource = inputChipInteractionSource,
|
|
)
|
|
}
|
|
Box(
|
|
modifier = Modifier.Companion
|
|
.matchParentSize()
|
|
.combinedClickable(
|
|
onClick = { onAction(NodeMenuAction.MoreDetails(node)) },
|
|
onLongClick = { menuExpanded = true },
|
|
interactionSource = inputChipInteractionSource,
|
|
indication = null,
|
|
)
|
|
)
|
|
}
|
|
NodeMenu(
|
|
expanded = menuExpanded,
|
|
node = node,
|
|
showFullMenu = !isThisNode && isConnected,
|
|
onDismissMenuRequest = { menuExpanded = false },
|
|
onAction = {
|
|
menuExpanded = false
|
|
onAction(it)
|
|
}
|
|
)
|
|
}
|