123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package ui
- import (
- "mimicry/pub"
- "mimicry/ansi"
- "mimicry/feed"
- "fmt"
- "log"
- )
- type State struct {
-
- feed *feed.Feed
- index int
- context int
- page pub.Container
- basepoint uint
- }
- func (s *State) View(width int, height uint) string {
-
- var top, center, bottom string
-
- for i := s.index - s.context; i <= s.index + s.context; i++ {
- if !s.feed.Contains(i) {
- continue
- }
- var serialized string
- if i == 0 {
- serialized = s.feed.Get(i).String(width - 4)
- log.Printf("%d\n", len(serialized))
- } else if i > 0 {
- serialized = "╰ " + ansi.Indent(s.feed.Get(i).Preview(width - 4), " ", false)
- } else {
- serialized = s.feed.Get(i).Preview(width - 4)
- }
- if i == s.index {
- center = ansi.Indent(serialized, "┃ ", true)
- } else if i < s.index {
- if top != "" { top += "\n" }
- top += ansi.Indent(serialized + "\n│", " ", true)
- } else {
- if bottom != "" { bottom = "\n" + bottom }
- bottom = ansi.Indent("│\n" + serialized, " ", true) + bottom
- }
- }
- log.Printf("%s\n", center)
- return ansi.CenterVertically(top, center, bottom, height)
- }
- func (s *State) Update(input byte) {
-
- switch input {
- case 'k':
- mayNeedLoading := s.index - 1 - s.context
- if !s.feed.Contains(mayNeedLoading) {
- if s.feed.Contains(mayNeedLoading - 1) {
- s.feed.Prepend(s.feed.Get(mayNeedLoading - 1).Parents(1))
- }
- }
- if s.feed.Contains(s.index - 1) {
- s.index -= 1
- }
- case 'j':
- mayNeedLoading := s.index + 1 + s.context
- if !s.feed.Contains(mayNeedLoading) {
- if s.page != nil {
- var children []pub.Tangible
- children, s.page, s.basepoint = s.page.Harvest(1, s.basepoint)
- s.feed.Append(children)
- }
- }
- if s.feed.Contains(s.index + 1) {
- s.index += 1
- }
- }
-
-
- }
- func (s *State) SwitchTo(item pub.Any) {
- switch narrowed := item.(type) {
- case pub.Tangible:
- s.feed = feed.Create(narrowed)
- s.feed.Prepend(narrowed.Parents(uint(s.context)))
- var children []pub.Tangible
- children, s.page, s.basepoint = narrowed.Children(uint(s.context))
- s.feed.Append(children)
- case pub.Container:
- var children []pub.Tangible
- children, s.page, s.basepoint = narrowed.Harvest(uint(s.context), 0)
- s.feed = feed.CreateAndAppend(children)
- default:
- panic(fmt.Sprintf("unrecognized non-Tangible non-Container: %T", item))
- }
- }
- func Start(input string) *State {
- item := pub.FetchUserInput(input)
- log.Printf("%v\n", item)
- s := &State{
- feed: &feed.Feed{},
- index: 0,
- context: 1,
- }
- s.SwitchTo(item)
- return s
- }
|