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
10 changes: 7 additions & 3 deletions src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
fun main(args: Array<String>) {
println("Hello World!")
}
import java.util.Scanner

fun main() {
val scanner = Scanner(System.`in`)
val app = NotesApp(scanner)
app.start()
}
8 changes: 8 additions & 0 deletions src/main/kotlin/Models.kt
Original file line number Diff line number Diff line change
@@ -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<Note> = mutableListOf()
fun getNote(index: Int): Note? = notes.getOrNull(index)
}
69 changes: 69 additions & 0 deletions src/main/kotlin/NotesApp.kt
Original file line number Diff line number Diff line change
@@ -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<MenuItem>()
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<MenuItem>()
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<MenuItem>()
menu.add(MenuItem("Показать текст") {
ui.printLine("-----")
ui.printLine(note.text)
ui.printLine("-----")
})
menu.add(MenuItem("Назад") { flag = false })
ui.showMenu("Заметка: ${note.title}", menu)
}
}
}
6 changes: 6 additions & 0 deletions src/main/kotlin/Storage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Storage {
private val archives: MutableList<Archive> = mutableListOf()
fun addArchive(a: Archive) { archives.add(a) }
fun getArchive(index: Int): Archive? = archives.getOrNull(index)
fun getArchiveNames(): List<String> = archives.map { it.name }
}
31 changes: 31 additions & 0 deletions src/main/kotlin/UI.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import java.util.Scanner

class UI(private val scanner: Scanner) {
fun showMenu(title: String, items: List<MenuItem>) {
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) {
""
}
}
}