自定义循环抽卡

This commit is contained in:
wh_zcy 2023-03-09 14:03:48 +08:00
parent 9c3689c51c
commit 029678b4fd
4 changed files with 241 additions and 105 deletions

View File

@ -4,5 +4,5 @@ Website = "http://legu.cc"
Icon = "app.png" Icon = "app.png"
Name = "RobotGUI" Name = "RobotGUI"
ID = "cc.legu.app" ID = "cc.legu.app"
Version = "1.2.11" Version = "1.2.13"
Build = 41 Build = 43

View File

@ -9,7 +9,6 @@ import (
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/driver/desktop" "fyne.io/fyne/v2/driver/desktop"
"fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
@ -21,12 +20,10 @@ import (
type appMonitor struct { type appMonitor struct {
appAdapter appAdapter
obs observer.Observer obs observer.Observer
logPanel *widget.Entry logPanel *widget.Entry
monitorHeader *widget.List monitorList *common.ItemList
monitorList *widget.List id int64
monitorBinding binding.UntypedList
monitorData *model.PushModelList
} }
func (app *appMonitor) LazyInit(service service.PttService, obs observer.Observer) error { func (app *appMonitor) LazyInit(service service.PttService, obs observer.Observer) error {
@ -42,21 +39,35 @@ func (app *appMonitor) LazyInit(service service.PttService, obs observer.Observe
//clear button //clear button
clearBtn := widget.NewButtonWithIcon(common.APP_TESTCASE_BTN_CLEARLOG, theme.DeleteIcon(), func() { clearBtn := widget.NewButtonWithIcon(common.APP_TESTCASE_BTN_CLEARLOG, theme.DeleteIcon(), func() {
app.logPanel.SetText("") app.logPanel.SetText("")
app.monitorBinding.Set([]interface{}{}) app.monitorList.Reset()
}) })
resPanel := container.NewBorder(container.NewHBox(clearBtn, layout.NewSpacer()), nil, nil, nil, app.logPanel) resPanel := container.NewBorder(container.NewHBox(clearBtn, layout.NewSpacer()), nil, nil, nil, app.logPanel)
app.monitorBinding = binding.NewUntypedList() app.monitorList = common.NewItemList()
app.monitorData = model.NewPushModelList()
app.createMonitorList() app.monitorList.ItemList = app.monitorList.CreateList()
app.monitorList.ItemList.OnSelected = func(id widget.ListItemID) {
o := app.monitorList.CachedList.Items[id]
pd, ok := o.Data.(*model.PushModel)
if !ok {
return
}
if res, err := anypb.New(pd.Msg.Data); err == nil {
app.logPanel.Text = res.String()
app.logPanel.Refresh()
} else {
logrus.WithField("err", err).Error("view detail")
}
}
// layout // layout
panel := container.NewVSplit(container.NewBorder(app.monitorHeader, nil, nil, nil, app.monitorList), resPanel) panel := container.NewVSplit(container.NewBorder(nil, nil, nil, nil,
app.monitorList.ItemList), resPanel)
panel.Offset = 0.8 panel.Offset = 0.8
content.Objects = append(content.Objects, panel) content.Objects = append(content.Objects, panel)
app.tabItem.Content = content app.tabItem.Content = content
app.Run() app.monitorlistener()
return nil return nil
} }
@ -73,78 +84,30 @@ func (a appMonitor) OnClose() bool {
} }
// monitor list data // monitor list data
func (app *appMonitor) Run() { func (app *appMonitor) monitorlistener() {
app.obs.AddListener(observer.EVENT_APP_MONI, observer.Listener{ app.obs.AddListener(observer.EVENT_APP_MONI, observer.Listener{
OnNotify: func(d interface{}, args ...interface{}) { OnNotify: func(d interface{}, args ...interface{}) {
app.id++
data := d.(*model.PushModel) data := d.(*model.PushModel)
app.monitorData.DataList = append(app.monitorData.DataList, data)
app.reloadMonitorData() //大于50条时清除一次
common.ShowCanvasTip("收到新的数据推送,请打开[推送]页面") // if len(app.monitorList.CachedList.Items) >= 50 {
// app.monitorList.Reset()
// }
protocol := fmt.Sprintf("【%s.%s】", data.Msg.MainType, data.Msg.SubType)
app.monitorList.AddItem(common.Item{
Text: fmt.Sprintf("%d - %-50v %-50v %-50v",
app.id, protocol, data.MethodName, data.DataTime),
Data: data,
})
app.monitorList.ItemList.ScrollToBottom()
// common.ShowCanvasTip("收到新的数据推送,请打开[推送]页面")//非常多调式时会导致系统崩溃
}, },
}) })
} }
func (this *appMonitor) reloadMonitorData() {
if this.monitorData != nil {
d := this.monitorData.AsInterfaceArray()
this.monitorBinding.Set(d)
}
}
func (this *appMonitor) createMonitorList() {
// header
this.monitorHeader = widget.NewList(
func() int {
return 1
},
func() fyne.CanvasObject {
return container.NewGridWithColumns(3,
widget.NewLabelWithStyle("", fyne.TextAlignLeading, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}))
},
func(id widget.ListItemID, item fyne.CanvasObject) {
item.(*fyne.Container).Objects[0].(*widget.Label).SetText(common.APP_MONITOR_TITLE_ID)
item.(*fyne.Container).Objects[1].(*widget.Label).SetText(common.APP_MONITOR_TITLE_DATA)
item.(*fyne.Container).Objects[2].(*widget.Label).SetText(common.APP_MONITOR_TITLE_DATE)
},
)
// data
this.monitorList = widget.NewListWithData(this.monitorBinding,
func() fyne.CanvasObject {
return container.NewGridWithColumns(3,
widget.NewLabelWithStyle("", fyne.TextAlignLeading, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}),
)
},
func(data binding.DataItem, item fyne.CanvasObject) {
o, _ := data.(binding.Untyped).Get()
pd := o.(*model.PushModel)
item.(*fyne.Container).Objects[0].(*widget.Label).SetText(fmt.Sprintf("%s.%s", pd.Msg.MainType, pd.Msg.SubType))
item.(*fyne.Container).Objects[1].(*widget.Label).SetText(pd.MethodName)
item.(*fyne.Container).Objects[2].(*widget.Label).SetText(pd.DataTime)
},
)
this.monitorList.OnSelected = func(id widget.ListItemID) {
if di, err := this.monitorBinding.GetItem(id); err != nil {
logrus.Error(err)
} else {
o, _ := di.(binding.Untyped).Get()
pd := o.(*model.PushModel)
if res, err := anypb.New(pd.Msg.Data); err == nil {
this.logPanel.Text = res.String()
this.logPanel.Refresh()
} else {
logrus.WithField("err", err).Error("view detail")
}
}
}
}
func (this *appMonitor) ShortCut() fyne.Shortcut { func (this *appMonitor) ShortCut() fyne.Shortcut {
return &desktop.CustomShortcut{KeyName: fyne.Key3, Modifier: desktop.AltModifier} return &desktop.CustomShortcut{KeyName: fyne.Key3, Modifier: desktop.AltModifier}
} }

