Instantly share code, notes, and snippets.
-
Star
(0)
0
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save mkamotsu/5624620 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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