Files
esdi/tui/internal/views/mainFlex.go
T

103 lines
2.5 KiB
Go

// Package views
package views
import (
"fmt"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
const (
MainFlexID = "main-flex"
APIToolPagesID = "api-tool-pages"
RightFlexID = "right-flex"
OutputPaneID = "output-window"
DeviceAPIListID = "device-api-list"
)
const (
EmptyPageName = "empty-page"
)
type DeviceAPIToolView struct {
Pages *tview.Pages
ChangedFn func()
}
func NewDeviceAPIToolView() *DeviceAPIToolView {
// We need to build a set of pages with an empty page
emptyPage := tview.NewTextView().
SetTextAlign(tview.AlignCenter).
SetChangedFunc(func() {
// bus.Emit(ui.RedrawEv{})
})
emptyPage.SetBorder(true).SetTitle("-- Tool Area --")
fmt.Fprintf(emptyPage, "No Tool Selected")
apiToolPages := tview.NewPages().AddPage(EmptyPageName, emptyPage, true, true)
return &DeviceAPIToolView{
Pages: apiToolPages,
ChangedFn: func() {}, // blank function to be hooked on
}
}
type DeviceAPIListView struct {
List *tview.List
InputCapture func(*tcell.EventKey) *tcell.EventKey
ItemOnSelect func()
}
func NewDeviceAPIListView() *DeviceAPIListView {
deviceAPIList := tview.NewList()
deviceAPIList.SetBorder(true).SetTitle("list")
return &DeviceAPIListView{
List: deviceAPIList,
InputCapture: func(ev *tcell.EventKey) *tcell.EventKey { return ev },
ItemOnSelect: func() {}, // blank functions, they have to be hooked on by the controller
}
}
type DeviceAPIView struct {
MainFlex *tview.Flex
DevAPIList *DeviceAPIListView
DevAPIToolView *DeviceAPIToolView
OutputWindow *OutputWinView
}
func (dl *DeviceAPIListView) AddItem(name, description string, onSelect func()) {
dl.List.AddItem(name, description, 0, onSelect)
}
func NewDeviceAPIView() (*DeviceAPIView, error) {
mainFlex := tview.NewFlex().SetDirection(tview.FlexColumn)
deviceAPIList := NewDeviceAPIListView()
apiToolPages := NewDeviceAPIToolView()
mainFlex.
AddItem(deviceAPIList.List, 0, 1, false).
AddItem(apiToolPages.Pages, 0, 4, false)
// Output window
outputWin := NewOutputWinView()
// Flex with debug window
// --------------------------------------------------------------------------
flexWithOutputWindow := tview.NewFlex().SetDirection(tview.FlexRow)
flexWithOutputWindow.
AddItem(mainFlex, 0, 5, true).
AddItem(outputWin.TextArea, 0, 2, false)
// --------------------------------------------------------------------------
return &DeviceAPIView{
MainFlex: flexWithOutputWindow,
DevAPIList: deviceAPIList,
DevAPIToolView: apiToolPages,
OutputWindow: outputWin,
}, nil
}