radiobutton_group.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. )
  6. type _RadioData struct {
  7. btn *RadioButton
  8. value string
  9. data interface{}
  10. }
  11. type RadioGroup struct {
  12. id string
  13. rds []*_RadioData
  14. command *Command
  15. }
  16. func NewRadioGroup() *RadioGroup {
  17. id := makeNamedId("atk_radiogroup")
  18. evalSetValue(id, "")
  19. return &RadioGroup{id, nil, &Command{}}
  20. }
  21. func (w *RadioGroup) IsValid() bool {
  22. return w.id != ""
  23. }
  24. func (w *RadioGroup) findRadio(btn *RadioButton) *_RadioData {
  25. for _, rd := range w.rds {
  26. if rd.btn == btn {
  27. return rd
  28. }
  29. }
  30. return nil
  31. }
  32. func (w *RadioGroup) findRadioByValue(value string) *_RadioData {
  33. for _, rd := range w.rds {
  34. if rd.value == value {
  35. return rd
  36. }
  37. }
  38. return nil
  39. }
  40. func (w *RadioGroup) AddNewRadio(parent Widget, text string, data interface{}, attributes ...*WidgetAttr) *RadioButton {
  41. btn := NewRadioButton(parent, text, attributes...)
  42. w.AddRadio(btn, data)
  43. return btn
  44. }
  45. func (w *RadioGroup) AddRadios(btns ...*RadioButton) error {
  46. for _, btn := range btns {
  47. w.AddRadio(btn, nil)
  48. }
  49. return nil
  50. }
  51. func (w *RadioGroup) AddRadio(btn *RadioButton, data interface{}) error {
  52. if w.findRadio(btn) != nil {
  53. return ErrExist
  54. }
  55. if !IsValidWidget(btn) {
  56. return ErrInvalid
  57. }
  58. value := makeNamedId("atk_radiovalue")
  59. err := eval(fmt.Sprintf("%v configure -variable {%v} -value {%v}", btn.Id(), w.id, value))
  60. if err != nil {
  61. return err
  62. }
  63. w.rds = append(w.rds, &_RadioData{btn, value, data})
  64. btn.OnCommand(w.command.Invoke)
  65. return nil
  66. }
  67. func (w *RadioGroup) SetRadioData(btn *RadioButton, data interface{}) error {
  68. rd := w.findRadio(btn)
  69. if rd == nil {
  70. return ErrNotExist
  71. }
  72. rd.data = data
  73. return nil
  74. }
  75. func (w *RadioGroup) RadioList() (lst []*RadioButton) {
  76. for _, v := range w.rds {
  77. lst = append(lst, v.btn)
  78. }
  79. return
  80. }
  81. func (w *RadioGroup) WidgetList() (lst []Widget) {
  82. for _, v := range w.rds {
  83. lst = append(lst, v.btn)
  84. }
  85. return
  86. }
  87. func (w *RadioGroup) SetCheckedRadio(btn *RadioButton) error {
  88. rd := w.findRadio(btn)
  89. if rd == nil {
  90. return ErrInvalid
  91. }
  92. evalSetValue(w.id, rd.value)
  93. return nil
  94. }
  95. func (w *RadioGroup) CheckedRadio() *RadioButton {
  96. s := w.checkedValue()
  97. rd := w.findRadioByValue(s)
  98. if rd != nil {
  99. return rd.btn
  100. }
  101. return nil
  102. }
  103. func (w *RadioGroup) SetCheckedIndex(index int) error {
  104. if index < 0 || index > len(w.rds) {
  105. return ErrInvalid
  106. }
  107. evalSetValue(w.id, w.rds[index].value)
  108. return nil
  109. }
  110. func (w *RadioGroup) CheckedIndex() int {
  111. s := w.checkedValue()
  112. for n, rd := range w.rds {
  113. if rd.value == s {
  114. return n
  115. }
  116. }
  117. return -1
  118. }
  119. func (w *RadioGroup) checkedValue() string {
  120. return evalGetValue(w.id)
  121. }
  122. func (w *RadioGroup) CheckedData() interface{} {
  123. s := w.checkedValue()
  124. rd := w.findRadioByValue(s)
  125. if rd != nil {
  126. return rd.data
  127. }
  128. return nil
  129. }
  130. func (w *RadioGroup) RadioData(btn *RadioButton) interface{} {
  131. rd := w.findRadio(btn)
  132. if rd == nil {
  133. return nil
  134. }
  135. return rd.data
  136. }
  137. func (w *RadioGroup) OnRadioChanged(fn func()) error {
  138. if fn == nil {
  139. return ErrInvalid
  140. }
  141. w.command.Bind(fn)
  142. return nil
  143. }