@@ -48,9 +48,8 @@ class MenuItem::Impl {
4848 std::shared_ptr<Menu> submenu_;
4949};
5050
51- // MenuItem static factory methods
52- std::shared_ptr<MenuItem> MenuItem::Create (const std::string& text,
53- MenuItemType type) {
51+ MenuItem::MenuItem (const std::string& text, MenuItemType type)
52+ : id(g_next_menu_item_id++) {
5453 GtkWidget* gtk_item = nullptr ;
5554
5655 switch (type) {
@@ -70,28 +69,30 @@ std::shared_ptr<MenuItem> MenuItem::Create(const std::string& text,
7069 break ;
7170 }
7271
73- auto item = std::shared_ptr<MenuItem>(new MenuItem (text, type));
74- item->pimpl_ = std::unique_ptr<Impl>(new Impl (gtk_item, type));
75- item->id = g_next_menu_item_id++;
76- item->pimpl_ ->title_ = text;
72+ pimpl_ = std::unique_ptr<Impl>(new Impl (gtk_item, type));
7773
78- // Register the MenuItem for event emission
79- g_menu_item_registry[item->id ] = item.get ();
80-
81- return item;
82- }
83-
84- std::shared_ptr<MenuItem> MenuItem::CreateSeparator () {
85- return Create (" " , MenuItemType::Separator);
86- }
74+ if (!text.empty ()) {
75+ pimpl_->title_ = text;
76+ } else {
77+ pimpl_->title_ .reset ();
78+ }
8779
88- MenuItem::MenuItem ( const std::string& text, MenuItemType type) : id( 0 ) {
89- // Constructor body - id will be set in Create method
80+ // Register the MenuItem for event emission
81+ g_menu_item_registry[id] = this ;
9082}
9183
9284MenuItem::MenuItem (void * menu_item)
93- : pimpl_(new Impl((GtkWidget*)menu_item, MenuItemType::Normal)) {
94- id = g_next_menu_item_id++;
85+ : id(g_next_menu_item_id++),
86+ pimpl_(new Impl((GtkWidget*)menu_item, MenuItemType::Normal)) {
87+ if (pimpl_->gtk_menu_item_ && pimpl_->type_ != MenuItemType::Separator) {
88+ const char * label = gtk_menu_item_get_label (
89+ GTK_MENU_ITEM (pimpl_->gtk_menu_item_ ));
90+ if (label && label[0 ] != ' \0 ' ) {
91+ pimpl_->title_ = std::string (label);
92+ } else {
93+ pimpl_->title_ .reset ();
94+ }
95+ }
9596 g_menu_item_registry[id] = this ;
9697}
9798
@@ -236,14 +237,6 @@ void* MenuItem::GetNativeObjectInternal() const {
236237 return (void *)pimpl_->gtk_menu_item_ ;
237238}
238239
239- void MenuItem::EmitSelectedEvent (const std::string& item_text) {
240- // TODO: Implement event emission for GTK
241- }
242-
243- void MenuItem::EmitStateChangedEvent (bool checked) {
244- // TODO: Implement state change event emission for GTK
245- }
246-
247240// Private implementation class for Menu
248241class Menu ::Impl {
249242 public:
@@ -255,25 +248,14 @@ class Menu::Impl {
255248 bool visible_;
256249};
257250
258- // Menu static factory method
259- std::shared_ptr<Menu> Menu::Create () {
260- GtkWidget* gtk_menu = gtk_menu_new ();
261- auto menu = std::shared_ptr<Menu>(new Menu ());
262- menu->pimpl_ = std::unique_ptr<Impl>(new Impl (gtk_menu));
263- menu->id = g_next_menu_id++;
264-
265- // Register the Menu for event emission
266- g_menu_registry[menu->id ] = menu.get ();
267-
268- return menu;
269- }
270-
271- Menu::Menu () : id(0 ) {
272- // Constructor body - id will be set in Create method
251+ Menu::Menu ()
252+ : id(g_next_menu_id++),
253+ pimpl_ (std::unique_ptr<Impl>(new Impl(gtk_menu_new()))) {
254+ g_menu_registry[id] = this ;
273255}
274256
275- Menu::Menu (void * menu) : pimpl_( new Impl((GtkWidget*)menu)) {
276- id = g_next_menu_id++;
257+ Menu::Menu (void * menu)
258+ : id( g_next_menu_id++), pimpl_( new Impl((GtkWidget*)menu)) {
277259 g_menu_registry[id] = this ;
278260}
279261
@@ -346,12 +328,12 @@ void Menu::Clear() {
346328}
347329
348330void Menu::AddSeparator () {
349- auto separator = MenuItem::CreateSeparator ( );
331+ auto separator = std::make_shared<MenuItem>( " " , MenuItemType::Separator );
350332 AddItem (separator);
351333}
352334
353335void Menu::InsertSeparator (size_t index) {
354- auto separator = MenuItem::CreateSeparator ( );
336+ auto separator = std::make_shared<MenuItem>( " " , MenuItemType::Separator );
355337 InsertItem (index, separator);
356338}
357339
@@ -445,15 +427,15 @@ bool Menu::IsEnabled() const {
445427}
446428
447429std::shared_ptr<MenuItem> Menu::CreateAndAddItem (const std::string& text) {
448- auto item = MenuItem::Create (text, MenuItemType::Normal);
430+ auto item = std::make_shared<MenuItem> (text, MenuItemType::Normal);
449431 AddItem (item);
450432 return item;
451433}
452434
453435std::shared_ptr<MenuItem> Menu::CreateAndAddItem (
454436 const std::string& text,
455437 const std::optional<std::string>& icon) {
456- auto item = MenuItem::Create (text, MenuItemType::Normal);
438+ auto item = std::make_shared<MenuItem> (text, MenuItemType::Normal);
457439 if (icon.has_value ()) {
458440 item->SetIcon (icon);
459441 }
@@ -464,7 +446,7 @@ std::shared_ptr<MenuItem> Menu::CreateAndAddItem(
464446std::shared_ptr<MenuItem> Menu::CreateAndAddSubmenu (
465447 const std::string& text,
466448 std::shared_ptr<Menu> submenu) {
467- auto item = MenuItem::Create (text, MenuItemType::Submenu);
449+ auto item = std::make_shared<MenuItem> (text, MenuItemType::Submenu);
468450 item->SetSubmenu (submenu);
469451 AddItem (item);
470452 return item;
0 commit comments