android, desktop: fix terminal items crash
This commit is contained in:
parent
bbde6d81ee
commit
4d430cfd25
@ -58,7 +58,7 @@ object ChatModel {
|
|||||||
val chatItemStatuses = mutableMapOf<Long, CIStatus>()
|
val chatItemStatuses = mutableMapOf<Long, CIStatus>()
|
||||||
val groupMembers = mutableStateListOf<GroupMember>()
|
val groupMembers = mutableStateListOf<GroupMember>()
|
||||||
|
|
||||||
val terminalItems = mutableStateListOf<TerminalItem>()
|
val terminalItems = mutableStateOf<List<TerminalItem>>(listOf())
|
||||||
val userAddress = mutableStateOf<UserContactLinkRec?>(null)
|
val userAddress = mutableStateOf<UserContactLinkRec?>(null)
|
||||||
// Allows to temporary save servers that are being edited on multiple screens
|
// Allows to temporary save servers that are being edited on multiple screens
|
||||||
val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null)
|
val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null)
|
||||||
@ -620,10 +620,10 @@ object ChatModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun addTerminalItem(item: TerminalItem) {
|
fun addTerminalItem(item: TerminalItem) {
|
||||||
if (terminalItems.size >= 500) {
|
if (terminalItems.value.size >= 500) {
|
||||||
terminalItems.removeAt(0)
|
terminalItems.value = terminalItems.value.subList(1, terminalItems.value.size)
|
||||||
}
|
}
|
||||||
terminalItems.add(item)
|
terminalItems.value += item
|
||||||
}
|
}
|
||||||
|
|
||||||
val connectedToRemote: Boolean @Composable get() = currentRemoteHost.value != null || remoteCtrlSession.value?.active == true
|
val connectedToRemote: Boolean @Composable get() = currentRemoteHost.value != null || remoteCtrlSession.value?.active == true
|
||||||
|
@ -34,7 +34,6 @@ fun TerminalView(chatModel: ChatModel, close: () -> Unit) {
|
|||||||
close()
|
close()
|
||||||
})
|
})
|
||||||
TerminalLayout(
|
TerminalLayout(
|
||||||
remember { chatModel.terminalItems },
|
|
||||||
composeState,
|
composeState,
|
||||||
sendCommand = { sendCommand(chatModel, composeState) },
|
sendCommand = { sendCommand(chatModel, composeState) },
|
||||||
close
|
close
|
||||||
@ -63,7 +62,6 @@ private fun sendCommand(chatModel: ChatModel, composeState: MutableState<Compose
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun TerminalLayout(
|
fun TerminalLayout(
|
||||||
terminalItems: List<TerminalItem>,
|
|
||||||
composeState: MutableState<ComposeState>,
|
composeState: MutableState<ComposeState>,
|
||||||
sendCommand: () -> Unit,
|
sendCommand: () -> Unit,
|
||||||
close: () -> Unit
|
close: () -> Unit
|
||||||
@ -111,7 +109,7 @@ fun TerminalLayout(
|
|||||||
.fillMaxWidth(),
|
.fillMaxWidth(),
|
||||||
color = MaterialTheme.colors.background
|
color = MaterialTheme.colors.background
|
||||||
) {
|
) {
|
||||||
TerminalLog(terminalItems)
|
TerminalLog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,22 +118,13 @@ fun TerminalLayout(
|
|||||||
private var lazyListState = 0 to 0
|
private var lazyListState = 0 to 0
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun TerminalLog(terminalItems: List<TerminalItem>) {
|
fun TerminalLog() {
|
||||||
val listState = rememberLazyListState(lazyListState.first, lazyListState.second)
|
val listState = rememberLazyListState(lazyListState.first, lazyListState.second)
|
||||||
DisposableEffect(Unit) {
|
DisposableEffect(Unit) {
|
||||||
onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset }
|
onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset }
|
||||||
}
|
}
|
||||||
val reversedTerminalItems by remember {
|
val reversedTerminalItems by remember {
|
||||||
derivedStateOf {
|
derivedStateOf { chatModel.terminalItems.value.asReversed() }
|
||||||
// Such logic prevents concurrent modification
|
|
||||||
val res = ArrayList<TerminalItem>()
|
|
||||||
var i = 0
|
|
||||||
while (i < terminalItems.size) {
|
|
||||||
res.add(terminalItems[i])
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
res.asReversed()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
val clipboard = LocalClipboardManager.current
|
val clipboard = LocalClipboardManager.current
|
||||||
LazyColumn(state = listState, reverseLayout = true) {
|
LazyColumn(state = listState, reverseLayout = true) {
|
||||||
@ -175,7 +164,6 @@ fun TerminalLog(terminalItems: List<TerminalItem>) {
|
|||||||
fun PreviewTerminalLayout() {
|
fun PreviewTerminalLayout() {
|
||||||
SimpleXTheme {
|
SimpleXTheme {
|
||||||
TerminalLayout(
|
TerminalLayout(
|
||||||
terminalItems = TerminalItem.sampleData,
|
|
||||||
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) },
|
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) },
|
||||||
sendCommand = {},
|
sendCommand = {},
|
||||||
close = {}
|
close = {}
|
||||||
|
Loading…
Reference in New Issue
Block a user