package fields import ( "bubble/types" "fmt" tea "github.com/charmbracelet/bubbletea" ) // CheckboxModel структура описывающая модель выбора из двух состояний да и нет type CheckboxModel struct { label string //Имя поля description string //Описание поля checked bool //Выбранное состояние validate types.BoolValidateFunc //Функция валидации err error //Поле ошибки валидации } // NewCheckboxModel создаем новую модель выбора func NewCheckboxModel(label, description string, checked bool, validator types.BoolValidateFunc) *CheckboxModel { checkbox := &CheckboxModel{ label: label, description: description, validate: validator, checked: checked, } checkbox.CheckboxValidate() return checkbox } func (m *CheckboxModel) Init() tea.Cmd { return nil } // Update отслеживает действия с полем func (m *CheckboxModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: //Отслеживает нажатия клавиш. switch msg.String() { case " ", "enter": //Если был нажат enter или space, то меняем текущее значение на противоположное m.checked = !m.checked m.CheckboxValidate() } } return m, nil } func (m *CheckboxModel) View() string { res := fmt.Sprintf("%s: ", m.label) if m.checked { res += "[x]" } else { res += "[ ]" } if m.err != nil { res += fmt.Sprintf("\nОшибка валидации: %s", m.err) } else if m.description != "" { res += fmt.Sprintf("\n%s", m.description) } return res } func (m *CheckboxModel) Focus() { } func (m *CheckboxModel) Blur() { } func (m *CheckboxModel) CaptureKeys() bool { return false } func (m *CheckboxModel) GetLabel() string { return m.label } func (m *CheckboxModel) GetValue() interface{} { return m.checked } func (m *CheckboxModel) CheckboxValidate() { if m.validate != nil { m.err = m.validate(m.checked) } }