mirror of
https://gitee.com/energye/energy.git
synced 2024-12-02 11:47:37 +08:00
163 lines
5.4 KiB
Go
163 lines
5.4 KiB
Go
package main
|
||
|
||
import (
|
||
"embed"
|
||
"fmt"
|
||
"github.com/energye/energy/v2/cef"
|
||
"github.com/energye/energy/v2/common"
|
||
"github.com/energye/golcl/lcl"
|
||
"github.com/energye/golcl/lcl/types"
|
||
"github.com/energye/golcl/lcl/win"
|
||
)
|
||
|
||
//go:embed resources
|
||
var resources embed.FS
|
||
|
||
func main() {
|
||
//全局初始化 每个应用都必须调用的
|
||
cef.GlobalInit(nil, &resources)
|
||
//创建应用
|
||
cefApp := cef.NewApplication()
|
||
//主窗口的配置
|
||
//
|
||
cef.BrowserWindow.Config.Url = "fs://energy"
|
||
cef.BrowserWindow.Config.IconFS = "resources/icon.ico"
|
||
cef.BrowserWindow.Config.LocalResource(cef.LocalLoadConfig{
|
||
Home: "sys-menu.html",
|
||
ResRootDir: "resources",
|
||
FS: &resources,
|
||
}.Build())
|
||
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
|
||
// 在窗口初始化时重置窗口布局 默认仅有CEFWindowParent
|
||
// 在这里重新指定 CEFWindowParent 的父组件, 默认是主窗口
|
||
// 仅 lcl 窗口
|
||
if window.IsLCL() {
|
||
// 主窗口
|
||
bw := window.AsLCLBrowserWindow().BrowserWindow()
|
||
// 拿到CEFWindowParent
|
||
windowParent := bw.WindowParent()
|
||
// 恢复四角定位, 因为默认整个窗口自动调整大小
|
||
windowParent.RevertCustomAnchors()
|
||
|
||
// 系统菜单
|
||
// 开始创建菜单
|
||
createSysMenu(bw)
|
||
|
||
// html 内容
|
||
// 重新设置父组件
|
||
// 创建contentBox panel组件
|
||
contentBox := lcl.NewPanel(bw)
|
||
contentBox.SetParent(bw) //这一步不能少
|
||
contentBox.SetAlign(types.AlClient) // 根据客户区自动适应大小, 这块是panel的宽高根据主窗口自动调整大小
|
||
|
||
//重新指定 CEFWindowParent 的父组件
|
||
windowParent.SetParent(contentBox)
|
||
// 重新设置四角定位,自动调整大小
|
||
windowParent.DefaultAnchors()
|
||
}
|
||
})
|
||
//运行应用
|
||
cef.Run(cefApp)
|
||
}
|
||
|
||
// 创建菜单
|
||
func createSysMenu(window *cef.LCLBrowserWindow) {
|
||
// 菜单通过 MainMenu popupMenu、menuitem组合
|
||
// 先创建 主菜单, 有很一些事件,也可以自己绘制菜单效果通过 canvas
|
||
mainMenu := lcl.NewMainMenu(window)
|
||
mainMenu.SetOnMeasureItem(func(sender lcl.IObject, aCanvas *lcl.TCanvas, width, height *int32) {
|
||
})
|
||
// 创建一级菜单
|
||
fileClassA := lcl.NewMenuItem(window)
|
||
fileClassA.SetCaption("文件(&F)") //菜单名称 alt + f
|
||
aboutClassA := lcl.NewMenuItem(window)
|
||
aboutClassA.SetCaption("关于(&A)")
|
||
|
||
// 把一及菜单添加到主菜单
|
||
mainMenu.Items().Add(fileClassA)
|
||
mainMenu.Items().Add(aboutClassA)
|
||
|
||
var createMenuItem = func(label, shortCut string, click func(lcl.IObject)) (result *lcl.TMenuItem) {
|
||
result = lcl.NewMenuItem(window)
|
||
result.SetCaption(label) //菜单项显示的文字
|
||
result.SetShortCutFromString(shortCut) // 快捷键
|
||
result.SetOnClick(click) // 触发事件,回调函数
|
||
return
|
||
}
|
||
|
||
// 给一级菜单添加菜单项
|
||
createItem := createMenuItem("新建(&N)", "Ctrl+N", func(lcl.IObject) {
|
||
fmt.Println("单击了新建")
|
||
})
|
||
fileClassA.Add(createItem) // 把创建好的菜单项添加到 第一个菜单中
|
||
openItem := createMenuItem("打开(&O)", "Ctrl+O", func(lcl.IObject) {
|
||
fmt.Println("单击了打开")
|
||
})
|
||
fileClassA.Add(openItem) // 把创建好的菜单项添加到 第一个菜单中
|
||
// 分割线
|
||
separate := lcl.NewMenuItem(window)
|
||
separate.SetCaption("-")
|
||
fileClassA.Add(separate) // 把创建好的菜单项添加到 第一个菜单中
|
||
//二级菜单
|
||
twoLevelMenu := lcl.NewMenuItem(window)
|
||
twoLevelMenu.SetCaption("二级菜单")
|
||
|
||
// 给二级菜单添加菜单
|
||
twoLevelSubOneMenu := createMenuItem("二级子菜单一", "", func(object lcl.IObject) {
|
||
lcl.ShowMessage("点击了 二级子菜单一, 提示框样式不好看,是因为没生成 syso 主题文件")
|
||
})
|
||
twoLevelMenu.Add(twoLevelSubOneMenu)
|
||
twoLevelSubTwoMenu := createMenuItem("二级子菜单二", "", func(object lcl.IObject) {
|
||
lcl.ShowMessage("点击了 二级子菜单二")
|
||
})
|
||
twoLevelMenu.Add(twoLevelSubTwoMenu)
|
||
fileClassA.Add(twoLevelMenu) // 把创建好的菜单项添加到 第一个菜单中
|
||
// 分割线
|
||
separate = lcl.NewMenuItem(window)
|
||
separate.SetCaption("-")
|
||
fileClassA.Add(separate)
|
||
|
||
// 退出
|
||
exit := createMenuItem("退出(&E)", "Ctrl+Q", func(object lcl.IObject) {
|
||
window.CloseBrowserWindow()
|
||
})
|
||
fileClassA.Add(exit)
|
||
// help
|
||
help := createMenuItem("帮助(&H)", "", func(object lcl.IObject) {
|
||
if lcl.Application.MessageBox("你确定需要帮助吗?", "消息框标题", win.MB_OKCANCEL+win.MB_ICONINFORMATION) == types.IdOK {
|
||
lcl.ShowMessage("你点击了“是")
|
||
}
|
||
})
|
||
aboutClassA.Add(help)
|
||
|
||
// Mac 偏好设置和关于菜单
|
||
if common.IsDarwin() {
|
||
// https://wiki.lazarus.freepascal.org/Mac_Preferences_and_About_Menu
|
||
// 动态添加的,静态好像是通过设计器将顶级的菜单标题设置为应用程序名,但动态的就是另一种方式
|
||
appMenu := lcl.NewMenuItem(window)
|
||
// 动态添加的,设置一个Unicode Apple logo char
|
||
appMenu.SetCaption(types.AppleLogoChar)
|
||
subItem := lcl.NewMenuItem(window)
|
||
|
||
subItem.SetCaption("关于")
|
||
subItem.SetOnClick(func(sender lcl.IObject) {
|
||
lcl.ShowMessage("About")
|
||
})
|
||
appMenu.Add(subItem)
|
||
|
||
subItem = lcl.NewMenuItem(window)
|
||
subItem.SetCaption("-")
|
||
appMenu.Add(subItem)
|
||
|
||
subItem = lcl.NewMenuItem(window)
|
||
subItem.SetCaption("首选项...")
|
||
subItem.SetShortCutFromString("Meta+,")
|
||
subItem.SetOnClick(func(sender lcl.IObject) {
|
||
lcl.ShowMessage("Preferences")
|
||
})
|
||
appMenu.Add(subItem)
|
||
// 添加
|
||
mainMenu.Items().Insert(0, appMenu)
|
||
}
|
||
}
|