From dca507a881ff20e8585c1e85fbbd8f8c9dcd12cc Mon Sep 17 00:00:00 2001 From: Stylish Date: Thu, 29 Jan 2026 18:35:22 +0300 Subject: [PATCH] =?UTF-8?q?"=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?'=D0=97=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8'"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/Main.kt | 13 ++++- src/main/kotlin/models/Archive.kt | 6 +++ src/main/kotlin/models/Note.kt | 7 +++ src/main/kotlin/ui/ArchiveMenu.kt | 36 +++++++++++++ src/main/kotlin/ui/ConsoleReader.kt | 21 ++++++++ src/main/kotlin/ui/Menu.kt | 81 +++++++++++++++++++++++++++++ src/main/kotlin/ui/NoteMenu.kt | 45 ++++++++++++++++ 7 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/models/Archive.kt create mode 100644 src/main/kotlin/models/Note.kt create mode 100644 src/main/kotlin/ui/ArchiveMenu.kt create mode 100644 src/main/kotlin/ui/ConsoleReader.kt create mode 100644 src/main/kotlin/ui/Menu.kt create mode 100644 src/main/kotlin/ui/NoteMenu.kt diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..86106794 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,12 @@ -fun main(args: Array) { - println("Hello World!") +import models.Archive +import ui.ArchiveMenu +fun main() { + println("=== Приложение \"Заметки\" ===") + + val archives = mutableListOf() + val archiveMenu = ArchiveMenu(archives) + + archiveMenu.show() + + println("До свидания!") } \ No newline at end of file diff --git a/src/main/kotlin/models/Archive.kt b/src/main/kotlin/models/Archive.kt new file mode 100644 index 00000000..0a832387 --- /dev/null +++ b/src/main/kotlin/models/Archive.kt @@ -0,0 +1,6 @@ +package models + +data class Archive( + val name: String, + val notes: MutableList = mutableListOf() +) \ No newline at end of file diff --git a/src/main/kotlin/models/Note.kt b/src/main/kotlin/models/Note.kt new file mode 100644 index 00000000..93742bad --- /dev/null +++ b/src/main/kotlin/models/Note.kt @@ -0,0 +1,7 @@ +package models +import models.Note + +data class Note( + val title: String, + val content: String +) \ No newline at end of file diff --git a/src/main/kotlin/ui/ArchiveMenu.kt b/src/main/kotlin/ui/ArchiveMenu.kt new file mode 100644 index 00000000..f6dcaabd --- /dev/null +++ b/src/main/kotlin/ui/ArchiveMenu.kt @@ -0,0 +1,36 @@ +package ui +import models.Archive + +class ArchiveMenu(private val archives: MutableList) : Menu( + title = "Меню архивов", + createItemText = "Создать архив" +) { + override fun getItemsList(): List = archives + + override fun getItemName(item: Archive): String = item.name + + override fun onItemSelected(item: Archive) { + val noteMenu = NoteMenu(item.notes) + noteMenu.show() + } + + override fun onCreateItem() { + while (true) { + val name = ConsoleReader.readLine("Введите название архива: ") + + if (name.isBlank()) { + println("Название архива не может быть пустым") + continue + } + + if (archives.any { it.name.equals(name, ignoreCase = true) }) { + println("Архив с таким названием уже существует") + continue + } + + archives.add(Archive(name)) + println("Архив \"$name\" создан") + break + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ui/ConsoleReader.kt b/src/main/kotlin/ui/ConsoleReader.kt new file mode 100644 index 00000000..88abd144 --- /dev/null +++ b/src/main/kotlin/ui/ConsoleReader.kt @@ -0,0 +1,21 @@ +package ui + +import java.util.Scanner + +object ConsoleReader { + private val scanner = Scanner(System.`in`) + + fun readLine(prompt: String): String { + print(prompt) + return scanner.nextLine().trim() + } + + fun readInt(prompt: String): Int? { + print(prompt) + return try { + scanner.nextLine().toInt() + } catch (e: NumberFormatException) { + null + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ui/Menu.kt b/src/main/kotlin/ui/Menu.kt new file mode 100644 index 00000000..ffa62e43 --- /dev/null +++ b/src/main/kotlin/ui/Menu.kt @@ -0,0 +1,81 @@ +package ui + +abstract class Menu( + private val title: String, + private val createItemText: String = "Создать", + private val exitText: String = "Выход" +) { + private val items = mutableListOf Unit>>() + + abstract fun getItemsList(): List + abstract fun getItemName(item: T): String + abstract fun onItemSelected(item: T) + abstract fun onCreateItem() + + fun show() { + while (true) { + updateMenuItems() + printMenu() + + val input = ConsoleReader.readLine("Выберите пункт меню: ") + + if (!validateInput(input)) { + continue + } + + val choice = input.toInt() + + if (!processChoice(choice)) { + break + } + } + } + + private fun updateMenuItems() { + items.clear() + items.add(Pair(createItemText) { onCreateItem() }) + + getItemsList().forEachIndexed { index, item -> + items.add(Pair(getItemName(item)) { onItemSelected(item) }) + } + + items.add(Pair(exitText) { /* Выход обрабатывается в processChoice */ }) + } + + private fun printMenu() { + println("\n=== $title ===") + items.forEachIndexed { index, pair -> + println("$index. ${pair.first}") + } + } + + private fun validateInput(input: String): Boolean { + if (input.isEmpty()) { + println("Ошибка: Введите число") + return false + } + + val choice = try { + input.toInt() + } catch (e: NumberFormatException) { + println("Ошибка: Введите корректное число") + return false + } + + if (choice < 0 || choice >= items.size) { + println("Ошибка: Пункт $choice не существует. Выберите от 0 до ${items.size - 1}") + return false + } + + return true + } + + private fun processChoice(choice: Int): Boolean { + if (choice == items.size - 1) { + return false // Выход + } + + items[choice].second.invoke() + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/ui/NoteMenu.kt b/src/main/kotlin/ui/NoteMenu.kt new file mode 100644 index 00000000..efc9fb28 --- /dev/null +++ b/src/main/kotlin/ui/NoteMenu.kt @@ -0,0 +1,45 @@ +package ui +import models.Archive +import models.Note + +class NoteMenu(private val notes: MutableList) : Menu( + title = "Меню заметок", + createItemText = "Создать заметку" +) { + override fun getItemsList(): List = notes + + override fun getItemName(item: Note): String = item.title + + override fun onItemSelected(item: Note) { + showNoteContent(item) + } + + override fun onCreateItem() { + while (true) { + val title = ConsoleReader.readLine("Введите название заметки: ") + + if (title.isBlank()) { + println("Название заметки не может быть пустым") + continue + } + + val content = ConsoleReader.readLine("Введите текст заметки: ") + + if (content.isBlank()) { + println("Текст заметки не может быть пустым") + continue + } + + notes.add(Note(title, content)) + println("Заметка \"$title\" создана") + break + } + } + + private fun showNoteContent(note: Note) { + println("\n=== ${note.title} ===") + println(note.content) + println("\nНажмите Enter для возврата...") + ConsoleReader.readLine("") + } +} \ No newline at end of file