moving cdashdisplay data handling to its backend

This commit is contained in:
2026-03-06 18:22:54 +00:00
parent de3e9784a0
commit d26dcae65f
6 changed files with 72 additions and 87 deletions
+26 -33
View File
@@ -3,7 +3,6 @@ package controllers
import (
"esdi/cdashdisplay"
helper "esdi/helpers"
"esdi/tui/internal/models"
"esdi/tui/internal/services"
"esdi/tui/internal/views"
"fmt"
@@ -82,10 +81,10 @@ func (lc *LayoutController) registerHooks() {
return
}
nodeWinRef := nodeRef.(*models.UIWindow)
lc.Messages <- fmt.Sprintf("changing to -> %d\n", nodeWinRef.IDX)
nodeWinRef := nodeRef.(int16)
lc.Messages <- fmt.Sprintf("changing to -> %d\n", nodeWinRef)
lc.LayoutToolView.ShowWindowFormByID(nodeWinRef.IDX)
lc.LayoutToolView.ShowWindowFormByID(nodeWinRef)
})
lc.LayoutToolView.LayoutTree.Tree.SetSelectedFunc(func(node *tview.TreeNode) {
@@ -96,9 +95,9 @@ func (lc *LayoutController) registerHooks() {
return
}
nodeWinRef := nodeRef.(*models.UIWindow)
nodeWinRef := nodeRef.(int16)
lc.App.SetFocus(lc.LayoutToolView.FormQuickAccess[nodeWinRef.IDX].Form.Form)
lc.App.SetFocus(lc.LayoutToolView.FormQuickAccess[nodeWinRef].Form.Form)
})
}
@@ -182,29 +181,23 @@ func (lc *LayoutController) createWindow() {
return
}
err = lc.updateFormView(
&models.UIWindow{
IDX: wID,
Window: *window,
},
)
err = lc.updateFormView(wID, window)
if err != nil {
// NOTE: if we fail to append the window to the views we must delete it
// altogether given we won't be able to manipulate it any further
lc.Messages <- "failed to append window to views " + err.Error()
}
}
func (lc *LayoutController) updateFormView(win *models.UIWindow) error {
func (lc *LayoutController) updateFormView(idx int16, win *cdashdisplay.UIWindow) error {
// OnSuccess we update our form to be an existing window form
err := lc.LayoutToolView.WindowCreatedSuccessfuly(win)
err := lc.LayoutToolView.WindowCreatedSuccessfuly(idx, win)
if err != nil {
return err
}
// Set the update window button behaviour
formView := lc.LayoutToolView.FormQuickAccess[win.IDX]
formView := lc.LayoutToolView.FormQuickAccess[idx]
err = SetFormButtonCallback(formView.Form.Form, "Update", func() {
lc.Messages <- "pressed update form button\n"
window, err := lc.parseWindowFormData(*formView.Form)
@@ -219,10 +212,11 @@ func (lc *LayoutController) updateFormView(win *models.UIWindow) error {
return
}
lc.updateWindowAction(&models.UIWindow{
IDX: win.IDX,
Window: *window,
})
lc.updateWindowAction(idx, win)
// lc.updateWindowAction(&models.UIWindow{
// IDX: win.IDX,
// Window: *window,
// })
})
if err != nil {
lc.Messages <- "failed to set callback for update button\n"
@@ -278,8 +272,8 @@ func (lc *LayoutController) newWindowAction() {
lc.App.SetFocus(newWindowForm.Form.Form)
}
func (lc *LayoutController) updateWindowAction(win *models.UIWindow) {
err := lc.DevService.UpdateWindow(win.IDX, &win.Window)
func (lc *LayoutController) updateWindowAction(idx int16, win *cdashdisplay.UIWindow) {
err := lc.DevService.UpdateWindow(idx, win)
lc.Messages <- fmt.Sprintf("Window: %v\n", win)
@@ -291,25 +285,24 @@ func (lc *LayoutController) updateWindowAction(win *models.UIWindow) {
func (lc *LayoutController) displayLoadedLayouts() {
for idx, w := range lc.DevService.CDash.State.Layout.Windows {
err := lc.updateFormView(&models.UIWindow{IDX: idx, Window: *w})
err := lc.updateFormView(idx, w)
if err != nil {
lc.Messages <- "failed to add window to list"
}
}
}
func (lc *LayoutController) getCurrentTreeNodeModel() (*tview.TreeNode, *models.UIWindow, error) {
func (lc *LayoutController) getCurrentTreeNodeModel() (*tview.TreeNode, int16, error) {
// Grab the form for the currently selected window
node := lc.LayoutToolView.LayoutTree.Tree.GetCurrentNode()
if node == nil {
return nil, nil, fmt.Errorf("failed to grab current tree node")
return nil, -1, fmt.Errorf("failed to grab current tree node")
}
// From this node get its references
ref, ok := node.GetReference().(*models.UIWindow)
ref, ok := node.GetReference().(int16)
if !ok {
return nil, nil, fmt.Errorf("failed to get data on currently selected window")
return nil, -1, fmt.Errorf("failed to get data on currently selected window")
}
return node, ref, nil
@@ -345,10 +338,10 @@ func (lc *LayoutController) deleteWindow() {
lc.Messages <- "couldn't get a hold of currently selected node\n"
return
}
win := curNode.GetReference().(*models.UIWindow)
wID := curNode.GetReference().(int16)
// Delete it
err := lc.DevService.DeleteWindow(win.IDX)
err := lc.DevService.DeleteWindow(wID)
if err != nil {
lc.Messages <- "failed to delete window: " + err.Error() + "\n"
return
@@ -362,13 +355,13 @@ func (lc *LayoutController) deleteWindow() {
func (lc *LayoutController) moveWindow() {
lc.Messages <- "Entering move mode (ESC to exit)\n"
_, win, err := lc.getCurrentTreeNodeModel()
_, idx, err := lc.getCurrentTreeNodeModel()
if err != nil {
lc.Messages <- "failed to enter move mode: " + err.Error() + "\n"
return
}
formView := lc.LayoutToolView.FormQuickAccess[win.IDX].Form
formView := lc.LayoutToolView.FormQuickAccess[idx].Form
oldCapture := formView.Form.GetInputCapture()
formView.Form.SetInputCapture(func(ev *tcell.EventKey) *tcell.EventKey {
@@ -392,7 +385,7 @@ func (lc *LayoutController) moveWindow() {
}
// Delegate the current handler input
handler := lc.MoveToolState.CurrentHandler(lc, win)
handler := lc.MoveToolState.CurrentHandler(lc, idx)
if handler != nil {
return handler(ev)
}
+11 -10
View File
@@ -2,7 +2,6 @@ package controllers
import (
helper "esdi/helpers"
"esdi/tui/internal/models"
"github.com/gdamore/tcell/v2"
)
@@ -43,53 +42,55 @@ func keyToVector(r rune) (helper.Vector, bool) {
return helper.Vector{}, false
}
func (lc *LayoutController) handleMovementCapture(win *models.UIWindow,
func (lc *LayoutController) handleMovementCapture(idx int16,
ev *tcell.EventKey) *tcell.EventKey {
vec, ok := keyToVector(ev.Rune())
if !ok {
return nil
}
err := lc.DevService.MoveWindow(win, &vec)
err := lc.DevService.MoveWindow(idx, &vec)
if err != nil {
lc.Messages <- "failed to move window: " + err.Error() + "\n"
return nil
}
// Success - update the form
lc.LayoutToolView.UpdateFormView(win)
window := lc.DevService.CDash.State.Layout.Windows[idx]
lc.LayoutToolView.UpdateFormView(idx, window)
return nil
}
func (lc *LayoutController) handleResizeCapture(win *models.UIWindow,
func (lc *LayoutController) handleResizeCapture(idx int16,
ev *tcell.EventKey) *tcell.EventKey {
vec, ok := keyToVector(ev.Rune())
if !ok {
return nil
}
err := lc.DevService.ResizeWindow(win, &vec)
err := lc.DevService.ResizeWindow(idx, &vec)
if err != nil {
lc.Messages <- "failed to resize window: " + err.Error() + "\n"
return nil
}
// Success - update the form
lc.LayoutToolView.UpdateFormView(win)
window := lc.DevService.CDash.State.Layout.Windows[idx]
lc.LayoutToolView.UpdateFormView(idx, window)
return nil
}
func (s *windowManipState) CurrentHandler(lc *LayoutController, w *models.UIWindow) modeHandler {
func (s *windowManipState) CurrentHandler(lc *LayoutController, idx int16) modeHandler {
switch s.Mode {
case moveMode:
return func(ev *tcell.EventKey) *tcell.EventKey {
return lc.handleMovementCapture(w, ev)
return lc.handleMovementCapture(idx, ev)
}
case resizeMode:
return func(ev *tcell.EventKey) *tcell.EventKey {
return lc.handleResizeCapture(w, ev)
return lc.handleResizeCapture(idx, ev)
}
}
+4 -6
View File
@@ -1,9 +1,7 @@
// Package models
package models
import "esdi/cdashdisplay"
type UIWindow struct {
IDX int16
Window cdashdisplay.UIWindow
}
// type UIWindow struct {
// IDX int16
// Window cdashdisplay.UIWindow
// }
+4 -11
View File
@@ -4,7 +4,6 @@ import (
"esdi/cdashdisplay"
helper "esdi/helpers"
"esdi/peripheral"
"esdi/tui/internal/models"
"log/slog"
)
@@ -69,26 +68,20 @@ func (cds *CDashService) DeleteWindow(idx int16) error {
return cds.CDash.DestroyWindow(idx)
}
func (cds *CDashService) ResizeWindow(win *models.UIWindow, vec *helper.Vector) error {
err := cds.CDash.ResizeWindow(win.IDX, vec)
func (cds *CDashService) ResizeWindow(idx int16, vec *helper.Vector) error {
err := cds.CDash.ResizeWindow(idx, vec)
if err != nil {
return err
}
// Update the UI window data
win.Window = *cds.CDash.State.Layout.Windows[win.IDX]
return nil
}
func (cds *CDashService) MoveWindow(win *models.UIWindow, vec *helper.Vector) error {
err := cds.CDash.MoveWindow(win.IDX, vec)
func (cds *CDashService) MoveWindow(idx int16, vec *helper.Vector) error {
err := cds.CDash.MoveWindow(idx, vec)
if err != nil {
return err
}
// Update the UI window data
win.Window = *cds.CDash.State.Layout.Windows[win.IDX]
return nil
}
+15 -15
View File
@@ -1,7 +1,7 @@
package views
import (
"esdi/tui/internal/models"
"esdi/cdashdisplay"
"fmt"
"github.com/gdamore/tcell/v2"
@@ -20,8 +20,8 @@ func FindNodeByID(node *tview.TreeNode, id int16) *tview.TreeNode {
return nil
}
if ref, ok := node.GetReference().(*models.UIWindow); ok {
if ref.IDX == id {
if ref, ok := node.GetReference().(int16); ok {
if ref == id {
return node
}
}
@@ -59,7 +59,7 @@ func NewLayoutTreeView() *LayoutTreeView {
return view
}
func (lt *LayoutTreeView) AddWindow(win *models.UIWindow) error {
func (lt *LayoutTreeView) AddWindow(idx int16, win *cdashdisplay.UIWindow) error {
root := lt.Tree.GetRoot()
if root == nil {
return fmt.Errorf("unable to get root of treeview")
@@ -67,8 +67,8 @@ func (lt *LayoutTreeView) AddWindow(win *models.UIWindow) error {
// Create this new node
newWindow := tview.NewTreeNode(
windowInfoPageTitle(win.IDX, win.Window.Title.String()),
).SetReference(win)
windowInfoPageTitle(idx, win.Title.String()),
).SetReference(idx)
root.AddChild(newWindow)
@@ -126,14 +126,14 @@ func NewLayoutToolView() *LayoutToolView {
return view
}
func (ltv *LayoutToolView) WindowCreatedSuccessfuly(win *models.UIWindow) error {
func (ltv *LayoutToolView) WindowCreatedSuccessfuly(idx int16, win *cdashdisplay.UIWindow) error {
updateWindowForm := NewWindowFormView(win)
// Update the pages ID
ltv.LayoutActions.Pages.RemovePage(LayoutToolNewWindowID)
AddAndShowPage(
ltv.LayoutActions.Pages,
windowInfoPageID(win.IDX),
windowInfoPageID(idx),
updateWindowForm.Form.Form,
)
@@ -141,10 +141,10 @@ func (ltv *LayoutToolView) WindowCreatedSuccessfuly(win *models.UIWindow) error
ltv.LayoutActions.CreateWindowView = nil
// Add this form thing to the quick access map
ltv.FormQuickAccess[win.IDX] = updateWindowForm
ltv.FormQuickAccess[idx] = updateWindowForm
// Add it to the tree view
return ltv.LayoutTree.AddWindow(win)
return ltv.LayoutTree.AddWindow(idx, win)
}
func (ltv *LayoutToolView) ShowCreateWindowForm() {
@@ -174,13 +174,13 @@ func (ltv *LayoutToolView) DeleteWindowByNode(node *tview.TreeNode) {
// We have to delete it from the map
// This isn't very safe now is it?
delete(ltv.FormQuickAccess, node.GetReference().(*models.UIWindow).IDX)
delete(ltv.FormQuickAccess, node.GetReference().(int16))
// Did we delete everything ???
}
func (ltv *LayoutToolView) UpdateFormView(win *models.UIWindow) {
func (ltv *LayoutToolView) UpdateFormView(idx int16, win *cdashdisplay.UIWindow) {
// Update the form view
ltv.FormQuickAccess[win.IDX].SetValues(win)
ltv.FormQuickAccess[idx].SetValues(win)
// Update the treeview with the new title
root := ltv.LayoutTree.Tree.GetRoot()
@@ -189,10 +189,10 @@ func (ltv *LayoutToolView) UpdateFormView(win *models.UIWindow) {
return
}
node := FindNodeByID(root, win.IDX)
node := FindNodeByID(root, idx)
if node == nil {
return
}
node.SetText(windowInfoPageTitle(win.IDX, win.Window.Title.String()))
node.SetText(windowInfoPageTitle(idx, win.Title.String()))
}
+12 -12
View File
@@ -3,7 +3,7 @@ package views
import (
"fmt"
"esdi/tui/internal/models"
"esdi/cdashdisplay"
"github.com/rivo/tview"
)
@@ -90,7 +90,7 @@ type WindowFormView struct {
UpdateBtn *tview.Button
}
func NewWindowFormView(win *models.UIWindow) *WindowFormView {
func NewWindowFormView(win *cdashdisplay.UIWindow) *WindowFormView {
view := &WindowFormView{
Form: NewCDashDisplayWindowFormView(),
}
@@ -106,17 +106,17 @@ func NewWindowFormView(win *models.UIWindow) *WindowFormView {
return view
}
func (fv *WindowFormView) SetValues(win *models.UIWindow) {
fv.Form.X.SetText(fmt.Sprintf("%d", win.Window.Dims.X0))
fv.Form.Y.SetText(fmt.Sprintf("%d", win.Window.Dims.Y0))
fv.Form.Width.SetText(fmt.Sprintf("%d", win.Window.Dims.Width))
fv.Form.Height.SetText(fmt.Sprintf("%d", win.Window.Dims.Height))
fv.Form.Title.SetText(win.Window.Title.String())
fv.Form.PreviewValue.SetText(win.Window.Opts.PreviewValue.String())
fv.Form.ShowID.SetChecked(win.Window.Opts.ShowID == 1)
func (fv *WindowFormView) SetValues(win *cdashdisplay.UIWindow) {
fv.Form.X.SetText(fmt.Sprintf("%d", win.Dims.X0))
fv.Form.Y.SetText(fmt.Sprintf("%d", win.Dims.Y0))
fv.Form.Width.SetText(fmt.Sprintf("%d", win.Dims.Width))
fv.Form.Height.SetText(fmt.Sprintf("%d", win.Dims.Height))
fv.Form.Title.SetText(win.Title.String())
fv.Form.PreviewValue.SetText(win.Opts.PreviewValue.String())
fv.Form.ShowID.SetChecked(win.Opts.ShowID == 1)
fv.Form.WinType.SetCurrentOption(0) // NOTE: this needs to set the correct option
fv.Form.TitleSize.SetCurrentOption(int(win.Window.Decor.TitleSize))
fv.Form.TextSize.SetCurrentOption(int(win.Window.Decor.TextSize))
fv.Form.TitleSize.SetCurrentOption(int(win.Decor.TitleSize))
fv.Form.TextSize.SetCurrentOption(int(win.Decor.TextSize))
}
func windowInfoPageID(idx int16) string {