|
@@ -14,7 +14,6 @@ import (
|
|
|
"github.com/kujtimiihoxha/opencode/internal/message"
|
|
"github.com/kujtimiihoxha/opencode/internal/message"
|
|
|
"github.com/kujtimiihoxha/opencode/internal/pubsub"
|
|
"github.com/kujtimiihoxha/opencode/internal/pubsub"
|
|
|
"github.com/kujtimiihoxha/opencode/internal/session"
|
|
"github.com/kujtimiihoxha/opencode/internal/session"
|
|
|
- "github.com/kujtimiihoxha/opencode/internal/tui/layout"
|
|
|
|
|
"github.com/kujtimiihoxha/opencode/internal/tui/styles"
|
|
"github.com/kujtimiihoxha/opencode/internal/tui/styles"
|
|
|
"github.com/kujtimiihoxha/opencode/internal/tui/util"
|
|
"github.com/kujtimiihoxha/opencode/internal/tui/util"
|
|
|
)
|
|
)
|
|
@@ -26,7 +25,6 @@ type cacheItem struct {
|
|
|
type messagesCmp struct {
|
|
type messagesCmp struct {
|
|
|
app *app.App
|
|
app *app.App
|
|
|
width, height int
|
|
width, height int
|
|
|
- writingMode bool
|
|
|
|
|
viewport viewport.Model
|
|
viewport viewport.Model
|
|
|
session session.Session
|
|
session session.Session
|
|
|
messages []message.Message
|
|
messages []message.Message
|
|
@@ -38,6 +36,32 @@ type messagesCmp struct {
|
|
|
}
|
|
}
|
|
|
type renderFinishedMsg struct{}
|
|
type renderFinishedMsg struct{}
|
|
|
|
|
|
|
|
|
|
+type MessageKeys struct {
|
|
|
|
|
+ PageDown key.Binding
|
|
|
|
|
+ PageUp key.Binding
|
|
|
|
|
+ HalfPageUp key.Binding
|
|
|
|
|
+ HalfPageDown key.Binding
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+var messageKeys = MessageKeys{
|
|
|
|
|
+ PageDown: key.NewBinding(
|
|
|
|
|
+ key.WithKeys("pgdown"),
|
|
|
|
|
+ key.WithHelp("f/pgdn", "page down"),
|
|
|
|
|
+ ),
|
|
|
|
|
+ PageUp: key.NewBinding(
|
|
|
|
|
+ key.WithKeys("pgup"),
|
|
|
|
|
+ key.WithHelp("b/pgup", "page up"),
|
|
|
|
|
+ ),
|
|
|
|
|
+ HalfPageUp: key.NewBinding(
|
|
|
|
|
+ key.WithKeys("ctrl+u"),
|
|
|
|
|
+ key.WithHelp("ctrl+u", "½ page up"),
|
|
|
|
|
+ ),
|
|
|
|
|
+ HalfPageDown: key.NewBinding(
|
|
|
|
|
+ key.WithKeys("ctrl+d", "ctrl+d"),
|
|
|
|
|
+ key.WithHelp("ctrl+d", "½ page down"),
|
|
|
|
|
+ ),
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func (m *messagesCmp) Init() tea.Cmd {
|
|
func (m *messagesCmp) Init() tea.Cmd {
|
|
|
return tea.Batch(m.viewport.Init(), m.spinner.Tick)
|
|
return tea.Batch(m.viewport.Init(), m.spinner.Tick)
|
|
|
}
|
|
}
|
|
@@ -45,8 +69,7 @@ func (m *messagesCmp) Init() tea.Cmd {
|
|
|
func (m *messagesCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
func (m *messagesCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
|
var cmds []tea.Cmd
|
|
var cmds []tea.Cmd
|
|
|
switch msg := msg.(type) {
|
|
switch msg := msg.(type) {
|
|
|
- case EditorFocusMsg:
|
|
|
|
|
- m.writingMode = bool(msg)
|
|
|
|
|
|
|
+
|
|
|
case SessionSelectedMsg:
|
|
case SessionSelectedMsg:
|
|
|
if msg.ID != m.session.ID {
|
|
if msg.ID != m.session.ID {
|
|
|
cmd := m.SetSession(msg)
|
|
cmd := m.SetSession(msg)
|
|
@@ -63,10 +86,6 @@ func (m *messagesCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
|
case renderFinishedMsg:
|
|
case renderFinishedMsg:
|
|
|
m.rendering = false
|
|
m.rendering = false
|
|
|
m.viewport.GotoBottom()
|
|
m.viewport.GotoBottom()
|
|
|
- case tea.KeyMsg:
|
|
|
|
|
- if m.writingMode {
|
|
|
|
|
- return m, nil
|
|
|
|
|
- }
|
|
|
|
|
case pubsub.Event[message.Message]:
|
|
case pubsub.Event[message.Message]:
|
|
|
needsRerender := false
|
|
needsRerender := false
|
|
|
if msg.Type == pubsub.CreatedEvent {
|
|
if msg.Type == pubsub.CreatedEvent {
|
|
@@ -326,22 +345,14 @@ func (m *messagesCmp) working() string {
|
|
|
func (m *messagesCmp) help() string {
|
|
func (m *messagesCmp) help() string {
|
|
|
text := ""
|
|
text := ""
|
|
|
|
|
|
|
|
- if m.writingMode {
|
|
|
|
|
|
|
+ if m.app.CoderAgent.IsBusy() {
|
|
|
text += lipgloss.JoinHorizontal(
|
|
text += lipgloss.JoinHorizontal(
|
|
|
lipgloss.Left,
|
|
lipgloss.Left,
|
|
|
styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render("press "),
|
|
styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render("press "),
|
|
|
styles.BaseStyle.Foreground(styles.Forground).Bold(true).Render("esc"),
|
|
styles.BaseStyle.Foreground(styles.Forground).Bold(true).Render("esc"),
|
|
|
- styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render(" to exit writing mode"),
|
|
|
|
|
- )
|
|
|
|
|
- } else {
|
|
|
|
|
- text += lipgloss.JoinHorizontal(
|
|
|
|
|
- lipgloss.Left,
|
|
|
|
|
- styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render("press "),
|
|
|
|
|
- styles.BaseStyle.Foreground(styles.Forground).Bold(true).Render("i"),
|
|
|
|
|
- styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render(" to start writing"),
|
|
|
|
|
|
|
+ styles.BaseStyle.Foreground(styles.ForgroundDim).Bold(true).Render(" to exit cancel"),
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
return styles.BaseStyle.
|
|
return styles.BaseStyle.
|
|
|
Width(m.width).
|
|
Width(m.width).
|
|
|
Render(text)
|
|
Render(text)
|
|
@@ -398,18 +409,26 @@ func (m *messagesCmp) SetSession(session session.Session) tea.Cmd {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (m *messagesCmp) BindingKeys() []key.Binding {
|
|
func (m *messagesCmp) BindingKeys() []key.Binding {
|
|
|
- bindings := layout.KeyMapToSlice(m.viewport.KeyMap)
|
|
|
|
|
- return bindings
|
|
|
|
|
|
|
+ return []key.Binding{
|
|
|
|
|
+ m.viewport.KeyMap.PageDown,
|
|
|
|
|
+ m.viewport.KeyMap.PageUp,
|
|
|
|
|
+ m.viewport.KeyMap.HalfPageUp,
|
|
|
|
|
+ m.viewport.KeyMap.HalfPageDown,
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewMessagesCmp(app *app.App) tea.Model {
|
|
func NewMessagesCmp(app *app.App) tea.Model {
|
|
|
s := spinner.New()
|
|
s := spinner.New()
|
|
|
s.Spinner = spinner.Pulse
|
|
s.Spinner = spinner.Pulse
|
|
|
|
|
+ vp := viewport.New(0, 0)
|
|
|
|
|
+ vp.KeyMap.PageUp = messageKeys.PageUp
|
|
|
|
|
+ vp.KeyMap.PageDown = messageKeys.PageDown
|
|
|
|
|
+ vp.KeyMap.HalfPageUp = messageKeys.HalfPageUp
|
|
|
|
|
+ vp.KeyMap.HalfPageDown = messageKeys.HalfPageDown
|
|
|
return &messagesCmp{
|
|
return &messagesCmp{
|
|
|
app: app,
|
|
app: app,
|
|
|
- writingMode: true,
|
|
|
|
|
cachedContent: make(map[string]cacheItem),
|
|
cachedContent: make(map[string]cacheItem),
|
|
|
- viewport: viewport.New(0, 0),
|
|
|
|
|
|
|
+ viewport: vp,
|
|
|
spinner: s,
|
|
spinner: s,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|