184 lines
4.9 KiB
Go
184 lines
4.9 KiB
Go
package views
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"esdi/cdashdisplay"
|
|
"esdi/tui/internal/dom"
|
|
"esdi/tui/internal/events"
|
|
"esdi/tui/internal/models"
|
|
"esdi/tui/internal/ui"
|
|
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
)
|
|
|
|
// Validate the form inputs
|
|
func validateFormInputs(x, y, w, h, title string) (models.Window, error) {
|
|
xValue, err := strconv.ParseUint(x, 10, 64)
|
|
if err != nil {
|
|
return models.Window{}, err
|
|
}
|
|
yValue, err := strconv.ParseUint(y, 10, 64)
|
|
if err != nil {
|
|
return models.Window{}, err
|
|
}
|
|
widthValue, err := strconv.ParseUint(w, 10, 64)
|
|
if err != nil {
|
|
return models.Window{}, err
|
|
}
|
|
heightValue, err := strconv.ParseUint(h, 10, 64)
|
|
if err != nil {
|
|
return models.Window{}, err
|
|
}
|
|
|
|
return models.Window{
|
|
X: uint16(xValue),
|
|
Y: uint16(yValue),
|
|
Width: uint16(widthValue),
|
|
Height: uint16(heightValue),
|
|
Title: title,
|
|
}, nil
|
|
}
|
|
|
|
func createNewWindowForm(bus *events.Bus, doc *dom.DOM) {
|
|
var err error
|
|
|
|
x0 := tview.NewInputField().SetLabel("x")
|
|
y0 := tview.NewInputField().SetLabel("y")
|
|
width := tview.NewInputField().SetLabel("width")
|
|
height := tview.NewInputField().SetLabel("height")
|
|
title := tview.NewInputField().SetLabel("title")
|
|
winType := tview.NewDropDown().SetLabel("type").
|
|
SetOptions([]string{"string", "bar"}, func(s string, id int) {
|
|
// Here we have to add extra options for the configuration of default
|
|
// values and so on
|
|
}).
|
|
SetCurrentOption(0)
|
|
|
|
form := tview.NewForm().
|
|
AddFormItem(x0).
|
|
AddFormItem(y0).
|
|
AddFormItem(width).
|
|
AddFormItem(height).
|
|
AddFormItem(title).
|
|
AddFormItem(winType).
|
|
AddButton("Create", func() {
|
|
// Validate the inputs
|
|
window, err := validateFormInputs(
|
|
x0.GetText(),
|
|
y0.GetText(),
|
|
width.GetText(),
|
|
height.GetText(),
|
|
title.GetText(),
|
|
)
|
|
|
|
if err != nil {
|
|
bus.Emit(ui.LogEv{Log: fmt.Sprintf("failed to parse form: %s\n", err.Error())})
|
|
return
|
|
}
|
|
|
|
bus.Emit(ui.CreateWindowEv{Window: window})
|
|
})
|
|
|
|
form.SetBorder(true).
|
|
SetTitle("new window form").
|
|
SetTitleAlign(tview.AlignLeft).
|
|
SetInputCapture(func(ev *tcell.EventKey) *tcell.EventKey {
|
|
switch ev.Key() {
|
|
case tcell.KeyEscape:
|
|
bus.Emit(ui.ChangeFocusEv{Target: doc.GetElemByID(layoutToolFlexID)})
|
|
}
|
|
|
|
return ev
|
|
})
|
|
|
|
var formNode *dom.UINode
|
|
formNode = doc.GetNodeByID("new-window-form")
|
|
if formNode == nil {
|
|
formNode, err = doc.NewUINode("new-window-form",
|
|
doc.GetElemByID(layoutToolActionPagesID), form)
|
|
if err != nil {
|
|
panic("failed to create UI node for the new window form: " + err.Error())
|
|
}
|
|
}
|
|
|
|
AddAndShowPage(bus, doc, doc.GetElemByID(layoutToolActionPagesID).(*tview.Pages),
|
|
formNode, true)
|
|
}
|
|
|
|
func windowInfoPageID(idx int16) string {
|
|
return fmt.Sprintf("layout-tool-win-info-%d", idx)
|
|
}
|
|
|
|
func windowInfoForm(bus *events.Bus, doc *dom.DOM, idx int16,
|
|
win *cdashdisplay.UIWindow) *dom.UINode {
|
|
var err error
|
|
|
|
x0 := tview.NewInputField().SetLabel("x").SetText(fmt.Sprintf("%d", win.Dims.X0))
|
|
y0 := tview.NewInputField().SetLabel("y").SetText(fmt.Sprintf("%d", win.Dims.Y0))
|
|
width := tview.NewInputField().SetLabel("width").SetText(fmt.Sprintf("%d", win.Dims.Width))
|
|
height := tview.NewInputField().SetLabel("height").SetText(fmt.Sprintf("%d", win.Dims.Height))
|
|
title := tview.NewInputField().SetLabel("title").SetText(win.Title.String())
|
|
winType := tview.NewDropDown().SetLabel("type").
|
|
SetOptions([]string{"string", "bar"}, func(s string, id int) {
|
|
// Here we have to add extra options for the configuration of default
|
|
// values and so on
|
|
}).
|
|
SetCurrentOption(0)
|
|
|
|
form := tview.NewForm().
|
|
AddFormItem(x0).
|
|
AddFormItem(y0).
|
|
AddFormItem(width).
|
|
AddFormItem(height).
|
|
AddFormItem(title).
|
|
AddFormItem(winType).
|
|
AddButton("Update", func() {
|
|
bus.Emit(ui.LogEv{Log: "update event was created\n"})
|
|
// Validate the inputs
|
|
window, err := validateFormInputs(
|
|
x0.GetText(),
|
|
y0.GetText(),
|
|
width.GetText(),
|
|
height.GetText(),
|
|
title.GetText(),
|
|
)
|
|
|
|
if err != nil {
|
|
bus.Emit(ui.LogEv{Log: fmt.Sprintf("failed to parse form: %s\n", err.Error())})
|
|
return
|
|
}
|
|
|
|
bus.Emit(ui.LogEv{Log: "sending update window ev\n"})
|
|
bus.Emit(ui.UpdateWindowEv{ID: idx, Window: window})
|
|
})
|
|
|
|
form.SetBorder(true).
|
|
SetTitle(fmt.Sprintf("Info - %s [%2d]", win.Title.String(), idx)).
|
|
SetTitleAlign(tview.AlignLeft).
|
|
SetInputCapture(func(ev *tcell.EventKey) *tcell.EventKey {
|
|
switch ev.Key() {
|
|
case tcell.KeyEscape:
|
|
bus.Emit(ui.ChangeFocusEv{Target: doc.GetElemByID(layoutToolTreeID)})
|
|
}
|
|
|
|
return ev
|
|
})
|
|
|
|
var formNode *dom.UINode
|
|
elemId := windowInfoPageID(idx)
|
|
formNode = doc.GetNodeByID(elemId)
|
|
layoutToolActionPagesElem := doc.GetElemByID(layoutToolActionPagesID)
|
|
if formNode == nil {
|
|
formNode, err = doc.NewUINode(elemId, layoutToolActionPagesElem, form)
|
|
if err != nil {
|
|
panic("failed to create UI node for the new window form: " + err.Error())
|
|
}
|
|
}
|
|
|
|
// AddAndShowPage(bus, doc, layoutToolActionPagesElem.(*tview.Pages), formNode)
|
|
return formNode
|
|
}
|