diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 00000000..81787186 --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,787 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9c8e7400..9bb64215 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/ArchiveMenu.kt b/src/main/kotlin/ArchiveMenu.kt new file mode 100644 index 00000000..23a4dc74 --- /dev/null +++ b/src/main/kotlin/ArchiveMenu.kt @@ -0,0 +1,19 @@ +class ArchiveMenu(private val archives: MutableList) : Menu() { + override val items: List = archives + override val createItemText: String = "Создать архив" + override val menuTitle: String = "Список архивов" + override val exitText: String = "Выход" + + override fun displayItem(item: Archive): String = item.name + + override fun onCreateItem() { + println("\nСоздание архива") + val name = readNonEmptyInput("Введите название архива: ") + archives.add(Archive(name)) + println("Архив '$name' создан!") + } + + override fun onItemSelected(item: Archive) { + NoteMenu(item.notes, item.name).show() + } +} \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..3558ca2e 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,4 @@ -fun main(args: Array) { - println("Hello World!") +fun main() { + val app = NotesApp() + app.start() } \ No newline at end of file diff --git a/src/main/kotlin/Menu.kt b/src/main/kotlin/Menu.kt new file mode 100644 index 00000000..004197be --- /dev/null +++ b/src/main/kotlin/Menu.kt @@ -0,0 +1,65 @@ +abstract class Menu { + protected abstract val items: List + protected abstract val createItemText: String + protected abstract val menuTitle: String + protected abstract val exitText: String + + protected abstract fun displayItem(item: T): String + protected abstract fun onCreateItem() + protected abstract fun onItemSelected(item: T) + + fun show() { + while (true) { + val menuItems = mutableListOf().apply { + add(createItemText) + addAll(items.map { displayItem(it) }) + } + + println("\n$menuTitle:") + menuItems.forEachIndexed { index, item -> + println("$index. $item") + } + println("${menuItems.size}. $exitText") + + when (val choice = getUserChoice(menuItems.size)) { + menuItems.size -> return + 0 -> onCreateItem() + else -> onItemSelected(items[choice - 1]) + } + } + } + + private fun getUserChoice(maxItem: Int): Int { + while (true) { + print("\nВыберите пункт: ") + val input = readlnOrNull() + + if (input.isNullOrBlank()) { + println("Пожалуйста, введите число") + continue + } + + try { + val choice = input.toInt() + if (choice in 0..maxItem) { + return choice + } else { + println("Число должно быть от 0 до $maxItem") + } + } catch (e: NumberFormatException) { + println("Пожалуйста, введите корректное число") + } + } + } + + protected fun readNonEmptyInput(prompt: String): String { + while (true) { + print(prompt) + val input = readlnOrNull()?.trim() + if (!input.isNullOrEmpty()) { + return input + } + println("Поле не может быть пустым. Пожалуйста, введите значение.") + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/Models.kt b/src/main/kotlin/Models.kt new file mode 100644 index 00000000..eb1f4be2 --- /dev/null +++ b/src/main/kotlin/Models.kt @@ -0,0 +1,3 @@ +data class Note(val title: String, val content: String) + +data class Archive(val name: String, val notes: MutableList = mutableListOf()) \ No newline at end of file diff --git a/src/main/kotlin/NoteMenu.kt b/src/main/kotlin/NoteMenu.kt new file mode 100644 index 00000000..6c0127ec --- /dev/null +++ b/src/main/kotlin/NoteMenu.kt @@ -0,0 +1,26 @@ +class NoteMenu( + private val notes: MutableList, + private val archiveName: String +) : Menu() { + override val items: List = notes + override val createItemText: String = "Создать заметку" + override val menuTitle: String = "Список заметок в архиве '$archiveName'" + override val exitText: String = "Назад" + + override fun displayItem(item: Note): String = item.title + + override fun onCreateItem() { + println("\nСоздание заметки") + val title = readNonEmptyInput("Введите название заметки: ") + val content = readNonEmptyInput("Введите текст заметки: ") + notes.add(Note(title, content)) + println("Заметка '$title' создана!") + } + + override fun onItemSelected(item: Note) { + println("\nЗаметка: ${item.title}") + println("Текст: ${item.content}") + println("\nНажмите Enter чтобы вернуться...") + readlnOrNull() + } +} \ No newline at end of file diff --git a/src/main/kotlin/NotesApp.kt b/src/main/kotlin/NotesApp.kt new file mode 100644 index 00000000..dfacfbfd --- /dev/null +++ b/src/main/kotlin/NotesApp.kt @@ -0,0 +1,9 @@ +class NotesApp { + private val archives = mutableListOf() + + fun start() { + println("Добро пожаловать в приложение Заметки!") + ArchiveMenu(archives).show() + println("\nДо свидания!") + } +} \ No newline at end of file