Yeah, I kinda gave up, i will fix it later or something I recon
This commit is contained in:
@@ -2,11 +2,7 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"esdi/tui/internal/events"
|
||||
"esdi/tui/internal/models"
|
||||
"esdi/tui/internal/ui"
|
||||
)
|
||||
|
||||
type LayoutController struct {
|
||||
@@ -18,22 +14,17 @@ func NewLayoutController(bus *events.Bus) *LayoutController {
|
||||
EvBus: bus,
|
||||
}
|
||||
|
||||
bus.On(ui.CreateWindowEv{}, func(e any) {
|
||||
ev := e.(ui.CreateWindowEv)
|
||||
lc.createWindow(ev.Window)
|
||||
})
|
||||
|
||||
return lc
|
||||
}
|
||||
|
||||
func (lc *LayoutController) createWindow(win models.Window) {
|
||||
lc.EvBus.Emit(ui.LogEv{
|
||||
Log: fmt.Sprintf("x : %d\n"+
|
||||
"y : %d\n"+
|
||||
"width : %d\n"+
|
||||
"height: %d\n"+
|
||||
"title : %s\n", win.X, win.Y, win.Width, win.Height, win.Title),
|
||||
})
|
||||
|
||||
lc.EvBus.Emit(ui.WindowCreatedEv{Window: win})
|
||||
}
|
||||
// func (lc *LayoutController) createWindow(win models.Window) {
|
||||
// lc.EvBus.Emit(ui.LogEv{
|
||||
// Log: fmt.Sprintf("x : %d\n"+
|
||||
// "y : %d\n"+
|
||||
// "width : %d\n"+
|
||||
// "height: %d\n"+
|
||||
// "title : %s\n", win.X, win.Y, win.Width, win.Height, win.Title),
|
||||
// })
|
||||
//
|
||||
// lc.EvBus.Emit(ui.WindowCreatedEv{})
|
||||
// }
|
||||
|
||||
@@ -2,11 +2,14 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"esdi/cdashdisplay"
|
||||
helper "esdi/helpers"
|
||||
"esdi/peripheral"
|
||||
"esdi/tui/internal/dom"
|
||||
"esdi/tui/internal/events"
|
||||
"esdi/tui/internal/ui"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/rivo/tview"
|
||||
)
|
||||
@@ -17,46 +20,85 @@ type Ctrls struct {
|
||||
}
|
||||
|
||||
type MainController struct {
|
||||
Logger *slog.Logger
|
||||
App *tview.Application
|
||||
Dom *dom.DOM
|
||||
EvBus *events.Bus
|
||||
DevClerk *peripheral.PeripheralDeviceClerk
|
||||
CDash *cdashdisplay.CDashDisplay
|
||||
}
|
||||
|
||||
func NewMainController() *MainController {
|
||||
func NewMainController(logger *slog.Logger) *MainController {
|
||||
mc := &MainController{
|
||||
Logger: logger,
|
||||
App: tview.NewApplication(),
|
||||
Dom: dom.NewDOM(),
|
||||
EvBus: events.NewBus(),
|
||||
DevClerk: peripheral.NewPeripheralDeviceClerk(),
|
||||
CDash: nil,
|
||||
}
|
||||
|
||||
mc.EvBus.On(ui.RedrawEv{}, func(e any) {
|
||||
mc.App.QueueUpdateDraw(func() {})
|
||||
go func() {
|
||||
mc.App.QueueUpdateDraw(func() {})
|
||||
}()
|
||||
})
|
||||
|
||||
mc.EvBus.On(ui.ChangeFocusEv{}, func(e any) {
|
||||
mc.App.SetFocus(e.(ui.ChangeFocusEv).Target)
|
||||
go func() {
|
||||
mc.App.SetFocus(e.(ui.ChangeFocusEv).Target)
|
||||
}()
|
||||
})
|
||||
|
||||
mc.EvBus.On(ui.LogEv{}, func(e any) {
|
||||
mc.EvBus.Emit(ui.PrintLogEv{Log: e.(ui.LogEv).Log})
|
||||
go func() {
|
||||
mc.EvBus.Emit(ui.PrintLogEv{Log: e.(ui.LogEv).Log})
|
||||
}()
|
||||
})
|
||||
|
||||
mc.EvBus.On(ui.CreateWindowEv{}, func(e any) {
|
||||
go func() {
|
||||
win := e.(ui.CreateWindowEv).Window
|
||||
|
||||
uiWindow := cdashdisplay.UIWindow{
|
||||
Dims: cdashdisplay.UIDimensions{
|
||||
X0: win.X,
|
||||
Y0: win.Y,
|
||||
Width: win.Width,
|
||||
Height: win.Height,
|
||||
},
|
||||
Decor: cdashdisplay.DefaultDecorations,
|
||||
Title: helper.B32(win.Title),
|
||||
}
|
||||
|
||||
wID, err := mc.CDash.CreateWindow(uiWindow)
|
||||
if err != nil {
|
||||
mc.EvBus.Emit(ui.PrintLogEv{Log: "failed to create window\n"})
|
||||
return
|
||||
}
|
||||
|
||||
mc.EvBus.Emit(ui.WindowCreatedEv{ID: wID, Title: win.Title})
|
||||
mc.EvBus.Emit(ui.PrintLogEv{Log: "Window created!\n"})
|
||||
}()
|
||||
})
|
||||
|
||||
mc.EvBus.On(ui.DestroyWindowEv{}, func(e any) {
|
||||
mc.Logger.Info(fmt.Sprintf("Called in to destroy win: %d", e.(ui.DestroyWindowEv).ID))
|
||||
mc.CDash.DestroyWindow(e.(ui.DestroyWindowEv).ID)
|
||||
})
|
||||
|
||||
mc.EvBus.On(ui.FindCDashDisplay{}, func(e any) {
|
||||
err := mc.DevClerk.FindDevices()
|
||||
if err != nil {
|
||||
mc.EvBus.Emit(ui.LogEv{Log: "Error finding devices: " + err.Error() + "\n"})
|
||||
}
|
||||
go func() {
|
||||
mc.Logger.Info("Looking for CDashDisplay")
|
||||
cdashdisplay.SetLogger(mc.Logger.With("[device]", "cdashdisplay"))
|
||||
|
||||
if len(mc.DevClerk.Devices) == 0 {
|
||||
mc.EvBus.Emit(ui.LogEv{Log: " there are no devices\n"})
|
||||
}
|
||||
display, err := cdashdisplay.NewCDashDisplay()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, d := range mc.DevClerk.Devices {
|
||||
msg := fmt.Sprintf(" [%2d] %s\n", d.ID, d.Name)
|
||||
mc.EvBus.Emit(ui.LogEv{Log: msg})
|
||||
}
|
||||
mc.CDash = display
|
||||
}()
|
||||
})
|
||||
|
||||
return mc
|
||||
|
||||
@@ -5,15 +5,16 @@ import (
|
||||
"esdi/tui/internal/controllers"
|
||||
"esdi/tui/internal/views"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/gdamore/tcell/v2"
|
||||
)
|
||||
|
||||
func Start() error {
|
||||
func Start(logger *slog.Logger) error {
|
||||
// The app starts running here!
|
||||
//
|
||||
// Set the event capture for the global app itself here
|
||||
mc := controllers.NewMainController()
|
||||
mc := controllers.NewMainController(logger.With("[ctrl]", "main"))
|
||||
|
||||
mc.App.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
||||
if event.Key() == tcell.KeyCtrlC || event.Rune() == 'q' {
|
||||
|
||||
@@ -30,10 +30,23 @@ type CreateWindowEv struct {
|
||||
Window models.Window
|
||||
}
|
||||
|
||||
type WindowCreatedEv struct {
|
||||
type DestroyWindowEv struct {
|
||||
ID int16
|
||||
}
|
||||
|
||||
type LayoutRegisterWindowEv struct {
|
||||
Window models.Window
|
||||
}
|
||||
|
||||
type WindowCreatedEv struct {
|
||||
ID int16
|
||||
Title string
|
||||
}
|
||||
|
||||
type WindowDestroyedEv struct {
|
||||
ID int16
|
||||
}
|
||||
|
||||
type ErrorCreateWindowEv struct {
|
||||
Error error
|
||||
}
|
||||
|
||||
@@ -18,6 +18,27 @@ const (
|
||||
layoutToolActionPagesID = "layout-tool-action-pages"
|
||||
)
|
||||
|
||||
func FindNodeByReference(
|
||||
node *tview.TreeNode,
|
||||
want any,
|
||||
) *tview.TreeNode {
|
||||
if node == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if node.GetReference() == want {
|
||||
return node
|
||||
}
|
||||
|
||||
for _, child := range node.GetChildren() {
|
||||
if found := FindNodeByReference(child, want); found != nil {
|
||||
return found
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func BindWindowEvents(
|
||||
bus *events.Bus,
|
||||
doc *dom.DOM,
|
||||
@@ -38,9 +59,24 @@ func BindWindowEvents(
|
||||
return
|
||||
}
|
||||
|
||||
newWindow := tview.NewTreeNode(e.(ui.WindowCreatedEv).Window.Title)
|
||||
newWindow := tview.NewTreeNode(e.(ui.WindowCreatedEv).Title).
|
||||
SetReference(e.(ui.WindowCreatedEv).ID)
|
||||
root.AddChild(newWindow)
|
||||
})
|
||||
|
||||
bus.On(ui.WindowDestroyedEv{}, func(e any) {
|
||||
root := tree.GetRoot()
|
||||
if root == nil {
|
||||
bus.Emit(ui.LogEv{Log: "unable to get current tree node"})
|
||||
}
|
||||
|
||||
node := FindNodeByReference(root, e.(ui.WindowDestroyedEv).ID)
|
||||
if node != nil {
|
||||
root.RemoveChild(node)
|
||||
}
|
||||
// NODE: add a log here in case it fails so we know whats going on
|
||||
})
|
||||
|
||||
bus.On(ui.ErrorCreateWindowEv{}, func(e any) {
|
||||
bus.Emit(ui.LogEv{
|
||||
Log: fmt.Sprintf(
|
||||
@@ -68,19 +104,21 @@ func layoutToolTreeViewEvents(bus *events.Bus, doc *dom.DOM,
|
||||
case 'x':
|
||||
// Delete selected window
|
||||
bus.Emit(ui.LogEv{Log: "calling delete window\n"})
|
||||
|
||||
curNode := tree.GetCurrentNode()
|
||||
if curNode == nil {
|
||||
bus.Emit(ui.LogEv{Log: "unable to get current tree node"})
|
||||
break
|
||||
}
|
||||
|
||||
root := tree.GetRoot()
|
||||
if root == nil {
|
||||
bus.Emit(ui.LogEv{Log: "unable to get current tree node"})
|
||||
ref := curNode.GetReference()
|
||||
wID, ok := ref.(int16)
|
||||
if !ok {
|
||||
// Whatever, do something better here
|
||||
break
|
||||
}
|
||||
|
||||
root.RemoveChild(curNode)
|
||||
bus.Emit(ui.DestroyWindowEv{ID: wID})
|
||||
case 'm':
|
||||
// Go into move mode
|
||||
case 'e':
|
||||
|
||||
Reference in New Issue
Block a user