Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
fun main(args: Array<String>) {
println("Hello World!")
import models.Archive
import ui.ArchiveMenu
fun main() {
println("=== Приложение \"Заметки\" ===")

val archives = mutableListOf<Archive>()
val archiveMenu = ArchiveMenu(archives)

archiveMenu.show()

println("До свидания!")
}
6 changes: 6 additions & 0 deletions src/main/kotlin/models/Archive.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package models

data class Archive(
val name: String,
val notes: MutableList<Note> = mutableListOf()
)
7 changes: 7 additions & 0 deletions src/main/kotlin/models/Note.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package models
import models.Note

data class Note(
val title: String,
val content: String
)
36 changes: 36 additions & 0 deletions src/main/kotlin/ui/ArchiveMenu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ui
import models.Archive

class ArchiveMenu(private val archives: MutableList<Archive>) : Menu<Archive>(
title = "Меню архивов",
createItemText = "Создать архив"
) {
override fun getItemsList(): List<Archive> = 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
}
}
}
21 changes: 21 additions & 0 deletions src/main/kotlin/ui/ConsoleReader.kt
Original file line number Diff line number Diff line change
@@ -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
}
}
}
81 changes: 81 additions & 0 deletions src/main/kotlin/ui/Menu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package ui

abstract class Menu<T>(
private val title: String,
private val createItemText: String = "Создать",
private val exitText: String = "Выход"
) {
private val items = mutableListOf<Pair<String, () -> Unit>>()

abstract fun getItemsList(): List<T>
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
}
}
45 changes: 45 additions & 0 deletions src/main/kotlin/ui/NoteMenu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package ui
import models.Archive
import models.Note

class NoteMenu(private val notes: MutableList<Note>) : Menu<Note>(
title = "Меню заметок",
createItemText = "Создать заметку"
) {
override fun getItemsList(): List<Note> = 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("")
}
}