Sfoglia il codice sorgente

removed draft alert dialog

sirekanian 3 anni fa
parent
commit
982efd1bdd

+ 1 - 0
app/src/main/java/com/sirekanian/spacetime/MainPresenter.kt

@@ -46,6 +46,7 @@ class MainPresenterImpl(
 
     override fun savePage(page: ImagePage) {
         state.editablePage = null
+        state.draft = null
         scope.launch {
             repository.savePage(page)
             updatePages()

+ 2 - 2
app/src/main/java/com/sirekanian/spacetime/MainScreen.kt

@@ -10,7 +10,7 @@ import com.google.accompanist.pager.HorizontalPager
 import com.sirekanian.spacetime.model.Draft
 import com.sirekanian.spacetime.model.GalleryPage
 import com.sirekanian.spacetime.model.ImagePage
-import com.sirekanian.spacetime.ui.DraftAlertDialog
+import com.sirekanian.spacetime.ui.DraftPage
 import com.sirekanian.spacetime.ui.GalleryPageContent
 import com.sirekanian.spacetime.ui.ImagePageContent
 
@@ -49,5 +49,5 @@ fun MainScreen(presenter: MainPresenter) {
             }
         }
     }
-    DraftAlertDialog(state, onConfirm = { presenter.savePage(it) })
+    DraftPage(insets, state, onDone = { presenter.savePage(it) })
 }

+ 1 - 1
app/src/main/java/com/sirekanian/spacetime/data/DefaultDataCallback.kt

@@ -22,7 +22,7 @@ class DefaultDataCallback(resources: Resources) : RoomDatabase.Callback() {
         val names = resources.getStringArray(R.array.default_page_names)
         val dates = resources.getStringArray(R.array.default_page_dates)
         defaultPages = names.zip(defaultImageUrls).zip(dates) { (name, url), date ->
-            createImagePage(name, url, DateField(date))
+            createImagePage(name, url, DateField(date), blur = 0.5f)
         }
     }
 

+ 2 - 2
app/src/main/java/com/sirekanian/spacetime/model/Page.kt

@@ -3,8 +3,8 @@ package com.sirekanian.spacetime.model
 import com.sirekanian.spacetime.data.local.PageEntity
 import com.sirekanian.spacetime.ui.DateField
 
-fun createImagePage(name: String, url: String, date: DateField): ImagePage =
-    ImagePage(0, name, url, date, blur = 0.5f)
+fun createImagePage(name: String, url: String, date: DateField, blur: Float): ImagePage =
+    ImagePage(0, name, url, date, blur)
 
 sealed class Page(val id: Int)
 

+ 0 - 114
app/src/main/java/com/sirekanian/spacetime/ui/DraftAlertDialog.kt

@@ -1,114 +0,0 @@
-package com.sirekanian.spacetime.ui
-
-import androidx.compose.foundation.layout.*
-import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material.*
-import androidx.compose.runtime.*
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusRequester
-import androidx.compose.ui.text.input.KeyboardCapitalization
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.window.Dialog
-import com.sirekanian.spacetime.MainState
-import com.sirekanian.spacetime.model.ImagePage
-import com.sirekanian.spacetime.model.createImagePage
-
-@Composable
-fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
-    val draft = state.draft
-    var name by remember(draft) { mutableStateOf("") }
-    var date by remember(draft) { mutableStateOf(DateField("")) }
-    var isNameValid by remember(draft, name) { mutableStateOf(true) }
-    var isDateValid by remember(draft, date) { mutableStateOf(true) }
-    if (draft != null) {
-        MyAlertDialog(
-            title = {
-                Text(
-                    text = "Enter Name",
-                    style = MaterialTheme.typography.h6,
-                )
-            },
-            content = {
-                val focusRequester = remember { FocusRequester() }
-                OutlinedTextField(
-                    value = name,
-                    onValueChange = { name = it },
-                    modifier = Modifier.focusRequester(focusRequester),
-                    label = { Text("Name") },
-                    isError = !isNameValid,
-                    keyboardOptions = KeyboardOptions(KeyboardCapitalization.Sentences),
-                    singleLine = true,
-                )
-                OutlinedTextField(
-                    value = date.value,
-                    onValueChange = { date = DateField(it) },
-                    label = { Text("Date") },
-                    placeholder = { Text("YYYY-MM-DD") },
-                    isError = !isDateValid,
-                    visualTransformation = { DateField(it.text).getVisualTransformation() },
-                    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
-                    singleLine = true,
-                )
-                LaunchedEffect(Unit) {
-                    focusRequester.requestFocus()
-                }
-            },
-            dismissButton = {
-                TextButton(
-                    onClick = { state.draft = null },
-                    content = { Text("CANCEL") },
-                )
-            },
-            confirmButton = {
-                TextButton(
-                    onClick = {
-                        isNameValid = name.isNotBlank()
-                        isDateValid = date.isValid()
-                        if (isNameValid && isDateValid) {
-                            onConfirm(createImagePage(name, draft.url, date))
-                            state.draft = null
-                        }
-                    },
-                    content = { Text("OK") },
-                )
-            },
-            onDismiss = {
-                state.draft = null
-            },
-        )
-    }
-}
-
-@Composable
-private fun MyAlertDialog(
-    title: @Composable () -> Unit,
-    content: @Composable () -> Unit,
-    dismissButton: @Composable () -> Unit,
-    confirmButton: @Composable () -> Unit,
-    onDismiss: () -> Unit,
-) {
-    Dialog(onDismiss) {
-        Surface(shape = MaterialTheme.shapes.medium) {
-            Column {
-                Column(Modifier.padding(24.dp)) {
-                    title.invoke()
-                    Spacer(Modifier.size(16.dp))
-                    content.invoke()
-                }
-                Spacer(Modifier.size(4.dp))
-                Row(
-                    Modifier
-                        .padding(8.dp)
-                        .fillMaxWidth(),
-                    Arrangement.spacedBy(8.dp, Alignment.End),
-                ) {
-                    dismissButton.invoke()
-                    confirmButton.invoke()
-                }
-            }
-        }
-    }
-}

