package ui import ( "fmt" "go_dreamfactory/cmd/v2/lib/common" "go_dreamfactory/cmd/v2/model" "go_dreamfactory/cmd/v2/service" "go_dreamfactory/cmd/v2/service/observer" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/driver/desktop" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/anypb" ) type appMonitor struct { appAdapter obs observer.Observer logPanel *widget.Entry monitorHeader *widget.List monitorList *widget.List monitorBinding binding.UntypedList monitorData *model.PushModelList } func (app *appMonitor) LazyInit(service service.PttService, obs observer.Observer) error { app.obs = obs app.tabItem = container.NewTabItemWithIcon(common.TOOLBAR_MONITOR, theme.MediaVideoIcon(), nil) content := container.NewMax() content.Objects = []fyne.CanvasObject{} // panel for output log app.logPanel = widget.NewMultiLineEntry() app.logPanel.Wrapping = fyne.TextWrapWord //clear button clearBtn := widget.NewButtonWithIcon(common.APP_TESTCASE_BTN_CLEARLOG, theme.DeleteIcon(), func() { app.logPanel.SetText("") app.monitorBinding.Set([]interface{}{}) }) resPanel := container.NewBorder(container.NewHBox(clearBtn, layout.NewSpacer()), nil, nil, nil, app.logPanel) app.monitorBinding = binding.NewUntypedList() app.monitorData = model.NewPushModelList() app.createMonitorList() // layout panel := container.NewVSplit(container.NewBorder(app.monitorHeader, nil, nil, nil, app.monitorList), resPanel) panel.Offset = 0.8 content.Objects = append(content.Objects, panel) app.tabItem.Content = content app.Run() return nil } func (a *appMonitor) OpenDefault() string { return common.TOOLBAR_MONITOR } func (a *appMonitor) GetAppName() string { return common.TOOLBAR_MONITOR } func (a appMonitor) OnClose() bool { return false } // monitor list data func (app *appMonitor) Run() { app.obs.AddListener(observer.EVENT_APP_MONI, observer.Listener{ OnNotify: func(d interface{}, args ...interface{}) { data := d.(*model.PushModel) app.monitorData.DataList = append(app.monitorData.DataList, data) app.reloadMonitorData() 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 { return &desktop.CustomShortcut{KeyName: fyne.Key3, Modifier: desktop.AltModifier} } func (this *appMonitor) Icon() fyne.Resource { return theme.MediaVideoIcon() }