拓展类型 自定义工具类型

This commit is contained in:
2024-10-10 18:22:50 +08:00
parent 3b69ba93ad
commit 1a0a9466d8
14 changed files with 374 additions and 31 deletions
+1 -2
View File
@@ -8,7 +8,7 @@ import (
)
// CreateCards 创建卡片列表
func CreateCards(w fyne.Window) fyne.CanvasObject {
func CreateCards(_ fyne.Window) fyne.CanvasObject {
var itemList []fyne.CanvasObject
keys := make([]string, 0, len(CardTypeMap))
for key, _ := range CardTypeMap {
@@ -18,7 +18,6 @@ func CreateCards(w fyne.Window) fyne.CanvasObject {
for _, key := range keys {
info := CardTypeMap[key]
itemList = append(itemList, widget.NewButton(info.Name, func() {
info := CardTypeMap[key]
cWin := fyne.CurrentApp().NewWindow(info.Name)
cWin.SetContent(info.createView(cWin))
cWin.Resize(info.createSize)
+55 -21
View File
@@ -1,57 +1,91 @@
package createView
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
dialogWin "github.com/sqweek/dialog"
"log"
"os/exec"
"path/filepath"
"time"
"work_cation/global"
"work_cation/models"
"work_cation/pkg/utils"
"work_cation/repo"
"work_cation/service"
)
var chooseDir string
func CreateExecFile(w fyne.Window) fyne.CanvasObject {
if erlangCard == nil {
erlangCard = &models.ErlangCards{
UUID: utils.Uuid.CreateUUID(),
UserID: repo.User.GetUserInfo(global.DB).ID,
}
}
var (
// 基础表单
formBase = &widget.Form{}
// 变量表单
formVars = &widget.Form{}
info = &models.ExecFiles{BaseCard: models.NewBaseCard(
models.ToolTypeExecFiles,
repo.User.GetUserInfo(global.DB).ID,
)}
)
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) })})
formBase.AppendItem(&widget.FormItem{Text: "名称", Widget: newDefaultEntry(&info.Title)})
formBase.AppendItem(&widget.FormItem{Text: "描述", Widget: newDefaultEntry(&info.Text)})
formBase.AppendItem(&widget.FormItem{Text: "封面", Widget: newDefaultEntry(&info.Covers), HintText: "暂未支持可不填"})
// 刷新变量表单
generateVariableForm1(erlangCard, formVars)
formBase.AppendItem(&widget.FormItem{Text: "执行命令", Widget: newDefaultEntry(&info.Cmd), HintText: "shell 命令 例: ./数据回档.exe"})
formBase.AppendItem(&widget.FormItem{Text: "执行路径", Widget: newDefaultEntry(&info.Pwd), HintText: ". 默认路径"})
chooseDirEntry := newDefaultEntry(&chooseDir)
formBase.AppendItem(&widget.FormItem{Text: "文件夹", Widget: chooseDirEntry})
buttonDir := widget.NewButton("选择路径", func() {
chooseDir1, err := dialogWin.Directory().Title("选择工具所在文件夹").SetStartDir(chooseDir).Browse()
if err != nil {
return
}
chooseDirEntry.SetText(chooseDir1)
log.Println("Selected folder:", chooseDir)
})
// 保存按钮
buttonSave := widget.NewButton("保存", func() {
err := service.ErlangCard.Create(erlangCard)
fmt.Println("info:", info)
err := service.ExecFile.Create(info, chooseDir)
if err != nil {
dialog.ShowError(err, w)
dialog.ShowInformation("创建失败", err.Error(), w)
return
}
dialog.ShowInformation("ok", "创建成功", w)
// 更换
erlangCard.UUID = utils.Uuid.CreateUUID()
time.AfterFunc(2*time.Second, func() { w.Close() })
})
buttonTest := widget.NewButton("测试", func() {
if info.Cmd == "" {
dialog.ShowInformation("测试失败", "未填写执行命令", w)
return
}
ex := exec.Command(info.Cmd)
ex.Dir = filepath.Join(chooseDir, info.Pwd)
if err := ex.Start(); err != nil {
dialog.ShowInformation("测试失败", err.Error(), w)
return
}
go func() {
if err := ex.Wait(); err != nil {
dialog.ShowInformation("测试失败", err.Error(), w)
}
}()
})
return container.NewBorder(container.NewHBox(widget.NewLabel("新建"), widget.NewSeparator()),
nil, nil, nil, container.NewScroll(
container.NewVBox(
formBase,
formVars,
buttonSave,
buttonDir,
buttonTest,
container.NewHBox(buttonSave),
)))
}
+2 -4
View File
@@ -38,9 +38,7 @@ type cardInfo struct {
var (
CardTypeMap = map[string]cardInfo{
models.ToolTypeErlang: {"erlang代码脚本1", createView.CreateErlangCard, fyne.NewSize(600, 400)},
"2": {"erlang代码脚本2", createView.CreateErlangCard, fyne.NewSize(600, 400)},
"3": {"erlang代码脚本3", createView.CreateErlangCard, fyne.NewSize(600, 400)},
"4": {"erlang代码脚本4", createView.CreateErlangCard, fyne.NewSize(600, 400)},
models.ToolTypeErlang: {"Erlang代码脚本模版", createView.CreateErlangCard, fyne.NewSize(600, 400)},
models.ToolTypeExecFiles: {"自定义可执行工具", createView.CreateExecFile, fyne.NewSize(600, 520)},
}
)
+3
View File
@@ -16,6 +16,9 @@ func myCardsViews(w fyne.Window) fyne.CanvasObject {
case models.ToolTypeErlang:
erlangCard := repo.ErlangCardRepo.Find(global.DB, baseCard.UUID)
items = append(items, showView.ErlangCardView(w, &erlangCard))
case models.ToolTypeExecFiles:
var baseCardCopy = baseCard
items = append(items, showView.ExecFileCardView(w, &baseCardCopy))
}
}
return container.NewBorder(nil, nil, nil, nil, container.NewScroll(
+6 -3
View File
@@ -14,7 +14,9 @@ import (
func ErlangCardView(w fyne.Window, data *models.ErlangCards) fyne.CanvasObject {
if len(data.VarName) == 0 {
return widget.NewCard(data.Title, data.Text, widget.NewButton("复制", func() {
err := clipboard.WriteAll(data.Template)
cleanedText := strings.ReplaceAll(data.Template, "\r", "")
cleanedText = strings.ReplaceAll(cleanedText, "\n", "")
err := clipboard.WriteAll(cleanedText)
if err != nil {
dialog.ShowError(err, w)
return
@@ -121,6 +123,7 @@ func replaceVars(input string, replacements []string) string {
result = strings.Replace(result, "$var", replacements[varIndex], 1)
varIndex++
}
return result
cleanedText := strings.ReplaceAll(result, "\r", "")
cleanedText = strings.ReplaceAll(cleanedText, "\n", "")
return cleanedText
}
+63
View File
@@ -0,0 +1,63 @@
package showView
import (
"encoding/json"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
"os"
"os/exec"
"path/filepath"
"work_cation/cfg"
"work_cation/models"
)
func ExecFileCardView(w fyne.Window, data *models.BaseCard) fyne.CanvasObject {
cardButton := widget.NewButton("启动", func() { runExecFile(data, w) })
openDirButton := widget.NewButton("打开目录", func() { openDir(data, w) })
card := widget.NewCard(data.Title, data.Text, container.NewVBox(cardButton, openDirButton))
return card
}
func runExecFile(data *models.BaseCard, w fyne.Window) {
infoPath := filepath.Join(cfg.T.CardDir, data.UUID, cfg.T.CardInfo)
bytes, err := os.ReadFile(infoPath)
if err != nil {
dialog.ShowInformation("测试失败", err.Error(), w)
return
}
var info models.ExecFiles
err = json.Unmarshal(bytes, &info)
if err != nil {
dialog.ShowInformation("测试失败", err.Error(), w)
return
}
ex := exec.Command(info.Cmd)
ex.Dir = filepath.Join(cfg.T.CardDir, data.UUID, info.Pwd)
if err := ex.Start(); err != nil {
dialog.ShowInformation("测试失败", err.Error(), w)
return
}
go func() {
if err := ex.Wait(); err != nil {
dialog.ShowInformation("测试失败", err.Error(), w)
}
}()
}
func openDir(data *models.BaseCard, w fyne.Window) {
infoPath := filepath.Join(cfg.T.CardDir, data.UUID)
// 打开目录
//utils.File.WinOpenFolder(infoPath)
cmd := exec.Command("explorer", infoPath)
if err := cmd.Start(); err != nil {
dialog.ShowInformation("打开失败", err.Error(), w)
}
go func() {
if err := cmd.Wait(); err != nil && err.Error() != "exit status 1" {
dialog.ShowInformation("测试失败", err.Error(), w)
}
}()
}