Skip to content

Commit a570cf0

Browse files
committed
Replace MenuItemSelectedEvent with MenuItemClickedEvent
Update all menu item event listeners to use MenuItemClickedEvent instead of MenuItemSelectedEvent or MenuItemStateChangedEvent. Menu item state management is now handled by the application.
1 parent 3a505d8 commit a570cf0

File tree

7 files changed

+81
-69
lines changed

7 files changed

+81
-69
lines changed

examples/menu_example/main.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,34 +35,30 @@ int main() {
3535
std::cout << "Setting up event listeners..." << std::endl;
3636

3737
// Listen to menu item selection events
38-
fileItem->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
39-
std::cout << "[EVENT] Menu item selected: " << event.GetItemText()
38+
fileItem->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
39+
std::cout << "[EVENT] Menu item clicked: " << event.GetItemText()
4040
<< " (ID: " << event.GetItemId() << ")" << std::endl;
4141
});
4242

43-
checkboxItem->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
43+
checkboxItem->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
4444
std::cout << "[EVENT] Checkbox item clicked: " << event.GetItemText()
45-
<< " (ID: " << event.GetItemId() << ")" << std::endl;
45+
<< " (ID: " << event.GetItemId() << ") - Handle state manually" << std::endl;
4646
});
4747

48-
// Listen to state change events for checkable items
49-
checkboxItem->AddListener<MenuItemStateChangedEvent>([](const MenuItemStateChangedEvent& event) {
50-
std::cout << "[EVENT] Checkbox state changed: ID " << event.GetItemId()
51-
<< ", checked: " << (event.IsChecked() ? "true" : "false") << std::endl;
52-
});
48+
// Note: State management is now handled by the application
5349

54-
radioItem1->AddListener<MenuItemStateChangedEvent>([](const MenuItemStateChangedEvent& event) {
55-
std::cout << "[EVENT] Radio item 1 state changed: ID " << event.GetItemId()
56-
<< ", checked: " << (event.IsChecked() ? "true" : "false") << std::endl;
50+
radioItem1->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
51+
std::cout << "[EVENT] Radio item 1 clicked: ID " << event.GetItemId()
52+
<< " - Handle state manually" << std::endl;
5753
});
5854

59-
radioItem2->AddListener<MenuItemStateChangedEvent>([](const MenuItemStateChangedEvent& event) {
60-
std::cout << "[EVENT] Radio item 2 state changed: ID " << event.GetItemId()
61-
<< ", checked: " << (event.IsChecked() ? "true" : "false") << std::endl;
55+
radioItem2->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
56+
std::cout << "[EVENT] Radio item 2 clicked: ID " << event.GetItemId()
57+
<< " - Handle state manually" << std::endl;
6258
});
6359

64-
exitItem->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
65-
std::cout << "[EVENT] Exit item selected: " << event.GetItemText() << std::endl;
60+
exitItem->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
61+
std::cout << "[EVENT] Exit item clicked: " << event.GetItemText() << std::endl;
6662
std::cout << "Application should exit now..." << std::endl;
6763
});
6864

@@ -122,12 +118,12 @@ int main() {
122118
auto submenuItem1 = MenuItem::Create("Submenu Item 1", MenuItemType::Normal);
123119
auto submenuItem2 = MenuItem::Create("Submenu Item 2", MenuItemType::Normal);
124120

125-
submenuItem1->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
126-
std::cout << "[EVENT] Submenu item selected: " << event.GetItemText() << std::endl;
121+
submenuItem1->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
122+
std::cout << "[EVENT] Submenu item clicked: " << event.GetItemText() << std::endl;
127123
});
128124

129-
submenuItem2->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
130-
std::cout << "[EVENT] Submenu item selected: " << event.GetItemText() << std::endl;
125+
submenuItem2->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
126+
std::cout << "[EVENT] Submenu item clicked: " << event.GetItemText() << std::endl;
131127
});
132128

