package createView import ( "encoding/json" "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" "os" "path/filepath" "regexp" "strings" "time" "work_cation/cfg" "work_cation/global" "work_cation/models" "work_cation/repo" "work_cation/service" ) func UpdateErlangCard(w fyne.Window, baseInfo *models.BaseCard) fyne.CanvasObject { // 读取类型文件数据 infoPath := filepath.Join(cfg.T.CardDir, baseInfo.UUID, cfg.T.CardInfo) bytes, err := os.ReadFile(infoPath) if err != nil { return widget.NewLabel(err.Error()) } var data models.ErlangCards err = json.Unmarshal(bytes, &data) if err != nil { return widget.NewLabel(err.Error()) } return createUpdateErlangCard(w, &data) } func CreateErlangCard(w fyne.Window) fyne.CanvasObject { return createUpdateErlangCard(w, nil) } func createUpdateErlangCard(w fyne.Window, erlangCard *models.ErlangCards) fyne.CanvasObject { if erlangCard == nil { // 创建数据 erlangCard = &models.ErlangCards{BaseCard: models.NewBaseCard(models.ToolTypeErlang, repo.User.GetUserInfo(global.DB).ID)} } 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) time.AfterFunc(2*time.Second, func() { w.Close() }) }) 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 }