cchat-gtk/internal/ui/config/widgets.go

152 lines
2.8 KiB
Go

package config
import (
"encoding/json"
"github.com/gotk3/gotk3/gtk"
)
// EntryValue with JSON serde capabilities.
type EntryValue interface {
json.Marshaler
json.Unmarshaler
Construct() gtk.IWidget
}
type _combo struct {
selected *int
options []string
change func(int)
}
func Combo(selected *int, options []string, change func(int)) EntryValue {
return &_combo{selected, options, change}
}
func (c *_combo) set(v int) {
*c.selected = v
if c.change != nil {
c.change(v)
}
}
func (c *_combo) Construct() gtk.IWidget {
var combo, _ = gtk.ComboBoxTextNew()
for _, opt := range c.options {
combo.Append(opt, opt)
}
combo.Connect("changed", func(combo *gtk.ComboBoxText) { c.set(combo.GetActive()) })
combo.SetActive(*c.selected)
combo.SetHAlign(gtk.ALIGN_END)
combo.Show()
return combo
}
func (c *_combo) MarshalJSON() ([]byte, error) {
return json.Marshal(*c.selected)
}
func (c *_combo) UnmarshalJSON(b []byte) error {
var value int
if err := json.Unmarshal(b, &value); err != nil {
return err
}
*c.selected = value
return nil
}
type _switch struct {
value *bool
change func(bool)
}
func Switch(value *bool, change func(bool)) EntryValue {
return &_switch{value, change}
}
func (s *_switch) set(v bool) {
*s.value = v
if s.change != nil {
s.change(v)
}
}
func (s *_switch) Construct() gtk.IWidget {
sw, _ := gtk.SwitchNew()
sw.SetActive(*s.value)
sw.Connect("notify::active", func(sw *gtk.Switch) { s.set(sw.GetActive()) })
sw.SetHAlign(gtk.ALIGN_END)
sw.Show()
return sw
}
func (s *_switch) MarshalJSON() ([]byte, error) {
return json.Marshal(*s.value)
}
func (s *_switch) UnmarshalJSON(b []byte) error {
var value bool
if err := json.Unmarshal(b, &value); err != nil {
return err
}
s.set(value)
return nil
}
type _inputentry struct {
value *string
change func(string) error
}
func InputEntry(value *string, change func(string) error) EntryValue {
return &_inputentry{value, change}
}
func (e *_inputentry) set(v string) error {
*e.value = v
if e.change != nil {
return e.change(v)
}
return nil
}
func (e *_inputentry) Construct() gtk.IWidget {
entry, _ := gtk.EntryNew()
entry.SetHExpand(true)
entry.SetText(*e.value)
entry.Connect("changed", func(entry *gtk.Entry) {
v, err := entry.GetText()
if err != nil {
return
}
if err := e.set(v); err != nil {
entry.SetIconFromIconName(gtk.ENTRY_ICON_SECONDARY, "dialog-error")
entry.SetIconTooltipText(gtk.ENTRY_ICON_SECONDARY, err.Error())
} else {
entry.RemoveIcon(gtk.ENTRY_ICON_SECONDARY)
}
})
entry.Show()
return entry
}
func (e *_inputentry) MarshalJSON() ([]byte, error) {
return json.Marshal(*e.value)
}
func (e *_inputentry) UnmarshalJSON(b []byte) error {
var value string
if err := json.Unmarshal(b, &value); err != nil {
return err
}
e.set(value)
return nil
}