133129
submenu->AddItem(submenuItem1);
@@ -148,7 +144,7 @@ int main() {
148144
std::cout << "This example demonstrates:" << std::endl;
149145
std::cout << "1. Creating menus and menu items with different types" << std::endl;
150146
std::cout << "2. Using the new event system with AddListener<EventType>()" << std::endl;
151-
std::cout << "3. Handling MenuItemSelectedEvent and MenuItemStateChangedEvent" << std::endl;
147+
std::cout << "3. Handling MenuItemClickedEvent (state managed by application)" << std::endl;
152148
std::cout << "4. Handling MenuOpenedEvent and MenuClosedEvent" << std::endl;
153149
std::cout << "5. Programmatic event triggering" << std::endl;
154150
std::cout << "6. Submenu support with event propagation" << std::endl;

examples/tray_icon_example/main.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
using namespace nativeapi;
1515
using nativeapi::Menu;
1616
using nativeapi::MenuItem;
17-
using nativeapi::MenuItemSelectedEvent;
17+
using nativeapi::MenuItemClickedEvent;
1818
using nativeapi::MenuItemType;
1919

2020
int main() {
@@ -69,7 +69,7 @@ int main() {
6969

7070
// Add menu items
7171
auto status_item = MenuItem::Create("Status: Running", MenuItemType::Normal);
72-
status_item->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
72+
status_item->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
7373
std::cout << "Status clicked from context menu" << std::endl;
7474
});
7575
context_menu->AddItem(status_item);
@@ -79,15 +79,15 @@ int main() {
7979

8080
// Add settings item
8181
auto settings_item = MenuItem::Create("Settings...", MenuItemType::Normal);
82-
settings_item->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
82+
settings_item->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
8383
std::cout << "Settings clicked from context menu" << std::endl;
8484
std::cout << "Opening settings dialog..." << std::endl;
8585
});
8686
context_menu->AddItem(settings_item);
8787

