From 048fc1e821eaffce07d49efd7d217f9ff7ee3252 Mon Sep 17 00:00:00 2001 From: Alexl Date: Tue, 21 Oct 2025 21:34:03 +0300 Subject: [PATCH] Comit --- .idea/misc.xml | 2 +- src/main/kotlin/ArchiveMenu.kt | 21 +++++++++++++++++ src/main/kotlin/Main.kt | 5 ++-- src/main/kotlin/Menu.kt | 42 ++++++++++++++++++++++++++++++++++ src/main/kotlin/Models.kt | 5 ++++ src/main/kotlin/NoteMenu.kt | 30 ++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/ArchiveMenu.kt create mode 100644 src/main/kotlin/Menu.kt create mode 100644 src/main/kotlin/Models.kt create mode 100644 src/main/kotlin/NoteMenu.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 9c8e7400..52b96137 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..8a30e626 --- /dev/null +++ b/src/main/kotlin/ArchiveMenu.kt @@ -0,0 +1,21 @@ +class ArchiveMenu(archives: List) : Menu(archives, "Список архивов:") { + override fun getDisplayName(item: Models.Archive) = item.name + override fun createItem(): Boolean { + print("Введите название архива: ") + val name = scanner.nextLine().trim() + when { + name.isEmpty() -> showError("Название не может быть пустым") + else -> { + items as MutableList + items.add(Models.Archive(name)) + println("Архив '$name' создан") + } + } + return true + } + + override fun selectItem(item: Models.Archive): Boolean { + NoteMenu(item.notes).show() + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..7dbeefaf 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 archives = mutableListOf() + ArchiveMenu(archives).show() } \ 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..372825c8 --- /dev/null +++ b/src/main/kotlin/Menu.kt @@ -0,0 +1,42 @@ +import java.util.Scanner + +abstract class Menu(protected val items: List, protected val header: String) { + protected val scanner = Scanner(System.`in`) + + open fun show() { + while (true) { + printMenu() + when (val input = readInput()) { + 0 -> if (createItem()) continue else return + in 1..items.size -> if (selectItem(items[input - 1])) continue else return + items.size + 1 -> return + else -> showError("Неверный пункт меню") + } + } + } + + protected open fun printMenu() { + println(header) + println("0. Создать") + items.forEachIndexed { index, item -> println("${index + 1}. ${getDisplayName(item)}") } + println("${items.size + 1}. Выход") + } + + protected fun readInput(): Int { + while (true) { + try { + return scanner.nextLine().toInt() + } catch (e: NumberFormatException) { + showError("Введите число") + } + } + } + + protected fun showError(message: String) { + println("Ошибка: $message") + } + + abstract fun getDisplayName(item: T): String + abstract fun createItem(): Boolean + abstract fun selectItem(item: T): Boolean +} \ 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..84b1cd75 --- /dev/null +++ b/src/main/kotlin/Models.kt @@ -0,0 +1,5 @@ +class Models { + data class Archive(val name: String, val notes: MutableList = mutableListOf()) + + data class Note(val title: String, val content: String) +} \ 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..ce6e8f8c --- /dev/null +++ b/src/main/kotlin/NoteMenu.kt @@ -0,0 +1,30 @@ +class NoteMenu(private val notes: MutableList) : Menu(notes, "Список заметок:") { + override fun getDisplayName(item: Models.Note) = item.title + override fun createItem(): Boolean { + print("Введите название заметки: ") + val title = scanner.nextLine().trim() + if (title.isEmpty()) { + showError("Название не может быть пустым") + return true + } + + print("Введите содержание заметки: ") + val content = scanner.nextLine().trim() + if (content.isEmpty()) { + showError("Содержание не может быть пустым") + return true + } + + notes.add(Models.Note(title, content)) + println("Заметка '$title' создана") + return true + } + + override fun selectItem(item: Models.Note): Boolean { + println("\n=== ${item.title} ===") + println(item.content) + println("\nНажмите Enter для возврата") + scanner.nextLine() + return true + } +} \ No newline at end of file