diff --git a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/TaskItem.kt b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/TaskItem.kt index 3fe1c8e..2cf78b1 100644 --- a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/TaskItem.kt +++ b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/TaskItem.kt @@ -1,21 +1,36 @@ package jp.co.mixi.androidtraining.todo.ui +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import jp.co.mixi.androidtraining.todo.R import jp.co.mixi.androidtraining.todo.data.entity.Task @Composable fun TaskItem( task: Task, + onDeleteButtonClick: () -> Unit, modifier: Modifier = Modifier, ) { ListItem( headlineContent = { Text(text = task.title) }, modifier = modifier, + trailingContent = { + IconButton(onClick = onDeleteButtonClick) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = stringResource(id = R.string.delete), + ) + } + }, ) } @@ -23,6 +38,9 @@ fun TaskItem( @Composable private fun TaskItemPreview() { MaterialTheme { - TaskItem(task = Task(title = "Task")) + TaskItem( + task = Task(title = "Task"), + onDeleteButtonClick = {}, + ) } } diff --git a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoScreen.kt b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoScreen.kt index 3d05d4f..f25955a 100644 --- a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoScreen.kt +++ b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoScreen.kt @@ -4,6 +4,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material3.HorizontalDivider @@ -14,6 +16,7 @@ import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.viewmodel.compose.viewModel import jp.co.mixi.androidtraining.todo.R @@ -29,12 +32,14 @@ fun ToDoScreen( Column(modifier = modifier) { TaskList( tasks = uiState.tasks, + onDeleteButtonClick = viewModel::deleteTask, modifier = Modifier.weight(1f), ) TaskTextField( value = uiState.inputText, onValueChange = viewModel::setInputText, + addButtonEnabled = uiState.addEnabled, onAddButtonClick = viewModel::addTask, modifier = Modifier.fillMaxWidth(), ) @@ -44,11 +49,15 @@ fun ToDoScreen( @Composable private fun TaskList( tasks: List, + onDeleteButtonClick: (Task) -> Unit, modifier: Modifier = Modifier, ) { LazyColumn(modifier = modifier) { items(tasks) { task -> - TaskItem(task = task) + TaskItem( + task = task, + onDeleteButtonClick = { onDeleteButtonClick(task) }, + ) HorizontalDivider() } } @@ -58,6 +67,7 @@ private fun TaskList( private fun TaskTextField( value: String, onValueChange: (String) -> Unit, + addButtonEnabled: Boolean, onAddButtonClick: () -> Unit, modifier: Modifier = Modifier, ) { @@ -66,13 +76,22 @@ private fun TaskTextField( onValueChange = onValueChange, modifier = modifier, trailingIcon = { - IconButton(onClick = onAddButtonClick) { + IconButton( + onClick = onAddButtonClick, + enabled = addButtonEnabled, + ) { Icon( imageVector = Icons.Default.Add, contentDescription = stringResource(id = R.string.add), ) } }, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Done, + ), + keyboardActions = KeyboardActions( + onDone = { onAddButtonClick() }, + ), ) } diff --git a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoUiState.kt b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoUiState.kt index ee5c7e6..4ce9b4e 100644 --- a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoUiState.kt +++ b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoUiState.kt @@ -5,4 +5,7 @@ import jp.co.mixi.androidtraining.todo.data.entity.Task data class ToDoUiState( val tasks: List = emptyList(), val inputText: String = "", -) +) { + val addEnabled: Boolean + get() = inputText.isNotBlank() +} diff --git a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoViewModel.kt b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoViewModel.kt index aabb491..96898c3 100644 --- a/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoViewModel.kt +++ b/app/todo/src/main/java/jp/co/mixi/androidtraining/todo/ui/ToDoViewModel.kt @@ -20,4 +20,8 @@ class ToDoViewModel : ViewModel() { inputText = "", ) } + + fun deleteTask(task: Task) { + uiState = uiState.copy(tasks = uiState.tasks - task) + } } diff --git a/app/todo/src/main/res/values/strings.xml b/app/todo/src/main/res/values/strings.xml index f3c165f..975357b 100644 --- a/app/todo/src/main/res/values/strings.xml +++ b/app/todo/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ ToDo 追加 + 削除