11#include < windows.h>
2- #include < algorithm>
32#include < atomic>
4- #include < iostream >
3+ #include < memory >
54#include < optional>
6- #include < unordered_map>
75#include < vector>
86#include " ../../menu.h"
97#include " ../../menu_event.h"
@@ -14,9 +12,6 @@ namespace nativeapi {
1412static std::atomic<MenuItemID> g_next_menu_item_id{1 };
1513static std::atomic<MenuID> g_next_menu_id{1 };
1614
17- // Global registry to map native objects to C++ objects for event emission
18- static std::unordered_map<MenuItemID, MenuItem*> g_menu_item_registry;
19- static std::unordered_map<MenuID, Menu*> g_menu_registry;
2015
2116// Helper function to convert KeyboardAccelerator to Windows accelerator
2217std::pair<UINT, UINT> ConvertAccelerator (
@@ -131,38 +126,19 @@ class MenuItem::Impl {
131126 }
132127};
133128
134- // MenuItem implementation
135- std::shared_ptr<MenuItem> MenuItem::Create (const std::string& text,
136- MenuItemType type) {
137- auto item = std::shared_ptr<MenuItem>(new MenuItem (text, type));
138- item->pimpl_ = std::make_unique<Impl>(nullptr , 0 , type);
139- item->id = g_next_menu_item_id++;
140- item->pimpl_ ->text_ = text;
141-
142- // Register the MenuItem for event emission
143- g_menu_item_registry[item->id ] = item.get ();
144-
145- return item;
146- }
147-
148- std::shared_ptr<MenuItem> MenuItem::CreateSeparator () {
149- return Create (" " , MenuItemType::Separator);
150- }
151129
152130MenuItem::MenuItem (void * native_item)
153131 : id(g_next_menu_item_id++),
154132 pimpl_ (std::make_unique<Impl>(nullptr , 0 , MenuItemType::Normal)) {
155- // Register the MenuItem for event emission
156- g_menu_item_registry[id] = this ;
157133}
158134
159135MenuItem::MenuItem (const std::string& text, MenuItemType type)
160- : id(0 ) { // Will be set in Create method
136+ : id(g_next_menu_item_id++),
137+ pimpl_(std::make_unique<Impl>(nullptr , 0 , type)) {
138+ pimpl_->text_ = text;
161139}
162140
163141MenuItem::~MenuItem () {
164- // Unregister from event registry
165- g_menu_item_registry.erase (id);
166142}
167143
168144MenuItemType MenuItem::GetType () const {
@@ -262,17 +238,10 @@ void MenuItem::SetState(MenuItemState state) {
262238 // Handle radio button group logic
263239 if (pimpl_->type_ == MenuItemType::Radio &&
264240 state == MenuItemState::Checked && pimpl_->radio_group_ >= 0 ) {
265- for (auto & pair : g_menu_item_registry) {
266- MenuItem* otherItem = pair.second ;
267- if (otherItem != this && otherItem->GetType () == MenuItemType::Radio &&
268- otherItem->GetRadioGroup () == pimpl_->radio_group_ ) {
269- otherItem->pimpl_ ->state_ = MenuItemState::Unchecked;
270- if (otherItem->pimpl_ ->parent_menu_ ) {
271- CheckMenuItem (otherItem->pimpl_ ->parent_menu_ ,
272- otherItem->pimpl_ ->menu_item_id_ , MF_UNCHECKED);
273- }
274- }
275- }
241+ // Note: Radio group logic would need to be implemented differently
242+ // without global registry. This could be done by maintaining group
243+ // information in the parent menu or through other means.
244+ // For now, this functionality is disabled.
276245 }
277246 }
278247}
@@ -319,22 +288,19 @@ bool MenuItem::Trigger() {
319288 if (!pimpl_->enabled_ )
320289 return false ;
321290
322- EmitSelectedEvent (pimpl_->text_ );
291+ try {
292+ std::string text = pimpl_->text_ .has_value () ? pimpl_->text_ .value () : " " ;
293+ EmitSync<MenuItemClickedEvent>(id, text);
294+ } catch (...) {
295+ // Protect against event emission exceptions
296+ }
323297 return true ;
324298}
325299
326300void * MenuItem::GetNativeObjectInternal () const {
327301 return reinterpret_cast <void *>(static_cast <uintptr_t >(pimpl_->menu_item_id_ ));
328302}
329303
330- void MenuItem::EmitSelectedEvent (const std::string& item_text) {
331- EmitSync<MenuItemClickedEvent>(id, item_text);
332- }
333-
334- void MenuItem::EmitStateChangedEvent (bool checked) {
335- // This method is kept for compatibility
336- }
337-
338304// Menu::Impl implementation
339305class Menu ::Impl {
340306 public:
@@ -352,36 +318,17 @@ class Menu::Impl {
352318 }
353319};
354320
355- // Menu implementation
356- std::shared_ptr<Menu> Menu::Create () {
357- HMENU hmenu = CreatePopupMenu ();
358- if (!hmenu) {
359- return nullptr ;
360- }
361-
362- auto menu = std::shared_ptr<Menu>(new Menu ());
363- menu->pimpl_ = std::make_unique<Impl>(hmenu);
364- menu->id = g_next_menu_id++;
365-
366- // Register the Menu for event emission
367- g_menu_registry[menu->id ] = menu.get ();
368-
369- return menu;
370- }
371321
372322Menu::Menu (void * native_menu)
373323 : id(g_next_menu_id++),
374324 pimpl_ (std::make_unique<Impl>(static_cast <HMENU>(native_menu))) {
375- // Register the Menu for event emission
376- g_menu_registry[id] = this ;
377325}
378326
379- Menu::Menu () : id(0 ) { // Will be set in Create method
327+ Menu::Menu () : id(g_next_menu_id++),
328+ pimpl_(std::make_unique<Impl>(CreatePopupMenu())) {
380329}
381330
382331Menu::~Menu () {
383- // Unregister from event registry
384- g_menu_registry.erase (id);
385332}
386333
387334void Menu::AddItem (std::shared_ptr<MenuItem> item) {
@@ -482,12 +429,12 @@ void Menu::Clear() {
482429}
483430
484431void Menu::AddSeparator () {
485- auto separator = MenuItem::CreateSeparator ( );
432+ auto separator = std::make_shared<MenuItem>( " " , MenuItemType::Separator );
486433 AddItem (separator);
487434}
488435
489436void Menu::InsertSeparator (size_t index) {
490- auto separator = MenuItem::CreateSeparator ( );
437+ auto separator = std::make_shared<MenuItem>( " " , MenuItemType::Separator );
491438 InsertItem (index, separator);
492439}
493440
@@ -588,15 +535,15 @@ bool Menu::IsEnabled() const {
588535}
589536
590537std::shared_ptr<MenuItem> Menu::CreateAndAddItem (const std::string& text) {
591- auto item = MenuItem::Create (text, MenuItemType::Normal);
538+ auto item = std::make_shared<MenuItem> (text, MenuItemType::Normal);
592539 AddItem (item);
593540 return item;
594541}
595542
596543std::shared_ptr<MenuItem> Menu::CreateAndAddItem (
597544 const std::string& text,
598545 const std::optional<std::string>& icon) {
599- auto item = MenuItem::Create (text, MenuItemType::Normal);
546+ auto item = std::make_shared<MenuItem> (text, MenuItemType::Normal);
600547 if (icon.has_value ()) {
601548 item->SetIcon (icon);
602549 }
@@ -607,7 +554,7 @@ std::shared_ptr<MenuItem> Menu::CreateAndAddItem(
607554std::shared_ptr<MenuItem> Menu::CreateAndAddSubmenu (
608555 const std::string& text,
609556 std::shared_ptr<Menu> submenu) {
610- auto item = MenuItem::Create (text, MenuItemType::Submenu);
557+ auto item = std::make_shared<MenuItem> (text, MenuItemType::Submenu);
611558 item->SetSubmenu (submenu);
612559 AddItem (item);
613560 return item;
0 commit comments