Skip to content

Instantly share code, notes, and snippets.

@mkamotsu
Created May 22, 2013 01:27
Show Gist options
  • Save mkamotsu/5624620 to your computer and use it in GitHub Desktop.
Save mkamotsu/5624620 to your computer and use it in GitHub Desktop.
// g++ -std=c++11 `pkg-config gtkmm-2.4 --cflags --libs` -o menu menu.cpp
#include <iostream>
#include <gtkmm.h>
#include <gtkmm/stock.h>
class MenuWindow: public Gtk::Window {
public:
MenuWindow() {
add(m_Box);
m_refActionGroup = Gtk::ActionGroup::create();
m_refActionGroup->add(Gtk::Action::create("FileMenu", "File"));
m_refActionGroup->add(Gtk::Action::create("FileOpen",
Gtk::Stock::OPEN, "_Open"),
sigc::mem_fun(*this, &MenuWindow::on_menu_file_open));
m_refActionGroup->add(Gtk::Action::create("FileSave",
Gtk::Stock::SAVE, "_Save"),
sigc::mem_fun(*this, &MenuWindow::on_menu_file_save));
m_refActionGroup->add(Gtk::Action::create("FileQuit",
Gtk::Stock::QUIT, "_Quit"),
sigc::mem_fun(*this, &MenuWindow::on_menu_file_quit));
m_refUIManager = Gtk::UIManager::create();
m_refUIManager->insert_action_group(m_refActionGroup);
add_accel_group(m_refUIManager->get_accel_group());
Glib::ustring ui_info =
"<ui>"
" <menubar name='MenuBar'>"
" <menu action='FileMenu'>"
" <menuitem action='FileOpen'/>"
" <menuitem action='FileSave'/>"
" <separator/>"
" <menuitem action='FileQuit'/>"
" </menu>"
" </menubar>"
"</ui>";
try {
m_refUIManager->add_ui_from_string(ui_info);
} catch (const Glib::Error& ex) {
std::cerr << "building menus failed: " << ex.what();
}
auto pMenubar = m_refUIManager->get_widget("/MenuBar");
if (pMenubar)
m_Box.pack_start(*pMenubar, Gtk::PACK_SHRINK);
show_all_children();
}
virtual ~MenuWindow() {}
protected:
void on_menu_file_open() {
Gtk::FileChooserDialog dialog("Please choose a file",
Gtk::FILE_CHOOSER_ACTION_OPEN);
dialog.set_transient_for(*this);
dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
Gtk::FileFilter filter_text;
filter_text.set_name("Text files");
filter_text.add_mime_type("text/plain");
dialog.add_filter(filter_text);
Gtk::FileFilter filter_any;
filter_any.set_name("Any files");
filter_any.add_pattern("*");
dialog.add_filter(filter_any);
int result = dialog.run();
switch(result) {
case(Gtk::RESPONSE_OK):
{
std::cout << "Open clicked." << std::endl;
std::string filename = dialog.get_filename();
std::cout << "File selected: " << filename << std::endl;
break;
}
case(Gtk::RESPONSE_CANCEL):
std::cout << "Cancel clicked." << std::endl;
break;
default:
std::cout << "Unexpected button clicked." << std::endl;
break;
}
}
void on_menu_file_save() {
Gtk::FileChooserDialog dialog("Please choose a file",
Gtk::FILE_CHOOSER_ACTION_SAVE);
dialog.set_transient_for(*this);
dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
Gtk::FileFilter filter_text;
filter_text.set_name("Text files");
filter_text.add_mime_type("text/plain");
dialog.add_filter(filter_text);
Gtk::FileFilter filter_any;
filter_any.set_name("Any files");
filter_any.add_pattern("*");
dialog.add_filter(filter_any);
int result = dialog.run();
switch(result) {
case(Gtk::RESPONSE_OK):
{
std::cout << "Open clicked." << std::endl;
std::string filename = dialog.get_filename();
std::cout << "File selected: " << filename << std::endl;
break;
}
case(Gtk::RESPONSE_CANCEL):
std::cout << "Cancel clicked." << std::endl;
break;
default:
std::cout << "Unexpected button clicked." << std::endl;
break;
}
}
void on_menu_file_quit() {
hide();
}
Gtk::VBox m_Box;
Glib::RefPtr<Gtk::UIManager> m_refUIManager;
Glib::RefPtr<Gtk::ActionGroup> m_refActionGroup;
};
int main(int argc, char** argv) {
Gtk::Main kit(argc, argv);
MenuWindow window;
Gtk::Main::run(window);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment