Skip to content
This repository has been archived by the owner on Feb 3, 2023. It is now read-only.

Commit

Permalink
add help for each view
Browse files Browse the repository at this point in the history
  • Loading branch information
ingbyr committed Sep 7, 2022
1 parent 9f0a4cf commit e4179d3
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 48 deletions.
15 changes: 14 additions & 1 deletion tui/editor_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,19 @@ func NewTextView(model *Model) *EditorView {
}

func (v *EditorView) Init() tea.Cmd {
km := v.hostEditor.KeyMap
v.model.SetShortHelp(editorViewState, []key.Binding{
keys.Up,
keys.Down,
keys.Left,
keys.Right,
keys.Save,
keys.Esc,
})
v.model.SetFullHelp(editorViewState, [][]key.Binding{
{keys.Up, keys.Down, keys.Left, keys.Right, keys.Save},
{km.CharacterForward, km.CharacterBackward}, // TODO add all key map from textarea.KeyMap
})
return func() tea.Msg {
// Display system host on start up
v.SetHost(gohost.SysHost())
Expand All @@ -46,7 +59,7 @@ func (v *EditorView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch m := msg.(type) {
case tea.WindowSizeMsg:
v.hostEditor.SetHeight(m.Height - v.model.reservedHeight - 1)
v.hostEditor.SetWidth(m.Width - v.model.groupView.groupList.Width())
v.hostEditor.SetWidth(m.Width - v.model.treeView.nodeList.Width())
case tea.KeyMsg:
if v.model.state == editorViewState {
switch {
Expand Down
37 changes: 27 additions & 10 deletions tui/help_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,20 @@ import (
)

type HelpView struct {
view help.Model
model *Model
helpView help.Model
shortHelp map[sessionState][]key.Binding
fullHelp map[sessionState][][]key.Binding
debug string
enableDebug bool
}

func NewHelpView(model *Model) *HelpView {
return &HelpView{
view: help.New(),
model: model,
helpView: help.New(),
shortHelp: make(map[sessionState][]key.Binding, 8),
fullHelp: make(map[sessionState][][]key.Binding, 8),
enableDebug: true,
}
}
Expand All @@ -27,19 +33,14 @@ func (h *HelpView) Init() tea.Cmd {
func (h *HelpView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.WindowSizeMsg:
h.view.Width = msg.Width
case tea.KeyMsg:
switch {
case key.Matches(msg, keys.Help):
h.view.ShowAll = !h.view.ShowAll
}
h.helpView.Width = msg.Width
}
return h, nil
}

func (h *HelpView) View() string {
var b strings.Builder
b.WriteString(h.view.View(keys))
b.WriteString(h.helpView.View(h))
if h.enableDebug {
b.WriteString(cfg.LineBreak)
b.WriteString("Debug: ")
Expand All @@ -48,6 +49,22 @@ func (h *HelpView) View() string {
return b.String()
}

func (h *HelpView) ShortHelp() []key.Binding {
return h.shortHelp[h.model.state]
}

func (h *HelpView) FullHelp() [][]key.Binding {
return h.fullHelp[h.model.preState]
}

func (h *HelpView) Width() int {
return h.view.Width
return h.helpView.Width
}

func (h *HelpView) SetShortHelp(state sessionState, kb []key.Binding) {
h.shortHelp[state] = kb
}

func (h *HelpView) SetFullHelp(state sessionState, kb [][]key.Binding) {
h.fullHelp[state] = kb
}
6 changes: 3 additions & 3 deletions tui/keymap.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func newKeys() *keyMaps {
),
Switch: key.NewBinding(
key.WithKeys("ctrl+e"),
key.WithHelp("ctrl+e", "switch view"),
key.WithHelp("ctrl+e", "switch helpView"),
),
Save: key.NewBinding(
key.WithKeys("ctrl+s"),
Expand All @@ -73,8 +73,8 @@ func (k keyMaps) ShortHelp() []key.Binding {

func (k keyMaps) FullHelp() [][]key.Binding {
return [][]key.Binding{
{k.Up, k.Down}, // column
{k.Left, k.Right},
//{k.Up, k.Down}, // column
//{k.Left, k.Right},
{k.Switch, k.New},
{k.Save},
{k.Help, k.Quit},
Expand Down
63 changes: 45 additions & 18 deletions tui/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"gohost/config"
"gohost/tui/styles"
"strconv"
"strings"
)

type sessionState int
Expand All @@ -16,15 +15,17 @@ const (
treeViewState = iota
editorViewState
nodeViewState
helpViewState
lastState
)

var cfg = config.Instance()

type Model struct {
preState sessionState
state sessionState
helpView *HelpView
groupView *TreeView
treeView *TreeView
editorView *EditorView
nodeView *NodeView
reservedHeight int
Expand All @@ -33,18 +34,18 @@ type Model struct {

func NewModel() (*Model, error) {
model := &Model{
state: nodeViewState,
state: treeViewState,
reservedHeight: 6,
}
model.helpView = NewHelpView(model)
model.groupView = NewTreeView(model)
model.treeView = NewTreeView(model)
model.editorView = NewTextView(model)
model.nodeView = NewNodeView(model)
return model, nil
}

func (m *Model) Init() tea.Cmd {
return tea.Batch(m.groupView.Init(),
return tea.Batch(m.treeView.Init(),
m.editorView.Init(),
m.helpView.Init())
}
Expand All @@ -60,33 +61,50 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case key.Matches(msg, keys.Quit):
m.quitting = true
cmds = append(cmds, tea.Quit)
case key.Matches(msg, keys.Help):
if m.state != helpViewState {
m.switchState(helpViewState)
m.helpView.helpView.ShowAll = true
} else {
m.switchState(m.preState)
m.helpView.helpView.ShowAll = false
}
}
}
m.updateView(msg, &cmds, m.groupView)
m.updateView(msg, &cmds, m.treeView)
m.updateView(msg, &cmds, m.editorView)
m.updateView(msg, &cmds, m.nodeView)
m.updateView(msg, &cmds, m.helpView)
return m, tea.Batch(cmds...)
}

func (m *Model) View() string {
var b strings.Builder
var v string
switch m.state {
case treeViewState:
b.WriteString(lipgloss.JoinHorizontal(lipgloss.Top,
styles.FocusedView.Render(m.groupView.View()),
styles.DefaultView.Render(m.editorView.View())))
v = lipgloss.JoinVertical(lipgloss.Left,
lipgloss.JoinHorizontal(lipgloss.Top,
styles.FocusedView.Render(m.treeView.View()),
styles.DefaultView.Render(m.editorView.View()),
),
m.helpView.View())

case editorViewState:
b.WriteString(lipgloss.JoinHorizontal(lipgloss.Top,
styles.DefaultView.Render(m.groupView.View()),
styles.FocusedView.Render(m.editorView.View())))
v = lipgloss.JoinHorizontal(lipgloss.Left,
lipgloss.JoinHorizontal(lipgloss.Top,
styles.DefaultView.Render(m.treeView.View()),
styles.FocusedView.Render(m.editorView.View())),
m.helpView.View())

case nodeViewState:
b.WriteString(lipgloss.JoinHorizontal(lipgloss.Top,
styles.DefaultView.Render(m.groupView.View()),
styles.FocusedView.Render(m.nodeView.View())))
}
v = lipgloss.JoinVertical(lipgloss.Left,
lipgloss.JoinHorizontal(lipgloss.Top,
styles.DefaultView.Render(m.treeView.View()),
styles.FocusedView.Render(m.nodeView.View())))

v := lipgloss.JoinVertical(lipgloss.Left, b.String(), m.helpView.View())
case helpViewState:
v = m.helpView.View()
}
return v
}

Expand All @@ -106,10 +124,19 @@ func (m *Model) switchNextState() sessionState {
}

func (m *Model) switchState(state sessionState) {
m.preState = m.state
if state == editorViewState {
m.editorView.Focus()
} else {
m.editorView.Blur()
}
m.state = state
}

func (m *Model) SetShortHelp(state sessionState, kb []key.Binding) {
m.helpView.SetShortHelp(state, kb)
}

func (m *Model) SetFullHelp(state sessionState, kb [][]key.Binding) {
m.helpView.SetFullHelp(state, kb)
}
6 changes: 6 additions & 0 deletions tui/node_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ func (v *NodeView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
v.inputs[i], cmd = v.inputs[i].Update(msg)
cmds = append(cmds, cmd)
}
//switch m := msg.(type) {
//case tea.KeyMsg:
// switch {
//
// }
//}
return v, cmd
}

Expand Down
42 changes: 26 additions & 16 deletions tui/tree_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ func (d groupItemDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd {
return nil
}

// TreeView is tui view for nodes tree
// TreeView is tui helpView for nodes tree
type TreeView struct {
model *Model
groupList list.Model
nodeList list.Model
selectedNode *gohost.TreeNode
selectedIndex int
selectedGroup *gohost.Group
Expand All @@ -67,8 +67,8 @@ func NewTreeView(model *Model) *TreeView {
treeNodes := service.Tree()
groups := util.WrapSlice[list.Item](treeNodes)

// Create nodes list view
//groupList := list.New(groups, groupItemDelegate{}, 0, 0)
// Create nodes list helpView
//nodeList := list.New(groups, groupItemDelegate{}, 0, 0)
delegate := list.NewDefaultDelegate()
groupList := list.New(groups, delegate, 0, 0)
// TODO add remaining help key
Expand All @@ -77,13 +77,15 @@ func NewTreeView(model *Model) *TreeView {

return &TreeView{
model: model,
groupList: groupList,
nodeList: groupList,
selectedNode: treeNodes[0],
service: service,
}
}

func (v *TreeView) Init() tea.Cmd {
v.model.SetShortHelp(treeViewState, v.nodeList.ShortHelp())
v.model.SetFullHelp(treeViewState, v.nodeList.FullHelp())
return nil
}

Expand All @@ -92,17 +94,17 @@ func (v *TreeView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmds []tea.Cmd
switch m := msg.(type) {
case tea.WindowSizeMsg:
v.groupList.SetHeight(m.Height - v.model.reservedHeight)
v.groupList.SetWidth(m.Width / 3)
v.model.helpView.debug = fmt.Sprintf("w %d h %d, w %d h %d", m.Width, m.Height, v.groupList.Width(), v.groupList.Height())
v.nodeList.SetHeight(m.Height - v.model.reservedHeight)
v.nodeList.SetWidth(m.Width / 3)
v.model.helpView.debug = fmt.Sprintf("w %d h %d, w %d h %d", m.Width, m.Height, v.nodeList.Width(), v.nodeList.Height())
case tea.KeyMsg:
if v.model.state == treeViewState {
switch {
case key.Matches(m, keys.Enter):
selectedItem := v.groupList.SelectedItem()
selectedItem := v.nodeList.SelectedItem()
if selectedItem != nil {
v.selectedNode = selectedItem.(*gohost.TreeNode)
v.selectedIndex = v.groupList.Index()
v.selectedIndex = v.nodeList.Index()
switch v.selectedNode.Node.(type) {
case *gohost.Group:
v.onGroupNodeEnterClick(&cmds)
Expand All @@ -116,13 +118,21 @@ func (v *TreeView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
msg = nil
}
}
v.groupList, cmd = v.groupList.Update(msg)
v.nodeList, cmd = v.nodeList.Update(msg)
cmds = append(cmds, cmd)
return v, tea.Batch(cmds...)
}

func (v *TreeView) View() string {
return v.groupList.View()
return v.nodeList.View()
}

func (v *TreeView) ShortHelp() []key.Binding {
return v.nodeList.ShortHelp()
}

func (v *TreeView) FullHelp() [][]key.Binding {
return v.nodeList.FullHelp()
}

func (v *TreeView) onGroupNodeEnterClick(cmds *[]tea.Cmd) {
Expand All @@ -140,17 +150,17 @@ func (v *TreeView) unfoldSelectedGroup(cmds *[]tea.Cmd) {
idx := v.selectedIndex
for i := range subGroups {
idx++
*cmds = append(*cmds, v.groupList.InsertItem(idx, subGroups[i]))
*cmds = append(*cmds, v.nodeList.InsertItem(idx, subGroups[i]))
}
subHosts := v.service.LoadHostNodes(v.selectedNode.GetID())
for i := range subHosts {
idx++
*cmds = append(*cmds, v.groupList.InsertItem(idx, subHosts[i]))
*cmds = append(*cmds, v.nodeList.InsertItem(idx, subHosts[i]))
}
}

func (v *TreeView) foldSelectedGroup() {
items := v.groupList.Items()
items := v.nodeList.Items()
next := v.selectedIndex + 1
for i := next; i < len(items); i++ {
if items[next] == nil {
Expand All @@ -159,7 +169,7 @@ func (v *TreeView) foldSelectedGroup() {
node := items[next].(*gohost.TreeNode)
if node.Depth > v.selectedNode.Depth {
node.IsFolded = true
v.groupList.RemoveItem(next)
v.nodeList.RemoveItem(next)
} else {
break
}
Expand Down

0 comments on commit e4179d3

Please sign in to comment.