iT邦幫忙

2025 iThome 鐵人賽

DAY 29
1

終於寫到第 29 篇了,這個月事情真是有夠多,明天再來寫回顧

AI 寫扣經過

  1. 修改 NoteEditViewModel
    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))
            )
        }
    }
    
  2. 修改 NoteEditScreen
    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
    ) {
    
  3. 修改 NoteEditScreen
    ) { 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 = "貼上") } }
                }
            }
        }
    }
    
  4. 修改 NoteEditScreen
    @Composable
    private fun NoteEditScreenPreview() {
        AndroidTemplateTheme {
            NoteEditScreenContent(
                uiState = NoteEditUiState(isLoading = false),
                onTitleChange = {},
                onContentChange = {},
                onSaveNote = {},
                onPlayTitle = {},
                onPlayContent = {},
                onSelectAll = {},
                onCopy = {},
                onPaste = {},
                onMoveToTop = {},
                onMoveToBottom = {},
                onNavigateBack = {}
            )
        }
    }
    

上一篇
114/28 - Vibe Coding 建立文字轉語音 (TTS) 功能
系列文
看見筆記捲土重來,試著用 Vibe Coding 完成一款 App 吧!29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言