148 lines
5.1 KiB
Go
148 lines
5.1 KiB
Go
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)
|
|
}
|