fully commit to event-driven arch
This commit is contained in:
parent
4f4758f7fe
commit
90a9facc44
89
cmd/manage/events.go
Normal file
89
cmd/manage/events.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.yetaga.in/alazyreader/library/book"
|
||||||
|
"github.com/gdamore/tcell"
|
||||||
|
)
|
||||||
|
|
||||||
|
// save change to book
|
||||||
|
type EventBookUpdate struct {
|
||||||
|
tcell.EventTime
|
||||||
|
book *book.Book
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventBookUpdate(b *book.Book) *EventBookUpdate {
|
||||||
|
e := &EventBookUpdate{book: b}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EventBookUpdate) Book() *book.Book {
|
||||||
|
return e.book
|
||||||
|
}
|
||||||
|
|
||||||
|
// open new book in display
|
||||||
|
type EventLoadBook struct {
|
||||||
|
tcell.EventTime
|
||||||
|
ID int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventLoadBook(id int) *EventLoadBook {
|
||||||
|
e := &EventLoadBook{ID: id}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// open new book in display
|
||||||
|
type EventEnterBook struct {
|
||||||
|
tcell.EventTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventEnterBook() *EventEnterBook {
|
||||||
|
e := &EventEnterBook{}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// switch back to menu control
|
||||||
|
type EventExitBook struct {
|
||||||
|
tcell.EventTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventExitBook() *EventExitBook {
|
||||||
|
e := &EventExitBook{}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// open import window
|
||||||
|
type EventOpenImport struct {
|
||||||
|
tcell.EventTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventOpenImport() *EventOpenImport {
|
||||||
|
e := &EventOpenImport{}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// close import window
|
||||||
|
type EventCloseImport struct {
|
||||||
|
tcell.EventTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventCloseImport() *EventCloseImport {
|
||||||
|
e := &EventCloseImport{}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// quit
|
||||||
|
type EventQuit struct {
|
||||||
|
tcell.EventTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventQuit() *EventQuit {
|
||||||
|
e := &EventQuit{}
|
||||||
|
e.SetEventNow()
|
||||||
|
return e
|
||||||
|
}
|
@ -46,37 +46,13 @@ func (s *State) Set(key string, value interface{}) {
|
|||||||
s.stateMap[key] = value
|
s.stateMap[key] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UI states
|
||||||
const (
|
const (
|
||||||
IN_MENU = iota
|
IN_MENU = iota
|
||||||
IN_BOOK
|
IN_BOOK
|
||||||
|
IN_IMPORT
|
||||||
)
|
)
|
||||||
|
|
||||||
type EventBookUpdate struct {
|
|
||||||
tcell.EventTime
|
|
||||||
book *book.Book
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewEventBookUpdate(b *book.Book) *EventBookUpdate {
|
|
||||||
e := &EventBookUpdate{book: b}
|
|
||||||
e.SetEventNow()
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *EventBookUpdate) Book() *book.Book {
|
|
||||||
return e.book
|
|
||||||
}
|
|
||||||
|
|
||||||
type EventLoadBook struct {
|
|
||||||
tcell.EventTime
|
|
||||||
ID int
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewEventLoadBook(id int) *EventLoadBook {
|
|
||||||
e := &EventLoadBook{ID: id}
|
|
||||||
e.SetEventNow()
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var c config.Config
|
var c config.Config
|
||||||
err := envconfig.Process("library", &c)
|
err := envconfig.Process("library", &c)
|
||||||
@ -131,6 +107,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// book list and options menu (left column)
|
||||||
l := ui.NewList(Titles(state.Get("library").([]book.Book)), 0)
|
l := ui.NewList(Titles(state.Get("library").([]book.Book)), 0)
|
||||||
menu := ui.NewBox(
|
menu := ui.NewBox(
|
||||||
"library",
|
"library",
|
||||||
@ -145,6 +122,8 @@ func main() {
|
|||||||
book := ui.NewBookDetails(&book.Book{
|
book := ui.NewBookDetails(&book.Book{
|
||||||
Title: "test title",
|
Title: "test title",
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// book display (right column)
|
||||||
activeBook := ui.NewBox(
|
activeBook := ui.NewBox(
|
||||||
"book",
|
"book",
|
||||||
nil,
|
nil,
|
||||||
@ -156,6 +135,10 @@ func main() {
|
|||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// pop-up
|
||||||
|
popup := ui.NewBox("import", nil, nil, ui.StyleActive, false)
|
||||||
|
popup.SetVisible(false)
|
||||||
|
|
||||||
container := ui.NewContainer(
|
container := ui.NewContainer(
|
||||||
ui.Contents{
|
ui.Contents{
|
||||||
{Container: menu, Offsets: ui.Offsets{Percent: 1}},
|
{Container: menu, Offsets: ui.Offsets{Percent: 1}},
|
||||||
@ -193,42 +176,62 @@ func main() {
|
|||||||
l.SetSelected(l.Selected() + 1)
|
l.SetSelected(l.Selected() + 1)
|
||||||
screen.PostEvent(NewEventLoadBook(l.SelectedID()))
|
screen.PostEvent(NewEventLoadBook(l.SelectedID()))
|
||||||
}
|
}
|
||||||
if v.Rune() == 'q' {
|
|
||||||
screen.Fini()
|
|
||||||
fmt.Printf("Thank you for playing Wing Commander!\n\n")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if v.Key() == tcell.KeyEnter {
|
if v.Key() == tcell.KeyEnter {
|
||||||
activeBook.SetStyle(ui.StyleActive)
|
screen.PostEvent(NewEventEnterBook())
|
||||||
menu.SetStyle(ui.StyleInactive)
|
}
|
||||||
state.Set("ui_state", IN_BOOK)
|
if v.Rune() == 'i' {
|
||||||
|
screen.PostEvent(NewEventOpenImport())
|
||||||
|
}
|
||||||
|
if v.Rune() == 'q' {
|
||||||
|
screen.PostEvent(NewEventQuit())
|
||||||
}
|
}
|
||||||
} else if curr == IN_BOOK {
|
} else if curr == IN_BOOK {
|
||||||
if v.Key() == tcell.KeyEsc {
|
if v.Key() == tcell.KeyEsc {
|
||||||
activeBook.SetStyle(ui.StyleInactive)
|
screen.PostEvent(NewEventExitBook())
|
||||||
menu.SetStyle(ui.StyleActive)
|
}
|
||||||
state.Set("ui_state", IN_MENU)
|
} else if curr == IN_IMPORT {
|
||||||
|
if v.Key() == tcell.KeyEsc {
|
||||||
|
screen.PostEvent(NewEventCloseImport())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
screen.Clear()
|
|
||||||
container.Draw(screen)
|
|
||||||
case *tcell.EventResize: // screen redraw
|
case *tcell.EventResize: // screen redraw
|
||||||
w, h := screen.Size()
|
w, h := screen.Size()
|
||||||
container.SetSize(0, 0, h, w)
|
container.SetSize(0, 0, h, w)
|
||||||
screen.Clear()
|
|
||||||
container.Draw(screen)
|
|
||||||
case *EventBookUpdate:
|
case *EventBookUpdate:
|
||||||
// TK
|
// TK
|
||||||
|
case *EventEnterBook:
|
||||||
|
activeBook.SetStyle(ui.StyleActive)
|
||||||
|
menu.SetStyle(ui.StyleInactive)
|
||||||
|
state.Set("ui_state", IN_BOOK)
|
||||||
|
case *EventExitBook:
|
||||||
|
state.Set("ui_state", IN_MENU)
|
||||||
|
activeBook.SetStyle(ui.StyleInactive)
|
||||||
|
menu.SetStyle(ui.StyleActive)
|
||||||
case *EventLoadBook:
|
case *EventLoadBook:
|
||||||
book.SetBook(GetBookByID(v.ID, books))
|
book.SetBook(GetBookByID(v.ID, books))
|
||||||
screen.Clear()
|
case *EventOpenImport:
|
||||||
container.Draw(screen)
|
state.Set("ui_state", IN_IMPORT)
|
||||||
|
menu.SetStyle(ui.StyleInactive)
|
||||||
|
popup.SetVisible(true)
|
||||||
|
popup.SetSize(6, 3, 10, 80)
|
||||||
|
case *EventCloseImport:
|
||||||
|
state.Set("ui_state", IN_MENU)
|
||||||
|
menu.SetStyle(ui.StyleActive)
|
||||||
|
popup.SetVisible(false)
|
||||||
|
case *EventQuit:
|
||||||
|
screen.Fini()
|
||||||
|
fmt.Printf("Thank you for playing Wing Commander!\n\n")
|
||||||
|
return
|
||||||
case *tcell.EventInterrupt:
|
case *tcell.EventInterrupt:
|
||||||
case *tcell.EventMouse:
|
case *tcell.EventMouse:
|
||||||
case *tcell.EventTime:
|
case *tcell.EventTime:
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
screen.Show() // repaint
|
// repaint
|
||||||
|
screen.Clear()
|
||||||
|
container.Draw(screen)
|
||||||
|
popup.Draw(screen)
|
||||||
|
screen.Show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user