mirror of
https://github.com/Myzel394/NumberHub.git
synced 2025-06-20 09:15:26 +02:00
Copy from output and history
This commit is contained in:
parent
a1333f5746
commit
65e6f7545e
@ -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,
|
||||
@ -96,6 +119,7 @@ internal fun CalculatorRoute(
|
||||
clearHistory = viewModel::clearHistory
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun CalculatorScreen(
|
||||
@ -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
|
||||
|
@ -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) }
|
||||
@ -148,6 +150,7 @@ private fun HistoryListItem(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
|
@ -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(
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user