+ 74 - 0
app/src/main/java/com/sirekanian/spacetime/ui/DraftPage.kt

@@ -0,0 +1,74 @@
+package com.sirekanian.spacetime.ui
+
+import androidx.activity.compose.BackHandler
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Slider
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Close
+import androidx.compose.material.icons.filled.Done
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import com.sirekanian.spacetime.D
+import com.sirekanian.spacetime.MainState
+import com.sirekanian.spacetime.ext.VectorIconButton
+import com.sirekanian.spacetime.model.EditablePage.Autofocus
+import com.sirekanian.spacetime.model.ImagePage
+import com.sirekanian.spacetime.model.createImagePage
+
+@Composable
+fun DraftPage(insets: PaddingValues, state: MainState, onDone: (ImagePage) -> Unit) {
+    val draft = state.draft ?: return
+    BackHandler {
+        state.draft = null
+    }
+    val name = remember { NameField("") }
+    var date by remember { mutableStateOf(DateField("")) }
+    var blur by remember { mutableStateOf(0.5f) }
+    var isNameValid by remember(name.field) { mutableStateOf(true) }
+    var isDateValid by remember(date) { mutableStateOf(true) }
+    PageBackground(
+        url = draft.url,
+        blur = blur,
+    )
+    Row(Modifier.padding(insets)) {
+        VectorIconButton(Icons.Default.Close, onClick = { state.draft = null })
+        Spacer(Modifier.weight(1f))
+        VectorIconButton(Icons.Default.Done, onClick = {
+            isNameValid = name.isValid()
+            isDateValid = date.isValid()
+            if (isNameValid && isDateValid) {
+                onDone(createImagePage(name.field.text, draft.url, date, blur))
+            }
+        })
+    }
+    Column(
+        modifier = Modifier
+            .fillMaxSize()
+            .systemBarsPadding()
+            .padding(top = D.toolbarHeight)
+            .padding(vertical = 8.dp, horizontal = 16.dp),
+        verticalArrangement = Arrangement.spacedBy(16.dp),
+    ) {
+        val textStyle = MaterialTheme.typography.h2.copy(textAlign = TextAlign.Center)
+        EditForm(
+            name = name,
+            isNameValid = isNameValid,
+            date = date,
+            onDateChange = { date = DateField(it) },
+            isDateValid = isDateValid,
+            autofocus = Autofocus.NAME,
+            textStyle = textStyle,
+        )
+        Box(Modifier.height(48.dp), Alignment.Center) {
+            Slider(
+                value = blur,
+                onValueChange = { blur = it },
+            )
+        }
+        Spacer(Modifier.weight(1f))
+    }
+}

+ 4 - 0
app/src/main/java/com/sirekanian/spacetime/ui/EditForm.kt

@@ -13,12 +13,14 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.input.KeyboardCapitalization
 import androidx.compose.ui.text.input.KeyboardType
 import com.sirekanian.spacetime.model.EditablePage.Autofocus
 
 @Composable
 fun EditForm(
     name: NameField,
+    isNameValid: Boolean,
     date: DateField,
     onDateChange: (String) -> Unit,
     isDateValid: Boolean,
@@ -38,6 +40,8 @@ fun EditForm(
             .focusRequester(nameFocusRequester),
         textStyle = textStyle,
         placeholder = { Text("Title", Modifier.fillMaxWidth(), style = textStyle) },
+        isError = !isNameValid,
+        keyboardOptions = KeyboardOptions(KeyboardCapitalization.Sentences),
         maxLines = 2,
         colors = TextFieldDefaults.outlinedTextFieldColors(backgroundColor = rippleColor),
     )

+ 5 - 3
app/src/main/java/com/sirekanian/spacetime/ui/ImagePageContent.kt

@@ -45,6 +45,7 @@ fun ImagePageContent(
     val name = remember(isEditMode) { NameField(page.name) }
     var date by remember(isEditMode) { mutableStateOf(page.date) }
     var blur by remember(isEditMode) { mutableStateOf(page.blur) }
+    var isNameValid by remember(name.field) { mutableStateOf(true) }
     var isDateValid by remember(date) { mutableStateOf(true) }
     PageBackground(
         url = page.url,
@@ -60,10 +61,10 @@ fun ImagePageContent(
                 }
             } else {
                 VectorIconButton(Icons.Default.Done, onClick = {
-                    if (date.isValid()) {
+                    isNameValid = name.isValid()
+                    isDateValid = date.isValid()
+                    if (isNameValid && isDateValid) {
                         onDone(ImagePage(page.id, name.field.text, page.url, date, blur))
-                    } else {
-                        isDateValid = false
                     }
                 })
             }
@@ -83,6 +84,7 @@ fun ImagePageContent(
         if (isEditMode) {
             EditForm(
                 name = name,
+                isNameValid = isNameValid,
                 date = date,
                 onDateChange = { date = DateField(it) },
                 isDateValid = isDateValid,

+ 1 - 0
app/src/main/java/com/sirekanian/spacetime/ui/NameField.kt

@@ -8,4 +8,5 @@ import androidx.compose.ui.text.input.TextFieldValue
 
 class NameField(name: String) {
     var field by mutableStateOf(TextFieldValue(name, TextRange(name.length)))
+    fun isValid() = field.text.isNotEmpty()
 }