From 869cd571329b392c5901bc237671d717614c3d6a Mon Sep 17 00:00:00 2001 From: daleclack Date: Mon, 28 Jun 2021 17:33:29 +0800 Subject: [PATCH] Update gtk79 --- Gtkmm3/gtk79_livetest/src/BackGround.cc | 82 ++++++++++++++++++++++++ Gtkmm3/gtk79_livetest/src/BackGround.hh | 19 ++++++ Gtkmm3/gtk79_livetest/src/MyWin.cc | 50 ++------------- Gtkmm3/gtk79_livetest/src/MyWin.hh | 2 + Gtkmm3/gtk79_livetest/src/image_types.hh | 36 +++++++++++ 5 files changed, 145 insertions(+), 44 deletions(-) create mode 100644 Gtkmm3/gtk79_livetest/src/BackGround.cc create mode 100644 Gtkmm3/gtk79_livetest/src/BackGround.hh create mode 100644 Gtkmm3/gtk79_livetest/src/image_types.hh diff --git a/Gtkmm3/gtk79_livetest/src/BackGround.cc b/Gtkmm3/gtk79_livetest/src/BackGround.cc new file mode 100644 index 0000000..1c96364 --- /dev/null +++ b/Gtkmm3/gtk79_livetest/src/BackGround.cc @@ -0,0 +1,82 @@ +#include "winpe.xpm" +#include "BackGround.hh" +#include "image_types.hh" + +BackGround::BackGround(Gtk::Window &parent,Gtk::Image *back) +:btn_default("Use Default Background"), +btn_set("Set Background From a File") +{ + //Initalize Dialog + set_default_size(300,100); + set_title("Change Background"); + set_transient_for(parent); + add_button("Close",Gtk::RESPONSE_CLOSE); + background=back; + + Gtk::Box * vbox=get_content_area(); + vbox->pack_start(btn_default,Gtk::PACK_SHRINK); + btn_default.signal_clicked().connect(sigc::mem_fun(*this,&BackGround::default_background)); + vbox->pack_start(btn_set,Gtk::PACK_SHRINK); + btn_set.signal_clicked().connect(sigc::mem_fun(*this,&BackGround::btnset_clicked)); +} + +void BackGround::btnset_clicked(){ + Gtk::FileChooserDialog dialog1("Choose an image file", + Gtk::FILE_CHOOSER_ACTION_OPEN); + dialog1.set_transient_for(*this); + + //Add reponse buttons + dialog1.add_button("_Cancel",Gtk::RESPONSE_CANCEL); + dialog1.add_button("_OK",Gtk::RESPONSE_OK); + + //Add filters + auto filter_image=Gtk::FileFilter::create(); + filter_image->set_name("Image Files"); + + //Windows doesn't support mime type + if(mime_type_supported()){ + filter_image->add_mime_type("image/*"); + }else{ + for(int i=0;supported_globs!=NULL && supported_globs[i]!=NULL ;i++){ + filter_image->add_pattern(supported_globs[i]); + } + } + + dialog1.add_filter(filter_image); + + auto filter_any = Gtk::FileFilter::create(); + filter_any->set_name("Any files"); + filter_any->add_pattern("*"); + dialog1.add_filter(filter_any); + + //Show the dialog and wait for a user response: + int result = dialog1.run(); + + if(result==Gtk::RESPONSE_OK){ + //Get the image file and set the image from the file + std::string filename; + filename=dialog1.get_filename(); + Glib::RefPtr pixbuf=Gdk::Pixbuf::create_from_file(filename); + Glib::RefPtr sized=pixbuf->scale_simple(640,360,Gdk::INTERP_BILINEAR); + gtk_image_set_from_pixbuf(background->gobj(),sized->gobj()); + //Free the memory + pixbuf.reset(); + sized.reset(); + } + filter_image.reset(); + filter_any.reset(); +} + +void BackGround::default_background(){ + //Background + Glib::RefPtr pixbuf=Gdk::Pixbuf::create_from_xpm_data(winpe); + Glib::RefPtr sized=pixbuf->scale_simple(640,360,Gdk::INTERP_BILINEAR); + gtk_image_set_from_pixbuf(background->gobj(),sized->gobj()); + //Release Memory + pixbuf.reset(); + sized.reset(); +} + +void BackGround::on_response(int response_id){ + hide(); +} \ No newline at end of file diff --git a/Gtkmm3/gtk79_livetest/src/BackGround.hh b/Gtkmm3/gtk79_livetest/src/BackGround.hh new file mode 100644 index 0000000..6b45929 --- /dev/null +++ b/Gtkmm3/gtk79_livetest/src/BackGround.hh @@ -0,0 +1,19 @@ +#pragma once + +#include + +class BackGround : public Gtk::Dialog +{ +public: + BackGround(Gtk::Window &parent,Gtk::Image *back); + void default_background(); +protected: + void on_response(int response_id) override; +private: + //Child widgets + Gtk::Button btn_default; + Gtk::Button btn_set; + Gtk::Image * background; + //Signal Handlers + void btnset_clicked(); +}; \ No newline at end of file diff --git a/Gtkmm3/gtk79_livetest/src/MyWin.cc b/Gtkmm3/gtk79_livetest/src/MyWin.cc index bd1849e..ac7322d 100644 --- a/Gtkmm3/gtk79_livetest/src/MyWin.cc +++ b/Gtkmm3/gtk79_livetest/src/MyWin.cc @@ -1,8 +1,9 @@ #include "MyWin.hh" -#include "winpe.xpm" + MyWin::MyWin() -:btn_back("Change Background") +:btn_back("Change Background"), +back_dialog(*this,&back) { set_icon_name("org.gtk.daleclack"); set_default_size(640,360); @@ -14,53 +15,14 @@ MyWin::MyWin() btn_back.set_valign(Gtk::ALIGN_CENTER); btn_back.signal_clicked().connect(sigc::mem_fun(*this,&MyWin::btnback_clicked)); overlay.add_overlay(btn_back); - //Background - Glib::RefPtr pixbuf=Gdk::Pixbuf::create_from_xpm_data(winpe); - Glib::RefPtr sized=pixbuf->scale_simple(640,360,Gdk::INTERP_BILINEAR); - gtk_image_set_from_pixbuf(back.gobj(),sized->gobj()); - //Release Memory - pixbuf.reset(); - sized.reset(); + //Set Default Background + back_dialog.default_background(); //Show all children show_all_children(); } void MyWin::btnback_clicked(){ - Gtk::FileChooserDialog dialog1("Choose an image file", - Gtk::FILE_CHOOSER_ACTION_OPEN); - dialog1.set_transient_for(*this); - - //Add reponse buttons - dialog1.add_button("_Cancel",Gtk::RESPONSE_CANCEL); - dialog1.add_button("_OK",Gtk::RESPONSE_OK); - - //Add filters - auto filter_image=Gtk::FileFilter::create(); - filter_image->set_name("Image Files"); - filter_image->add_mime_type("image/*"); - dialog1.add_filter(filter_image); - - auto filter_any = Gtk::FileFilter::create(); - filter_any->set_name("Any files"); - filter_any->add_pattern("*"); - dialog1.add_filter(filter_any); - - //Show the dialog and wait for a user response: - int result = dialog1.run(); - - if(result==Gtk::RESPONSE_OK){ - //Get the image file and set the image from the file - std::string filename; - filename=dialog1.get_filename(); - Glib::RefPtr pixbuf=Gdk::Pixbuf::create_from_file(filename); - Glib::RefPtr sized=pixbuf->scale_simple(640,360,Gdk::INTERP_BILINEAR); - gtk_image_set_from_pixbuf(back.gobj(),sized->gobj()); - //Free the memory - pixbuf.reset(); - sized.reset(); - } - filter_image.reset(); - filter_any.reset(); + back_dialog.show_all(); } MyWin::~MyWin(){ diff --git a/Gtkmm3/gtk79_livetest/src/MyWin.hh b/Gtkmm3/gtk79_livetest/src/MyWin.hh index 99bec9b..847b112 100644 --- a/Gtkmm3/gtk79_livetest/src/MyWin.hh +++ b/Gtkmm3/gtk79_livetest/src/MyWin.hh @@ -1,6 +1,7 @@ #pragma once #include +#include "BackGround.hh" class MyWin : public Gtk::Window{ public: @@ -13,4 +14,5 @@ protected: Gtk::Overlay overlay; Gtk::Image back; Gtk::Button btn_back; + BackGround back_dialog; }; diff --git a/Gtkmm3/gtk79_livetest/src/image_types.hh b/Gtkmm3/gtk79_livetest/src/image_types.hh new file mode 100644 index 0000000..87ed106 --- /dev/null +++ b/Gtkmm3/gtk79_livetest/src/image_types.hh @@ -0,0 +1,36 @@ +//This File is some extensions of image +//Note that this is the first edition,may needs improvement +static const char * const supported_globs[]={ + "*.bmp", + "*.cod", + "*.gif", + "*.ief", + "*.jpe", + "*.jpeg", + "*.jpg", + "*.jfif", + "*.svg", + "*.png", + "*.tif", + "*.tiff", + "*.ras", + "*.cmx", + "*.ico", + "*.pnm", + "*.pbm", + "*.pgm", + "*.ppm", + "*.rgb", + "*.xbm", + "*.xpm", + "*.xwd", + NULL +}; + +static inline bool mime_type_supported(){ + #ifdef G_OS_WIN32 + return false; + #else + return true; + #endif +}