89 lines
2.1 KiB
Go
89 lines
2.1 KiB
Go
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, то меняем текущее значение на противоположное
|
||
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)
|
||
}
|
||
}
|