diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 00000000..7d60e7b8 --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,1186 @@ + + + + + + \ No newline at end of file diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 00000000..c61ea334 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9c8e7400..977f64f9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,5 @@ - - + \ 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..98f15dcf --- /dev/null +++ b/src/main/kotlin/ArchiveMenu.kt @@ -0,0 +1,17 @@ +class ArchiveMenu : Menu("Список архивов") { + private val archives = mutableListOf() + + override fun show() { + runMenu( + items = archives, + getItemName = { it.name }, + onSelect = { archive -> NoteListMenu(archive).show() }, + onCreate = { + val name = readNonEmptyString("Введите название архива:") + archives.add(Archive(name)) + println("Архив '$name' создан.") + }, + exitText = "Выход из программы" + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..426e706c 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,6 @@ fun main(args: Array) { - println("Hello World!") -} \ No newline at end of file + // println("Hello World!") + //println("добро пожаловать") + val mainMenu = ArchiveMenu() + mainMenu.show() +} diff --git a/src/main/kotlin/Menu.kt b/src/main/kotlin/Menu.kt new file mode 100644 index 00000000..c7a2b762 --- /dev/null +++ b/src/main/kotlin/Menu.kt @@ -0,0 +1,46 @@ +import java.util.Scanner + +abstract class Menu(val title: String) { + private val scanner = Scanner(System.`in`) + + // Метод, который каждый экран реализует по-своему + abstract fun show() + + // Универсальный метод отрисовки меню и обработки выбора + fun runMenu( + items: List, + getItemName: (T) -> String, + onSelect: (T) -> Unit, + onCreate: () -> Unit, + exitText: String + ) { + while (true) { + println("\n--- $title ---") + println("0. Создать") + items.forEachIndexed { index, item -> + println("${index + 1}. ${getItemName(item)}") + } + println("${items.size + 1}. $exitText") + + val input = scanner.nextLine() + val choice = input.toIntOrNull() + + when { + choice == 0 -> onCreate() + choice == items.size + 1 -> return // Выход из текущего меню + choice != null && choice in 1..items.size -> onSelect(items[choice - 1]) + else -> println("Ошибка: введите число из списка.") + } + } + } + + // Универсальный метод для безопасного ввода текста + fun readNonEmptyString(prompt: String): String { + while (true) { + println(prompt) + val input = scanner.nextLine().trim() + if (input.isNotEmpty()) 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..8f718ff1 --- /dev/null +++ b/src/main/kotlin/Models.kt @@ -0,0 +1,2 @@ +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/NoteContentMenu.kt b/src/main/kotlin/NoteContentMenu.kt new file mode 100644 index 00000000..2826ea30 --- /dev/null +++ b/src/main/kotlin/NoteContentMenu.kt @@ -0,0 +1,13 @@ +import java.util.Scanner + +class NoteContentMenu(private val note: Note) : Menu("Заметка: ${note.title}") { + override fun show() { + println("\nТекст заметки:\n${note.content}") + // Просто ждем ввода, чтобы пользователь успел прочитать + println("\n0. Назад") + while (true) { + if (Scanner(System.`in`).nextLine() == "0") break + else println("Введите 0 для возврата.") + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/NoteListMenu.kt b/src/main/kotlin/NoteListMenu.kt new file mode 100644 index 00000000..d9bb791b --- /dev/null +++ b/src/main/kotlin/NoteListMenu.kt @@ -0,0 +1,16 @@ +class NoteListMenu(private val archive: Archive) : Menu("Архив: ${archive.name}") { + override fun show() { + runMenu( + items = archive.notes, + getItemName = { it.title }, + onSelect = { note -> NoteContentMenu(note).show() }, + onCreate = { + val title = readNonEmptyString("Введите название заметки:") + val content = readNonEmptyString("Введите текст заметки:") + archive.notes.add(Note(title, content)) + println("Заметка '$title' добавлена.") + }, + exitText = "Назад в меню архивов" + ) + } +} \ No newline at end of file