GoSetup-bubble/setup/fields/checkbox.go

90 lines
2.2 KiB
Go
Raw Normal View History

2025-12-26 17:45:37 +05:00
package fields
import (
"bubble/types"
"fmt"
2025-12-26 17:45:37 +05:00
tea "github.com/charmbracelet/bubbletea"
)
// CheckboxModel структура описывающая модель выбора из двух состояний да и нет
2025-12-26 17:45:37 +05:00
type CheckboxModel struct {
label string //Имя поля
description string //Описание поля
checked bool //Выбранное состояние
validate types.BoolValidateFunc //Функция валидации
err error //Поле ошибки валидации
2025-12-26 17:45:37 +05:00
}
// NewCheckboxModel создаем новую модель выбора
func NewCheckboxModel(label, description string, checked bool, validator types.BoolValidateFunc) *CheckboxModel {
checkbox := &CheckboxModel{
label: label,
description: description,
validate: validator,
checked: checked,
2025-12-26 17:45:37 +05:00
}
checkbox.CheckboxValidate()
return checkbox
2025-12-26 17:45:37 +05:00
}
func (m *CheckboxModel) Init() tea.Cmd {
return nil
}
// Update отслеживает действия с полем
2025-12-26 17:45:37 +05:00
func (m *CheckboxModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
//Отслеживает нажатия клавиш.
2025-12-26 17:45:37 +05:00
switch msg.String() {
case " ", "enter":
//Если был нажат enter или space, то меняем текущее значение на противоположное
m.checked = !m.checked
m.CheckboxValidate()
2025-12-26 17:45:37 +05:00
}
}
return m, nil
}
func (m *CheckboxModel) View() string {
res := fmt.Sprintf("%s: ", m.label)
if m.checked {
2025-12-26 17:45:37 +05:00
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)
}
2025-12-26 17:45:37 +05:00
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
2025-12-26 17:45:37 +05:00
}
func (m *CheckboxModel) GetValue() interface{} {
return m.checked
2025-12-26 17:45:37 +05:00
}
func (m *CheckboxModel) CheckboxValidate() {
if m.validate != nil {
m.err = m.validate(m.checked)
}
}