#include "examplewindow.h" #include ExampleWindow::ExampleWindow() : m_Box{ Gtk::ORIENTATION_VERTICAL } { set_title( "main menu example" ); set_default_size( 200, 200 ); add( m_Box ); // put a MenuBar at the top of the box and other stuff below it. //Create actions for menus and toolbars: auto refActionGroup = Gio::SimpleActionGroup::create(); //File|New sub menu: refActionGroup->add_action("newstandard", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_new_generic)); refActionGroup->add_action("newfoo", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_new_generic)); refActionGroup->add_action("newgoo", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_new_generic)); //File menu: refActionGroup->add_action("quit", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_quit)); //Edit menu: refActionGroup->add_action("copy", sigc::mem_fun(*this, &ExampleWindow::on_menu_others)); refActionGroup->add_action("paste", sigc::mem_fun(*this, &ExampleWindow::on_menu_others)); refActionGroup->add_action("something", sigc::mem_fun(*this, &ExampleWindow::on_menu_others)); //Choices menus, to demonstrate Radio items, //using our convenience methods for string and int radio values: m_refChoice = refActionGroup->add_action_radio_string("choice", sigc::mem_fun(*this, &ExampleWindow::on_menu_choices), "a"); m_refChoiceOther = refActionGroup->add_action_radio_integer("choiceother", sigc::mem_fun(*this, &ExampleWindow::on_menu_choices_other), 1); m_refToggle = refActionGroup->add_action_bool("sometoggle", sigc::mem_fun(*this, &ExampleWindow::on_menu_toggle), false); //Help menu: refActionGroup->add_action("about", sigc::mem_fun(*this, &ExampleWindow::on_menu_others) ); insert_action_group("example", refActionGroup); m_refBuilder = Gtk::Builder::create(); //TODO: add_accel_group(m_refBuilder->get_accel_group()); //Layout the actions in a menubar and toolbar: Glib::ustring ui_info = "" " " " " " _File" "
" " " " New _Standard" " example.newstandard" " <Primary>n" " " " " " New _Foo" " example.newfoo" " " " " " New _Goo" " example.newgoo" " " "
" "
" " " " _Quit" " example.quit" " <Primary>q" " " "
" "
" " " " _Edit" "
" " " " _Copy" " example.copy" " <Primary>c" " " " " " _Paste" " example.paste" " <Primary>v" " " " " " _Something" " example.something" " " "
" "
" " " " _Choices" "
" " " " Choice _A" " example.choice" " a" " " " " " Choice _B" " example.choice" " b" " " "
" "
" " " " _Other Choices" "
" " " " Choice 1" " example.choiceother" " 1" " " " " " Choice 2" " example.choiceother" " 2" " " "
" "
" " " " Some Toggle" " example.sometoggle" " " "
" "
" " " " _Help" "
" " " " _About" " example.about" " " "
" "
" "
" "
"; try { m_refBuilder->add_from_string(ui_info); } catch( const Glib::Error& ex ) { std::cerr << "building menus failed: " << ex.what(); } //Get the menubar and add it to a container widget: auto object = m_refBuilder->get_object( "menu-example" ); auto gmenu = Glib::RefPtr::cast_dynamic(object); if ( !gmenu ) g_warning( "GMenu not found" ); //Menubar: Gtk::MenuBar* pMenubar = Gtk::manage( new Gtk::MenuBar(gmenu) ); m_Box.pack_start(*pMenubar, Gtk::PACK_SHRINK); //Create the toolbar and add it to a container widget: Gtk::Toolbar* toolbar = Gtk::manage(new Gtk::Toolbar()); Gtk::ToolButton* button = Gtk::manage(new Gtk::ToolButton()); button->set_icon_name("document-new"); //We can't do this until we can break the ToolButton ABI: button->set_detailed_action_name("example.new"); gtk_actionable_set_detailed_action_name (GTK_ACTIONABLE (button->gobj()), "example.newstandard"); toolbar->add(*button); button = Gtk::manage( new Gtk::ToolButton() ); button->set_icon_name("application-exit"); //We can't do this until we can break the ToolButton ABI: button->set_detailed_action_name("example.quit"); gtk_actionable_set_detailed_action_name (GTK_ACTIONABLE (button->gobj()), "example.quit"); toolbar->add( *button ); m_Box.pack_start( *toolbar, Gtk::PACK_SHRINK ); show_all_children(); } ExampleWindow::~ExampleWindow() {} void ExampleWindow::on_menu_file_quit() { hide(); //Closes the main window to stop the app->run(). } void ExampleWindow::on_menu_file_new_generic() { std::cout << "A File|New menu item was selected." << std::endl; } void ExampleWindow::on_menu_others() { std::cout << "A menu item was selected." << std::endl; } void ExampleWindow::on_menu_choices( const Glib::ustring& parameter ) { //The radio action's state does not change automatically: m_refChoice->change_state(parameter); Glib::ustring message; if ( parameter == "a" ) message = "Choice a was selected."; else message = "Choice b was selected"; std::cout << message << std::endl; } void ExampleWindow::on_menu_choices_other( int parameter ) { //The radio action's state does not change automatically: m_refChoiceOther->change_state(parameter); Glib::ustring message; if ( parameter == 1 ) message = "Choice 1 was selected."; else message = "Choice 2 was selected"; std::cout << message << std::endl; } void ExampleWindow::on_menu_toggle() { bool active = false; m_refToggle->get_state(active); //The toggle action's state does not change automatically: m_refToggle->change_state(!active); active = !active; Glib::ustring message; if(active) message = "Toggle is active."; else message = "Toggle is not active"; std::cout << message << std::endl; }