Files
MujicaUI/regenerate_menu.go
T

92 lines
2.6 KiB
Go

package mujica
import (
"log/slog"
"github.com/egoist/mygo/ui"
"mujicaui/icons"
)
// RegenerateKind is what a RegenerateMenu choice asks for.
type RegenerateKind int
const (
// RegenerateAgain retries with the same model.
RegenerateAgain RegenerateKind = iota
// RegenerateModel retries with Choice.Model.
RegenerateModel
// RegenerateVariant retries asking for Choice.Variant, such as longer or shorter.
RegenerateVariant
)
// RegenerateChoice is the retry the user picked.
type RegenerateChoice struct {
Kind RegenerateKind
Model string
Variant string
}
// RegenerateMenuOptions configure a RegenerateMenu.
type RegenerateMenuOptions struct {
// Models lists models to retry with; Current is left out.
Models []string
Current string
// Variants replaces the built-in Longer, Shorter, Simpler and More detailed.
Variants []string
Disabled bool
}
// RegenerateMenuView is a built menu and the chosen retry.
type RegenerateMenuView struct {
Element *ui.Element
Chosen bool
Choice RegenerateChoice
}
// RegenerateMenu offers retry, another model, and rewrite variants.
func RegenerateMenu(c *ui.Context, opts RegenerateMenuOptions) RegenerateMenuView {
variants := opts.Variants
if variants == nil {
for _, key := range []string{"regenerate_menu.longer", "regenerate_menu.shorter", "regenerate_menu.simpler", "regenerate_menu.detailed"} {
variants = append(variants, msg(c, key))
}
}
var v RegenerateMenuView
pick := func(ch RegenerateChoice) { v.Chosen, v.Choice = true, ch }
v.Element = DropdownMenu(c, msg(c, "regenerate_menu.regenerate"), DropdownMenuOptions{Icon: icons.Must("refresh-cw"), Disabled: opts.Disabled}, func(m *PopupMenu) {
if m.Item(msg(c, "regenerate_menu.again"), PopupMenuItemOptions{}) {
pick(RegenerateChoice{Kind: RegenerateAgain})
}
others := 0
for _, model := range opts.Models {
if model != opts.Current {
others++
}
}
m.Submenu(msg(c, "regenerate_menu.model"), PopupMenuItemOptions{Disabled: others == 0}, func(m *PopupMenu) {
for _, model := range opts.Models {
if model != opts.Current && m.Item(model, PopupMenuItemOptions{}) {
pick(RegenerateChoice{Kind: RegenerateModel, Model: model})
}
}
})
m.Separator()
m.Group(msg(c, "regenerate_menu.variants"), func() {
for _, variant := range variants {
if m.Item(variant, PopupMenuItemOptions{}) {
pick(RegenerateChoice{Kind: RegenerateVariant, Variant: variant})
}
}
})
})
v.Element.AlignSelf(ui.Start)
if v.Element.IsDisabled() {
v.Chosen = false
}
if v.Chosen {
slog.Debug("mujica: regenerate_menu choose", "kind", v.Choice.Kind, "model", v.Choice.Model, "variant", v.Choice.Variant)
}
return v
}