func main() { var tool *walk.Action var menutool *walk.Menu var mw *walk.MainWindow mw.SetMaximizeBox(false) mw.SetFixedSize(true) mw, _ = walk.NewMainWindowCody() mw.SetTitle("测试") mw.SetSize(walk.Size{300, 200}) menutool, _ = walk.NewMenu() tool = walk.NewMenuAction(menutool) tool.SetText("文件") open := walk.NewAction() open.SetText("打开") exit := walk.NewAction() exit.SetText("退出") menutool.Actions().Add(open) menutool.Actions().Add(exit) men2, _ := walk.NewMenu() too2 := walk.NewMenuAction(men2) too2.SetText("工具") mw.Menu().Actions().Add(tool) mw.Menu().Actions().Add(too2) mw.Show() mw.Run() }
func main() { walk.Initialize(walk.InitParams{PanicOnError: true}) defer walk.Shutdown() mainWnd, _ := walk.NewMainWindow() mw := &MainWindow{MainWindow: mainWnd} mw.SetLayout(walk.NewVBoxLayout()) mw.SetTitle("Walk Image Viewer Example") mw.tabWidget, _ = walk.NewTabWidget(mw) imageList, _ := walk.NewImageList(walk.Size{16, 16}, 0) mw.ToolBar().SetImageList(imageList) fileMenu, _ := walk.NewMenu() fileMenuAction, _ := mw.Menu().Actions().AddMenu(fileMenu) fileMenuAction.SetText("&File") openBmp, _ := walk.NewBitmapFromFile("../img/open.png") openAction := walk.NewAction() openAction.SetImage(openBmp) openAction.SetText("&Open") openAction.Triggered().Attach(func() { mw.openImage() }) fileMenu.Actions().Add(openAction) mw.ToolBar().Actions().Add(openAction) exitAction := walk.NewAction() exitAction.SetText("E&xit") exitAction.Triggered().Attach(func() { walk.App().Exit(0) }) fileMenu.Actions().Add(exitAction) helpMenu, _ := walk.NewMenu() helpMenuAction, _ := mw.Menu().Actions().AddMenu(helpMenu) helpMenuAction.SetText("&Help") aboutAction := walk.NewAction() aboutAction.SetText("&About") aboutAction.Triggered().Attach(func() { walk.MsgBox(mw, "About", "Walk Image Viewer Example", walk.MsgBoxOK|walk.MsgBoxIconInformation) }) helpMenu.Actions().Add(aboutAction) mw.SetMinMaxSize(walk.Size{320, 240}, walk.Size{}) mw.SetSize(walk.Size{800, 600}) mw.Show() mw.Run() }
func (m Menu) createAction(menu *walk.Menu) (*walk.Action, error) { if menu == nil { var err error if menu, err = walk.NewMenu(); err != nil { return nil, err } } subMenu, err := walk.NewMenu() if err != nil { return nil, err } action, err := menu.Actions().AddMenu(subMenu) if err != nil { return nil, err } if err := action.SetText(m.Text); err != nil { return nil, err } if err := action.SetImage(m.Image); err != nil { return nil, err } for _, item := range m.Items { if _, err := item.createAction(subMenu); err != nil { return nil, err } } if m.AssignActionTo != nil { *m.AssignActionTo = action } if m.AssignTo != nil { *m.AssignTo = subMenu } return action, nil }
func (mw *MyWindows) switchEngine() error { menuEngine, _ := walk.NewMenu() engine, _ := mw.ni.ContextMenu().Actions().AddMenu(menuEngine) engine.SetText("切换视频源") engineAction1 := walk.NewAction() engineAction1.SetText("资源一") engineAction2 := walk.NewAction() engineAction2.SetText("资源二") engineAction3 := walk.NewAction() engineAction3.SetText("资源三") engineAction1.SetChecked(true) engineAction2.SetChecked(false) engineAction3.SetChecked(false) engineAction1.Triggered().Attach(func() { requestUrl = engine1 engineAction1.SetChecked(true) engineAction2.SetChecked(false) engineAction3.SetChecked(false) mw.OpenVip() }) engineAction2.Triggered().Attach(func() { requestUrl = engine2 engineAction1.SetChecked(false) engineAction2.SetChecked(true) engineAction3.SetChecked(false) mw.OpenVip() }) engineAction3.Triggered().Attach(func() { requestUrl = engine3 engineAction1.SetChecked(false) engineAction2.SetChecked(false) engineAction3.SetChecked(true) mw.OpenVip() }) menuEngine.Actions().Add(engineAction1) menuEngine.Actions().Add(engineAction2) menuEngine.Actions().Add(engineAction3) return nil }
func NewTable(parent walk.Container, width, height, x, y int) *Table { t := new(Table) t.model = NewTableModel() t.TableView, _ = walk.NewTableView(parent) t.SetWidth(width) t.SetHeight(height) t.SetX(x) t.SetY(y) t.SetModel(t.model) t.AddExStyle(win.LVS_EX_GRIDLINES) t.SetColumnsOrderable(false) menu, _ := walk.NewMenu() t.TableView.SetContextMenu(menu) return t }
func (m Menu) createAction(builder *Builder, menu *walk.Menu) (*walk.Action, error) { subMenu, err := walk.NewMenu() if err != nil { return nil, err } var action *walk.Action if menu == nil { action = walk.NewMenuAction(subMenu) } else if action, err = menu.Actions().AddMenu(subMenu); err != nil { return nil, err } if err := action.SetText(m.Text); err != nil { return nil, err } if err := setActionImage(action, m.Image); err != nil { return nil, err } for _, item := range m.Items { if _, err := item.createAction(builder, subMenu); err != nil { return nil, err } } if m.OnTriggered != nil { action.Triggered().Attach(m.OnTriggered) } if m.AssignActionTo != nil { *m.AssignActionTo = action } if m.AssignTo != nil { *m.AssignTo = subMenu } return action, nil }
func (b *Builder) InitWidget(d Widget, w walk.Widget, customInit func() error) error { b.level++ defer func() { b.level-- }() var succeeded bool defer func() { if !succeeded { w.Dispose() } }() b.declWidgets = append(b.declWidgets, declWidget{d, w}) // Widget name, _, _, font, toolTipText, minSize, maxSize, stretchFactor, row, rowSpan, column, columnSpan, contextMenuActions, onKeyDown, onMouseDown, onMouseMove, onMouseUp, onSizeChanged := d.WidgetInfo() w.SetName(name) if name != "" { b.name2Widget[name] = w } if toolTipText != "" { if err := w.SetToolTipText(toolTipText); err != nil { return err } } if err := w.SetMinMaxSize(minSize.toW(), maxSize.toW()); err != nil { return err } if len(contextMenuActions) > 0 { cm, err := walk.NewMenu() if err != nil { return err } if err := addToActionList(cm.Actions(), contextMenuActions); err != nil { return err } w.SetContextMenu(cm) } if onKeyDown != nil { w.KeyDown().Attach(onKeyDown) } if onMouseDown != nil { w.MouseDown().Attach(onMouseDown) } if onMouseMove != nil { w.MouseMove().Attach(onMouseMove) } if onMouseUp != nil { w.MouseUp().Attach(onMouseUp) } if onSizeChanged != nil { w.SizeChanged().Attach(onSizeChanged) } if p := w.Parent(); p != nil { switch l := p.Layout().(type) { case *walk.BoxLayout: if stretchFactor < 1 { stretchFactor = 1 } if err := l.SetStretchFactor(w, stretchFactor); err != nil { return err } case *walk.GridLayout: cs := columnSpan if cs < 1 { cs = 1 } rs := rowSpan if rs < 1 { rs = 1 } r := walk.Rectangle{column, row, cs, rs} if err := l.SetRange(w, r); err != nil { return err } } } oldParent := b.parent // Container var db *walk.DataBinder if dc, ok := d.(Container); ok { if wc, ok := w.(walk.Container); ok { dataBinder, layout, children := dc.ContainerInfo() if layout != nil { l, err := layout.Create() if err != nil { return err } if err := wc.SetLayout(l); err != nil { return err } } b.parent = wc defer func() { b.parent = oldParent }() for _, child := range children { if err := child.Create(b); err != nil { return err } } var err error if db, err = dataBinder.create(); err != nil { return err } } } // Custom if customInit != nil { if err := customInit(); err != nil { return err } } b.parent = oldParent // Widget continued if font != nil { if f, err := font.Create(); err != nil { return err } else if f != nil { w.SetFont(f) } } if b.level == 1 { if err := b.initProperties(); err != nil { return err } } // Call Reset on DataBinder after customInit, so a Dialog gets a chance to first // wire up its DefaultButton to the CanSubmitChanged event of a DataBinder. if db != nil { if _, ok := d.(Container); ok { if wc, ok := w.(walk.Container); ok { // FIXME: Currently SetDataBinder must be called after initProperties. wc.SetDataBinder(db) if err := db.Reset(); err != nil { return err } } } } if b.level == 1 { for _, f := range b.deferredFuncs { if err := f(); err != nil { return err } } } succeeded = true return nil }
func (b *Builder) InitWidget(d Widget, w walk.Window, customInit func() error) error { b.level++ defer func() { b.level-- }() var succeeded bool defer func() { if !succeeded { w.Dispose() } }() b.declWidgets = append(b.declWidgets, declWidget{d, w}) // Widget name, _, _, font, toolTipText, minSize, maxSize, stretchFactor, row, rowSpan, column, columnSpan, alwaysConsumeSpace, contextMenuItems, onKeyDown, onKeyPress, onKeyUp, onMouseDown, onMouseMove, onMouseUp, onSizeChanged := d.WidgetInfo() w.SetName(name) if name != "" { b.name2Window[name] = w } if toolTipText != "" { if widget, ok := w.(walk.Widget); ok { if err := widget.SetToolTipText(toolTipText); err != nil { return err } } } if err := w.SetMinMaxSize(minSize.toW(), maxSize.toW()); err != nil { return err } if len(contextMenuItems) > 0 { cm, err := walk.NewMenu() if err != nil { return err } b.deferBuildMenuActions(cm, contextMenuItems) w.SetContextMenu(cm) } if onKeyDown != nil { w.KeyDown().Attach(onKeyDown) } if onKeyPress != nil { w.KeyPress().Attach(onKeyPress) } if onKeyUp != nil { w.KeyUp().Attach(onKeyUp) } if onMouseDown != nil { w.MouseDown().Attach(onMouseDown) } if onMouseMove != nil { w.MouseMove().Attach(onMouseMove) } if onMouseUp != nil { w.MouseUp().Attach(onMouseUp) } if onSizeChanged != nil { w.SizeChanged().Attach(onSizeChanged) } if widget, ok := w.(walk.Widget); ok { if err := widget.SetAlwaysConsumeSpace(alwaysConsumeSpace); err != nil { return err } type SetStretchFactorer interface { SetStretchFactor(widget walk.Widget, factor int) error } if p := widget.Parent(); p != nil { if stretchFactor < 1 { stretchFactor = 1 } switch l := p.Layout().(type) { case SetStretchFactorer: if err := l.SetStretchFactor(widget, stretchFactor); err != nil { return err } case *walk.GridLayout: csf := l.ColumnStretchFactor(column) if csf < stretchFactor { csf = stretchFactor } l.SetColumnStretchFactor(column, csf) rsf := l.RowStretchFactor(row) if rsf < stretchFactor { rsf = stretchFactor } l.SetRowStretchFactor(row, rsf) if rowSpan < 1 { rowSpan = 1 } if columnSpan < 1 { columnSpan = 1 } if b.columns > 0 && row == 0 && column == 0 { if b.col+columnSpan > b.columns { b.row++ b.col = 0 } row = b.row column = b.col b.col += columnSpan } r := walk.Rectangle{column, row, columnSpan, rowSpan} if err := l.SetRange(widget, r); err != nil { return err } } } } oldParent := b.parent // Container var db *walk.DataBinder if dc, ok := d.(Container); ok { if wc, ok := w.(walk.Container); ok { dataBinder, layout, children := dc.ContainerInfo() if layout != nil { l, err := layout.Create() if err != nil { return err } if err := wc.SetLayout(l); err != nil { return err } } b.parent = wc defer func() { b.parent = oldParent }() if g, ok := layout.(Grid); ok { columns := b.columns defer func() { b.columns, b.row, b.col = columns, row, column+columnSpan }() b.columns = g.Columns b.row = 0 b.col = 0 } for _, child := range children { if err := child.Create(b); err != nil { return err } } if dataBinder.AssignTo != nil || dataBinder.DataSource != nil { if dataB, err := dataBinder.create(); err != nil { return err } else { db = dataB } } } } // Custom if customInit != nil { if err := customInit(); err != nil { return err } } b.parent = oldParent // Widget continued if font != nil { if f, err := font.Create(); err != nil { return err } else if f != nil { w.SetFont(f) } } if b.level == 1 { if err := b.initProperties(); err != nil { return err } } // Call Reset on DataBinder after customInit, so a Dialog gets a chance to first // wire up its DefaultButton to the CanSubmitChanged event of a DataBinder. if db != nil { if _, ok := d.(Container); ok { if wc, ok := w.(walk.Container); ok { b.Defer(func() error { // FIXME: Currently SetDataBinder must be called after initProperties. wc.SetDataBinder(db) if db.DataSource() == nil { return nil } return db.Reset() }) } } } if b.level == 1 { for _, f := range b.deferredFuncs { if err := f(); err != nil { return err } } } succeeded = true return nil }
func (mw *MainWindow) initPoseInfo() { if modelItem == nil { return } model := modelItem.img if model == nil { return } // Get the pose count poseCnt := 1 x := model.Bounds().Min.X y := model.Bounds().Min.Y w := model.Bounds().Dx() h := model.Bounds().Dy() for i := 2; i < POSE_CNT_MAX; i++ { sh := h / i for j := 1; j < i; j++ { beginY := sh * j // Erase the boundary by 1 pix to handel the neighbor pix for z := 1; z < w-1; z++ { _, _, _, a := model.At(x+z, y+beginY).RGBA() if a != 0 { _, _, _, la := model.At(x+z-1, y+beginY).RGBA() _, _, _, ra := model.At(x+z+1, y+beginY).RGBA() _, _, _, ta := model.At(x+z, y+beginY-1).RGBA() _, _, _, da := model.At(x+z, y+beginY+1).RGBA() if la != 0 && ra != 0 && ta != 0 && da != 0 { fmt.Println("Pose alpha:", x+z, y+beginY, a) goto nextPose } } } } poseCnt = i break nextPose: } fmt.Println("Pose count: ", poseCnt) // Init the pose list imageW = w / int(mw.uiFrameCnt.Value()) imageH = h / poseCnt mw.resetImageList() boundary = image.Rect(0, 0, imageW, imageH) tmpBound := boundary // Read all png images for i := 0; i < poseCnt; i++ { for j := 0; j < int(mw.uiFrameCnt.Value()); j++ { deltaX := imageW * j deltaY := imageH * i tmpBound = boundary.Add(image.Point{deltaX, deltaY}) newImg := new(ImageItem) newImg.fname = "" newImg.img = modelItem.img.SubImage(tmpBound).(ImageExt) newImg.bm, _ = walk.NewBitmapFromImage(newImg.img) imgList = append(imgList, newImg) } } } /* func (mw *MainWindow) onUiSetFrameCnt() { if modelItem == nil { return } // imageW = modelItem.img.Bounds().Dx() // imageH = modelItem.img.Bounds().Dy() // poseCnt := mw.getPoseCnt() playPose = int(mw.uiPlayPose.Value()) mw.setImageSize() }*/ func (mw *MainWindow) refreshToolBar(mode int) { mw.uiConvirm.SetEnabled(false) mw.uiComposeAction.SetEnabled(false) mw.uiPoseCnt.SetEnabled(false) mw.mode = mode mw.uiFrameCnt.SetEnabled(false) if mw.mode == MODE_INVALID { return } if mw.mode == MODE_PLAY { return } if mw.mode == MODE_COMPOSE { mw.uiFrameCnt.SetEnabled(true) mw.uiComposeAction.SetEnabled(true) } } func (mw *MainWindow) getPoseInfo() (int, int) { totalFrame := len(imgList) poseCnt := mw.getPoseCnt() if poseCnt >= totalFrame { return 1, totalFrame } if totalFrame%poseCnt != 0 { return 1, totalFrame } return poseCnt, totalFrame / poseCnt } func (mw *MainWindow) composeImg(fullname string) { poseCnt, frame := mw.getPoseInfo() if frame == 0 { return } sw := boundary.Dx() sh := boundary.Dy() + yBoundAdd //var rgba bool _newBound := image.Rect(0, 0, sw*frame, sh*poseCnt) // No need to check the source image type. var result draw.Image firstImg := imgList[0].img switch firstImg.(type) { case *image.RGBA: result = image.NewRGBA(_newBound) case *image.RGBA64: result = image.NewRGBA64(_newBound) case *image.NRGBA: result = image.NewNRGBA(_newBound) case *image.NRGBA64: result = image.NewNRGBA64(_newBound) default: fmt.Println("image type: ", reflect.TypeOf(firstImg)) println("Unsupported image type") return } // Compress to RGBA32, Stride // result := image.NewRGBA(_newBound) // result.Stride = result.Bounds().Dx() singleBound := image.Rect(0, 0, sw, sh) for i, _img := range imgList { _subImg := _img.img.SubImage(boundary) col := i % frame row := i / frame drawBound := singleBound.Add(image.Point{sw * col, sh * row}) draw.Draw(result, drawBound, _subImg, _subImg.Bounds().Min, draw.Src) } // Modify stride // fmt.Println("Stride ", result.Stride) f, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE, os.ModePerm) if err != nil { panic(err) return } defer f.Close() f.Truncate(0) // buf := bufio.NewWriterSize(f, 1024 * 1000) buf := bufio.NewWriter(f) png.Encode(buf, result) } func setIcon(ui *walk.Action, fname string) { fpath := "./img/" + fname _, err := os.Stat(fpath) if err != nil { fmt.Println(err) return } img, _ := walk.NewBitmapFromFile(fpath) ui.SetImage(img) } func (mw *MainWindow) initMenu() { fileMenu, _ := walk.NewMenu() fileMenuAction, _ := mw.Menu().Actions().AddMenu(fileMenu) fileMenuAction.SetText("&File") imageList, _ := walk.NewImageList(walk.Size{TB_H, TB_H}, 0) mw.ToolBar().SetImageList(imageList) openAction := walk.NewAction() setIcon(openAction, "open.png") openAction.SetText("&Open") openAction.Triggered().Attach(func() { go mw.openImage(MODE_COMPOSE) }) fileMenu.Actions().Add(openAction) mw.ToolBar().Actions().Add(openAction) /// // Load loadAction := walk.NewAction() setIcon(loadAction, "load.png") loadAction.SetText("&Load") loadAction.Triggered().Attach(func() { mw.openImage(MODE_PLAY) }) fileMenu.Actions().Add(loadAction) mw.ToolBar().Actions().Add(loadAction) helpMenu, _ := walk.NewMenu() helpMenuAction, _ := mw.Menu().Actions().AddMenu(helpMenu) helpMenuAction.SetText("&Help") aboutAction := walk.NewAction() helpMenu.Actions().Add(aboutAction) aboutAction.SetText("&About") aboutAction.Triggered().Attach(func() { walk.MsgBox(mw, "About", "Image composer V0.1\nAuthor:heml", walk.MsgBoxOK|walk.MsgBoxIconInformation) }) // Image operations // Save mw.uiComposeAction = walk.NewAction() setIcon(mw.uiComposeAction, "save.png") mw.uiComposeAction.SetText("&Save") mw.uiComposeAction.Triggered().Attach(func() { mw.saveImage() }) fileMenu.Actions().Add(mw.uiComposeAction) mw.ToolBar().Actions().Add(mw.uiComposeAction) // Exit exitAction := walk.NewAction() exitAction.SetText("E&xit") exitAction.Triggered().Attach(func() { walk.App().Exit(0) }) fileMenu.Actions().Add(exitAction) } func (mw *MainWindow) initCanvas() { for i := 0; i < POSE_CNT_MAX; i++ { iv, _ := selfWidget.NewMyImageView(mw) mw.imageView[i] = iv } } func (mw *MainWindow) initOtherBars() { sp, _ := walk.NewSplitter(mw) sp.SetSize(walk.Size{400, 20}) lab, _ := walk.NewLabel(sp) lab.SetSize(walk.Size{16, 30}) // lab.SetText("Pose") // others mw.uiFrameCnt, _ = walk.NewNumberEdit(sp) //mw.uiFrameCnt.SetSize(walk.Size{42, TB_H}) mw.uiFrameCnt.SetRange(1, 100) mw.uiFrameCnt.SetDecimals(0) mw.uiFrameCnt.SetValue(8) mw.uiFrameCnt.SetEnabled(false) mw.uiFrameCnt.SetToolTipText(ttPlayPose) mw.uiPoseCnt, _ = walk.NewNumberEdit(sp) //mw.uiPoseCnt.SetSize(walk.Size{42, TB_H}) mw.uiPoseCnt.SetRange(1, 100) mw.uiPoseCnt.SetValue(1) mw.uiPoseCnt.SetDecimals(0) mw.uiPoseCnt.SetToolTipText(ttPosCnt) mw.uiAddBoundY, _ = walk.NewNumberEdit(sp) mw.uiAddBoundY.SetRange(1, 1000) mw.uiAddBoundY.SetValue(0) mw.uiAddBoundY.SetDecimals(0) mw.uiAddBoundY.ValueChanged().Attach(func() { yBoundAdd = int(mw.uiAddBoundY.Value()) if yBoundAdd < -imageH { yBoundAdd = -imageH } if yBoundAdd > (imageH - boundary.Max.Y) { yBoundAdd = imageH - boundary.Max.Y } mw.uiAddBoundY.SetValue(float64(yBoundAdd)) mw.setImageSize() }) mw.uiConvirm, _ = walk.NewPushButton(sp) mw.uiConvirm.SetText("OK") mw.uiConvirm.Clicked().Attach(func() { // Get some fresh data. // mw.onUiSetFrameCnt() }) walk.InitWidget(sp, mw, FREEZEIZE_CLASS, winapi.CCS_NORESIZE, winapi.WS_EX_TOOLWINDOW|winapi.WS_EX_WINDOWEDGE) } func newMainWindow() { walk.SetPanicOnError(true) mainWnd, _ := walk.NewMainWindow() mw := &MainWindow{MainWindow: mainWnd} mw.viewGrid = walk.NewGridLayout() mw.SetLayout(mw.viewGrid) mw.viewGrid.SetRowStretchFactor(GRID_CNT, 2) mw.viewGrid.SetColumnStretchFactor(GRID_CNT, 2) mw.viewGrid.SetMargins(walk.Margins{6, 28, 2, 6}) mw.SetTitle("Image composer") mw.initMenu() mw.initOtherBars() mw.initCanvas() mw.SetMinMaxSize(walk.Size{800, 600}, walk.Size{}) mw.SetSize(walk.Size{800, 600}) mw.refreshToolBar(MODE_INVALID) mw.Show() mw.Run() } func init() { walk.MustRegisterWindowClass(FREEZEIZE_CLASS) runtime.GOMAXPROCS(2) screenW = int(winapi.GetSystemMetrics(winapi.SM_CXSCREEN)) screenH = int(winapi.GetSystemMetrics(winapi.SM_CYSCREEN)) } func main() { newMainWindow() }
func InitWidget(d Widget, w walk.Widget, customInit func() error) error { var succeeded bool defer func() { if !succeeded { w.Dispose() } }() // Widget name, disabled, hidden, font, minSize, maxSize, stretchFactor, row, rowSpan, column, columnSpan, contextMenuActions := d.WidgetInfo() w.SetName(name) if err := w.SetMinMaxSize(minSize.toW(), maxSize.toW()); err != nil { return err } if len(contextMenuActions) > 0 { cm, err := walk.NewMenu() if err != nil { return err } if err := addToActionList(cm.Actions(), contextMenuActions); err != nil { return err } w.SetContextMenu(cm) } if p := w.Parent(); p != nil { switch l := p.Layout().(type) { case *walk.BoxLayout: if stretchFactor < 1 { stretchFactor = 1 } if err := l.SetStretchFactor(w, stretchFactor); err != nil { return err } case *walk.GridLayout: cs := columnSpan if cs < 1 { cs = 1 } rs := rowSpan if rs < 1 { rs = 1 } r := walk.Rectangle{column, row, cs, rs} if err := l.SetRange(w, r); err != nil { return err } } } // Container if dc, ok := d.(Container); ok { if wc, ok := w.(walk.Container); ok { layout, children := dc.ContainerInfo() if layout != nil { l, err := layout.Create() if err != nil { return err } if err := wc.SetLayout(l); err != nil { return err } } for _, child := range children { if err := child.Create(wc); err != nil { return err } } } } // Widget continued w.SetEnabled(!disabled) w.SetVisible(!hidden) if font != nil { if f, err := font.Create(); err != nil { return err } else if f != nil { w.SetFont(f) } } // Custom if customInit != nil { if err := customInit(); err != nil { return err } } succeeded = true return nil }
func (mw *MyDialog) init(owner walk.Form) (err error) { // 设置最小化 mw.SetMinimizeBox(true) // 禁用最大化 mw.SetMaximizeBox(false) // 设置窗口固定 mw.SetFixedSize(true) // // 设置窗口前置 // mw.SetWindowPos(true) mw.Dialog, err = walk.NewDialog(owner) mw.checkError(err) succeeded := false defer func() { if !succeeded { mw.Dispose() } }() // 设置主窗体大小 err = mw.SetClientSize(walk.Size{700, 560}) mw.checkError(err) // 设置主窗体标题 err = mw.SetTitle("iMan-打包工具 V【" + _VERSION_ + "】") mw.checkError(err) // 设置 mw.ui.SettingMenu, _ = walk.NewMenu() mw.ui.SettingAction = walk.NewMenuAction(mw.ui.SettingMenu) mw.ui.SettingAction.SetText("设置") mw.ui.ServerAction = walk.NewAction() mw.ui.ServerAction.SetText("服务器") mw.ui.SettingMenu.Actions().Add(mw.ui.ServerAction) // 帮助 mw.ui.HelpMenu, _ = walk.NewMenu() mw.ui.HelpAction = walk.NewMenuAction(mw.ui.HelpMenu) mw.ui.HelpAction.SetText("帮助") mw.ui.AboutAction = walk.NewAction() mw.ui.AboutAction.SetText("关于") mw.ui.HelpMenu.Actions().Add(mw.ui.AboutAction) // 菜单配置 mw.Menu().Actions().Add(mw.ui.SettingAction) mw.Menu().Actions().Add(mw.ui.HelpAction) // 设置字体和图标 fountTitle, _ := walk.NewFont("幼圆", 10, walk.FontBold) otherFont, _ := walk.NewFont("幼圆", 10, 0) // 开始打包 mw.ui.StartPackingBtn, err = walk.NewPushButton(mw) mw.checkError(err) mw.ui.StartPackingBtn.SetText("开始打包") mw.ui.StartPackingBtn.SetBounds(walk.Rectangle{310, 20, 75, 30}) // 版本配置 mw.ui.VersionGb, err = walk.NewGroupBox(mw) mw.checkError(err) mw.ui.VersionGb.SetTitle("版本配置") mw.ui.VersionGb.SetFont(otherFont) err = mw.ui.VersionGb.SetBounds(walk.Rectangle{10, 60, 330, 260}) mw.checkError(err) // 版本类型 mw.ui.VersionTypeLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.VersionTypeLb.SetText("版本类型:") mw.ui.VersionTypeLb.SetFont(fountTitle) mw.ui.VersionTypeLb.SetBounds(walk.Rectangle{10, 20, 70, 25}) // 测试版 mw.ui.VersionTestRadio, err = walk.NewRadioButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.VersionTestRadio.SetText("测试版") mw.ui.VersionTestRadio.SetBounds(walk.Rectangle{110, 20, 60, 25}) mw.ui.VersionTestRadio.SetChecked(true) // 正式版 mw.ui.VersionOffRadio, err = walk.NewRadioButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.VersionOffRadio.SetText("正式版") mw.ui.VersionOffRadio.SetBounds(walk.Rectangle{180, 20, 70, 25}) // 主版本号 mw.ui.MasterVersionLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.MasterVersionLb.SetText("主版本号:") mw.ui.MasterVersionLb.SetFont(fountTitle) mw.ui.MasterVersionLb.SetBounds(walk.Rectangle{10, 60, 70, 25}) // 主版本号内容 mw.ui.MasterVersionLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.MasterVersionLe.SetBounds(walk.Rectangle{110, 60, 60, 25}) // 生成版本号 mw.ui.PackVersionLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.PackVersionLb.SetText("生成版本:") mw.ui.PackVersionLb.SetFont(fountTitle) mw.ui.PackVersionLb.SetBounds(walk.Rectangle{10, 100, 70, 25}) // 生成版本号内容 mw.ui.PackVersionLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.PackVersionLe.SetEnabled(false) mw.ui.PackVersionLe.SetBounds(walk.Rectangle{110, 100, 140, 25}) // PC助手 mw.ui.PcHelperLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.PcHelperLb.SetText("PC助手:") mw.ui.PcHelperLb.SetFont(fountTitle) mw.ui.PcHelperLb.SetBounds(walk.Rectangle{10, 140, 70, 25}) // PC助手上传路径 mw.ui.PcHelperLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.PcHelperLe.SetBounds(walk.Rectangle{110, 140, 150, 25}) // PC助手上传按钮 mw.ui.PcUploadBtn, err = walk.NewPushButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.PcUploadBtn.SetText("上传") mw.ui.PcUploadBtn.SetBounds(walk.Rectangle{270, 140, 50, 25}) // Android助手 mw.ui.AndroidHelperLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.AndroidHelperLb.SetText("Android助手:") mw.ui.AndroidHelperLb.SetFont(fountTitle) mw.ui.AndroidHelperLb.SetBounds(walk.Rectangle{10, 180, 100, 25}) // Android助手上传路径 mw.ui.AndroidHelperLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.AndroidHelperLe.SetBounds(walk.Rectangle{110, 180, 150, 25}) // Android助手上传按钮 mw.ui.AndUploadBtn, err = walk.NewPushButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.AndUploadBtn.SetText("上传") mw.ui.AndUploadBtn.SetBounds(walk.Rectangle{270, 180, 50, 25}) // Web 数据库 mw.ui.WebSqlLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.WebSqlLb.SetText("Web 数据库:") mw.ui.WebSqlLb.SetFont(fountTitle) mw.ui.WebSqlLb.SetBounds(walk.Rectangle{10, 220, 90, 25}) // Web 数据库上传路径 mw.ui.WebSqlLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.WebSqlLe.SetBounds(walk.Rectangle{110, 220, 150, 25}) // Web 数据库上传按钮 mw.ui.WebSqlBtn, err = walk.NewPushButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.WebSqlBtn.SetText("上传") mw.ui.WebSqlBtn.SetBounds(walk.Rectangle{270, 220, 50, 25}) // 打包内容配置 mw.ui.PackGb, err = walk.NewGroupBox(mw) mw.checkError(err) mw.ui.PackGb.SetTitle("打包内容配置") mw.ui.PackGb.SetFont(otherFont) mw.ui.PackGb.SetBounds(walk.Rectangle{355, 60, 335, 260}) // 全选 mw.ui.CheckAllLb, err = walk.NewLabel(mw.ui.PackGb) mw.checkError(err) mw.ui.CheckAllLb.SetText("全选:") mw.ui.CheckAllLb.SetFont(fountTitle) mw.ui.CheckAllLb.SetBounds(walk.Rectangle{10, 20, 55, 25}) // 全选框 mw.ui.CheckAllCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.CheckAllCb.SetVisible(true) mw.ui.CheckAllCb.SetBounds(walk.Rectangle{80, 20, 70, 25}) // 服务器 mw.ui.ServerLb, err = walk.NewLabel(mw.ui.PackGb) mw.checkError(err) mw.ui.ServerLb.SetText("服务器:") mw.ui.ServerLb.SetFont(fountTitle) mw.ui.ServerLb.SetBounds(walk.Rectangle{10, 50, 55, 25}) // Java Web复选框 mw.ui.JavaWebCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.JavaWebCb.SetText("Java Web") mw.ui.JavaWebCb.SetBounds(walk.Rectangle{80, 50, 80, 25}) // Web 数据库复选框 mw.ui.WebSqlCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.WebSqlCb.SetText("Web 数据库") mw.ui.WebSqlCb.SetBounds(walk.Rectangle{170, 50, 90, 25}) // PC助手 mw.ui.PcHelperCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.PcHelperCb.SetText("PC助手") mw.ui.PcHelperCb.SetBounds(walk.Rectangle{80, 90, 60, 25}) // Android助手 mw.ui.AndroidHelperCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.AndroidHelperCb.SetText("Android助手") mw.ui.AndroidHelperCb.SetBounds(walk.Rectangle{170, 90, 90, 25}) // 控制器 mw.ui.ControlLb, err = walk.NewLabel(mw.ui.PackGb) mw.checkError(err) mw.ui.ControlLb.SetText("控制器:") mw.ui.ControlLb.SetFont(fountTitle) mw.ui.ControlLb.SetBounds(walk.Rectangle{10, 130, 55, 25}) // Linux knl mw.ui.LinuxKnlCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.LinuxKnlCb.SetText("Linux Knl") mw.ui.LinuxKnlCb.SetBounds(walk.Rectangle{80, 130, 80, 25}) // Linux App mw.ui.LinuxAppCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.LinuxAppCb.SetText("Linux App") mw.ui.LinuxAppCb.SetBounds(walk.Rectangle{170, 130, 80, 25}) // Linux Ruby mw.ui.LinuxRubyCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.LinuxRubyCb.SetText("Linux Ruby") mw.ui.LinuxRubyCb.SetBounds(walk.Rectangle{80, 170, 90, 25}) // 打包日志 mw.ui.PackLogLb, err = walk.NewLabel(mw) mw.checkError(err) mw.ui.PackLogLb.SetText("打包日志") mw.ui.PackLogLb.SetFont(fountTitle) mw.ui.PackLogLb.SetBounds(walk.Rectangle{20, 330, 60, 20}) // 日志输出 mw.ui.lv, err = NewLogView(mw) mw.checkError(err) err = mw.ui.lv.SetBounds(walk.Rectangle{10, 360, 680, 190}) mw.checkError(err) log.SetOutput(mw.ui.lv) // img, _ = walk.NewIconFromResourceId(7) // mw.ui.browseBtn.SetImage(img) // mw.ui.browseBtn.SetImageAboveText(false) // mw.ui.browseBtn.SetBackground(bg) // reader, _ := os.Open("../../img/folder_add.png") // add, _, _ := image.Decode(reader) // var img walk.Image // img, _ = walk.NewBitmapFromImage(add) // mw.ui.browseBtn.SetImage(img) // img, _ = walk.NewImageFromFile("../../img/arrow_divide.png") // mw.ui.uploadBtn.SetImage(img) succeeded = true return nil }
func main() { walk.Initialize(walk.InitParams{PanicOnError: true}) defer walk.Shutdown() mainWnd, _ := walk.NewMainWindow() mw := &MainWindow{ MainWindow: mainWnd, fileInfoModel: &FileInfoModel{}, } mw.SetTitle("Walk File Browser Example") mw.SetLayout(walk.NewHBoxLayout()) fileMenu, _ := walk.NewMenu() fileMenuAction, _ := mw.Menu().Actions().AddMenu(fileMenu) fileMenuAction.SetText("&File") exitAction := walk.NewAction() exitAction.SetText("E&xit") exitAction.Triggered().Attach(func() { walk.App().Exit(0) }) fileMenu.Actions().Add(exitAction) helpMenu, _ := walk.NewMenu() helpMenuAction, _ := mw.Menu().Actions().AddMenu(helpMenu) helpMenuAction.SetText("&Help") aboutAction := walk.NewAction() aboutAction.SetText("&About") aboutAction.Triggered().Attach(func() { walk.MsgBox(mw, "About", "Walk File Browser Example", walk.MsgBoxOK|walk.MsgBoxIconInformation) }) helpMenu.Actions().Add(aboutAction) splitter, _ := walk.NewSplitter(mw) mw.treeView, _ = walk.NewTreeView(splitter) mw.treeView.ItemExpanded().Attach(func(item *walk.TreeViewItem) { children := item.Children() if children.Len() == 1 && children.At(0).Text() == "" { mw.populateTreeViewItem(item) } }) mw.treeView.SelectionChanged().Attach(func(old, new *walk.TreeViewItem) { mw.selTvwItem = new mw.showError(mw.fileInfoModel.ResetRows(pathForTreeViewItem(new))) }) drives, _ := walk.DriveNames() mw.treeView.SetSuspended(true) for _, drive := range drives { driveItem := newTreeViewItem(drive[:2]) mw.treeView.Items().Add(driveItem) } mw.treeView.SetSuspended(false) mw.tableView, _ = walk.NewTableView(splitter) mw.tableView.SetModel(mw.fileInfoModel) mw.tableView.SetSingleItemSelection(true) mw.tableView.CurrentIndexChanged().Attach(func() { var url string index := mw.tableView.CurrentIndex() if index > -1 { name := mw.fileInfoModel.items[index].Name url = path.Join(pathForTreeViewItem(mw.selTvwItem), name) } mw.preview.SetURL(url) }) mw.preview, _ = walk.NewWebView(splitter) mw.SetMinMaxSize(walk.Size{600, 400}, walk.Size{}) mw.SetSize(walk.Size{800, 600}) mw.Show() mw.Run() }
func (mw *MyWindow) init() (err error) { // 设置最小化 mw.SetMinimizeBox(true) // 禁用最大化 mw.SetMaximizeBox(false) // 设置窗口固定 mw.SetFixedSize(true) // // 设置窗口前置 // mw.SetWindowPos(true) mw.MainWindow, err = walk.NewMainWindow() mw.checkError(err) succeeded := false defer func() { if !succeeded { mw.Dispose() } }() // 设置主窗体大小 err = mw.SetClientSize(walk.Size{700, 560}) mw.checkError(err) // 设置主窗体标题 err = mw.SetTitle("iMan-打包工具 V【" + _VERSION_ + "】") mw.checkError(err) // 设置 mw.ui.SettingMenu, _ = walk.NewMenu() mw.ui.SettingAction = walk.NewMenuAction(mw.ui.SettingMenu) mw.ui.SettingAction.SetText("设置") mw.ui.ServerAction = walk.NewAction() mw.ui.ServerAction.SetText("服务器") mw.ui.SettingMenu.Actions().Add(mw.ui.ServerAction) // 帮助 mw.ui.HelpMenu, _ = walk.NewMenu() mw.ui.HelpAction = walk.NewMenuAction(mw.ui.HelpMenu) mw.ui.HelpAction.SetText("帮助") mw.ui.AboutAction = walk.NewAction() mw.ui.AboutAction.SetText("关于") mw.ui.HelpMenu.Actions().Add(mw.ui.AboutAction) // 菜单配置 mw.Menu().Actions().Add(mw.ui.SettingAction) mw.Menu().Actions().Add(mw.ui.HelpAction) // 设置字体和图标 fountTitle, _ := walk.NewFont("幼圆", 10, walk.FontBold) otherFont, _ := walk.NewFont("幼圆", 10, 0) // 编译服务器IP mw.ui.BuildServerLb, err = walk.NewLabel(mw) mw.checkError(err) mw.ui.BuildServerLb.SetText("编译服务器IP: " + ConfSer.Ip) mw.ui.BuildServerLb.SetFont(otherFont) mw.ui.BuildServerLb.SetBounds(walk.Rectangle{480, 10, 220, 20}) // 开始打包 mw.ui.StartPackingBtn, err = walk.NewPushButton(mw) mw.checkError(err) mw.ui.StartPackingBtn.SetText("开始打包") mw.ui.StartPackingBtn.SetBounds(walk.Rectangle{310, 20, 75, 30}) // 版本配置 mw.ui.VersionGb, err = walk.NewGroupBox(mw) mw.checkError(err) mw.ui.VersionGb.SetTitle("版本配置") mw.ui.VersionGb.SetFont(otherFont) err = mw.ui.VersionGb.SetBounds(walk.Rectangle{10, 60, 330, 260}) mw.checkError(err) // 版本类型 mw.ui.VersionTypeLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.VersionTypeLb.SetText("版本类型:") mw.ui.VersionTypeLb.SetFont(fountTitle) mw.ui.VersionTypeLb.SetBounds(walk.Rectangle{10, 20, 70, 25}) // 测试版 mw.ui.VersionTestRadio, err = walk.NewRadioButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.VersionTestRadio.SetText("测试版") mw.ui.VersionTestRadio.SetBounds(walk.Rectangle{110, 20, 60, 25}) mw.ui.VersionTestRadio.SetChecked(true) // 正式版 mw.ui.VersionOffRadio, err = walk.NewRadioButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.VersionOffRadio.SetText("正式版") mw.ui.VersionOffRadio.SetBounds(walk.Rectangle{180, 20, 70, 25}) // 主版本号 mw.ui.MasterVersionLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.MasterVersionLb.SetText("主版本号:") mw.ui.MasterVersionLb.SetFont(fountTitle) mw.ui.MasterVersionLb.SetBounds(walk.Rectangle{10, 60, 70, 25}) // 主版本号内容 mw.ui.MasterVersionLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.MasterVersionLe.SetBounds(walk.Rectangle{110, 60, 60, 25}) // 生成版本号 mw.ui.PackVersionLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.PackVersionLb.SetText("生成版本:") mw.ui.PackVersionLb.SetFont(fountTitle) mw.ui.PackVersionLb.SetBounds(walk.Rectangle{10, 100, 70, 25}) // 生成版本号内容 mw.ui.PackVersionLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.PackVersionLe.SetEnabled(false) mw.ui.PackVersionLe.SetBounds(walk.Rectangle{110, 100, 140, 25}) // PC助手 mw.ui.PcHelperLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.PcHelperLb.SetText("PC助手:") mw.ui.PcHelperLb.SetFont(fountTitle) mw.ui.PcHelperLb.SetBounds(walk.Rectangle{10, 140, 70, 25}) // PC助手上传路径 mw.ui.PcHelperLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.PcHelperLe.SetBounds(walk.Rectangle{110, 140, 150, 25}) // PC助手上传按钮 mw.ui.PcUploadBtn, err = walk.NewPushButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.PcUploadBtn.SetText("上传") mw.ui.PcUploadBtn.SetBounds(walk.Rectangle{270, 140, 50, 25}) // Android助手 mw.ui.AndroidHelperLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.AndroidHelperLb.SetText("Android助手:") mw.ui.AndroidHelperLb.SetFont(fountTitle) mw.ui.AndroidHelperLb.SetBounds(walk.Rectangle{10, 180, 100, 25}) // Android助手上传路径 mw.ui.AndroidHelperLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.AndroidHelperLe.SetBounds(walk.Rectangle{110, 180, 150, 25}) // Android助手上传按钮 mw.ui.AndUploadBtn, err = walk.NewPushButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.AndUploadBtn.SetText("上传") mw.ui.AndUploadBtn.SetBounds(walk.Rectangle{270, 180, 50, 25}) // Web 数据库 mw.ui.WebSqlLb, err = walk.NewLabel(mw.ui.VersionGb) mw.checkError(err) mw.ui.WebSqlLb.SetText("Web 数据库:") mw.ui.WebSqlLb.SetFont(fountTitle) mw.ui.WebSqlLb.SetBounds(walk.Rectangle{10, 220, 90, 25}) // Web 数据库上传路径 mw.ui.WebSqlLe, err = walk.NewLineEdit(mw.ui.VersionGb) mw.checkError(err) mw.ui.WebSqlLe.SetBounds(walk.Rectangle{110, 220, 150, 25}) // Web 数据库上传按钮 mw.ui.WebSqlBtn, err = walk.NewPushButton(mw.ui.VersionGb) mw.checkError(err) mw.ui.WebSqlBtn.SetText("上传") mw.ui.WebSqlBtn.SetBounds(walk.Rectangle{270, 220, 50, 25}) // 打包内容配置 mw.ui.PackGb, err = walk.NewGroupBox(mw) mw.checkError(err) mw.ui.PackGb.SetTitle("打包内容配置") mw.ui.PackGb.SetFont(otherFont) mw.ui.PackGb.SetBounds(walk.Rectangle{355, 60, 335, 260}) // 全选 mw.ui.CheckAllLb, err = walk.NewLabel(mw.ui.PackGb) mw.checkError(err) mw.ui.CheckAllLb.SetText("全选:") mw.ui.CheckAllLb.SetFont(fountTitle) mw.ui.CheckAllLb.SetBounds(walk.Rectangle{10, 20, 55, 25}) // 全选框 mw.ui.CheckAllCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.CheckAllCb.SetVisible(true) mw.ui.CheckAllCb.SetBounds(walk.Rectangle{80, 20, 70, 25}) // 服务器 mw.ui.ServerLb, err = walk.NewLabel(mw.ui.PackGb) mw.checkError(err) mw.ui.ServerLb.SetText("服务器:") mw.ui.ServerLb.SetFont(fountTitle) mw.ui.ServerLb.SetBounds(walk.Rectangle{10, 50, 55, 25}) // Java Web复选框 mw.ui.JavaWebCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.JavaWebCb.SetText("Java Web") mw.ui.JavaWebCb.SetBounds(walk.Rectangle{80, 50, 80, 25}) // Web 数据库复选框 mw.ui.WebSqlCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.WebSqlCb.SetText("Web 数据库") mw.ui.WebSqlCb.SetBounds(walk.Rectangle{170, 50, 90, 25}) // PC助手 mw.ui.PcHelperCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.PcHelperCb.SetText("PC助手") mw.ui.PcHelperCb.SetBounds(walk.Rectangle{80, 90, 60, 25}) // Android助手 mw.ui.AndroidHelperCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.AndroidHelperCb.SetText("Android助手") mw.ui.AndroidHelperCb.SetBounds(walk.Rectangle{170, 90, 90, 25}) // 控制器 mw.ui.ControlLb, err = walk.NewLabel(mw.ui.PackGb) mw.checkError(err) mw.ui.ControlLb.SetText("控制器:") mw.ui.ControlLb.SetFont(fountTitle) mw.ui.ControlLb.SetBounds(walk.Rectangle{10, 130, 55, 25}) // Linux knl mw.ui.LinuxKnlCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.LinuxKnlCb.SetText("Linux Knl") mw.ui.LinuxKnlCb.SetBounds(walk.Rectangle{80, 130, 80, 25}) // Linux App mw.ui.LinuxAppCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.LinuxAppCb.SetText("Linux App") mw.ui.LinuxAppCb.SetBounds(walk.Rectangle{170, 130, 80, 25}) // Linux Ruby mw.ui.LinuxRubyCb, err = walk.NewCheckBox(mw.ui.PackGb) mw.checkError(err) mw.ui.LinuxRubyCb.SetText("Linux Ruby") mw.ui.LinuxRubyCb.SetBounds(walk.Rectangle{80, 170, 90, 25}) // 打包日志 TabWidget mw.ui.PackTabWidget, err = walk.NewTabWidget(mw) mw.checkError(err) mw.ui.PackTabWidget.SetBounds(walk.Rectangle{10, 330, 680, 200}) // 打包日志 TabPage mw.ui.PackTabPage, err = walk.NewTabPage() mw.ui.PackTabPage.SetTitle("打包日志") // 历史版本记录 TabPage mw.ui.VersionPage, err = walk.NewTabPage() mw.ui.VersionPage.SetTitle("历史版本记录") // TabPage 添加到 TabWidget mw.ui.PackTabWidget.Pages().Add(mw.ui.PackTabPage) mw.ui.PackTabWidget.Pages().Add(mw.ui.VersionPage) // 打包日志 输出记录 mw.ui.lv, err = NewLogView(mw.ui.PackTabPage) mw.checkError(err) err = mw.ui.lv.SetBounds(walk.Rectangle{-1, -1, 680, 180}) mw.checkError(err) log.SetOutput(mw.ui.lv) // 历史版本记录 TableView mw.ui.VersionTableView, err = walk.NewTableView(mw.ui.VersionPage) mw.checkError(err) mw.ui.VersionTableView.SetBounds(walk.Rectangle{-1, -1, 680, 180}) // 历史版本记录 - 序号 mw.ui.VersionTabVieConIndex = walk.NewTableViewColumn() mw.ui.VersionTabVieConIndex.SetTitle("序号") mw.ui.VersionTabVieConIndex.SetWidth(50) // 历史版本记录 - 版本 mw.ui.VersionTabVieConVer = walk.NewTableViewColumn() mw.ui.VersionTabVieConVer.SetTitle("版本") mw.ui.VersionTabVieConVer.SetWidth(100) // 历史版本记录 - 打包内容 mw.ui.VersionTabVieConPack = walk.NewTableViewColumn() mw.ui.VersionTabVieConPack.SetTitle("打包内容") mw.ui.VersionTabVieConPack.SetWidth(120) // 历史版本记录 - 是否打Tag mw.ui.VersionTabVieConTag = walk.NewTableViewColumn() mw.ui.VersionTabVieConTag.SetTitle("Tag") mw.ui.VersionTabVieConTag.SetWidth(120) // 历史版本记录 - Tag 路径 mw.ui.VersionTabVieConTagPath = walk.NewTableViewColumn() mw.ui.VersionTabVieConTagPath.SetTitle("Tag路径") mw.ui.VersionTabVieConTagPath.SetWidth(150) // 历史版本记录 - 打包时间 mw.ui.VersionTabVieConTime = walk.NewTableViewColumn() mw.ui.VersionTabVieConTime.SetTitle("打包时间") mw.ui.VersionTabVieConTime.SetWidth(100) // TableViewColumn 添加到 TableView mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConIndex) mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConVer) mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConPack) mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConTag) mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConTagPath) mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConTime) // 历史版本记录数据 mw.ui.VersionTableView.SetCheckBoxes(true) mw.ui.VersionTableView.SetModel(ConfVerModel) succeeded = true return nil }
func (m Menu) createAction(builder *Builder, menu *walk.Menu) (*walk.Action, error) { subMenu, err := walk.NewMenu() if err != nil { return nil, err } action, err := menu.Actions().AddMenu(subMenu) if err != nil { return nil, err } if err := action.SetText(m.Text); err != nil { return nil, err } if err := setActionImage(action, m.Image); err != nil { return nil, err } for _, item := range m.Items { if _, err := item.createAction(builder, subMenu); err != nil { return nil, err } } if m.AssignActionTo != nil { *m.AssignActionTo = action } if m.AssignTo != nil { *m.AssignTo = subMenu } return action, nil }