@@ -23,23 +23,23 @@ static void OnGtkMenuItemActivate(GtkMenuItem* /*item*/, gpointer user_data) {
2323 if (auto label = menu_item->GetLabel (); label.has_value ()) {
2424 text = *label;
2525 }
26- menu_item->Emit (MenuItemClickedEvent (menu_item->id , text));
26+ menu_item->Emit (MenuItemClickedEvent (menu_item->GetId () , text));
2727}
2828
2929static void OnGtkMenuShow (GtkWidget* /* menu*/ , gpointer user_data) {
3030 Menu* menu_obj = static_cast <Menu*>(user_data);
3131 if (!menu_obj) {
3232 return ;
3333 }
34- menu_obj->Emit (MenuOpenedEvent (menu_obj->id ));
34+ menu_obj->Emit (MenuOpenedEvent (menu_obj->GetId () ));
3535}
3636
3737static void OnGtkMenuHide (GtkWidget* /* menu*/ , gpointer user_data) {
3838 Menu* menu_obj = static_cast <Menu*>(user_data);
3939 if (!menu_obj) {
4040 return ;
4141 }
42- menu_obj->Emit (MenuClosedEvent (menu_obj->id ));
42+ menu_obj->Emit (MenuClosedEvent (menu_obj->GetId () ));
4343}
4444
4545static void OnGtkSubmenuShow (GtkWidget* /* submenu*/ , gpointer user_data) {
@@ -48,7 +48,7 @@ static void OnGtkSubmenuShow(GtkWidget* /*submenu*/, gpointer user_data) {
4848 return ;
4949 }
5050 // Emit submenu opened on the item
51- menu_item->Emit (MenuItemSubmenuOpenedEvent (menu_item->id ));
51+ menu_item->Emit (MenuItemSubmenuOpenedEvent (menu_item->GetId () ));
5252}
5353
5454static void OnGtkSubmenuHide (GtkWidget* /* submenu*/ , gpointer user_data) {
@@ -57,14 +57,15 @@ static void OnGtkSubmenuHide(GtkWidget* /*submenu*/, gpointer user_data) {
5757 return ;
5858 }
5959 // Emit submenu closed on the item
60- menu_item->Emit (MenuItemSubmenuClosedEvent (menu_item->id ));
60+ menu_item->Emit (MenuItemSubmenuClosedEvent (menu_item->GetId () ));
6161}
6262
6363// Private implementation class for MenuItem
6464class MenuItem ::Impl {
6565 public:
66- Impl (GtkWidget* menu_item, MenuItemType type)
67- : gtk_menu_item_(menu_item),
66+ Impl (MenuItemId id, GtkWidget* menu_item, MenuItemType type)
67+ : id_(id),
68+ gtk_menu_item_ (menu_item),
6869 title_(" " ),
6970 tooltip_(" " ),
7071 type_(type),
@@ -74,6 +75,7 @@ class MenuItem::Impl {
7475 radio_group_(-1 ),
7576 accelerator_(" " , KeyboardAccelerator::None) {}
7677
78+ MenuItemId id_;
7779 GtkWidget* gtk_menu_item_;
7880 std::optional<std::string> title_;
7981 std::shared_ptr<Image> image_;
@@ -87,8 +89,8 @@ class MenuItem::Impl {
8789 std::shared_ptr<Menu> submenu_;
8890};
8991
90- MenuItem::MenuItem (const std::string& text, MenuItemType type)
91- : id( IdAllocator::Allocate<MenuItem>()) {
92+ MenuItem::MenuItem (const std::string& text, MenuItemType type) {
93+ MenuItemId id = IdAllocator::Allocate<MenuItem>();
9294 GtkWidget* gtk_item = nullptr ;
9395
9496 switch (type) {
@@ -108,7 +110,7 @@ MenuItem::MenuItem(const std::string& text, MenuItemType type)
108110 break ;
109111 }
110112
111- pimpl_ = std::unique_ptr<Impl>(new Impl (gtk_item, type));
113+ pimpl_ = std::unique_ptr<Impl>(new Impl (id, gtk_item, type));
112114
113115 if (!text.empty ()) {
114116 pimpl_->title_ = text;
@@ -123,9 +125,9 @@ MenuItem::MenuItem(const std::string& text, MenuItemType type)
123125 }
124126}
125127
126- MenuItem::MenuItem (void * menu_item)
127- : id( IdAllocator::Allocate<MenuItem>()),
128- pimpl_ (new Impl((GtkWidget*)menu_item, MenuItemType::Normal)) {
128+ MenuItem::MenuItem (void * menu_item) {
129+ MenuItemId id = IdAllocator::Allocate<MenuItem>();
130+ pimpl_ = std::unique_ptr<Impl> (new Impl (id, (GtkWidget*)menu_item, MenuItemType::Normal));
129131 if (pimpl_->gtk_menu_item_ && pimpl_->type_ != MenuItemType::Separator) {
130132 const char * label =
131133 gtk_menu_item_get_label (GTK_MENU_ITEM (pimpl_->gtk_menu_item_ ));
@@ -144,6 +146,10 @@ MenuItem::MenuItem(void* menu_item)
144146
145147MenuItem::~MenuItem () {}
146148
149+ MenuItemId MenuItem::GetId () const {
150+ return pimpl_->id_ ;
151+ }
152+
147153MenuItemType MenuItem::GetType () const {
148154 return pimpl_->type_ ;
149155}
@@ -294,17 +300,18 @@ void* MenuItem::GetNativeObjectInternal() const {
294300// Private implementation class for Menu
295301class Menu ::Impl {
296302 public:
297- Impl (GtkWidget* menu) : gtk_menu_(menu), enabled_(true ), visible_(false ) {}
303+ Impl (MenuId id, GtkWidget* menu) : id_(id), gtk_menu_(menu), enabled_(true ), visible_(false ) {}
298304
305+ MenuId id_;
299306 GtkWidget* gtk_menu_;
300307 std::vector<std::shared_ptr<MenuItem>> items_;
301308 bool enabled_;
302309 bool visible_;
303310};
304311
305- Menu::Menu ()
306- : id( IdAllocator::Allocate<Menu>()),
307- pimpl_ ( std::unique_ptr<Impl>(new Impl(gtk_menu_new()))) {
312+ Menu::Menu () {
313+ MenuId id = IdAllocator::Allocate<Menu>();
314+ pimpl_ = std::unique_ptr<Impl>(new Impl (id, gtk_menu_new ()));
308315 // Connect menu show/hide to emit open/close events
309316 if (pimpl_->gtk_menu_ ) {
310317 g_signal_connect (G_OBJECT (pimpl_->gtk_menu_ ), " show" ,
@@ -314,8 +321,9 @@ Menu::Menu()
314321 }
315322}
316323
317- Menu::Menu (void * menu)
318- : id(IdAllocator::Allocate<Menu>()), pimpl_(new Impl((GtkWidget*)menu)) {
324+ Menu::Menu (void * menu) {
325+ MenuId id = IdAllocator::Allocate<Menu>();
326+ pimpl_ = std::unique_ptr<Impl>(new Impl (id, (GtkWidget*)menu));
319327 if (pimpl_->gtk_menu_ ) {
320328 g_signal_connect (G_OBJECT (pimpl_->gtk_menu_ ), " show" ,
321329 G_CALLBACK (OnGtkMenuShow), this );
@@ -330,6 +338,10 @@ Menu::~Menu() {
330338 }
331339}
332340
341+ MenuId Menu::GetId () const {
342+ return pimpl_->id_ ;
343+ }
344+
333345void Menu::AddItem (std::shared_ptr<MenuItem> item) {
334346 if (pimpl_->gtk_menu_ && item && item->GetNativeObject ()) {
335347 pimpl_->items_ .push_back (item);
@@ -369,7 +381,7 @@ bool Menu::RemoveItem(std::shared_ptr<MenuItem> item) {
369381
370382bool Menu::RemoveItemById (MenuItemId item_id) {
371383 for (auto & item : pimpl_->items_ ) {
372- if (item->id == item_id) {
384+ if (item->GetId () == item_id) {
373385 return RemoveItem (item);
374386 }
375387 }
@@ -413,7 +425,7 @@ std::shared_ptr<MenuItem> Menu::GetItemAt(size_t index) const {
413425
414426std::shared_ptr<MenuItem> Menu::GetItemById (MenuItemId item_id) const {
415427 for (const auto & item : pimpl_->items_ ) {
416- if (item->id == item_id) {
428+ if (item->GetId () == item_id) {
417429 return item;
418430 }
419431 }
@@ -424,34 +436,6 @@ std::vector<std::shared_ptr<MenuItem>> Menu::GetAllItems() const {
424436 return pimpl_->items_ ;
425437}
426438
427- std::shared_ptr<MenuItem> Menu::FindItemByText (const std::string& text,
428- bool case_sensitive) const {
429- for (const auto & item : pimpl_->items_ ) {
430- auto itemTextOpt = item->GetLabel ();
431- if (!itemTextOpt.has_value ()) {
432- continue ;
433- }
434-
435- const std::string& item_text = itemTextOpt.value ();
436- if (case_sensitive) {
437- if (item_text == text) {
438- return item;
439- }
440- } else {
441- std::string lower_item_text = item_text;
442- std::string lower_search_text = text;
443- std::transform (lower_item_text.begin (), lower_item_text.end (),
444- lower_item_text.begin (), ::tolower);
445- std::transform (lower_search_text.begin (), lower_search_text.end (),
446- lower_search_text.begin (), ::tolower);
447- if (lower_item_text == lower_search_text) {
448- return item;
449- }
450- }
451- }
452- return nullptr ;
453- }
454-
455439bool Menu::Open (double x, double y) {
456440 if (pimpl_->gtk_menu_ ) {
457441 pimpl_->visible_ = true ;
0 commit comments