This commit is contained in:
2026-02-09 00:25:07 +08:00
commit 85ed0946c8
12 changed files with 756 additions and 0 deletions

147
utils/menu.go Normal file
View File

@@ -0,0 +1,147 @@
package utils
import (
"fmt"
"github.com/progrium/darwinkit/macos/appkit"
"github.com/progrium/darwinkit/objc"
)
var deviceStateCache = make(map[string]State)
type State struct {
Effect int
Color string
}
func UpdateMenu(menu appkit.Menu, app appkit.Application, statusBarItem appkit.StatusItem) {
menu.RemoveAllItems()
// 1. 刷新按钮
refreshItem := appkit.NewMenuItemWithAction("🔄 刷新设备列表", "r", func(sender objc.Object) {
UpdateMenu(menu, app, statusBarItem)
})
menu.AddItem(refreshItem)
menu.AddItem(appkit.MenuItem_SeparatorItem())
devices := ScanDevices()
// 更新 ToolTip 显示当前连接数
statusBarItem.Button().SetToolTip(fmt.Sprintf("雷蛇控制器 - 已连接设备: %d", len(devices)))
if len(devices) == 0 {
none := appkit.NewMenuItemWithAction("未发现雷蛇设备", "", func(sender objc.Object) {})
none.SetEnabled(false)
menu.AddItem(none)
} else {
for _, dev := range devices {
// 设备标题 (不可点击)
devTitle := appkit.NewMenuItemWithAction("⌨️ "+dev.Name, "", func(sender objc.Object) {})
devTitle.SetEnabled(false)
menu.AddItem(devTitle)
// 切换灯效模式 (二级菜单)
//modeMenuItem := appkit.NewMenuItemWithAction("⚙️ 切换灯效模式", "", func(sender objc.Object) {})
//modeSubMenu := appkit.NewMenuWithTitle("Select Mode")
// --- A. 常亮模式 ---
staticItem := appkit.NewMenuItemWithAction("☀️ 常亮模式", "", func(sender objc.Object) {})
if dev.CurrentEffect == KBD_EFFECT_STATIC {
staticItem.SetState(appkit.ControlStateValueOn)
}
colorMenu := appkit.NewMenuWithTitle("Colors")
for _, c := range PRESET_COLORS {
colorItem := appkit.NewMenuItemWithAction(c.Name, "", func(sender objc.Object) {
//dev.ApplyEffect(KBD_EFFECT_STATIC, c.R, c.G, c.B)
dev.SetStaticColor([]byte{c.R, c.G, c.B})
// 更新状态与缓存
key := fmt.Sprintf("%s|%s|%d", dev.Serial, dev.Product, dev.ProductID)
deviceStateCache[key] = State{Effect: KBD_EFFECT_STATIC, Color: c.Name}
UpdateMenu(menu, app, statusBarItem)
})
if dev.CurrentEffect == KBD_EFFECT_STATIC && dev.CurrentColor == c.Name {
colorItem.SetState(appkit.ControlStateValueOn)
}
colorMenu.AddItem(colorItem)
}
staticItem.SetSubmenu(colorMenu)
menu.AddItem(staticItem)
// --- B. 呼吸模式 ---
breathItem := appkit.NewMenuItemWithAction("🌬️ 呼吸模式", "", func(sender objc.Object) {
dev.SetBreathingColor() // 默认绿色
key := fmt.Sprintf("%s|%s|%d", dev.Serial, dev.Product, dev.ProductID)
deviceStateCache[key] = State{Effect: KBD_EFFECT_BREATHING, Color: ""}
UpdateMenu(menu, app, statusBarItem)
})
if dev.CurrentEffect == KBD_EFFECT_BREATHING {
breathItem.SetState(appkit.ControlStateValueOn)
}
menu.AddItem(breathItem)
// --- C. 波浪模式 ---
waveItem := appkit.NewMenuItemWithAction("🌊 波浪模式", "", func(sender objc.Object) {
//dev.ApplyEffect(KBD_EFFECT_WAVE, 0x01, 0x00, 0x00)
key := fmt.Sprintf("%s|%s|%d", dev.Serial, dev.Product, dev.ProductID)
deviceStateCache[key] = State{Effect: KBD_EFFECT_WAVE, Color: ""}
UpdateMenu(menu, app, statusBarItem)
})
if dev.CurrentEffect == KBD_EFFECT_WAVE {
waveItem.SetState(appkit.ControlStateValueOn)
}
menu.AddItem(waveItem)
// --- D. 响应模式 ---
reactiveItem := appkit.NewMenuItemWithAction("🌊 响应模式", "", func(sender objc.Object) {
//dev.ApplyEffect(KBD_EFFECT_WAVE, 0x01, 0x00, 0x00)
key := fmt.Sprintf("%s|%s|%d", dev.Serial, dev.Product, dev.ProductID)
deviceStateCache[key] = State{Effect: KBD_EFFECT_REACTIVE, Color: ""}
UpdateMenu(menu, app, statusBarItem)
})
if dev.CurrentEffect == KBD_EFFECT_REACTIVE {
reactiveItem.SetState(appkit.ControlStateValueOn)
}
menu.AddItem(reactiveItem)
// --- E. 关灯模式 --- 关灯
offLightsItem := appkit.NewMenuItemWithAction("关灯模式", "", func(sender objc.Object) {
dev.SetOffLightsColor([]byte{0x00, 0x00, 0x00})
key := fmt.Sprintf("%s|%s|%d", dev.Serial, dev.Product, dev.ProductID)
deviceStateCache[key] = State{Effect: KBD_EFFECT_OFFLIGHTS, Color: ""}
UpdateMenu(menu, app, statusBarItem)
})
if dev.CurrentEffect == KBD_EFFECT_OFFLIGHTS {
offLightsItem.SetState(appkit.ControlStateValueOn)
}
menu.AddItem(offLightsItem)
//modeMenuItem.SetSubmenu(modeSubMenu)
//menu.AddItem(modeMenuItem)
menu.AddItem(appkit.MenuItem_SeparatorItem())
}
}
menu.AddItem(appkit.NewMenuItemWithAction("退出", "q", func(sender objc.Object) {
app.Terminate(nil)
}))
}
func SetupStatusBar(app appkit.Application) {
// 创建状态栏项
item := appkit.StatusBar_SystemStatusBar().StatusItemWithLength(appkit.VariableStatusItemLength)
objc.Retain(&item)
// 设置图标
img := appkit.Image_ImageWithSystemSymbolNameAccessibilityDescription("antenna.radiowaves.left.and.right", "Razer Tool")
item.Button().SetImage(img)
// 设置描述
item.Button().SetToolTip("雷蛇设备控制器 (Razer Controller)")
// 创建初始菜单
menu := appkit.NewMenuWithTitle("Razer")
UpdateMenu(menu, app, item)
item.SetMenu(menu)
}