View File

@ -10,6 +10,7 @@ import (
"go_dreamfactory/modules/user" "go_dreamfactory/modules/user"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"strings" "strings"
"time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
@ -312,23 +313,23 @@ func (ui *MainWindowImpl) createLoginWin(sid, sname string) {
return return
} }
// go func() { go func() {
// timer := time.NewTimer(10 * time.Second) timer := time.NewTimer(10 * time.Second)
// for { for {
// if !timer.Stop() { if !timer.Stop() {
// select { select {
// case <-timer.C: case <-timer.C:
// default: default:
// } }
// } }
// timer.Reset(10 * time.Second) timer.Reset(10 * time.Second)
// select { select {
// case <-timer.C: case <-timer.C:
// ui.pttService.Ping(sid, account.Text) ui.pttService.Ping(sid, account.Text)
// continue continue
// } }
// } }
// }() }()
// reset main window title // reset main window title
subTitle := fmt.Sprintf("%s[%s]", sname, sid) subTitle := fmt.Sprintf("%s[%s]", sname, sid)
ui.w.SetTitle(fmt.Sprintf(common.APP_WIN_TITLE, subTitle, ui.app.Metadata().Version, ui.app.Metadata().Build, common.APP_NAME)) ui.w.SetTitle(fmt.Sprintf(common.APP_WIN_TITLE, subTitle, ui.app.Metadata().Version, ui.app.Metadata().Build, common.APP_NAME))

