2020-04-14 03:14:49 +01:00
|
|
|
package ui
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (d *Driver) realId(id string) string {
|
|
|
|
return fmt.Sprintf("%v:%v", d.menu.Name, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) Value(id string, into *string) error {
|
2020-04-14 12:12:37 +01:00
|
|
|
for _, valueable := range d.allValueables() {
|
2020-04-14 03:14:49 +01:00
|
|
|
if valueable.id() == d.realId(id) {
|
|
|
|
*into = valueable.value()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find valueable widget %v:%v", d.menu.Name, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) SetValue(id, value string) error {
|
2020-04-14 12:12:37 +01:00
|
|
|
for _, valueable := range d.allValueables() {
|
2020-04-14 03:14:49 +01:00
|
|
|
if valueable.id() == d.realId(id) {
|
|
|
|
valueable.setValue(value)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find valueable widget %v:%v", d.menu.Name, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) ValueBool(id string, into *bool) error {
|
|
|
|
var vStr string
|
|
|
|
if err := d.Value(id, &vStr); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
*into = vStr == "1"
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) SetValueBool(id string, value bool) error {
|
|
|
|
vStr := "0"
|
|
|
|
if value {
|
|
|
|
vStr = "1"
|
|
|
|
}
|
|
|
|
|
|
|
|
return d.SetValue(id, vStr)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) SetFreeze(id string, value bool) error {
|
2020-04-14 12:12:37 +01:00
|
|
|
for _, freezable := range d.allFreezables() {
|
2020-04-14 03:14:49 +01:00
|
|
|
if freezable.id() == d.realId(id) {
|
|
|
|
freezable.setFreezeState(value)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find clickable widget %v:%v", d.menu.Name, id)
|
|
|
|
}
|
|
|
|
|
2020-04-19 18:21:08 +01:00
|
|
|
func (d *Driver) ToggleActive(locator string) error {
|
|
|
|
if widget := d.findWidget(locator); widget != nil {
|
|
|
|
widget.Active = !widget.Active
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find activatable widget %v to toggle", locator)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) SetActive(locator string, value bool) error {
|
|
|
|
if widget := d.findWidget(locator); widget != nil {
|
|
|
|
widget.Active = value
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find activeatable widget %v to set to %v", locator, value)
|
|
|
|
}
|
|
|
|
|
2020-04-14 03:14:49 +01:00
|
|
|
func (d *Driver) OnClick(id string, f func()) error {
|
2020-04-14 12:12:37 +01:00
|
|
|
for _, clickable := range d.allClickables() {
|
2020-04-14 03:14:49 +01:00
|
|
|
if clickable.id() == d.realId(id) {
|
|
|
|
clickable.onClick(f)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find clickable widget %v:%v", d.menu.Name, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
// FIXME: HURK. Surely I'm missing something? steps is value:offset
|
|
|
|
func (d *Driver) ConfigureSlider(id string, steps map[int]int) error {
|
2020-04-14 12:12:37 +01:00
|
|
|
for _, clickable := range d.activeClickables() {
|
2020-04-14 03:14:49 +01:00
|
|
|
if slider, ok := clickable.(*slider); ok && slider.id() == d.realId(id) {
|
|
|
|
slider.steps = steps
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Errorf("Couldn't find slider %v:%v", d.menu.Name, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) ValueInt(id string, into *int) error {
|
|
|
|
var vStr string
|
|
|
|
if err := d.Value(id, &vStr); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
value, err := strconv.Atoi(vStr)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
*into = value
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Driver) SetValueInt(id string, value int) error {
|
|
|
|
vStr := strconv.Itoa(value)
|
|
|
|
|
|
|
|
return d.SetValue(id, vStr)
|
|
|
|
}
|