nextNoteVault #23

Merged
sebastian merged 57 commits from nextNoteVault into master 2025-05-10 06:23:23 +00:00
8 changed files with 101 additions and 42 deletions
Showing only changes of commit f20c8f0096 - Show all commits

View File

@ -40,6 +40,9 @@
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>

View File

@ -2,27 +2,23 @@ package come.stormborntales.notevault
import android.net.Uri
import android.os.Bundle
import android.webkit.MimeTypeMap
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.viewmodel.compose.viewModel
import come.stormborntales.notevault.data.local.AppDatabase
import come.stormborntales.notevault.data.model.NoteEntry
import come.stormborntales.notevault.data.local.entity.NoteEntity
import come.stormborntales.notevault.data.repository.NoteRepository
import come.stormborntales.notevault.ui.screens.AddNoteDialog
import come.stormborntales.notevault.ui.screens.MainScreen
import come.stormborntales.notevault.ui.theme.NoteVaultTheme
import come.stormborntales.notevault.ui.viewmodel.NoteViewModel
import come.stormborntales.notevault.ui.viewmodel.NoteViewModelFactory
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
import java.io.InputStream
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@ -35,11 +31,6 @@ class MainActivity : ComponentActivity() {
setContent {
NoteVaultTheme {
val viewModel: NoteViewModel = viewModel(factory = viewModelFactory)
val context = LocalContext.current
// Globale Notenliste
val notes = remember { mutableStateListOf<NoteEntry>() }
// Bildauswahl + Dialog-States
var selectedUris by remember { mutableStateOf<List<Uri>>(emptyList()) }
var showDialog by remember { mutableStateOf(false) }
@ -55,6 +46,15 @@ class MainActivity : ComponentActivity() {
}
)
var noteToEdit by remember { mutableStateOf<NoteEntity?>(null) }
// Dialog anzeigen
val openDialog: (NoteEntity?) -> Unit = { note ->
Log.d("EditNote", "NoteEntity: " + note?.title)
noteToEdit = note
showDialog = true
}
// UI anzeigen
MainScreen(
viewModel = viewModel,
@ -62,7 +62,8 @@ class MainActivity : ComponentActivity() {
imagePickerLauncher.launch(
arrayOf("image/*")
)
}
},
onEditNote = openDialog
)
// Dialog bei Bedarf
@ -72,6 +73,7 @@ class MainActivity : ComponentActivity() {
AddNoteDialog(
onDismiss = { showDialog = false },
onSave = { title, composer, year, genre, description ->
if(noteToEdit == null) {
viewModel.addNote(
context = context,
title = title,
@ -82,7 +84,23 @@ class MainActivity : ComponentActivity() {
selectedUris = selectedUris,
onDone = { showDialog = false }
)
} else {
viewModel.updateNote(
editedNote = noteToEdit!!,
updatedTitle = title,
updatedComposer = composer,
updatedYear = year,
updatedGenre = genre,
updatedDescription = description,
onDone = { showDialog = false }
)
}
},
initialTitle = noteToEdit?.title ?: "",
initialComposer = noteToEdit?.composer,
initialYear = noteToEdit?.year,
initialGenre = noteToEdit?.genre,
initialDescription = noteToEdit?.description
)
}
}

View File

@ -5,6 +5,7 @@ import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import come.stormborntales.notevault.data.local.entity.NoteEntity
import kotlinx.coroutines.flow.Flow
@ -18,4 +19,7 @@ interface NoteDao {
@Delete
suspend fun delete(note: NoteEntity)
@Update
suspend fun update(note: NoteEntity)
}

View File

@ -6,11 +6,11 @@ import androidx.room.PrimaryKey
@Entity(tableName = "notes")
data class NoteEntity(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val title: String,
var title: String,
val images: List<String>, // oder String + TypeConverter
val composer: String?,
val year: Int?,
val genre: String?,
val description: String?,
var composer: String?,
var year: Int?,
var genre: String?,
var description: String?,
val imagePreview: String
)

View File

@ -9,4 +9,6 @@ class NoteRepository(private val dao: NoteDao) {
suspend fun insert(note: NoteEntity) = dao.insert(note)
suspend fun delete(note: NoteEntity) = dao.delete(note)
suspend fun update(note: NoteEntity) = dao.update(note);
}

View File

@ -14,15 +14,21 @@ import androidx.compose.ui.unit.dp
@Composable
fun AddNoteDialog(
onDismiss: () -> Unit,
onSave: (title: String, composer: String?, year: Int?, genre: String?, description: String?) -> Unit
onSave: (title: String, composer: String?, year: Int?, genre: String?, description: String?) -> Unit,
initialTitle: String = "",
initialComposer: String? = null,
initialYear: Int? = null,
initialGenre: String? = null,
initialDescription: String? = null
) {
var title by remember { mutableStateOf("") }
var composer by remember { mutableStateOf("") }
var yearText by remember { mutableStateOf("") }
var genre by remember { mutableStateOf("") }
var description by remember { mutableStateOf("") }
var title by remember { mutableStateOf(initialTitle) }
var composer by remember { mutableStateOf(initialComposer ?: "") }
var yearText by remember { mutableStateOf(initialYear?.toString() ?: "") }
var genre by remember { mutableStateOf(initialGenre ?: "") }
var description by remember { mutableStateOf(initialDescription ?: "") }
var showTitleError by remember { mutableStateOf(false) }
AlertDialog(
onDismissRequest = onDismiss,
confirmButton = {

View File

@ -6,6 +6,7 @@ import android.graphics.BitmapFactory
import android.graphics.ImageDecoder
import android.media.Image
import android.net.Uri
import android.util.Log
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
@ -45,7 +46,7 @@ fun loadImageBitmap(context: Context, uriString: String): ImageBitmap? {
}
@Composable
fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) {
fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit, onEditNote: (NoteEntity) -> Unit) {
val context = LocalContext.current
@ -116,7 +117,10 @@ fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) {
Text("Anzeigen", style = MaterialTheme.typography.labelLarge)
}
OutlinedButton(
onClick = { /* TODO */ },
onClick = {
onEditNote(note)
Log.d("EditNote", "on Edit Note!")
},
contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp)
) {
Text("Bearbeiten", style = MaterialTheme.typography.labelLarge)
@ -143,7 +147,8 @@ fun NoteCard(note: NoteEntity, onDeleteNote: (NoteEntity) -> Unit) {
@Composable
fun MainScreen(
onAddNoteClicked: () -> Unit, // Übergib hier deine Logik für den Import
viewModel: NoteViewModel
viewModel: NoteViewModel,
onEditNote: (NoteEntity) -> Unit
) {
val notes by viewModel.notes.observeAsState(emptyList())
Scaffold(
@ -170,7 +175,7 @@ fun MainScreen(
items(notes) { note ->
NoteCard(note = note, onDeleteNote = { noteEntity ->
viewModel.deleteNote(noteEntity)
})
}, onEditNote = onEditNote)
}
}
}

View File

@ -14,7 +14,6 @@ import come.stormborntales.notevault.data.repository.NoteRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
import java.io.InputStream
import androidx.core.graphics.scale
class NoteViewModel(
@ -86,4 +85,26 @@ class NoteViewModel(
repository.delete(note)
}
}
fun updateNote(
editedNote: NoteEntity,
updatedTitle: String,
updatedComposer: String?,
updatedYear: Int?,
updatedGenre: String?,
updatedDescription: String?,
onDone: () -> Unit
) {
viewModelScope.launch {
editedNote.title = updatedTitle
editedNote.year = updatedYear;
editedNote.composer = updatedComposer
editedNote.genre = updatedGenre
editedNote.description = updatedDescription
repository.update(editedNote)
onDone()
}
}
}