mirror of
https://github.com/diamondburned/cchat-gtk.git
synced 2024-11-16 03:02:45 +00:00
152 lines
2.8 KiB
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
|
|
}
|