Изменение вызова действий, проверка наличия действий секции, отображение счетчика выполнения действий в модальном окне, работа над подключением привязки горячих клавиш

This commit is contained in:
XeRo 2026-01-23 17:52:47 +05:00
parent 91b1eea1d4
commit c69a7ae84b
14 changed files with 886 additions and 706 deletions

View file

@ -3,6 +3,7 @@ package setup
import (
"bubble/setup/fields"
"bubble/setup/ui"
"bubble/setup/utils"
"bubble/types"
"fmt"
"github.com/charmbracelet/bubbles/viewport"
@ -31,7 +32,7 @@ func NewFormModel(application *types.PackageApplication, sectionIdx, focus, widt
//Заполняем массив моделей полей с учетом условий
var fieldModels []fields.FieldModel
for _, sectionField := range currentSection.Fields {
if !CheckCondition(sectionField.Condition, application) {
if !utils.CheckCondition(sectionField.Condition, application) {
continue
}
switch sectionField.FieldType {
@ -41,13 +42,13 @@ func NewFormModel(application *types.PackageApplication, sectionIdx, focus, widt
options = append(options, fmt.Sprintf("%v", sectionField.Options[j]))
}
if sectionField.SpecialValue != "" {
specialOptions := SpecialValueHandle(sectionField.SpecialValue)
specialOptions := utils.SpecialValueHandle(sectionField.SpecialValue)
if strSpecial, ok := specialOptions.([]string); ok {
options = strSpecial
}
}
selected := fmt.Sprintf("%v", sectionField.Variable.Value)
validationFunc := ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
validationFunc := utils.ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
fieldModels = append(fieldModels, fields.NewSelectModel(sectionField.Name, selected, sectionField.Description, options, validationFunc))
case "check":
checked := false
@ -56,23 +57,23 @@ func NewFormModel(application *types.PackageApplication, sectionIdx, focus, widt
} else {
checked = sectionField.Variable.Value == "true"
}
validationFunc := ValidateCheckField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
validationFunc := utils.ValidateCheckField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
fieldModels = append(fieldModels, fields.NewCheckboxModel(sectionField.Name, sectionField.Description, checked, validationFunc))
case "compute":
value, err := ComputeValue(sectionField.Compute, application)
value, err := utils.ComputeValue(sectionField.Compute, application)
if err != nil {
value = fmt.Sprintf("Ошибка вычисления: %v", err)
}
fieldModels = append(fieldModels, fields.NewComputeModel(sectionField.Name, fmt.Sprintf("%v", value), sectionField.Description))
//compute расчет
case "file":
validationFunc := ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
validationFunc := utils.ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
fieldModels = append(fieldModels, fields.NewFileSelectModel(sectionField.Name, fmt.Sprintf("%v", sectionField.Variable.Value), sectionField.Description, sectionField.FileFieldExtensions, validationFunc))
case "directory":
validationFunc := ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
validationFunc := utils.ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
fieldModels = append(fieldModels, fields.NewDirSelectModel(sectionField.Name, fmt.Sprintf("%v", sectionField.Variable.Value), sectionField.Description, validationFunc))
default:
validationFunc := ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
validationFunc := utils.ValidateField(sectionField.Name, sectionField.VariableName, sectionField.Validate, application)
fieldModels = append(fieldModels, fields.NewInputModel(sectionField.Name, fmt.Sprintf("%v", sectionField.Variable.Value), sectionField.Description, validationFunc))
}
}
@ -165,7 +166,7 @@ func (m *FormModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
// фокус равен количество полей, значит он на кнопке следующей секции,
// если меньше количества полей или равен 0, значит фокус на поле формы.
// Если у нас нет полей на форме (секция About), значит количество полей равно 0, а фокус по умолчанию устанавливается 0.
// Чтобы m.FieldModels[m.focus] вызвало ошибку "индекс вне массива",
// Чтобы m.FieldModels[m.focus] не вызвало ошибку "индекс вне массива",
// нужно чтобы в условие m.focus < len(m.FieldModels) попал фокус меньше 0 (-1,-2 и тд).
// Чтобы этого избежать, есть проверка, которая устанавливает m.focus на последнюю позицию (количество полей на форме).
// Чтобы эта проверка дала сбой, нужно после неё прописать изменение фокуса формы на отрицательный принудительно, так как такое не может произойти в текущем коде.
@ -222,7 +223,7 @@ func (m *FormModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var viewportCmd, fieldsCmd tea.Cmd
m.viewport, viewportCmd = m.viewport.Update(msg)
fieldsCmd = m.updateFields(msg)
return m, tea.Batch(viewportCmd, fieldsCmd)
return m, tea.Sequence(viewportCmd, fieldsCmd)
}
func (m *FormModel) View() string {
@ -407,5 +408,5 @@ func (m *FormModel) updateFields(msg tea.Msg) tea.Cmd {
}
}
//Объединяем весь массив команду в одну
return tea.Batch(cmds...)
return tea.Sequence(cmds...)
}