erm/vendor/github.com/lxn/walk/radiobutton.go
2021-07-30 23:29:20 +01:00

136 lines
2.6 KiB
Go

// Copyright 2010 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build windows
package walk
import (
"github.com/lxn/win"
)
type RadioButtonGroup struct {
buttons []*RadioButton
checkedButton *RadioButton
}
func (rbg *RadioButtonGroup) Buttons() []*RadioButton {
buttons := make([]*RadioButton, len(rbg.buttons))
copy(buttons, rbg.buttons)
return buttons
}
func (rbg *RadioButtonGroup) CheckedButton() *RadioButton {
return rbg.checkedButton
}
type radioButtonish interface {
radioButton() *RadioButton
}
type RadioButton struct {
Button
group *RadioButtonGroup
value interface{}
}
func NewRadioButton(parent Container) (*RadioButton, error) {
rb := new(RadioButton)
if count := parent.Children().Len(); count > 0 {
if prevRB, ok := parent.Children().At(count - 1).(radioButtonish); ok {
rb.group = prevRB.radioButton().group
}
}
var groupBit uint32
if rb.group == nil {
groupBit = win.WS_GROUP
rb.group = new(RadioButtonGroup)
}
if err := InitWidget(
rb,
parent,
"BUTTON",
groupBit|win.WS_TABSTOP|win.WS_VISIBLE|win.BS_AUTORADIOBUTTON,
0); err != nil {
return nil, err
}
rb.Button.init()
rb.SetBackground(nullBrushSingleton)
rb.GraphicsEffects().Add(InteractionEffect)
rb.GraphicsEffects().Add(FocusEffect)
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.buttons = append(rb.group.buttons, rb)
return rb, nil
}
func (rb *RadioButton) radioButton() *RadioButton {
return rb
}
func (rb *RadioButton) TextOnLeftSide() bool {
return rb.hasStyleBits(win.BS_LEFTTEXT)
}
func (rb *RadioButton) SetTextOnLeftSide(textLeft bool) error {
return rb.ensureStyleBits(win.BS_LEFTTEXT, textLeft)
}
func (rb *RadioButton) Group() *RadioButtonGroup {
return rb.group
}
func (rb *RadioButton) Value() interface{} {
return rb.value
}
func (rb *RadioButton) SetValue(value interface{}) {
rb.value = value
}
func (rb *RadioButton) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
switch msg {
case win.WM_COMMAND:
switch win.HIWORD(uint32(wParam)) {
case win.BN_CLICKED:
prevChecked := rb.group.checkedButton
rb.group.checkedButton = rb
if prevChecked != rb {
if prevChecked != nil {
prevChecked.setChecked(false)
}
rb.setChecked(true)
}
}
}
return rb.Button.WndProc(hwnd, msg, wParam, lParam)
}