testing-repository/Gtkmm3/gtk85_menu2/src/MyWin.cc

130 lines
4.0 KiB
C++
Raw Normal View History

2021-06-12 22:10:22 +08:00
#include "MyWin.hh"
2021-06-13 20:24:52 +08:00
#include "winpe.xpm"
2021-06-12 22:10:22 +08:00
2021-06-13 21:40:20 +08:00
MyWin::MyWin():
main_box(Gtk::ORIENTATION_VERTICAL)
{
2021-06-12 22:10:22 +08:00
//Initalize Window
set_icon_name("org.gtk.daleclack");
set_default_size(800,450);
overlay.add_overlay(draw_area);
2021-06-13 20:24:52 +08:00
default_background();
overlay.add(background);
2021-06-12 22:10:22 +08:00
//Initalize menu
menu_builder=Gtk::Builder::create_from_file("../res/appmenu.xml");
auto object=menu_builder->get_object("app-menu");
auto gmenu=Glib::RefPtr<Gio::Menu>::cast_dynamic(object);
2021-06-13 20:24:52 +08:00
//Menu actions
add_action("quit",sigc::mem_fun(*this,&MyWin::win_quit));
add_action("default",sigc::mem_fun(*this,&MyWin::default_background));
add_action("back",sigc::mem_fun(*this,&MyWin::back_dialog));
add_action("about",sigc::mem_fun(*this,&MyWin::about_dialog));
2021-06-12 22:10:22 +08:00
//Set Popover Menu
popover.bind_model(gmenu);
popover.set_relative_to(draw_area);
2021-06-13 20:24:52 +08:00
2021-06-12 22:10:22 +08:00
//Set Gesture
2021-06-13 20:24:52 +08:00
gesture=Gtk::GestureMultiPress::create(overlay);
gesture->set_button(GDK_BUTTON_SECONDARY);
2021-06-12 22:10:22 +08:00
gesture->signal_pressed().connect(sigc::mem_fun(*this,&MyWin::btn_pressed));
2021-06-13 20:24:52 +08:00
2021-06-13 21:40:20 +08:00
//Add Toppanel
2021-06-13 20:24:52 +08:00
//Add Stack
2021-06-13 21:40:20 +08:00
main_box.pack_start(*(main_stack.stack));
overlay.add_overlay(main_box);
//Add Overlay to window and show everything
2021-06-12 22:10:22 +08:00
add(overlay);
show_all();
}
void MyWin::btn_pressed(int n_press,double x,double y){
2021-06-13 20:24:52 +08:00
//When mouse pressed,show a menu
2021-06-12 22:10:22 +08:00
Gdk::Rectangle point{(int)x,(int)y,1,1};
popover.set_pointing_to(point);
popover.popup();
}
2021-06-13 20:24:52 +08:00
void MyWin::default_background(){
//Default background
Glib::RefPtr<Gdk::Pixbuf> pixbuf=Gdk::Pixbuf::create_from_xpm_data(winpe);
Glib::RefPtr<Gdk::Pixbuf> sized=pixbuf->scale_simple(800,450,Gdk::INTERP_BILINEAR);
gtk_image_set_from_pixbuf(background.gobj(),sized->gobj());
//Free Memory of pixbufs
pixbuf.reset();
sized.reset();
}
void MyWin::back_dialog(){
//Initalize dialog
auto dialog=new Gtk::FileChooserDialog("Open Image File",
Gtk::FILE_CHOOSER_ACTION_OPEN);
dialog->set_transient_for(*this);
dialog->signal_response().connect(sigc::bind(
sigc::mem_fun(*this,&MyWin::change_background),dialog));
//Add button for dialog
dialog->add_button("OK",Gtk::RESPONSE_OK);
dialog->add_button("Cancel",Gtk::RESPONSE_CANCEL);
//Add Filter
auto filter=Gtk::FileFilter::create();
filter->set_name("Image Files");
filter->add_mime_type("image/*");
dialog->add_filter(filter);
auto filter2=Gtk::FileFilter::create();
filter2->set_name("All Files");
filter2->add_pattern("*");
dialog->add_filter(filter2);
dialog->show_all();
filter.reset();
filter2.reset();
}
void MyWin::change_background(int response,Gtk::FileChooserDialog *dialog){
Glib::ustring filename;
if(response==Gtk::RESPONSE_OK){
filename=dialog->get_filename();
//Default background
Glib::RefPtr<Gdk::Pixbuf> pixbuf=Gdk::Pixbuf::create_from_file(filename.c_str());
Glib::RefPtr<Gdk::Pixbuf> sized=pixbuf->scale_simple(800,450,Gdk::INTERP_BILINEAR);
gtk_image_set_from_pixbuf(background.gobj(),sized->gobj());
//Free Memory of pixbufs
pixbuf.reset();
sized.reset();
}
delete dialog;
}
void MyWin::about_dialog(){
char *version;
2021-06-13 21:40:20 +08:00
Gtk::AboutDialog about_dialog(true);
2021-06-13 20:24:52 +08:00
about_dialog.set_transient_for(*this);
//Create Comments
version=g_strdup_printf("1.0\nRunning against Gtkmm %d.%d.%d",
GTKMM_MAJOR_VERSION,
GTKMM_MINOR_VERSION,
GTKMM_MICRO_VERSION);
about_dialog.set_program_name("Gtk(85)");
about_dialog.set_version(version);
about_dialog.set_logo_icon_name("org.gtk.daleclack");
about_dialog.set_copyright("©2019—2021 The Xe Project");
about_dialog.set_comments("A test program for menu and background in gtkmm");
about_dialog.set_title("About gtk(85)");
about_dialog.run();
g_free(version);
}
void MyWin::win_quit(){
hide();
}
2021-06-12 22:10:22 +08:00
MyWin::~MyWin(){
}