| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- // Copyright 2018 visualfc. All rights reserved.
- package tk
- import (
- "fmt"
- )
- type _RadioData struct {
- btn *RadioButton
- value string
- data interface{}
- }
- type RadioGroup struct {
- id string
- rds []*_RadioData
- command *Command
- }
- func NewRadioGroup() *RadioGroup {
- id := makeNamedId("atk_radiogroup")
- evalSetValue(id, "")
- return &RadioGroup{id, nil, &Command{}}
- }
- func (w *RadioGroup) IsValid() bool {
- return w.id != ""
- }
- func (w *RadioGroup) findRadio(btn *RadioButton) *_RadioData {
- for _, rd := range w.rds {
- if rd.btn == btn {
- return rd
- }
- }
- return nil
- }
- func (w *RadioGroup) findRadioByValue(value string) *_RadioData {
- for _, rd := range w.rds {
- if rd.value == value {
- return rd
- }
- }
- return nil
- }
- func (w *RadioGroup) AddNewRadio(parent Widget, text string, data interface{}, attributes ...*WidgetAttr) *RadioButton {
- btn := NewRadioButton(parent, text, attributes...)
- w.AddRadio(btn, data)
- return btn
- }
- func (w *RadioGroup) AddRadios(btns ...*RadioButton) error {
- for _, btn := range btns {
- w.AddRadio(btn, nil)
- }
- return nil
- }
- func (w *RadioGroup) AddRadio(btn *RadioButton, data interface{}) error {
- if w.findRadio(btn) != nil {
- return ErrExist
- }
- if !IsValidWidget(btn) {
- return ErrInvalid
- }
- value := makeNamedId("atk_radiovalue")
- err := eval(fmt.Sprintf("%v configure -variable {%v} -value {%v}", btn.Id(), w.id, value))
- if err != nil {
- return err
- }
- w.rds = append(w.rds, &_RadioData{btn, value, data})
- btn.OnCommand(w.command.Invoke)
- return nil
- }
- func (w *RadioGroup) SetRadioData(btn *RadioButton, data interface{}) error {
- rd := w.findRadio(btn)
- if rd == nil {
- return ErrNotExist
- }
- rd.data = data
- return nil
- }
- func (w *RadioGroup) RadioList() (lst []*RadioButton) {
- for _, v := range w.rds {
- lst = append(lst, v.btn)
- }
- return
- }
- func (w *RadioGroup) WidgetList() (lst []Widget) {
- for _, v := range w.rds {
- lst = append(lst, v.btn)
- }
- return
- }
- func (w *RadioGroup) SetCheckedRadio(btn *RadioButton) error {
- rd := w.findRadio(btn)
- if rd == nil {
- return ErrInvalid
- }
- evalSetValue(w.id, rd.value)
- return nil
- }
- func (w *RadioGroup) CheckedRadio() *RadioButton {
- s := w.checkedValue()
- rd := w.findRadioByValue(s)
- if rd != nil {
- return rd.btn
- }
- return nil
- }
- func (w *RadioGroup) SetCheckedIndex(index int) error {
- if index < 0 || index > len(w.rds) {
- return ErrInvalid
- }
- evalSetValue(w.id, w.rds[index].value)
- return nil
- }
- func (w *RadioGroup) CheckedIndex() int {
- s := w.checkedValue()
- for n, rd := range w.rds {
- if rd.value == s {
- return n
- }
- }
- return -1
- }
- func (w *RadioGroup) checkedValue() string {
- return evalGetValue(w.id)
- }
- func (w *RadioGroup) CheckedData() interface{} {
- s := w.checkedValue()
- rd := w.findRadioByValue(s)
- if rd != nil {
- return rd.data
- }
- return nil
- }
- func (w *RadioGroup) RadioData(btn *RadioButton) interface{} {
- rd := w.findRadio(btn)
- if rd == nil {
- return nil
- }
- return rd.data
- }
- func (w *RadioGroup) OnRadioChanged(fn func()) error {
- if fn == nil {
- return ErrInvalid
- }
- w.command.Bind(fn)
- return nil
- }
|