summaryrefslogtreecommitdiffhomepage
path: root/internal/tui/components
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-05-29 15:18:47 -0500
committeradamdottv <[email protected]>2025-05-29 15:18:47 -0500
commit005d6e0bde9a42e2bebee7b712b0fe9a7be23499 (patch)
tree3e667d3237d99a95a123b8659c4f1a5c370b9e5e /internal/tui/components
parent37c0c1f358cadbc918319500cd2b1b3fcbe41a9e (diff)
downloadopencode-005d6e0bde9a42e2bebee7b712b0fe9a7be23499.tar.gz
opencode-005d6e0bde9a42e2bebee7b712b0fe9a7be23499.zip
wip: refactoring tui
Diffstat (limited to 'internal/tui/components')
-rw-r--r--internal/tui/components/chat/chat.go58
-rw-r--r--internal/tui/components/dialog/filepicker.go11
-rw-r--r--internal/tui/components/dialog/models.go257
3 files changed, 161 insertions, 165 deletions
diff --git a/internal/tui/components/chat/chat.go b/internal/tui/components/chat/chat.go
index 4fa6b27b2..7cd49ef6a 100644
--- a/internal/tui/components/chat/chat.go
+++ b/internal/tui/components/chat/chat.go
@@ -29,7 +29,7 @@ func header(width int) string {
}
func lspsConfigured(width int) string {
- cfg := config.Get()
+ // cfg := config.Get()
title := "LSP Servers"
title = ansi.Truncate(title, width, "…")
@@ -44,37 +44,37 @@ func lspsConfigured(width int) string {
// Get LSP names and sort them for consistent ordering
var lspNames []string
- for name := range cfg.LSP {
- lspNames = append(lspNames, name)
- }
+ // for name := range cfg.LSP {
+ // lspNames = append(lspNames, name)
+ // }
sort.Strings(lspNames)
var lspViews []string
- for _, name := range lspNames {
- lsp := cfg.LSP[name]
- lspName := baseStyle.
- Foreground(t.Text()).
- Render(fmt.Sprintf("• %s", name))
-
- cmd := lsp.Command
- cmd = ansi.Truncate(cmd, width-lipgloss.Width(lspName)-3, "…")
-
- lspPath := baseStyle.
- Foreground(t.TextMuted()).
- Render(fmt.Sprintf(" (%s)", cmd))
-
- lspViews = append(lspViews,
- baseStyle.
- Width(width).
- Render(
- lipgloss.JoinHorizontal(
- lipgloss.Left,
- lspName,
- lspPath,
- ),
- ),
- )
- }
+ // for _, name := range lspNames {
+ // lsp := cfg.LSP[name]
+ // lspName := baseStyle.
+ // Foreground(t.Text()).
+ // Render(fmt.Sprintf("• %s", name))
+
+ // cmd := lsp.Command
+ // cmd = ansi.Truncate(cmd, width-lipgloss.Width(lspName)-3, "…")
+
+ // lspPath := baseStyle.
+ // Foreground(t.TextMuted()).
+ // Render(fmt.Sprintf(" (%s)", cmd))
+
+ // lspViews = append(lspViews,
+ // baseStyle.
+ // Width(width).
+ // Render(
+ // lipgloss.JoinHorizontal(
+ // lipgloss.Left,
+ // lspName,
+ // lspPath,
+ // ),
+ // ),
+ // )
+ // }
return baseStyle.
Width(width).
diff --git a/internal/tui/components/dialog/filepicker.go b/internal/tui/components/dialog/filepicker.go
index 33f7599db..980ab216b 100644
--- a/internal/tui/components/dialog/filepicker.go
+++ b/internal/tui/components/dialog/filepicker.go
@@ -17,7 +17,6 @@ import (
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
- "github.com/sst/opencode/internal/config"
"github.com/sst/opencode/internal/message"
"github.com/sst/opencode/internal/status"
"github.com/sst/opencode/internal/tui/app"
@@ -239,11 +238,11 @@ func (f *filepickerCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
func (f *filepickerCmp) addAttachmentToMessage() (tea.Model, tea.Cmd) {
- modeInfo := GetSelectedModel(config.Get())
- if !modeInfo.SupportsAttachments {
- status.Error(fmt.Sprintf("Model %s doesn't support attachments", modeInfo.Name))
- return f, nil
- }
+ // modeInfo := GetSelectedModel(config.Get())
+ // if !modeInfo.SupportsAttachments {
+ // status.Error(fmt.Sprintf("Model %s doesn't support attachments", modeInfo.Name))
+ // return f, nil
+ // }
selectedFilePath := f.selectedFile
if !isExtSupported(selectedFilePath) {
diff --git a/internal/tui/components/dialog/models.go b/internal/tui/components/dialog/models.go
index d919b5303..1d8c4f495 100644
--- a/internal/tui/components/dialog/models.go
+++ b/internal/tui/components/dialog/models.go
@@ -1,15 +1,10 @@
package dialog
import (
- "fmt"
- "slices"
- "strings"
-
"github.com/charmbracelet/bubbles/key"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/sst/opencode/internal/config"
- "github.com/sst/opencode/internal/llm/models"
"github.com/sst/opencode/internal/tui/layout"
"github.com/sst/opencode/internal/tui/styles"
"github.com/sst/opencode/internal/tui/theme"
@@ -23,7 +18,7 @@ const (
// ModelSelectedMsg is sent when a model is selected
type ModelSelectedMsg struct {
- Model models.Model
+ // Model models.Model
}
// CloseModelDialogMsg is sent when a model is selected
@@ -36,9 +31,9 @@ type ModelDialog interface {
}
type modelDialogCmp struct {
- models []models.Model
- provider models.ModelProvider
- availableProviders []models.ModelProvider
+ // models []models.Model
+ // provider models.ModelProvider
+ // availableProviders []models.ModelProvider
selectedIdx int
width int
@@ -126,7 +121,7 @@ func (m *modelDialogCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.switchProvider(1)
}
case key.Matches(msg, modelKeys.Enter):
- return m, util.CmdHandler(ModelSelectedMsg{Model: m.models[m.selectedIdx]})
+ // return m, util.CmdHandler(ModelSelectedMsg{Model: m.models[m.selectedIdx]})
case key.Matches(msg, modelKeys.Escape):
return m, util.CmdHandler(CloseModelDialogMsg{})
}
@@ -143,8 +138,8 @@ func (m *modelDialogCmp) moveSelectionUp() {
if m.selectedIdx > 0 {
m.selectedIdx--
} else {
- m.selectedIdx = len(m.models) - 1
- m.scrollOffset = max(0, len(m.models)-numVisibleModels)
+ // m.selectedIdx = len(m.models) - 1
+ // m.scrollOffset = max(0, len(m.models)-numVisibleModels)
}
// Keep selection visible
@@ -155,12 +150,12 @@ func (m *modelDialogCmp) moveSelectionUp() {
// moveSelectionDown moves the selection down or wraps to top
func (m *modelDialogCmp) moveSelectionDown() {
- if m.selectedIdx < len(m.models)-1 {
- m.selectedIdx++
- } else {
- m.selectedIdx = 0
- m.scrollOffset = 0
- }
+ // if m.selectedIdx < len(m.models)-1 {
+ // m.selectedIdx++
+ // } else {
+ // m.selectedIdx = 0
+ // m.scrollOffset = 0
+ // }
// Keep selection visible
if m.selectedIdx >= m.scrollOffset+numVisibleModels {
@@ -172,16 +167,16 @@ func (m *modelDialogCmp) switchProvider(offset int) {
newOffset := m.hScrollOffset + offset
// Ensure we stay within bounds
- if newOffset < 0 {
- newOffset = len(m.availableProviders) - 1
- }
- if newOffset >= len(m.availableProviders) {
- newOffset = 0
- }
+ // if newOffset < 0 {
+ // newOffset = len(m.availableProviders) - 1
+ // }
+ // if newOffset >= len(m.availableProviders) {
+ // newOffset = 0
+ // }
m.hScrollOffset = newOffset
- m.provider = m.availableProviders[m.hScrollOffset]
- m.setupModelsForProvider(m.provider)
+ // m.provider = m.availableProviders[m.hScrollOffset]
+ // m.setupModelsForProvider(m.provider)
}
func (m *modelDialogCmp) View() string {
@@ -189,33 +184,33 @@ func (m *modelDialogCmp) View() string {
baseStyle := styles.BaseStyle()
// Capitalize first letter of provider name
- providerName := strings.ToUpper(string(m.provider)[:1]) + string(m.provider[1:])
- title := baseStyle.
- Foreground(t.Primary()).
- Bold(true).
- Width(maxDialogWidth).
- Padding(0, 0, 1).
- Render(fmt.Sprintf("Select %s Model", providerName))
+ // providerName := strings.ToUpper(string(m.provider)[:1]) + string(m.provider[1:])
+ // title := baseStyle.
+ // Foreground(t.Primary()).
+ // Bold(true).
+ // Width(maxDialogWidth).
+ // Padding(0, 0, 1).
+ // Render(fmt.Sprintf("Select %s Model", providerName))
// Render visible models
- endIdx := min(m.scrollOffset+numVisibleModels, len(m.models))
- modelItems := make([]string, 0, endIdx-m.scrollOffset)
-
- for i := m.scrollOffset; i < endIdx; i++ {
- itemStyle := baseStyle.Width(maxDialogWidth)
- if i == m.selectedIdx {
- itemStyle = itemStyle.Background(t.Primary()).
- Foreground(t.Background()).Bold(true)
- }
- modelItems = append(modelItems, itemStyle.Render(m.models[i].Name))
- }
+ // endIdx := min(m.scrollOffset+numVisibleModels, len(m.models))
+ // modelItems := make([]string, 0, endIdx-m.scrollOffset)
+ //
+ // for i := m.scrollOffset; i < endIdx; i++ {
+ // itemStyle := baseStyle.Width(maxDialogWidth)
+ // if i == m.selectedIdx {
+ // itemStyle = itemStyle.Background(t.Primary()).
+ // Foreground(t.Background()).Bold(true)
+ // }
+ // modelItems = append(modelItems, itemStyle.Render(m.models[i].Name))
+ // }
scrollIndicator := m.getScrollIndicators(maxDialogWidth)
content := lipgloss.JoinVertical(
lipgloss.Left,
- title,
- baseStyle.Width(maxDialogWidth).Render(lipgloss.JoinVertical(lipgloss.Left, modelItems...)),
+ // title,
+ // baseStyle.Width(maxDialogWidth).Render(lipgloss.JoinVertical(lipgloss.Left, modelItems...)),
scrollIndicator,
)
@@ -230,22 +225,22 @@ func (m *modelDialogCmp) View() string {
func (m *modelDialogCmp) getScrollIndicators(maxWidth int) string {
var indicator string
- if len(m.models) > numVisibleModels {
- if m.scrollOffset > 0 {
- indicator += "↑ "
- }
- if m.scrollOffset+numVisibleModels < len(m.models) {
- indicator += "↓ "
- }
- }
+ // if len(m.models) > numVisibleModels {
+ // if m.scrollOffset > 0 {
+ // indicator += "↑ "
+ // }
+ // if m.scrollOffset+numVisibleModels < len(m.models) {
+ // indicator += "↓ "
+ // }
+ // }
if m.hScrollPossible {
if m.hScrollOffset > 0 {
indicator = "← " + indicator
}
- if m.hScrollOffset < len(m.availableProviders)-1 {
- indicator += "→"
- }
+ // if m.hScrollOffset < len(m.availableProviders)-1 {
+ // indicator += "→"
+ // }
}
if indicator == "" {
@@ -268,51 +263,52 @@ func (m *modelDialogCmp) BindingKeys() []key.Binding {
}
func (m *modelDialogCmp) setupModels() {
- cfg := config.Get()
- modelInfo := GetSelectedModel(cfg)
- m.availableProviders = getEnabledProviders(cfg)
- m.hScrollPossible = len(m.availableProviders) > 1
-
- m.provider = modelInfo.Provider
- m.hScrollOffset = findProviderIndex(m.availableProviders, m.provider)
-
- m.setupModelsForProvider(m.provider)
+ // cfg := config.Get()
+ // modelInfo := GetSelectedModel(cfg)
+ // m.availableProviders = getEnabledProviders(cfg)
+ // m.hScrollPossible = len(m.availableProviders) > 1
+ //
+ // m.provider = modelInfo.Provider
+ // m.hScrollOffset = findProviderIndex(m.availableProviders, m.provider)
+ //
+ // m.setupModelsForProvider(m.provider)
}
-func GetSelectedModel(cfg *config.Config) models.Model {
-
- agentCfg := cfg.Agents[config.AgentPrimary]
- selectedModelId := agentCfg.Model
- return models.SupportedModels[selectedModelId]
+func GetSelectedModel(cfg *config.Config) string {
+ return "Claude Sonnet 4"
+ // agentCfg := cfg.Agents[config.AgentPrimary]
+ // selectedModelId := agentCfg.Model
+ // return models.SupportedModels[selectedModelId]
}
-func getEnabledProviders(cfg *config.Config) []models.ModelProvider {
- var providers []models.ModelProvider
- for providerId, provider := range cfg.Providers {
- if !provider.Disabled {
- providers = append(providers, providerId)
- }
- }
-
- // Sort by provider popularity
- slices.SortFunc(providers, func(a, b models.ModelProvider) int {
- rA := models.ProviderPopularity[a]
- rB := models.ProviderPopularity[b]
-
- // models not included in popularity ranking default to last
- if rA == 0 {
- rA = 999
- }
- if rB == 0 {
- rB = 999
- }
- return rA - rB
- })
- return providers
+func getEnabledProviders(cfg *config.Config) []string {
+ return []string{"anthropic", "openai", "google"}
+ // var providers []models.ModelProvider
+ // for providerId, provider := range cfg.Providers {
+ // if !provider.Disabled {
+ // providers = append(providers, providerId)
+ // }
+ // }
+ //
+ // // Sort by provider popularity
+ // slices.SortFunc(providers, func(a, b models.ModelProvider) int {
+ // rA := models.ProviderPopularity[a]
+ // rB := models.ProviderPopularity[b]
+ //
+ // // models not included in popularity ranking default to last
+ // if rA == 0 {
+ // rA = 999
+ // }
+ // if rB == 0 {
+ // rB = 999
+ // }
+ // return rA - rB
+ // })
+ // return providers
}
// findProviderIndex returns the index of the provider in the list, or -1 if not found
-func findProviderIndex(providers []models.ModelProvider, provider models.ModelProvider) int {
+func findProviderIndex(providers []string, provider string) int {
for i, p := range providers {
if p == provider {
return i
@@ -321,50 +317,51 @@ func findProviderIndex(providers []models.ModelProvider, provider models.ModelPr
return -1
}
-func (m *modelDialogCmp) setupModelsForProvider(provider models.ModelProvider) {
- cfg := config.Get()
- agentCfg := cfg.Agents[config.AgentPrimary]
- selectedModelId := agentCfg.Model
+func (m *modelDialogCmp) setupModelsForProvider(provider string) {
+ // cfg := config.Get()
+ // agentCfg := cfg.Agents[config.AgentPrimary]
+ // selectedModelId := agentCfg.Model
- m.provider = provider
- m.models = getModelsForProvider(provider)
+ // m.provider = provider
+ // m.models = getModelsForProvider(provider)
m.selectedIdx = 0
m.scrollOffset = 0
// Try to select the current model if it belongs to this provider
- if provider == models.SupportedModels[selectedModelId].Provider {
- for i, model := range m.models {
- if model.ID == selectedModelId {
- m.selectedIdx = i
- // Adjust scroll position to keep selected model visible
- if m.selectedIdx >= numVisibleModels {
- m.scrollOffset = m.selectedIdx - (numVisibleModels - 1)
- }
- break
- }
- }
- }
+ // if provider == models.SupportedModels[selectedModelId].Provider {
+ // for i, model := range m.models {
+ // if model.ID == selectedModelId {
+ // m.selectedIdx = i
+ // // Adjust scroll position to keep selected model visible
+ // if m.selectedIdx >= numVisibleModels {
+ // m.scrollOffset = m.selectedIdx - (numVisibleModels - 1)
+ // }
+ // break
+ // }
+ // }
+ // }
}
-func getModelsForProvider(provider models.ModelProvider) []models.Model {
- var providerModels []models.Model
- for _, model := range models.SupportedModels {
- if model.Provider == provider {
- providerModels = append(providerModels, model)
- }
- }
+func getModelsForProvider(provider string) []string {
+ return []string{"Claude Sonnet 4"}
+ // var providerModels []models.Model
+ // for _, model := range models.SupportedModels {
+ // if model.Provider == provider {
+ // providerModels = append(providerModels, model)
+ // }
+ // }
// reverse alphabetical order (if llm naming was consistent latest would appear first)
- slices.SortFunc(providerModels, func(a, b models.Model) int {
- if a.Name > b.Name {
- return -1
- } else if a.Name < b.Name {
- return 1
- }
- return 0
- })
-
- return providerModels
+ // slices.SortFunc(providerModels, func(a, b models.Model) int {
+ // if a.Name > b.Name {
+ // return -1
+ // } else if a.Name < b.Name {
+ // return 1
+ // }
+ // return 0
+ // })
+
+ // return providerModels
}
func NewModelDialogCmp() ModelDialog {