From 1d0ac9024e1dd5ffe89d78cfe65ca3a6f55d8b5f Mon Sep 17 00:00:00 2001 From: Kiro Date: Tue, 10 Feb 2026 21:11:45 +0700 Subject: [PATCH] Sprint7 project2 --- src/main/kotlin/Main.kt | 10 ++++-- src/main/kotlin/Models.kt | 8 +++++ src/main/kotlin/NotesApp.kt | 69 +++++++++++++++++++++++++++++++++++++ src/main/kotlin/Storage.kt | 6 ++++ src/main/kotlin/UI.kt | 31 +++++++++++++++++ 5 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/Models.kt create mode 100644 src/main/kotlin/NotesApp.kt create mode 100644 src/main/kotlin/Storage.kt create mode 100644 src/main/kotlin/UI.kt diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..9ee3e5af 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,7 @@ -fun main(args: Array) { - println("Hello World!") -} \ No newline at end of file +import java.util.Scanner + +fun main() { + val scanner = Scanner(System.`in`) + val app = NotesApp(scanner) + app.start() +} diff --git a/src/main/kotlin/Models.kt b/src/main/kotlin/Models.kt new file mode 100644 index 00000000..84c99253 --- /dev/null +++ b/src/main/kotlin/Models.kt @@ -0,0 +1,8 @@ +class MenuItem(val title: String, val action: () -> Unit) + +data class Note(val title: String, val text: String) + +class Archive(val name: String) { + val notes: MutableList = mutableListOf() + fun getNote(index: Int): Note? = notes.getOrNull(index) +} diff --git a/src/main/kotlin/NotesApp.kt b/src/main/kotlin/NotesApp.kt new file mode 100644 index 00000000..78d87644 --- /dev/null +++ b/src/main/kotlin/NotesApp.kt @@ -0,0 +1,69 @@ +import java.util.Scanner + +class NotesApp(private val scanner: Scanner) { + private val storage = Storage() + private val ui = UI(scanner) + + fun start() { + var flag = true + while (flag) { + val archives = storage.getArchiveNames() + val menu = mutableListOf() + menu.add(MenuItem("Создать архив") { createArchive() }) + archives.forEachIndexed { idx, name -> + menu.add(MenuItem("${name}") { selectArchive(idx) }) + } + menu.add(MenuItem("Выход") { flag = false }) + ui.showMenu("Список архивов:", menu) + } + } + + private fun createArchive() { + ui.printLine("Введите название архива:") + val name = scanner.nextLine() + if (name.isBlank()) return + storage.addArchive(Archive(name)) + } + + private fun selectArchive(index: Int) { + val archive = storage.getArchive(index) ?: return + var flag = true + + while (flag) { + val menu = mutableListOf() + menu.add(MenuItem("Создать заметку") { createNote(archive) }) + archive.notes.forEachIndexed { idx, note -> + menu.add(MenuItem(note.title) { selectNote(archive, idx) }) + } + menu.add(MenuItem("Назад") { flag = false }) + ui.showMenu("Архив: ${archive.name}", menu) + } + } + + private fun createNote(archive: Archive) { + ui.printLine("Введите заголовок заметки:") + val title = scanner.nextLine() + if (title.isBlank()) return + ui.printLine("Введите текст заметки:") + val text = scanner.nextLine() + if (text.isBlank()) return + + archive.notes.add(Note(title, text)) + } + + private fun selectNote(archive: Archive, index: Int) { + val note = archive.getNote(index) ?: return + var flag = true + + while (flag) { + val menu = mutableListOf() + menu.add(MenuItem("Показать текст") { + ui.printLine("-----") + ui.printLine(note.text) + ui.printLine("-----") + }) + menu.add(MenuItem("Назад") { flag = false }) + ui.showMenu("Заметка: ${note.title}", menu) + } + } +} diff --git a/src/main/kotlin/Storage.kt b/src/main/kotlin/Storage.kt new file mode 100644 index 00000000..7ed5cf3a --- /dev/null +++ b/src/main/kotlin/Storage.kt @@ -0,0 +1,6 @@ +class Storage { + private val archives: MutableList = mutableListOf() + fun addArchive(a: Archive) { archives.add(a) } + fun getArchive(index: Int): Archive? = archives.getOrNull(index) + fun getArchiveNames(): List = archives.map { it.name } +} diff --git a/src/main/kotlin/UI.kt b/src/main/kotlin/UI.kt new file mode 100644 index 00000000..2a1043bd --- /dev/null +++ b/src/main/kotlin/UI.kt @@ -0,0 +1,31 @@ +import java.util.Scanner + +class UI(private val scanner: Scanner) { + fun showMenu(title: String, items: List) { + while (true) { + println() + println(title) + items.forEachIndexed { i, it -> println("${i}. ${it.title}") } + val input = readLineSafe() + val idx = input.toIntOrNull() + if (idx == null || idx !in items.indices) { + println("Некорректный ввод") + continue + } + items[idx].action() + break + } + } + + fun printLine(s: String) { + println(s) + } + + private fun readLineSafe(): String { + return try { + scanner.nextLine() + } catch (e: Exception) { + "" + } + } +}