@@ -14,7 +14,6 @@ import (
14 "github.com/kujtimiihoxha/opencode/internal/message"
14 "github.com/kujtimiihoxha/opencode/internal/message"
15 "github.com/kujtimiihoxha/opencode/internal/pubsub"
15 "github.com/kujtimiihoxha/opencode/internal/pubsub"
16 "github.com/kujtimiihoxha/opencode/internal/session"
16 "github.com/kujtimiihoxha/opencode/internal/session"
17− "github.com/kujtimiihoxha/opencode/internal/tui/layout"
18 "github.com/kujtimiihoxha/opencode/internal/tui/styles"
17 "github.com/kujtimiihoxha/opencode/internal/tui/styles"
19 "github.com/kujtimiihoxha/opencode/internal/tui/util"
18 "github.com/kujtimiihoxha/opencode/internal/tui/util"
@@ -26,7 +25,6 @@ type cacheItem struct {
26type messagesCmp struct {
25type messagesCmp struct {
27 app *app.App
26 app *app.App
28 width, height int
27 width, height int
30 viewport viewport.Model
28 viewport viewport.Model
31 session session.Session
29 session session.Session
32 messages []message.Message
30 messages []message.Message
@@ -38,6 +36,32 @@ type messagesCmp struct {
39type renderFinishedMsg struct{}
37type renderFinishedMsg struct{}
39+type MessageKeys struct {
42+ HalfPageUp key.Binding
43+ HalfPageDown key.Binding
46+var messageKeys = MessageKeys{
47+ PageDown: key.NewBinding(
48+ key.WithKeys("pgdown"),
49+ key.WithHelp("f/pgdn", "page down"),
51+ PageUp: key.NewBinding(
52+ key.WithKeys("pgup"),
53+ key.WithHelp("b/pgup", "page up"),
55+ HalfPageUp: key.NewBinding(
56+ key.WithKeys("ctrl+u"),
57+ key.WithHelp("ctrl+u", "½ page up"),
59+ HalfPageDown: key.NewBinding(
60+ key.WithKeys("ctrl+d", "ctrl+d"),
61+ key.WithHelp("ctrl+d", "½ page down"),
41func (m *messagesCmp) Init() tea.Cmd {
65func (m *messagesCmp) Init() tea.Cmd {
42 return tea.Batch(m.viewport.Init(), m.spinner.Tick)
66 return tea.Batch(m.viewport.Init(), m.spinner.Tick)
@@ -45,8 +69,7 @@ func (m *messagesCmp) Init() tea.Cmd {
45func (m *messagesCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
69func (m *messagesCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
46 var cmds []tea.Cmd
70 var cmds []tea.Cmd
47 switch msg := msg.(type) {
71 switch msg := msg.(type) {
48− case EditorFocusMsg:
72+
49− m.writingMode = bool(msg)
50 case SessionSelectedMsg:
73 case SessionSelectedMsg:
51 if msg.ID != m.session.ID {
74 if msg.ID != m.session.ID {
52 cmd := m.SetSession(msg)
75 cmd := m.SetSession(msg)
@@ -63,10 +86,6 @@ func (m *messagesCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
63 case renderFinishedMsg:
86 case renderFinishedMsg:
64 m.rendering = false
87 m.rendering = false
65 m.viewport.GotoBottom()
88 m.viewport.GotoBottom()
70 case pubsub.Event[message.Message]:
89 case pubsub.Event[message.Message]:
71 needsRerender := false
90 needsRerender := false
72 if msg.Type == pubsub.CreatedEvent {
91 if msg.Type == pubsub.CreatedEvent {
@@ -326,22 +345,14 @@ func (m *messagesCmp) working() string {
326func (m *messagesCmp) help() string {
345func (m *messagesCmp) help() string {
327 text := ""
346 text := ""
329− if m.writingMode {
348+ if m.app.CoderAgent.IsBusy() {
330 text += lipgloss.JoinHorizontal(
349 text += lipgloss.JoinHorizontal(
331 lipgloss.Left,
350 lipgloss.Left,
332 styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render("press "),
351 styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render("press "),
333 styles.BaseStyle.Foreground(styles.Forground).Bold(true).Render("esc"),
352 styles.BaseStyle.Foreground(styles.Forground).Bold(true).Render("esc"),
334− styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render(" to exit writing mode"),
353+ styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render(" to exit cancel"),
337− text += lipgloss.JoinHorizontal(
339− styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render("press "),
340− styles.BaseStyle.Foreground(styles.Forground).Bold(true).Render("i"),
341− styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render(" to start writing"),
345 return styles.BaseStyle.
356 return styles.BaseStyle.
346 Width(m.width).
357 Width(m.width).
347 Render(text)
358 Render(text)
@@ -398,18 +409,26 @@ func (m *messagesCmp) SetSession(session session.Session) tea.Cmd {
400func (m *messagesCmp) BindingKeys() []key.Binding {
411func (m *messagesCmp) BindingKeys() []key.Binding {
401− bindings := layout.KeyMapToSlice(m.viewport.KeyMap)
402− return bindings
412+ return []key.Binding{
413+ m.viewport.KeyMap.PageDown,
414+ m.viewport.KeyMap.PageUp,
415+ m.viewport.KeyMap.HalfPageUp,
416+ m.viewport.KeyMap.HalfPageDown,
405func NewMessagesCmp(app *app.App) tea.Model {
420func NewMessagesCmp(app *app.App) tea.Model {
406 s := spinner.New()
421 s := spinner.New()
407 s.Spinner = spinner.Pulse
422 s.Spinner = spinner.Pulse
423+ vp := viewport.New(0, 0)
424+ vp.KeyMap.PageUp = messageKeys.PageUp
425+ vp.KeyMap.PageDown = messageKeys.PageDown
426+ vp.KeyMap.HalfPageUp = messageKeys.HalfPageUp
427+ vp.KeyMap.HalfPageDown = messageKeys.HalfPageDown
408 return &messagesCmp{
428 return &messagesCmp{
409 app: app,
429 app: app,
411 cachedContent: make(map[string]cacheItem),
430 cachedContent: make(map[string]cacheItem),
412− viewport: viewport.New(0, 0),
431+ viewport: vp,
413 spinner: s,
432 spinner: s,