add initial stuff
This commit is contained in:
@@ -4,10 +4,13 @@ import (
|
||||
"github.com/charmbracelet/bubbles/key"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
"github.com/kujtimiihoxha/termai/internal/app"
|
||||
"github.com/kujtimiihoxha/termai/internal/tui/components/core"
|
||||
"github.com/kujtimiihoxha/termai/internal/tui/components/dialog"
|
||||
"github.com/kujtimiihoxha/termai/internal/tui/layout"
|
||||
"github.com/kujtimiihoxha/termai/internal/tui/page"
|
||||
"github.com/kujtimiihoxha/termai/internal/tui/util"
|
||||
"github.com/kujtimiihoxha/vimtea"
|
||||
)
|
||||
|
||||
type keyMap struct {
|
||||
@@ -49,6 +52,9 @@ type appModel struct {
|
||||
loadedPages map[page.PageID]bool
|
||||
status tea.Model
|
||||
help core.HelpCmp
|
||||
dialog core.DialogCmp
|
||||
dialogVisible bool
|
||||
editorMode vimtea.EditorMode
|
||||
showHelp bool
|
||||
}
|
||||
|
||||
@@ -60,6 +66,8 @@ func (a appModel) Init() tea.Cmd {
|
||||
|
||||
func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
switch msg := msg.(type) {
|
||||
case vimtea.EditorModeMsg:
|
||||
a.editorMode = msg.Mode
|
||||
case tea.WindowSizeMsg:
|
||||
msg.Height -= 1 // Make space for the status bar
|
||||
a.width, a.height = msg.Width, msg.Height
|
||||
@@ -72,31 +80,47 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
p, cmd := a.pages[a.currentPage].Update(msg)
|
||||
a.pages[a.currentPage] = p
|
||||
return a, cmd
|
||||
case core.DialogMsg:
|
||||
d, cmd := a.dialog.Update(msg)
|
||||
a.dialog = d.(core.DialogCmp)
|
||||
a.dialogVisible = true
|
||||
return a, cmd
|
||||
case core.DialogCloseMsg:
|
||||
d, cmd := a.dialog.Update(msg)
|
||||
a.dialog = d.(core.DialogCmp)
|
||||
a.dialogVisible = false
|
||||
return a, cmd
|
||||
case util.InfoMsg:
|
||||
a.status, _ = a.status.Update(msg)
|
||||
case util.ErrorMsg:
|
||||
a.status, _ = a.status.Update(msg)
|
||||
case tea.KeyMsg:
|
||||
switch {
|
||||
case key.Matches(msg, keys.Quit):
|
||||
return a, tea.Quit
|
||||
case key.Matches(msg, keys.Back):
|
||||
if a.previousPage != "" {
|
||||
return a, a.moveToPage(a.previousPage)
|
||||
}
|
||||
case key.Matches(msg, keys.Return):
|
||||
if a.showHelp {
|
||||
if a.editorMode == vimtea.ModeNormal {
|
||||
switch {
|
||||
case key.Matches(msg, keys.Quit):
|
||||
return a, dialog.NewQuitDialogCmd()
|
||||
case key.Matches(msg, keys.Back):
|
||||
if a.previousPage != "" {
|
||||
return a, a.moveToPage(a.previousPage)
|
||||
}
|
||||
case key.Matches(msg, keys.Return):
|
||||
if a.showHelp {
|
||||
a.ToggleHelp()
|
||||
return a, nil
|
||||
}
|
||||
case key.Matches(msg, keys.Logs):
|
||||
return a, a.moveToPage(page.LogsPage)
|
||||
case key.Matches(msg, keys.Help):
|
||||
a.ToggleHelp()
|
||||
return a, nil
|
||||
}
|
||||
return a, nil
|
||||
case key.Matches(msg, keys.Logs):
|
||||
return a, a.moveToPage(page.LogsPage)
|
||||
case key.Matches(msg, keys.Help):
|
||||
a.ToggleHelp()
|
||||
return a, nil
|
||||
}
|
||||
}
|
||||
if a.dialogVisible {
|
||||
d, cmd := a.dialog.Update(msg)
|
||||
a.dialog = d.(core.DialogCmp)
|
||||
return a, cmd
|
||||
}
|
||||
p, cmd := a.pages[a.currentPage].Update(msg)
|
||||
a.pages[a.currentPage] = p
|
||||
return a, cmd
|
||||
@@ -141,25 +165,45 @@ func (a appModel) View() string {
|
||||
if p, ok := a.pages[a.currentPage].(layout.Bindings); ok {
|
||||
bindings = append(bindings, p.BindingKeys()...)
|
||||
}
|
||||
if a.dialogVisible {
|
||||
bindings = append(bindings, a.dialog.BindingKeys()...)
|
||||
}
|
||||
a.help.SetBindings(bindings)
|
||||
components = append(components, a.help.View())
|
||||
}
|
||||
|
||||
components = append(components, a.status.View())
|
||||
|
||||
return lipgloss.JoinVertical(lipgloss.Top, components...)
|
||||
appView := lipgloss.JoinVertical(lipgloss.Top, components...)
|
||||
|
||||
if a.dialogVisible {
|
||||
overlay := a.dialog.View()
|
||||
row := lipgloss.Height(appView) / 2
|
||||
row -= lipgloss.Height(overlay) / 2
|
||||
col := lipgloss.Width(appView) / 2
|
||||
col -= lipgloss.Width(overlay) / 2
|
||||
appView = layout.PlaceOverlay(
|
||||
col,
|
||||
row,
|
||||
overlay,
|
||||
appView,
|
||||
true,
|
||||
)
|
||||
}
|
||||
return appView
|
||||
}
|
||||
|
||||
func New() tea.Model {
|
||||
func New(app *app.App) tea.Model {
|
||||
return &appModel{
|
||||
currentPage: page.ReplPage,
|
||||
loadedPages: make(map[page.PageID]bool),
|
||||
status: core.NewStatusCmp(),
|
||||
help: core.NewHelpCmp(),
|
||||
dialog: core.NewDialogCmp(),
|
||||
pages: map[page.PageID]tea.Model{
|
||||
page.LogsPage: page.NewLogsPage(),
|
||||
page.InitPage: page.NewInitPage(),
|
||||
page.ReplPage: page.NewReplPage(),
|
||||
page.ReplPage: page.NewReplPage(app),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user