added model switcher
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"charm.land/bubbles/v2/list"
|
||||
tea "charm.land/bubbletea/v2"
|
||||
)
|
||||
|
||||
type modelPicker struct {
|
||||
focus *focusState
|
||||
logger slog.Logger
|
||||
list list.Model
|
||||
}
|
||||
|
||||
type modelsLoadedMsg struct{ models []string }
|
||||
type modelsErrMsg struct{ err error }
|
||||
type modelChosenMsg struct{ id string }
|
||||
|
||||
type modelItem struct{ name string }
|
||||
func (i modelItem) FilterValue() string { return i.name }
|
||||
func (i modelItem) Title() string { return i.name }
|
||||
func (i modelItem) Description() string { return i.name }
|
||||
|
||||
func newModelPicker(focus *focusState) modelPicker {
|
||||
l := list.New(nil, list.NewDefaultDelegate(), 0, 0)
|
||||
l.Title = "Choose a model"
|
||||
return modelPicker{list: l, logger: *slog.Default().With("Component", "ModelPicker"), focus: focus}
|
||||
}
|
||||
|
||||
func (p *modelPicker) SetSize(w, h int) {
|
||||
p.list.SetSize(w, h)
|
||||
}
|
||||
|
||||
func (p modelPicker) Update(msg tea.Msg) (modelPicker, tea.Cmd) {
|
||||
switch msg := msg.(type) {
|
||||
case modelsLoadedMsg:
|
||||
p.logger.Debug("Received modelsLoadedMsg", "models", msg.models)
|
||||
items := make([]list.Item, len(msg.models))
|
||||
for i, m := range msg.models {
|
||||
items[i] = modelItem{ name: m}
|
||||
}
|
||||
return p, p.list.SetItems(items)
|
||||
case tea.KeyPressMsg:
|
||||
if msg.String() == "enter" {
|
||||
p.logger.Debug("Selecting model", "model", p.list.SelectedItem())
|
||||
if it, ok := p.list.SelectedItem().(modelItem); ok {
|
||||
*p.focus = focusChat
|
||||
p.logger.Debug("Sending modelChosenMsg")
|
||||
return p, func() tea.Msg { return modelChosenMsg{it.name} }
|
||||
}
|
||||
}
|
||||
}
|
||||
var cmd tea.Cmd
|
||||
p.list, cmd = p.list.Update(msg)
|
||||
return p, cmd
|
||||
}
|
||||
|
||||
func (p modelPicker) View() string {
|
||||
return p.list.View()
|
||||
}
|
||||
Reference in New Issue
Block a user