Copy from output and history

This commit is contained in:
Sad Ellie 2023-02-26 16:55:56 +04:00
parent a1333f5746
commit 65e6f7545e
4 changed files with 91 additions and 66 deletions

View File

@ -33,6 +33,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.outlined.MoreVert
@ -44,6 +45,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@ -53,7 +55,11 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalTextToolbar
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@ -69,6 +75,7 @@ import com.sadellie.unitto.feature.calculator.components.CalculatorKeyboard
import com.sadellie.unitto.feature.calculator.components.DragDownView
import com.sadellie.unitto.feature.calculator.components.HistoryList
import com.sadellie.unitto.feature.calculator.components.InputTextField
import com.sadellie.unitto.feature.calculator.components.UnittoTextToolbar
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.*
@ -81,8 +88,24 @@ internal fun CalculatorRoute(
navigateToSettings: () -> Unit,
viewModel: CalculatorViewModel = hiltViewModel()
) {
val clipboardManager = LocalClipboardManager.current
val uiState = viewModel.uiState.collectAsStateWithLifecycle()
fun copyToClipboard() {
val clipboardText = clipboardManager.getText() ?: return
// This method is called immediately after copying formatted text, we replace it with the
// the unformatted version.
clipboardManager.setText(
AnnotatedString(Formatter.removeFormat(clipboardText.text))
)
}
CompositionLocalProvider(
LocalTextToolbar provides UnittoTextToolbar(
view = LocalView.current,
copyCallback = ::copyToClipboard
)
) {
CalculatorScreen(
uiState = uiState.value,
navigateToMenu = navigateToMenu,
@ -95,6 +118,7 @@ internal fun CalculatorRoute(
evaluate = viewModel::evaluate,
clearHistory = viewModel::clearHistory
)
}
}
@Composable
@ -209,6 +233,7 @@ private fun CalculatorScreen(
pasteCallback = addSymbol,
cutCallback = deleteSymbol
)
SelectionContainer {
Text(
modifier = Modifier
.fillMaxWidth()
@ -219,6 +244,7 @@ private fun CalculatorScreen(
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f),
style = NumbersTextStyleDisplayMedium,
)
}
// Handle
Box(
Modifier

View File

@ -30,6 +30,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.History
import androidx.compose.material3.Icon
@ -115,6 +116,7 @@ private fun HistoryListItem(
historyItem: HistoryItem,
onTextClick: (String) -> Unit
) {
SelectionContainer {
Column(modifier = modifier) {
Box(
Modifier.clickable { onTextClick(historyItem.expression) }
@ -147,6 +149,7 @@ private fun HistoryListItem(
)
}
}
}
}
@Preview

View File

@ -30,7 +30,6 @@ import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalTextInputService
import androidx.compose.ui.platform.LocalTextToolbar
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import com.sadellie.unitto.core.base.Separator
@ -57,21 +56,16 @@ internal fun InputTextField(
}
fun copyToClipboard() = clipboardManager.setText(
AnnotatedString(
Formatter.removeFormat(formattedInput.text)
)
formattedInput.annotatedString.subSequence(formattedInput.selection)
)
CompositionLocalProvider(
LocalTextInputService provides null,
LocalTextToolbar provides UnittoTextToolbar(
view = LocalView.current,
copyCallback = ::copyToClipboard,
pasteCallback = { pasteCallback(clipboardManager.getText()?.text ?: "") },
cutCallback = {
copyToClipboard()
cutCallback()
},
copyCallback = ::copyToClipboard
cutCallback = { copyToClipboard(); cutCallback() }
)
) {
BasicTextField(

View File

@ -27,9 +27,9 @@ import androidx.compose.ui.platform.TextToolbarStatus
internal class UnittoTextToolbar(
private val view: View,
private val pasteCallback: () -> Unit,
private val cutCallback: () -> Unit,
private val copyCallback: () -> Unit
private val copyCallback: () -> Unit,
private val pasteCallback: (() -> Unit)? = null,
private val cutCallback: (() -> Unit)? = null
) : TextToolbar {
private var actionMode: ActionMode? = null
@ -45,8 +45,10 @@ internal class UnittoTextToolbar(
onSelectAllRequested: (() -> Unit)?
) {
textActionModeCallback.rect = rect
textActionModeCallback.onCopyRequested = copyCallback
textActionModeCallback.onCutRequested = cutCallback
textActionModeCallback.onCopyRequested = { onCopyRequested?.invoke(); copyCallback.invoke() }
textActionModeCallback.onCutRequested = cutCallback?.let {
{ it.invoke(); onCutRequested?.invoke() }
}
textActionModeCallback.onPasteRequested = pasteCallback
textActionModeCallback.onSelectAllRequested = onSelectAllRequested
if (actionMode == null) {