diff options
Diffstat (limited to 'confirm.go')
-rw-r--r-- | confirm.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/confirm.go b/confirm.go new file mode 100644 index 0000000..a7d4748 --- /dev/null +++ b/confirm.go @@ -0,0 +1,92 @@ +package main + +import ( + "fmt" + + "github.com/charmbracelet/bubbles/viewport" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" +) + +type confirmModel struct { + ready bool + doRun bool + selected item + viewport viewport.Model + returnTo selectingModel +} + +func switchToConfirm(m selectingModel) (confirmModel, tea.Cmd) { + model := confirmModel{ + selected: m.list.SelectedItem().(item), + returnTo: m, + } + return model, model.Init() +} + +func (m confirmModel) View() string { + if !m.ready { + return "Initialising..." + } + + return appStyle.Render(fmt.Sprintf("%s\n%s\n%s", m.headerView(), m.viewport.View(), m.footerView())) +} + +func (m confirmModel) Init() tea.Cmd { + return func() tea.Msg { + // FIXME: Hacky way to get a WindowSizeMsg event sent + frame_h, frame_v := appStyle.GetFrameSize() + return tea.WindowSizeMsg{ + Height: m.returnTo.list.Height() + frame_v, + Width: m.returnTo.list.Width() + frame_h, + } + } +} + +func (m confirmModel) headerView() string { + return confirmTitleStyle.Render(m.selected.title) +} +func (m confirmModel) footerView() string { + out := areYouSureTextStyle.Render("Are you sure?") + out += subtleTextStyle.Render(" RET to continue, q to go back, ctrl+c to quit") + return out +} + +func (m confirmModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + var cmds []tea.Cmd + + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + + case "enter": + m.doRun = true + return m, tea.Quit + case "ctrl-c": + return m, tea.Quit + case "q": + return m.returnTo, nil + } + case tea.WindowSizeMsg: + padding_h, padding_v := appStyle.GetFrameSize() + headerHeight := lipgloss.Height(m.headerView()) + footerHeight := lipgloss.Height(m.footerView()) + verticalMarginHeight := headerHeight + footerHeight + padding_v + + if !m.ready { + m.viewport = viewport.New(msg.Width-padding_h, msg.Height-verticalMarginHeight) + m.viewport.YPosition = headerHeight + padding_v + 1 + m.viewport.SetContent(m.selected.contents) + m.ready = true + } else { + m.viewport.Width = msg.Width - padding_h + m.viewport.Height = msg.Height - verticalMarginHeight - padding_v + } + } + + // Handle keyboard and mouse events in the viewport + var cmd tea.Cmd + m.viewport, cmd = m.viewport.Update(msg) + cmds = append(cmds, cmd) + return m, tea.Batch(cmds...) +} |