init
This commit is contained in:
147
utils/menu.go
Normal file
147
utils/menu.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user