copy button fix

This commit is contained in:
Evgeny @ SimpleX Chat
2026-04-01 22:18:24 +00:00
parent 8923aa216e
commit a0a5de3cf0
2 changed files with 25 additions and 21 deletions
@@ -1139,30 +1139,16 @@ fun ChatLayout(
if (appPlatform.isDesktop) {
val manager = LocalSelectionManager.current
val range = manager?.range
if (manager != null && manager.selectionState == SelectionState.Selected && manager.onCopySelection != null && range != null) {
if (manager != null && manager.selectionState == SelectionState.Selected && manager.onCopySelection != null && range != null && manager.focusCharRect != Rect.Zero) {
val draggingDown = range.startIndex > range.endIndex || (range.startIndex == range.endIndex && range.startOffset < range.endOffset)
val gap = with(LocalDensity.current) { 4.dp.toPx() }
var buttonSize by remember { mutableStateOf(IntSize.Zero) }
// val ls = manager.listState?.value
// val itemInfo = ls?.layoutInfo?.visibleItemsInfo?.find { it.index == range.endIndex }
// if (ls != null && itemInfo != null && manager.focusCharRect != Rect.Zero) {
// val itemWindowY = (ls.layoutInfo.viewportEndOffset - itemInfo.offset - itemInfo.size).toFloat()
// val cr = manager.focusCharRect
// val vp = manager.viewportPosition
// val charX = (if (draggingDown) cr.right else cr.left) - vp.x
// val charY = itemWindowY + (if (draggingDown) cr.bottom else cr.top) - vp.y
// val x = if (draggingDown) charX
// else (charX - buttonSize.width).coerceAtLeast(0f)
// val y = if (draggingDown) charY + gap
// else (charY - buttonSize.height - gap)
// val clampedX = x.coerceIn(0f, (manager.viewportWidth - buttonSize.width).coerceAtLeast(0f))
// SelectionCopyButton(
// modifier = Modifier
// .offset { IntOffset(clampedX.toInt(), y.toInt()) }
// .onSizeChanged { buttonSize = it },
// onCopy = { manager.onCopySelection?.invoke() }
// )
// }
SelectionCopyButton(
modifier = Modifier
.offset { manager.copyButtonOffset(draggingDown, gap, buttonSize) }
.onSizeChanged { buttonSize = it },
onCopy = { manager.onCopySelection?.invoke() }
)
}
}
}
@@ -26,6 +26,8 @@ import androidx.compose.ui.layout.positionInWindow
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import chat.simplex.common.model.*
import chat.simplex.common.platform.*
@@ -104,6 +106,22 @@ class SelectionManager {
selectionState = SelectionState.Idle
}
fun copyButtonOffset(draggingDown: Boolean, gap: Float, buttonSize: IntSize): IntOffset {
val r = range ?: return IntOffset.Zero
val ls = listState?.value ?: return IntOffset.Zero
val itemInfo = ls.layoutInfo.visibleItemsInfo.find { it.index == r.endIndex }
?: return IntOffset(0, -10000)
val itemWindowY = (ls.layoutInfo.viewportEndOffset - itemInfo.offset - itemInfo.size).toFloat()
val cr = focusCharRect
val vp = viewportPosition
val charX = (if (draggingDown) cr.right else cr.left) - vp.x
val charY = itemWindowY + (if (draggingDown) cr.bottom else cr.top) - vp.y
val x = if (draggingDown) charX else (charX - buttonSize.width).coerceAtLeast(0f)
val y = if (draggingDown) charY + gap else charY - buttonSize.height - gap
val clampedX = x.coerceIn(0f, (viewportWidth - buttonSize.width).coerceAtLeast(0f))
return IntOffset(clampedX.toInt(), y.toInt())
}
fun getSelectedText(items: List<MergedItem>, linkMode: SimplexLinkMode): String {
val r = range ?: return ""
val lo = minOf(r.startIndex, r.endIndex)