View File

@ -1,37 +1,118 @@
package formview package formview
import ( import (
"bufio"
"go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/model" "go_dreamfactory/cmd/v2/model"
"go_dreamfactory/cmd/v2/service" "go_dreamfactory/cmd/v2/service"
"go_dreamfactory/cmd/v2/service/observer"
"go_dreamfactory/comm"
"go_dreamfactory/modules/hero"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"os"
"os/exec"
"path/filepath"
"runtime"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/layout"
fyne_storage "fyne.io/fyne/v2/storage"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cast" "github.com/spf13/cast"
) )
type HeroZhaomuView struct { type HeroZhaomuView struct {
BaseformView BaseformView
flag bool
exportFolder *widget.Entry
resultCountLbl *widget.Label
resultCount int
}
// 打开目录
func openFolder(entry *widget.Entry, w fyne.Window) {
dConf := dialog.NewFolderOpen(func(lu fyne.ListableURI, err error) {
if lu == nil {
return
}
entry.Text = lu.Path()
entry.Refresh()
}, w)
luri, _ := fyne_storage.ListerForURI(fyne_storage.NewFileURI("."))
dConf.SetLocation(luri)
dConf.SetConfirmText("打开")
dConf.SetDismissText("取消")
dConf.Resize(fyne.NewSize(750, 500))
dConf.Show()
} }
func (this *HeroZhaomuView) CreateView(t *model.TestCase) fyne.CanvasObject { func (this *HeroZhaomuView) CreateView(t *model.TestCase) fyne.CanvasObject {
var ckType, ckCount string var ckType, ckCount string
// 抽卡类型 0 1 2 3 4 // 抽卡类型 0 1 2 3 4
ckTypeSelect := widget.NewSelect([]string{"0", "1", "2", "3", "4"}, func(s string) { ckTypeSelect := widget.NewSelect([]string{"普通", "魔法", "功夫", "科技", "月能"}, func(s string) {
ckType = s switch s {
case "普通":
ckType = "0"
case "魔法":
ckType = "1"
case "功夫":
ckType = "2"
case "科技":
ckType = "3"
case "月能":
ckType = "4"
default:
ckType = "0"
}
}) })
ckTypeSelect.Selected = "选择"
//数量 //数量
ckCountSelect := widget.NewSelect([]string{"1", "10"}, func(s string) { ckCountSelect := widget.NewSelect([]string{"单抽", "十连抽"}, func(s string) {
ckCount = s if s == "单抽" {
ckCount = "1"
} else if s == "十连抽" {
ckCount = "10"
}
}) })
ckCountSelect.Selected = "选择"
this.form.AppendItem(widget.NewFormItem("抽卡类型", ckTypeSelect)) //循环次数
this.form.AppendItem(widget.NewFormItem("数量", ckCountSelect)) loopCount := widget.NewEntry()
loopCount.PlaceHolder = "循环抽卡次数"
this.form.OnSubmit = func() { //结果导出目录
this.exportFolder = widget.NewEntry()
this.exportFolder.PlaceHolder = "请选择保存结果的目录"
form := widget.NewForm(
widget.NewFormItem("抽卡类型", ckTypeSelect),
widget.NewFormItem("单抽/十连", ckCountSelect),
widget.NewFormItem("循环次数", loopCount),
widget.NewFormItem("导出", container.NewBorder(nil, nil, nil,
widget.NewButtonWithIcon("", theme.FolderIcon(), func() {
openFolder(this.exportFolder, this.w)
}), this.exportFolder)),
)
form.Items[3].HintText = "文件名默认result.txt"
choukaBtnFunc := func() {
if ckTypeSelect.Selected == "选择" {
common.ShowTip("请选择抽卡类型")
return
}
if ckCountSelect.Selected == "选择" {
common.ShowTip("请选择单抽/十连")
return
}
if err := service.GetPttService().SendToClient(t.MainType, t.SubType, if err := service.GetPttService().SendToClient(t.MainType, t.SubType,
&pb.HeroDrawCardReq{ &pb.HeroDrawCardReq{
DrawType: cast.ToInt32(ckType), DrawType: cast.ToInt32(ckType),
@ -40,5 +121,96 @@ func (this *HeroZhaomuView) CreateView(t *model.TestCase) fyne.CanvasObject {
logrus.Error(err) logrus.Error(err)
} }
} }
return this.form choukaBtn := widget.NewButton("抽卡", choukaBtnFunc)
choukaBtn.Importance = widget.HighImportance
this.resultCountLbl = widget.NewLabel("共抽卡:")
//抽卡并导出结果
choukaAndExport := func() {
this.resultCount = 0
if loopCount.Text == "" || cast.ToInt(loopCount.Text) <= 0 {
common.ShowTip("请设置正确的循环次数")
return
}
if this.exportFolder.Text == "" {
common.ShowTip("请设置导出目录")
return
}
for i := 0; i < cast.ToInt(loopCount.Text); i++ {
choukaBtnFunc()
}
}
choukaAndExportBtn := widget.NewButton("抽卡并导出", choukaAndExport)
choukaAndExportBtn.Importance = widget.MediumImportance
openExplor := func(dir string) {
if dir == "" {
common.ShowTip("资源管理器路径错误")
return
}
if runtime.GOOS == "windows" {
if err := exec.Command("explorer", filepath.Join(dir)).Start(); err != nil {
dialog.ShowError(errors.WithMessage(err, "请确认Json目录是否填写正确"), this.w)
return
}
}
}
//资源目录
explorBtn := widget.NewButtonWithIcon("打开目录", theme.FolderIcon(), func() {
openExplor(this.exportFolder.Text)
})
explorBtn.Importance = widget.LowImportance
btns := container.NewHBox(this.resultCountLbl, layout.NewSpacer(), explorBtn, choukaAndExportBtn, choukaBtn)
c := container.NewBorder(nil, btns, nil, nil, form)
this.resListener()
return c
}
// 监听抽卡结果
func (this *HeroZhaomuView) resListener() {
if this.flag {
return
}
this.obs.AddListener(observer.EVENT_REQ_RSP, observer.Listener{
OnNotify: func(d interface{}, args ...interface{}) {
data := d.(*pb.UserMessage)
if !(data.MainType == string(comm.ModuleHero) &&
data.SubType == hero.DrawCard) {
return
}
rsp := &pb.HeroDrawCardResp{}
if !comm.ProtoUnmarshal(data, rsp) {
logrus.Error("unmarshal err")
return
}
filePath := filepath.Join(this.exportFolder.Text, "result.txt")
f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_RDWR, os.ModeAppend|os.ModePerm)
if err != nil {
logrus.Error(err.Error())
return
}
defer f.Close()
write := bufio.NewWriter(f)
for _, v := range rsp.Data {
for _, o := range v.Atno {
if o.A == "hero" && o.O != "" && o.T != "" {
write.WriteString(o.T + "\r\n")
}
}
this.resultCount++
this.resultCountLbl.SetText("共抽卡:" + cast.ToString(this.resultCount))
this.resultCountLbl.Refresh()
}
write.Flush()
},
})
this.flag = true
} }