diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 00000000..bb3c8f78 --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,560 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9c8e7400..a6e1098c 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/Archive.kt b/src/main/kotlin/Archive.kt new file mode 100644 index 00000000..cfba849e --- /dev/null +++ b/src/main/kotlin/Archive.kt @@ -0,0 +1,15 @@ +class Archive(val name: String) { + val notes = mutableListOf() + + override fun toString() = name + + fun createNote() { + val title = InputHandler.readValidInput("Введите заголовок заметки:") { it.isNotEmpty() } + val content = InputHandler.readValidInput("Введите текст заметки:") { it.isNotEmpty() } + notes.add(Note(title, content)) + } +} + +class Note(val title: String, val content: String) { + override fun toString() = title +} \ 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..b136bb79 --- /dev/null +++ b/src/main/kotlin/ArchiveMenu.kt @@ -0,0 +1,11 @@ +class ArchiveMenu(private val archive: Archive) : Menu("Список заметок в архиве '${archive.name}'") { + override fun getItems() = archive.notes + override fun createItem() = archive.createNote() + + override fun handleItemSelected(item: Note) { + println("\nЗаметка: ${item.title}") + println("Содержание:\n${item.content}") + println("\nНажмите Enter чтобы вернуться...") + readlnOrNull() + } +} \ No newline at end of file diff --git a/src/main/kotlin/InputHandler.kt b/src/main/kotlin/InputHandler.kt new file mode 100644 index 00000000..481e1788 --- /dev/null +++ b/src/main/kotlin/InputHandler.kt @@ -0,0 +1,10 @@ +object InputHandler { + fun readValidInput(prompt: String, validator: (String) -> Boolean): String { + while (true) { + println(prompt) + val input = readlnOrNull()?.trim() ?: "" + if (validator(input)) return input + println("Некорректный ввод, попробуйте снова") + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..c6f7eaaa 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,3 @@ -fun main(args: Array) { - println("Hello World!") +fun main() { + NoteApp().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..c31b1a2d --- /dev/null +++ b/src/main/kotlin/Menu.kt @@ -0,0 +1,32 @@ +abstract class Menu(private val title: String) { + abstract fun getItems(): List + abstract fun createItem() + abstract fun handleItemSelected(item: T) + + fun show() { + while (true) { + println("\n$title:") + println("0. Создать") + getItems().forEachIndexed { index, item -> println("${index + 1}. ${item}") } + println("${getItems().size + 1}. Выход") + + when (val choice = readChoice(getItems().size + 1)) { + 0 -> createItem() + getItems().size + 1 -> return + else -> handleItemSelected(getItems()[choice - 1]) + } + } + } + + private fun readChoice(max: Int): Int { + while (true) { + print("Выберите пункт: ") + val input = readlnOrNull()?.toIntOrNull() + when { + input == null -> println("Введите число!") + input in 0..max -> return input + else -> println("Некорректный выбор, попробуйте снова") + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/NoteApp.kt b/src/main/kotlin/NoteApp.kt new file mode 100644 index 00000000..a9739e5e --- /dev/null +++ b/src/main/kotlin/NoteApp.kt @@ -0,0 +1,34 @@ +class NoteApp { + private val archives = mutableListOf() + + fun start() { + val mainMenu = object : Menu("Список архивов") { + override fun getItems() = archives + override fun createItem() { + createArchive() + } + + override fun handleItemSelected(item: Archive) { + val notesMenu = object : Menu("Список заметок в архиве '${item.name}'") { + override fun getItems() = item.notes + override fun createItem() { + item.createNote() + } + override fun handleItemSelected(note: Note) { + println("\nЗаметка: ${note.title}") + println("Содержание:\n${note.content}") + println("\nНажмите Enter чтобы вернуться...") + readlnOrNull() + } + } + notesMenu.show() + } + } + mainMenu.show() + } + + private fun createArchive() { + val name = InputHandler.readValidInput("Введите название архива:") { it.isNotEmpty() } + archives.add(Archive(name)) + } +} \ No newline at end of file