Golang WALKで書いた5chビューアunkarAppの不具合を修正するときに簡単にできなかったので書きたいと思います。

やりたいことは、ラジオボタンのチェックを変更するだけです。

まずは

    prevRb *walk.RadioButton

    nextRb *walk.RadioButton

    prevRb.SetChecked(false)

    nextRb.SetChecked(true)

で以前のチェックを外し新しく選択するラジオボタンにチェックを入れようとしました。

しかしなんかUIの動きが変。

調べてみると、ラジオボタンを包括するラジオボタングループに選択状態が反映されていないことに気付きました。

  nextRb.SetChecked(true)

    rbg := nextRb.Group()

    if rbg.CheckButton() != nextRb {

        // ここにくる

    } 

そこでライブラリ内のコードを眺めているとPropertyにCheckedValueというのがありました。

   rb.MustRegisterProperty("CheckedValue", NewProperty(
        func() interface{} {
            if rb.Checked() {
                return rb.value
            }

            return nil
        },
        func(v interface{}) error {
            checked := v == rb.value
            if checked {
                rb.group.checkedButton = rb
            }
            rb.SetChecked(checked)

            return nil
        },
        rb.CheckedChanged()))

だと、rb.group.checkedButton = rb とセットしてくれます。

このプロパティはチェック状態(true/false)を渡すのではなくRadioButtonの値と比較する現在の値を渡す形になっています。

        for _, rb := range rbList {
            prop := rb.AsWindowBase().Property("CheckedValue")
            prop.Set("two")
        }

ここで、rbListはラジオボタンの配列[8](*walk.RadioButton)です。この例だと値が"two"のラジオボタンのチェック状態がtrueになり、それ以外はfalseになります。

希望としては、nextRb.SetChecked(true)で前のチェックのオフ、nextRb.Group()..CheckButton()の自動反映をしてほしいところですが仕方ありません。CheckedValueプロパティで我慢しようと思います。