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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,6 @@ bin/
.vscode/

### Mac OS ###
.DS_Store
.DS_Store
.idea/caches/
out/
23 changes: 23 additions & 0 deletions src/main/kotlin/ArchiveListScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class ArchiveListScreen : Screen {
override fun show(repo: Repository, input: InputReader): NavCommand {
val items = mutableListOf<MenuItem>()
items.add(
MenuItem("Создать архив") {
NavCommand.Push(CreateArchiveScreen())
}
)
repo.archives.forEach { archive ->
items.add(
MenuItem(archive.name) {
NavCommand.Push(NoteListScreen(archive))
}
)
}
items.add(
MenuItem("Выход") {
NavCommand.Exit
}
)
return Menu("Список архивов:", items, input).run()
}
}
19 changes: 19 additions & 0 deletions src/main/kotlin/CreateArchiveScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class CreateArchiveScreen : Screen {
override fun show(repo: Repository, input: InputReader): NavCommand {
println("Создание архива")
println("Введите название архива (0 — назад)")

while (true) {
val name = input.readLine("Название: ").trim()
if (name == "0") return NavCommand.Pop
if (name.isBlank()) {
println("Название не может быть пустым. Попробуйте ещё раз.\n")
continue
}
repo.archives.add(Archive(name))
println("Архив \"$name\" создан.\n")
return NavCommand.Pop
}

}
}
32 changes: 32 additions & 0 deletions src/main/kotlin/CreateNoteScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
class CreateNoteScreen(private val archive: Archive):Screen{
override fun show(repo:Repository,input:InputReader):NavCommand{
println("Создание заметки (архив: ${archive.name})")
println("Введите название заметки (0 — назад)")
val title: String
while (true){
val t = input.readLine("Название: ").trim()
if (t=="0")return NavCommand.Pop
if(t.isBlank()){
println("Название не может быть пустым. Попробуйте ещё раз.\n")
continue
}
title = t
break
}
println("\nВведите текст заметки (0 — назад)")
val content:String
while(true){
val c = input.readLine("Текст: ")
if (c.trim()=="0") return NavCommand.Pop
if (c.isBlank()){
println("Текст не может быть пустым. Попробуйте ещё раз.\n")
continue
}
content = c
break
}
archive.notes.add(Note(title,content))
println("\nЗаметка \"$title\" создана.\n")
return NavCommand.Pop
}
}
10 changes: 10 additions & 0 deletions src/main/kotlin/InputReader.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import java.util.Scanner

class InputReader {
private val scanner = Scanner(System.`in`)
;
fun readLine(prompt: String? = null): String {
if (prompt != null) print(prompt)
return scanner.nextLine()
}
}
8 changes: 6 additions & 2 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!")
fun main() {
val repo = Repository()
val input = InputReader()
val navigator = Navigator(repo,input)

navigator.start(ArchiveListScreen())
}
34 changes: 34 additions & 0 deletions src/main/kotlin/Menu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
data class MenuItem(
val title: String,
val action: () -> NavCommand
)

class Menu(
private val header: String,
private val items: List<MenuItem>,
private val input: InputReader
) {
fun run(): NavCommand {
while (true) {
if (header.isNotBlank()) println(header)
items.forEachIndexed { index, item ->
println("$index.${item.title}")
}
val raw = input.readLine("Выберите пункт:").trim()
val choice = raw.toIntOrNull()

if (choice == null) {
println("Нужно ввести цифру. Попробуйте еще раз.\n")
continue
}
if (choice !in items.indices) {
println("Нет пункта с номером $choice. Попробуйте ещё раз.\n")
continue
}

println()
return items[choice].action()

}
}
}
9 changes: 9 additions & 0 deletions src/main/kotlin/Models.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class Note(
val title: String,
val content: String
)

class Archive(
val name: String,
val notes: MutableList<Note> = mutableListOf()
)
36 changes: 36 additions & 0 deletions src/main/kotlin/Navigation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
interface Screen {
fun show(repo: Repository, input: InputReader): NavCommand
}

sealed class NavCommand {
data class Push(val screen: Screen) : NavCommand()
object Pop : NavCommand()
object Exit : NavCommand()
object Stay : NavCommand()
}

class Navigator(
private val repo: Repository,
private val input: InputReader
) {
private val stack: MutableList<Screen> = mutableListOf()

fun start(root: Screen) {
stack.add(root)

while (stack.isNotEmpty()) {
val current = stack.last()

when (val cmd = current.show(repo, input)) {
is NavCommand.Push -> stack.add(cmd.screen)

NavCommand.Pop -> {
if (stack.size > 1) stack.removeAt(stack.lastIndex) else return
}

NavCommand.Exit -> return
NavCommand.Stay -> { }
}
}
}
}
27 changes: 27 additions & 0 deletions src/main/kotlin/NoteListScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class NoteListScreen(private val archive: Archive) : Screen {
override fun show(repo: Repository, input: InputReader): NavCommand {
val items = mutableListOf<MenuItem>()

items.add(
MenuItem("Создать заметку") {
NavCommand.Push(CreateNoteScreen(archive))
}
)

archive.notes.forEach { note ->
items.add(
MenuItem(note.title) {
NavCommand.Push(NoteViewScreen(note))
}
)
}

items.add(
MenuItem("Назад") {
NavCommand.Pop
}
)

return Menu("Архив: ${archive.name}\nСписок заметок:", items, input).run()
}
}
14 changes: 14 additions & 0 deletions src/main/kotlin/NoteViewScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class NoteViewScreen(private val note: Note) : Screen {
override fun show(repo: Repository, input: InputReader): NavCommand {
println("Заметка: ${note.title}")
println("------------")
println(note.content)
println("------------\n")

val items = listOf(
MenuItem("Назад") { NavCommand.Pop }
)

return Menu("", items, input).run()
}
}
3 changes: 3 additions & 0 deletions src/main/kotlin/Repository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Repository(
val archives: MutableList<Archive> = mutableListOf()
)