add initial stuff

This commit is contained in:
Kujtim Hoxha
2025-03-23 19:19:08 +01:00
parent 796bbf4d66
commit 8daa6e774a
36 changed files with 1779 additions and 143 deletions

View File

@@ -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),
},
}
}