8888
// Add about item
8989
auto about_item = MenuItem::Create("About", MenuItemType::Normal);
90-
about_item->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
90+
about_item->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
9191
std::cout << "About clicked from context menu" << std::endl;
9292
std::cout << "TrayIcon Example v1.0 - Native API Demo" << std::endl;
9393
});
@@ -99,7 +99,7 @@ int main() {
9999
// Add exit item
100100
auto exit_item = MenuItem::Create("Exit", MenuItemType::Normal);
101101
bool* should_exit = new bool(false);
102-
exit_item->AddListener<MenuItemSelectedEvent>([should_exit](const MenuItemSelectedEvent& event) {
102+
exit_item->AddListener<MenuItemClickedEvent>([should_exit](const MenuItemClickedEvent& event) {
103103
std::cout << "Exit clicked from context menu" << std::endl;
104104
*should_exit = true;
105105
});

examples/window_example/main.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ using nativeapi::DisplayManager;
88
using nativeapi::DisplayRemovedEvent;
99
using nativeapi::Menu;
1010
using nativeapi::MenuItem;
11-
using nativeapi::MenuItemSelectedEvent;
11+
using nativeapi::MenuItemClickedEvent;
1212
using nativeapi::MenuItemType;
1313
using nativeapi::TrayIcon;
1414
using nativeapi::TrayManager;
@@ -81,7 +81,7 @@ int main() {
8181

8282
// Add menu items
8383
auto show_window_item = MenuItem::Create("Show Window", MenuItemType::Normal);
84-
show_window_item->AddListener<MenuItemSelectedEvent>([window_ptr](const MenuItemSelectedEvent& event) {
84+
show_window_item->AddListener<MenuItemClickedEvent>([window_ptr](const MenuItemClickedEvent& event) {
8585
std::cout << "Show Window clicked from context menu" << std::endl;
8686
if (window_ptr) {
8787
window_ptr->Show();
@@ -91,7 +91,7 @@ int main() {
9191
context_menu->AddItem(show_window_item);
9292

9393
auto hide_window_item = MenuItem::Create("Hide Window", MenuItemType::Normal);
94-
hide_window_item->AddListener<MenuItemSelectedEvent>([window_ptr](const MenuItemSelectedEvent& event) {
94+
hide_window_item->AddListener<MenuItemClickedEvent>([window_ptr](const MenuItemClickedEvent& event) {
9595
std::cout << "Hide Window clicked from context menu" << std::endl;
9696
if (window_ptr) {
9797
window_ptr->Hide();
@@ -104,7 +104,7 @@ int main() {
104104

105105
// Add about item
106106
auto about_item = MenuItem::Create("About", MenuItemType::Normal);
107-
about_item->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
107+
about_item->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
108108
std::cout << "About clicked from context menu" << std::endl;
109109
std::cout << "Window Example v1.0 - Native API Demo" << std::endl;
110110
});
@@ -115,7 +115,7 @@ int main() {
115115

116116
// Add exit item
117117
auto exit_item = MenuItem::Create("Exit", MenuItemType::Normal);
118-
exit_item->AddListener<MenuItemSelectedEvent>([&window_manager](const MenuItemSelectedEvent& event) {
118+
exit_item->AddListener<MenuItemClickedEvent>([&window_manager](const MenuItemClickedEvent& event) {
119119
std::cout << "Exit clicked from context menu" << std::endl;
120120
// Get all windows and destroy them to trigger app exit
121121
auto windows = window_manager.GetAll();

src/capi/menu_c.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ int native_menu_item_add_listener(native_menu_item_t item, native_menu_item_even
440440

441441
// Add the appropriate event listener based on event type
442442
if (event_type == NATIVE_MENU_ITEM_EVENT_SELECTED) {
443-
menu_item->AddListener<MenuItemSelectedEvent>([item, listener_id](const MenuItemSelectedEvent& event) {
443+
menu_item->AddListener<MenuItemClickedEvent>([item, listener_id](const MenuItemClickedEvent& event) {
444444
// Find the listener data
445445
auto item_it = g_menu_item_listeners.find(item);
446446
if (item_it != g_menu_item_listeners.end()) {
@@ -456,15 +456,15 @@ int native_menu_item_add_listener(native_menu_item_t item, native_menu_item_even
456456
}
457457
});
458458
} else if (event_type == NATIVE_MENU_ITEM_EVENT_STATE_CHANGED) {
459-
menu_item->AddListener<MenuItemStateChangedEvent>([item, listener_id](const MenuItemStateChangedEvent& event) {
459+
menu_item->AddListener<MenuItemClickedEvent>([item, listener_id](const MenuItemClickedEvent& event) {
460460
// Find the listener data
461461
auto item_it = g_menu_item_listeners.find(item);
462462
if (item_it != g_menu_item_listeners.end()) {
463463
auto listener_it = item_it->second.find(listener_id);
464464
if (listener_it != item_it->second.end()) {
465465
native_menu_item_state_changed_event_t c_event = {};
466466
c_event.item_id = event.GetItemId();
467-
c_event.checked = event.IsChecked();
467+
c_event.checked = false; // Application should manage checkbox/radio state
468468

469469
listener_it->second->callback(&c_event, listener_it->second->user_data);
470470
}

src/menu.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,16 @@ class Menu;
132132
* auto item = MenuItem::Create("Open File", MenuItemType::Normal);
133133
* item->SetIcon("data:image/png;base64,...");
134134
* item->SetAccelerator(KeyboardAccelerator("O", KeyboardAccelerator::Ctrl));
135-
* item->AddListener<MenuItemSelectedEvent>([](const MenuItemSelectedEvent& event) {
135+
* item->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
136136
* // Handle menu item click
137137
* std::cout << "Opening file..." << std::endl;
138138
* });
139139
*
140140
* // Create a checkbox item
141141
* auto checkbox = MenuItem::Create("Show Toolbar", MenuItemType::Checkbox);
142142
* checkbox->SetChecked(true);
143-
* checkbox->AddListener<MenuItemStateChangedEvent>([](const MenuItemStateChangedEvent& event) {
144-
* std::cout << "Toolbar visibility: " << event.IsChecked() << std::endl;
143+
* checkbox->AddListener<MenuItemClickedEvent>([](const MenuItemClickedEvent& event) {
144+
* std::cout << "Toolbar clicked, handle state change manually" << std::endl;
145145
* });
146146
* ```
147147
*/

src/menu_event.h

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,70 +10,85 @@ typedef long MenuID;
1010
typedef long MenuItemID;
1111

1212
/**
13-
* @brief Menu item selection event.
13+
* @brief Menu opened event.
1414
*
15-
* This event is fired when a menu item is clicked or activated.
16-
* Contains information about which menu item was selected.
15+
* This event is fired when a menu has been displayed.
1716
*/
18-
class MenuItemSelectedEvent : public TypedEvent<MenuItemSelectedEvent> {
17+
class MenuOpenedEvent : public TypedEvent<MenuOpenedEvent> {
1918
public:
20-
MenuItemSelectedEvent(MenuItemID item_id, const std::string& item_text)
21-
: item_id_(item_id), item_text_(item_text) {}
19+
MenuOpenedEvent(MenuID menu_id) : menu_id_(menu_id) {}
2220

23-
MenuItemID GetItemId() const { return item_id_; }
24-
const std::string& GetItemText() const { return item_text_; }
21+
MenuID GetMenuId() const { return menu_id_; }
2522

2623
private:
27-
MenuItemID item_id_;
28-
std::string item_text_;
24+
MenuID menu_id_;
25+
};
26+
27+
/**
28+
* @brief Menu closed event.
29+
*
30+
* This event is fired when a menu has been hidden or closed.
31+
*/
32+
class MenuClosedEvent : public TypedEvent<MenuClosedEvent> {
33+
public:
34+
MenuClosedEvent(MenuID menu_id) : menu_id_(menu_id) {}
35+
36+
MenuID GetMenuId() const { return menu_id_; }
37+
38+
private:
39+
MenuID menu_id_;
2940
};
3041

3142
/**
32-
* @brief Menu item state change event.
43+
* @brief Menu item clicked event.
3344
*
34-
* This event is fired when a checkable menu item's state changes.
45+
* This event is fired when a menu item is clicked or activated.
46+
* Contains information about which menu item was clicked.
3547
*/
36-
class MenuItemStateChangedEvent : public TypedEvent<MenuItemStateChangedEvent> {
48+
class MenuItemClickedEvent : public TypedEvent<MenuItemClickedEvent> {
3749
public:
38-
MenuItemStateChangedEvent(MenuItemID item_id, bool checked)
39-
: item_id_(item_id), checked_(checked) {}
50+
MenuItemClickedEvent(MenuItemID item_id, const std::string& item_text)
51+
: item_id_(item_id), item_text_(item_text) {}
4052

4153
MenuItemID GetItemId() const { return item_id_; }
42-
bool IsChecked() const { return checked_; }
54+
const std::string& GetItemText() const { return item_text_; }
4355

4456
private:
4557
MenuItemID item_id_;
46-
bool checked_;
58+
std::string item_text_;
4759
};
4860

61+
4962
/**
50-
* @brief Menu opened event.
63+
* @brief Menu item submenu opened event.
5164
*
52-
* This event is fired when a menu has been displayed.
65+
* This event is fired when a menu item's submenu has been displayed.
5366
*/
54-
class MenuOpenedEvent : public TypedEvent<MenuOpenedEvent> {
67+
class MenuItemSubmenuOpenedEvent
68+
: public TypedEvent<MenuItemSubmenuOpenedEvent> {
5569
public:
56-
MenuOpenedEvent(MenuID menu_id) : menu_id_(menu_id) {}
70+
MenuItemSubmenuOpenedEvent(MenuItemID item_id) : item_id_(item_id) {}
5771

58-
MenuID GetMenuId() const { return menu_id_; }
72+
MenuItemID GetItemId() const { return item_id_; }
5973

6074
private:
61-
MenuID menu_id_;
75+
MenuItemID item_id_;
6276
};
6377

6478
/**
65-
* @brief Menu closed event.
79+
* @brief Menu item submenu closed event.
6680
*
67-
* This event is fired when a menu has been hidden or closed.
81+
* This event is fired when a menu item's submenu has been hidden or closed.
6882
*/
69-
class MenuClosedEvent : public TypedEvent<MenuClosedEvent> {
83+
class MenuItemSubmenuClosedEvent
84+
: public TypedEvent<MenuItemSubmenuClosedEvent> {
7085
public:
71-
MenuClosedEvent(MenuID menu_id) : menu_id_(menu_id) {}
86+
MenuItemSubmenuClosedEvent(MenuItemID item_id) : item_id_(item_id) {}
7287

73-
MenuID GetMenuId() const { return menu_id_; }
88+
MenuItemID GetItemId() const { return item_id_; }
7489

7590
private:
76-
MenuID menu_id_;
91+
MenuItemID item_id_;
7792
};
7893

7994
} // namespace nativeapi

src/platform/macos/menu_macos.mm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,11 +400,12 @@ - (void)menuDidClose:(NSMenu *)menu {
400400
}
401401

402402
void MenuItem::EmitSelectedEvent(const std::string& item_text) {
403-
EmitSync<MenuItemSelectedEvent>(id, item_text);
403+
EmitSync<MenuItemClickedEvent>(id, item_text);
404404
}
405405

406406
void MenuItem::EmitStateChangedEvent(bool checked) {
407-
EmitSync<MenuItemStateChangedEvent>(id, checked);
407+
// Now just emit clicked event, application manages state
408+
EmitSync<MenuItemClickedEvent>(id, pimpl_->text_);
408409
}
409410

410411
// Menu::Impl implementation

0 commit comments

Comments
 (0)