package views import ( "fmt" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" "regexp" "strings" "work_cation/models" "work_cation/pkg/utils" "work_cation/service" ) var erlangCard *models.ErlangCards func CreateErlangCard(w fyne.Window) fyne.CanvasObject { if erlangCard == nil { erlangCard = &models.ErlangCards{ UUID: utils.CreateUUID(), UserIp: utils.Get192Ip(), } } var ( // 基础表单 formBase = &widget.Form{} // 变量表单 formVars = &widget.Form{} ) formBase.AppendItem(&widget.FormItem{Text: "名称", Widget: newDefaultEntry(&erlangCard.Title)}) formBase.AppendItem(&widget.FormItem{Text: "描述", Widget: newDefaultEntry(&erlangCard.Text)}) formBase.AppendItem(&widget.FormItem{Text: "封面", Widget: newDefaultEntry(&erlangCard.Covers), HintText: "暂未支持可不填"}) formBase.AppendItem(&widget.FormItem{Text: "是否默认展示", Widget: newDefaultEntry(&erlangCard.IsShowOut)}) formBase.AppendItem(&widget.FormItem{Text: "模版内容", Widget: newDefaultEntryCallback(&erlangCard.Template, func() { generateVariableForm1(erlangCard, formVars) })}) // 刷新变量表单 generateVariableForm1(erlangCard, formVars) // 保存按钮 buttonSave := widget.NewButton("保存", func() { err := service.ErlangCard.Create(erlangCard) if err != nil { dialog.ShowError(err, w) return } dialog.ShowInformation("ok", "创建成功", w) // 更换 erlangCard.UUID = utils.CreateUUID() }) return container.NewBorder(container.NewHBox(widget.NewLabel("新建"), widget.NewSeparator()), nil, nil, nil, container.NewScroll( container.NewVBox( formBase, formVars, buttonSave, ))) } // 刷新表单 func generateVariableForm1(erlCard *models.ErlangCards, form2 *widget.Form) { varSum := countVarOccurrences(erlCard.Template) form2.Items = nil var newVarList []string for i := 0; i < varSum; i++ { var item string if i < len(erlCard.VarName) { // 如果有旧数据,则使用旧数据 item = erlCard.VarName[i] } var index = i newItem := &widget.FormItem{Text: fmt.Sprintf("变量%d", i+1), Widget: newDefaultEntryCallback(&item, func() { erlCard.VarName[index] = item })} form2.AppendItem(newItem) newVarList = append(newVarList, item) } erlCard.VarName = newVarList form2.Refresh() } func countVarOccurrences(input string) int { re := regexp.MustCompile(`\$var`) matches := re.FindAllStringIndex(input, -1) return len(matches) } func newDefaultEntry(value any) *widget.Entry { en := widget.NewEntry() switch v := value.(type) { case string: en.SetText(v) case bool: if v { en.SetText("1") } else { en.SetText("0") } case []string: en.SetText(strings.Join(v, ",")) case *string: data := binding.BindString(v) en.Bind(data) case *bool: data := binding.NewString() data.AddListener(binding.NewDataListener(func() { s, err := data.Get() if err != nil { return } *v = s == "1" })) if *v { data.Set("1") } else { data.Set("0") } en.Bind(data) case *[]string: data := binding.NewString() data.Set(strings.Join(*v, ",")) en.Bind(data) default: } return en } func newDefaultEntryCallback(value *string, callback func()) *widget.Entry { en := widget.NewEntry() data := binding.BindString(value) en.Bind(data) en.OnChanged = func(_ string) { callback() } return en }