終於寫到第 29 篇了,這個月事情真是有夠多,明天再來寫回顧
fun playContent() {
val content = _uiState.value.content.text
if (content.isNotBlank()) {
ttsHelper.speak(content)
}
}
fun selectAllContent() {
_uiState.update {
it.copy(
content = it.content.copy(
selection = TextRange(0, it.content.text.length)
)
)
}
}
fun copyContent() {
val selectedText = _uiState.value.content.selection
if (!selectedText.collapsed) {
val textToCopy = _uiState.value.content.text.substring(selectedText.start, selectedText.end)
val clipboard = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("note_content", textToCopy)
clipboard.setPrimaryClip(clip)
}
}
fun pasteContent() {
val clipboard = application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val pasteData = clipboard.primaryClip?.getItemAt(0)?.text?.toString() ?: ""
if (pasteData.isNotBlank()) {
val currentContent = _uiState.value.content
val newText = currentContent.text.replaceRange(
currentContent.selection.start,
currentContent.selection.end,
pasteData
)
val newCursorPosition = currentContent.selection.start + pasteData.length
_uiState.update {
it.copy(
content = it.content.copy(
text = newText,
selection = TextRange(newCursorPosition)
)
)
}
}
}
fun moveContentCursorToTop() {
_uiState.update {
it.copy(
content = it.content.copy(selection = TextRange(0))
)
}
}
fun moveContentCursorToBottom() {
_uiState.update {
it.copy(
content = it.content.copy(selection = TextRange(it.content.text.length))
)
}
}
private fun NoteEditScreenContent(
modifier: Modifier = Modifier,
uiState: NoteEditUiState,
onTitleChange: (androidx.compose.ui.text.input.TextFieldValue) -> Unit,
onContentChange: (androidx.compose.ui.text.input.TextFieldValue) -> Unit,
onSaveNote: () -> Unit,
onPlayTitle: () -> Unit,
onPlayContent: () -> Unit,
onSelectAll: () -> Unit,
onCopy: () -> Unit,
onPaste: () -> Unit,
onMoveToTop: () -> Unit,
onMoveToBottom: () -> Unit,
onNavigateBack: () -> Unit
) {
) { innerPadding ->
if (uiState.isLoading) {
CircularProgressIndicator()
} else {
Column(
modifier = Modifier
.padding(innerPadding)
.fillMaxSize()
) {
TextField(
value = uiState.title,
onValueChange = onTitleChange,
label = { Text("標題") },
modifier = Modifier.fillMaxWidth()
)
TextField(
value = uiState.content,
onValueChange = onContentChange,
label = { Text("內容") },
modifier = Modifier
.fillMaxWidth()
.weight(1f)
)
// Function Panel
LazyRow(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
item { IconButton(onClick = onMoveToTop) { Icon(Icons.Default.ArrowUpward, contentDescription = "移至頂端") } }
item { IconButton(onClick = onMoveToBottom) { Icon(Icons.Default.ArrowDownward, contentDescription = "移至底端") } }
item { IconButton(onClick = onSelectAll) { Icon(Icons.Default.SelectAll, contentDescription = "全選") } }
item { IconButton(onClick = onCopy) { Icon(Icons.Default.ContentCopy, contentDescription = "複製") } }
item { IconButton(onClick = onPaste) { Icon(Icons.Default.ContentPaste, contentDescription = "貼上") } }
}
}
}
}
@Composable
private fun NoteEditScreenPreview() {
AndroidTemplateTheme {
NoteEditScreenContent(
uiState = NoteEditUiState(isLoading = false),
onTitleChange = {},
onContentChange = {},
onSaveNote = {},
onPlayTitle = {},
onPlayContent = {},
onSelectAll = {},
onCopy = {},
onPaste = {},
onMoveToTop = {},
onMoveToBottom = {},
onNavigateBack = {}
)
}
}