finally adding some functionality to the layout tool UI
This commit is contained in:
@@ -63,8 +63,6 @@ func (t *TUI) Start() error {
|
||||
Ctx: ctx,
|
||||
}
|
||||
|
||||
views.BindWindowEvents(ctx, t.Events, nil)
|
||||
|
||||
// Make the output window
|
||||
err := views.BuildOutputWindow(t.Dom, ctx)
|
||||
if err != nil {
|
||||
|
||||
@@ -11,7 +11,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
layoutToolFlexID = "layout-tool-flex"
|
||||
layoutToolFlexID = "layout-tool-flex"
|
||||
layoutToolTreeID = "layout-tool-tree"
|
||||
layoutToolActionPagesID = "layout-tool-action-pages"
|
||||
)
|
||||
|
||||
func BindWindowEvents(
|
||||
@@ -23,6 +25,19 @@ func BindWindowEvents(
|
||||
// triggers directly on the UINodes I want them to be triggered on
|
||||
bus.On(events.WindowCreated{}, func(e any) {
|
||||
ctx.Log("Received a window created event\n")
|
||||
if tree == nil {
|
||||
ctx.Log("tree view is nil")
|
||||
return
|
||||
}
|
||||
|
||||
root := tree.GetRoot()
|
||||
if root == nil {
|
||||
ctx.Log("unable to get root of tree view")
|
||||
return
|
||||
}
|
||||
|
||||
newWindow := tview.NewTreeNode(e.(events.WindowCreated).Window.Title)
|
||||
root.AddChild(newWindow)
|
||||
})
|
||||
bus.On(events.Error{}, func(e any) {
|
||||
ctx.Log("Error performing action: %s\n", e.(events.Error).Error.Error())
|
||||
@@ -30,7 +45,7 @@ func BindWindowEvents(
|
||||
}
|
||||
|
||||
func layoutToolTreeViewEvents(root *dom.DOM, ctx *ui.UIContext,
|
||||
wc *controllers.WindowingController) func(
|
||||
tree *tview.TreeView, wc *controllers.WindowingController) func(
|
||||
event *tcell.EventKey) *tcell.EventKey {
|
||||
return func(event *tcell.EventKey) *tcell.EventKey {
|
||||
switch event.Key() {
|
||||
@@ -41,12 +56,27 @@ func layoutToolTreeViewEvents(root *dom.DOM, ctx *ui.UIContext,
|
||||
switch event.Rune() {
|
||||
case 'N':
|
||||
// Create a new screen
|
||||
// I think I will leave this one for later
|
||||
case 'n':
|
||||
// Create a new window
|
||||
ctx.Log("calling new window form\n")
|
||||
createNewWindowForm(root, ctx, wc)
|
||||
case 'x':
|
||||
// Delete selected window
|
||||
ctx.Log("calling delete window\n")
|
||||
curNode := tree.GetCurrentNode()
|
||||
if curNode == nil {
|
||||
ctx.Log("unable to get current tree node")
|
||||
break
|
||||
}
|
||||
|
||||
root := tree.GetRoot()
|
||||
if root == nil {
|
||||
ctx.Log("unable to get current tree node")
|
||||
break
|
||||
}
|
||||
|
||||
root.RemoveChild(curNode)
|
||||
case 'm':
|
||||
// Go into move mode
|
||||
case 'e':
|
||||
@@ -71,7 +101,7 @@ func layoutToolUIOnSelect(root *dom.DOM, ctx *ui.UIContext, wc *controllers.Wind
|
||||
ctx.Log(" Checking if `%s` UINode already exists\n", layoutToolFlexID)
|
||||
layoutToolUINode := root.GetNodeByID(layoutToolFlexID)
|
||||
if layoutToolUINode == nil {
|
||||
layoutToolUINode, err = buildLayoutToolUINode(root, ctx, wc)
|
||||
layoutToolUINode, err = buildLayoutFlexComponent(root, ctx, wc)
|
||||
if err != nil {
|
||||
ctx.Log(" Failed to build layout tool UI: %s\n", err.Error())
|
||||
}
|
||||
@@ -80,37 +110,70 @@ func layoutToolUIOnSelect(root *dom.DOM, ctx *ui.UIContext, wc *controllers.Wind
|
||||
AddAndShowPage(root, ctx, apiToolPages, layoutToolUINode)
|
||||
}
|
||||
|
||||
func buildLayoutToolUINode(root *dom.DOM, ctx *ui.UIContext,
|
||||
func buildLayoutTreeComponent(doc *dom.DOM, ctx *ui.UIContext,
|
||||
wc *controllers.WindowingController) (*dom.UINode, error) {
|
||||
|
||||
layoutTree := tview.NewTreeView()
|
||||
|
||||
layoutTree.SetBorder(true).SetTitle("Layout Tree").
|
||||
SetInputCapture(layoutToolTreeViewEvents(doc, ctx, layoutTree, wc))
|
||||
|
||||
layoutTreeUINode, err := doc.NewUINode(layoutToolTreeID,
|
||||
doc.GetElemByID(rightFlexID), layoutTree)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Bind the events for the treeview
|
||||
BindWindowEvents(ctx, wc.Events, layoutTreeUINode.Self.(*tview.TreeView))
|
||||
|
||||
// Create a root element
|
||||
rootElem := tview.NewTreeNode(".")
|
||||
layoutTree.SetRoot(rootElem).SetCurrentNode(rootElem)
|
||||
|
||||
return layoutTreeUINode, nil
|
||||
}
|
||||
|
||||
func buildLayoutActionPagesComponent(doc *dom.DOM, _ *ui.UIContext,
|
||||
_ *controllers.WindowingController) (*dom.UINode, error) {
|
||||
|
||||
actionPages := tview.NewPages()
|
||||
|
||||
actionPages.SetBorder(true).SetTitle("Action Page")
|
||||
|
||||
actionPagesUINode, err := doc.NewUINode(layoutToolActionPagesID,
|
||||
doc.GetElemByID("right-flex"), actionPages)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return actionPagesUINode, nil
|
||||
}
|
||||
|
||||
func buildLayoutFlexComponent(root *dom.DOM, ctx *ui.UIContext,
|
||||
wc *controllers.WindowingController) (*dom.UINode, error) {
|
||||
// Want a TreeView at the top
|
||||
layoutTree := tview.NewTreeView().
|
||||
SetInputCapture(layoutToolTreeViewEvents(root, ctx, wc))
|
||||
layoutTree.SetBorder(true).SetTitle("Layout Tree")
|
||||
_, err := root.NewUINode("layout-tree",
|
||||
root.GetElemByID("right-flex"), layoutTree)
|
||||
layoutTreeUINode, err := buildLayoutTreeComponent(root, ctx, wc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Want pages below to run actions
|
||||
actionPages := tview.NewPages()
|
||||
actionPages.SetBorder(true).SetTitle("Action Page")
|
||||
_, err = root.NewUINode("layout-action-pages",
|
||||
root.GetElemByID("right-flex"), actionPages)
|
||||
actionPagesUINode, err := buildLayoutActionPagesComponent(root, ctx, wc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
layoutToolFlex := tview.NewFlex().SetDirection(tview.FlexRow)
|
||||
layoutToolFlexNode, err := root.NewUINode(layoutToolFlexID, root.GetElemByID("api-tool-pages"),
|
||||
layoutToolFlex)
|
||||
layoutToolFlexNode, err := root.NewUINode(layoutToolFlexID,
|
||||
root.GetElemByID(apiToolPagesID), layoutToolFlex)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
layoutToolFlex.
|
||||
AddItem(layoutTree, 0, 2, true).
|
||||
AddItem(actionPages, 0, 5, false)
|
||||
AddItem(layoutTreeUINode.Self, 0, 2, true).
|
||||
AddItem(actionPagesUINode.Self, 0, 5, false)
|
||||
|
||||
return layoutToolFlexNode, nil
|
||||
}
|
||||
@@ -157,13 +220,13 @@ func createNewWindowForm(root *dom.DOM, ctx *ui.UIContext,
|
||||
var formNode *dom.UINode
|
||||
formNode = root.GetNodeByID("new-window-form")
|
||||
if formNode == nil {
|
||||
formNode, err = root.NewUINode("new-window-form", root.GetElemByID("layout-action-pages"),
|
||||
form)
|
||||
formNode, err = root.NewUINode("new-window-form",
|
||||
root.GetElemByID(layoutToolActionPagesID), form)
|
||||
if err != nil {
|
||||
panic("failed to create UI node for the new window form: " + err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
AddAndShowPage(root, ctx, root.GetElemByID("layout-action-pages").(*tview.Pages),
|
||||
AddAndShowPage(root, ctx, root.GetElemByID(layoutToolActionPagesID).(*tview.Pages),
|
||||
formNode)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user