Skip to content

Commit 9c52572

Browse files
committed
Refactor menu API for improved event handling and item management
- Replace old event handler system with type-safe closures - Add factory methods for Menu and MenuItem creation - Improve MenuItem property access and state management - Enhance Menu class with item access, insertion, and removal methods - Update TrayIcon to support context menu and event listener cleanup - Update main.swift to use new menu API and event handler style
1 parent 4645503 commit 9c52572

File tree

3 files changed

+1010
-411
lines changed

3 files changed

+1010
-411
lines changed

Sources/Example/main.swift

Lines changed: 87 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,49 @@ import NativeAPI
2727
print("✅ Tray icon configured")
2828

2929
// Create context menu for tray icon
30-
let contextMenu = Menu()
30+
guard let contextMenu = Menu.create() else {
31+
print("❌ Failed to create context menu")
32+
return
33+
}
3134

3235
// Add "Show Window" menu item
33-
let showItem = contextMenu.addItem(text: "显示窗口") { event in
36+
guard let showItem = MenuItem.create("显示窗口") else {
37+
print("❌ Failed to create show item")
38+
return
39+
}
40+
contextMenu.addItem(showItem)
41+
showItem.onClicked { menuItem in
3442
print("📱 显示窗口 - 菜单项点击成功!")
35-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
43+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
3644
}
3745
print("✅ 创建'显示窗口'菜单项,ID: \(showItem.id)")
3846

3947
// Add separator
4048
contextMenu.addSeparator()
4149

4250
// Add "About" menu item
43-
let aboutItem = contextMenu.addItem(text: "关于") { event in
51+
guard let aboutItem = MenuItem.create("关于") else {
52+
print("❌ Failed to create about item")
53+
return
54+
}
55+
contextMenu.addItem(aboutItem)
56+
aboutItem.onClicked { menuItem in
4457
print("ℹ️ 关于菜单项点击成功!")
4558
print(" NativeAPI Demo v1.0")
46-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
59+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
4760
}
4861
print("✅ 创建'关于'菜单项,ID: \(aboutItem.id)")
4962

5063
// Add "Settings" menu item
51-
let settingsItem = contextMenu.addItem(text: "设置") { event in
64+
guard let settingsItem = MenuItem.create("设置") else {
65+
print("❌ Failed to create settings item")
66+
return
67+
}
68+
contextMenu.addItem(settingsItem)
69+
settingsItem.onClicked { menuItem in
5270
print("⚙️ 设置菜单项点击成功!")
5371
print(" 打开设置面板")
54-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
72+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
5573
}
5674
print("✅ 创建'设置'菜单项,ID: \(settingsItem.id)")
5775

@@ -62,25 +80,35 @@ import NativeAPI
6280
print("📝 添加 Checkbox 菜单项演示...")
6381

6482
// First create the checkbox items without event handlers
65-
let showToolbarItem = contextMenu.addCheckboxItem(text: "显示工具栏", checked: true)
66-
print("✅ 创建复选框'显示工具栏',ID: \(showToolbarItem.id), 初始状态: \(showToolbarItem.isChecked)")
83+
guard let showToolbarItem = MenuItem.create("显示工具栏", type: .checkbox) else {
84+
print("❌ Failed to create toolbar checkbox")
85+
return
86+
}
87+
showToolbarItem.setChecked(true)
88+
contextMenu.addItem(showToolbarItem)
89+
print("✅ 创建复选框'显示工具栏',ID: \(showToolbarItem.id), 初始状态: \(showToolbarItem.isChecked())")
6790

68-
let autoSaveItem = contextMenu.addCheckboxItem(text: "自动保存", checked: false)
69-
print("✅ 创建复选框'自动保存',ID: \(autoSaveItem.id), 初始状态: \(autoSaveItem.isChecked)")
91+
guard let autoSaveItem = MenuItem.create("自动保存", type: .checkbox) else {
92+
print("❌ Failed to create autosave checkbox")
93+
return
94+
}
95+
autoSaveItem.setChecked(false)
96+
contextMenu.addItem(autoSaveItem)
97+
print("✅ 创建复选框'自动保存',ID: \(autoSaveItem.id), 初始状态: \(autoSaveItem.isChecked())")
7098

7199
// Now add event handlers after the variables are declared
72-
showToolbarItem.onClick { event in
73-
let isChecked = showToolbarItem.isChecked
100+
showToolbarItem.onClicked { menuItem in
101+
let isChecked = menuItem.isChecked()
74102
print("☑️ 工具栏显示状态切换: \(isChecked)")
75103
print(" 工具栏现在\(isChecked ? "显示" : "隐藏")")
76-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
104+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
77105
}
78106

79-
autoSaveItem.onClick { event in
80-
let isChecked = autoSaveItem.isChecked
107+
autoSaveItem.onClicked { menuItem in
108+
let isChecked = menuItem.isChecked()
81109
print("☑️ 自动保存状态切换: \(isChecked)")
82110
print(" 自动保存功能\(isChecked ? "已启用" : "已禁用")")
83-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
111+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
84112
}
85113

86114
// Add separator
@@ -90,42 +118,68 @@ import NativeAPI
90118
print("📝 添加 Radio 按钮组演示...")
91119

92120
// First create the radio items without event handlers
93-
let compactViewItem = contextMenu.addRadioItem(text: "紧凑视图", groupId: 1, checked: false)
94-
print("✅ 创建单选按钮'紧凑视图',ID: \(compactViewItem.id), 组: 1, 选中: \(compactViewItem.isChecked)")
121+
guard let compactViewItem = MenuItem.create("紧凑视图", type: .radio) else {
122+
print("❌ Failed to create compact view radio")
123+
return
124+
}
125+
compactViewItem.setRadioGroup(1)
126+
compactViewItem.setChecked(false)
127+
contextMenu.addItem(compactViewItem)
128+
print("✅ 创建单选按钮'紧凑视图',ID: \(compactViewItem.id), 组: 1, 选中: \(compactViewItem.isChecked())")
95129

96-
let normalViewItem = contextMenu.addRadioItem(text: "普通视图", groupId: 1, checked: true)
97-
print("✅ 创建单选按钮'普通视图',ID: \(normalViewItem.id), 组: 1, 选中: \(normalViewItem.isChecked)")
130+
guard let normalViewItem = MenuItem.create("普通视图", type: .radio) else {
131+
print("❌ Failed to create normal view radio")
132+
return
133+
}
134+
normalViewItem.setRadioGroup(1)
135+
normalViewItem.setChecked(true)
136+
contextMenu.addItem(normalViewItem)
137+
print("✅ 创建单选按钮'普通视图',ID: \(normalViewItem.id), 组: 1, 选中: \(normalViewItem.isChecked())")
98138

99-
let detailedViewItem = contextMenu.addRadioItem(text: "详细视图", groupId: 1, checked: false)
100-
print("✅ 创建单选按钮'详细视图',ID: \(detailedViewItem.id), 组: 1, 选中: \(detailedViewItem.isChecked)")
139+
guard let detailedViewItem = MenuItem.create("详细视图", type: .radio) else {
140+
print("❌ Failed to create detailed view radio")
141+
return
142+
}
143+
detailedViewItem.setRadioGroup(1)
144+
detailedViewItem.setChecked(false)
145+
contextMenu.addItem(detailedViewItem)
146+
print("✅ 创建单选按钮'详细视图',ID: \(detailedViewItem.id), 组: 1, 选中: \(detailedViewItem.isChecked())")
101147

102148
// Now add event handlers after the variables are declared
103-
compactViewItem.onClick { event in
149+
compactViewItem.onClicked { menuItem in
150+
menuItem.setState(.checked)
104151
print("🔘 视图模式切换为: 紧凑视图")
105152
print(" Radio 组 ID: 1")
106-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
153+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
107154
}
108155

109-
normalViewItem.onClick { event in
156+
normalViewItem.onClicked { menuItem in
157+
menuItem.setState(.checked)
110158
print("🔘 视图模式切换为: 普通视图")
111159
print(" Radio 组 ID: 1")
112-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
160+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
113161
}
114162

115-
detailedViewItem.onClick { event in
163+
detailedViewItem.onClicked { menuItem in
164+
menuItem.setState(.checked)
116165
print("🔘 视图模式切换为: 详细视图")
117166
print(" Radio 组 ID: 1")
118-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
167+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
119168
}
120169

121170
// Add separator
122171
contextMenu.addSeparator()
123172

124173
// Add "Exit" menu item
125-
let exitItem = contextMenu.addItem(text: "退出") { event in
174+
guard let exitItem = MenuItem.create("退出") else {
175+
print("❌ Failed to create exit item")
176+
return
177+
}
178+
contextMenu.addItem(exitItem)
179+
exitItem.onClicked { menuItem in
126180
print("👋 退出菜单项点击成功!")
127181
print(" 退出应用程序")
128-
print(" 事件详情: ID=\(event.itemId), Text='\(event.itemText)'")
182+
print(" 菜单项详情: ID=\(menuItem.id), Text='\(menuItem.getText())'")
129183
exit(0)
130184
}
131185
print("✅ 创建'退出'菜单项,ID: \(exitItem.id)")
@@ -158,9 +212,8 @@ import NativeAPI
158212
print("💡 Tray icon is visible: \(trayIcon.isVisible)")
159213
print("💡 右键点击托盘图标可查看菜单")
160214

161-
if let bounds = trayIcon.bounds {
162-
print("💡 Tray icon bounds: (\(bounds.x), \(bounds.y), \(bounds.width)x\(bounds.height))")
163-
}
215+
let bounds = trayIcon.bounds
216+
print("💡 Tray icon bounds: (\(bounds.x), \(bounds.y), \(bounds.width)x\(bounds.height))")
164217
} else {
165218
print("❌ Failed to show tray icon")
166219
}

0 commit comments

Comments
 (0)