Ejemplo n.º 1
0
func (tv TableView) Create(builder *Builder) error {
	var w *walk.TableView
	var err error
	if tv.NotSortableByHeaderClick {
		w, err = walk.NewTableViewWithStyle(builder.Parent(), win.LVS_NOSORTHEADER)
	} else {
		w, err = walk.NewTableView(builder.Parent())
	}
	if err != nil {
		return err
	}

	return builder.InitWidget(tv, w, func() error {
		for i := range tv.Columns {
			if err := tv.Columns[i].Create(w); err != nil {
				return err
			}
		}

		if err := w.SetModel(tv.Model); err != nil {
			return err
		}

		if tv.AlternatingRowBGColor != 0 {
			w.SetAlternatingRowBGColor(tv.AlternatingRowBGColor)
		}
		w.SetCheckBoxes(tv.CheckBoxes)
		w.SetItemStateChangedEventDelay(tv.ItemStateChangedEventDelay)
		if err := w.SetLastColumnStretched(tv.LastColumnStretched); err != nil {
			return err
		}
		if err := w.SetSingleItemSelection(tv.SingleItemSelection); err != nil {
			return err
		}

		if tv.OnCurrentIndexChanged != nil {
			w.CurrentIndexChanged().Attach(tv.OnCurrentIndexChanged)
		}
		if tv.OnSelectedIndexesChanged != nil {
			w.SelectedIndexesChanged().Attach(tv.OnSelectedIndexesChanged)
		}
		if tv.OnItemActivated != nil {
			w.ItemActivated().Attach(tv.OnItemActivated)
		}

		if tv.AssignTo != nil {
			*tv.AssignTo = w
		}

		return nil
	})
}
Ejemplo n.º 2
0
func (tv TableView) Create(builder *Builder) error {
	w, err := walk.NewTableView(builder.Parent())
	if err != nil {
		return err
	}

	return builder.InitWidget(tv, w, func() error {
		for i := range tv.Columns {
			if err := tv.Columns[i].Create(w); err != nil {
				return err
			}
		}

		if err := w.SetModel(tv.Model); err != nil {
			return err
		}

		if tv.AlternatingRowBGColor != 0 {
			w.SetAlternatingRowBGColor(tv.AlternatingRowBGColor)
		}
		w.SetCheckBoxes(tv.CheckBoxes)
		w.SetItemStateChangedEventDelay(tv.ItemStateChangedEventDelay)
		if err := w.SetLastColumnStretched(tv.LastColumnStretched); err != nil {
			return err
		}
		w.SetReorderColumnsEnabled(tv.ReorderColumnsEnabled)
		if err := w.SetSingleItemSelection(tv.SingleItemSelection); err != nil {
			return err
		}

		if tv.OnCurrentIndexChanged != nil {
			w.CurrentIndexChanged().Attach(tv.OnCurrentIndexChanged)
		}
		if tv.OnSelectedIndexesChanged != nil {
			w.SelectedIndexesChanged().Attach(tv.OnSelectedIndexesChanged)
		}
		if tv.OnItemActivated != nil {
			w.ItemActivated().Attach(tv.OnItemActivated)
		}

		if tv.AssignTo != nil {
			*tv.AssignTo = w
		}

		return nil
	})
}
Ejemplo n.º 3
0
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
}
Ejemplo n.º 4
0
func main() {
	walk.Initialize(walk.InitParams{PanicOnError: true})
	defer walk.Shutdown()

	rand.Seed(time.Now().UnixNano())

	mainWnd, _ := walk.NewMainWindow()

	mw := &MainWindow{
		MainWindow: mainWnd,
		model:      NewFooModel(),
	}

	mw.SetLayout(walk.NewVBoxLayout())
	mw.SetTitle("Walk TableView Example")

	resetRowsButton, _ := walk.NewPushButton(mw)
	resetRowsButton.SetText("Reset Rows")

	resetRowsButton.Clicked().Attach(func() {
		// Get some fresh data.
		mw.model.ResetRows()
	})

	tableView, _ := walk.NewTableView(mw)

	tableView.SetAlternatingRowBGColor(walk.RGB(255, 255, 224))
	tableView.SetReorderColumnsEnabled(true)

	// Everybody loves check boxes.
	tableView.SetCheckBoxes(true)

	// Don't forget to set the model.
	tableView.SetModel(mw.model)

	mw.SetMinMaxSize(walk.Size{320, 240}, walk.Size{})
	mw.SetSize(walk.Size{800, 600})
	mw.Show()

	mw.Run()
}
Ejemplo n.º 5
0
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()
}
Ejemplo n.º 6
0
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{800, 560})
	mw.checkError(err)

	// 设置主窗体标题
	err = mw.SetTitle("iMan-打包工具   V【" + _VERSION_ + "】")
	mw.checkError(err)

	mw.ui.PushButton1, err = walk.NewPushButton(mw)
	mw.checkError(err)
	mw.ui.PushButton1.SetText("刷新")
	mw.ui.PushButton1.SetBounds(walk.Rectangle{300, 10, 50, 30})

	// 获取
	mw.ui.PushButton2, err = walk.NewPushButton(mw)
	mw.checkError(err)
	mw.ui.PushButton2.SetText("获取")
	mw.ui.PushButton2.SetBounds(walk.Rectangle{400, 10, 50, 30})

	// 打包日志 TabWidget
	mw.ui.PackTabWidget, err = walk.NewTabWidget(mw)
	mw.checkError(err)
	mw.ui.PackTabWidget.SetBounds(walk.Rectangle{5, 50, 780, 500})

	// 历史版本记录 TabPage
	mw.ui.VersionPage, err = walk.NewTabPage()
	mw.ui.VersionPage.SetTitle("历史版本记录")

	// TabPage 添加到 TabWidget
	mw.ui.PackTabWidget.Pages().Add(mw.ui.VersionPage)

	// 历史版本记录 TableView
	mw.ui.VersionTableView, err = walk.NewTableView(mw.ui.VersionPage)
	mw.ui.VersionTableView.SetCheckBoxes(true)
	mw.ui.VersionTableView.SetBounds(walk.Rectangle{10, 10, 770, 460})

	mw.checkError(err)

	// 历史版本记录 - 序号
	mw.ui.VersionTabVieConIndex = walk.NewTableViewColumn()
	mw.ui.VersionTabVieConIndex.SetTitle("序号")
	mw.ui.VersionTabVieConIndex.SetWidth(50)

	// 历史版本记录 - 主版本
	mw.ui.VersionTabVieConMastVer = walk.NewTableViewColumn()
	mw.ui.VersionTabVieConMastVer.SetTitle("主版本")
	mw.ui.VersionTabVieConMastVer.SetWidth(60)

	// 历史版本记录 - 版本
	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(150)
	mw.ui.VersionTabVieConTime.SetFormat(layoutTime)

	// TableViewColumn 添加到 TableView
	mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConIndex)
	mw.ui.VersionTableView.Columns().Add(mw.ui.VersionTabVieConMastVer)
	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)

	succeeded = true

	return nil
}
Ejemplo n.º 7
0
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
}