From 01e869aaf1a24b48623fe0bd2ff54106bd632f62 Mon Sep 17 00:00:00 2001 From: daleclack Date: Wed, 18 Aug 2021 18:49:15 +0800 Subject: [PATCH] Add gtk103 --- Gtkmm3/gtk103_cfgtest2/meson.build | 32 ++++++++++ Gtkmm3/gtk103_cfgtest2/src/MyWin.cc | 55 ++++++++++++++++ Gtkmm3/gtk103_cfgtest2/src/MyWin.hh | 22 +++++++ Gtkmm3/gtk103_cfgtest2/src/SetDialog.cc | 84 +++++++++++++++++++++++++ Gtkmm3/gtk103_cfgtest2/src/SetDialog.hh | 30 +++++++++ Gtkmm3/gtk103_cfgtest2/src/main.cc | 7 +++ 6 files changed, 230 insertions(+) create mode 100644 Gtkmm3/gtk103_cfgtest2/meson.build create mode 100644 Gtkmm3/gtk103_cfgtest2/src/MyWin.cc create mode 100644 Gtkmm3/gtk103_cfgtest2/src/MyWin.hh create mode 100644 Gtkmm3/gtk103_cfgtest2/src/SetDialog.cc create mode 100644 Gtkmm3/gtk103_cfgtest2/src/SetDialog.hh create mode 100644 Gtkmm3/gtk103_cfgtest2/src/main.cc diff --git a/Gtkmm3/gtk103_cfgtest2/meson.build b/Gtkmm3/gtk103_cfgtest2/meson.build new file mode 100644 index 0000000..ec35e47 --- /dev/null +++ b/Gtkmm3/gtk103_cfgtest2/meson.build @@ -0,0 +1,32 @@ +#A Simple Project Test +project('gtk103', 'cpp', + default_options : ['c_std=c17', 'cpp_std=c++17']) + +#Initalize variants +# gnome=import('gnome') + +#Compile Resource +# gresources = gnome.compile_resources( +# 'resources', 'res/gtk91.resource.xml', +# source_dir: 'res', +# c_name: 'resources' +# ) + +#The Gtkmm Library as a dependency +gtkdep = dependency('gtkmm-3.0') + +#Additional include dirs +dir_include = include_directories('..') + +#source files +src=['src/main.cc', 'src/MyWin.cc', 'src/SetDialog.cc', '../cfgfile2/cfgfile.cc'] + +#Use Different Build Opinions in windows and Linux +if host_machine.system() == 'windows' + win=import('windows') + icon_res=win.compile_resources('../icon.rc') + executable('gtk103', icon_res, src, dependencies : gtkdep, + win_subsystem : 'windows', include_directories : dir_include) +else + executable('gtk103', src, dependencies : gtkdep, include_directories : dir_include) +endif diff --git a/Gtkmm3/gtk103_cfgtest2/src/MyWin.cc b/Gtkmm3/gtk103_cfgtest2/src/MyWin.cc new file mode 100644 index 0000000..cc1b30a --- /dev/null +++ b/Gtkmm3/gtk103_cfgtest2/src/MyWin.cc @@ -0,0 +1,55 @@ +#include "MyWin.hh" +#include "winpe.xpm" + +MyWin::MyWin() +:btnset("Setting"), +dialog1(*this) +{ + //Initalize window + int width=640,height=360; + set_icon_name("org.gtk.daleclack"); + set_title("CfgFile Test2"); + + //Add Image and button + m_overlay.add(m_back); + btnset.set_halign(Gtk::ALIGN_CENTER); + btnset.set_valign(Gtk::ALIGN_CENTER); + m_overlay.add_overlay(btnset); + add(m_overlay); + + //Read Config File,else use default background + std::string filename("config"); + if(readCfgFile(filename,configs)){ + std::string backname=configs["background"]; + if(backname.empty()){ + default_background(); + }else{ + auto pixbuf=Gdk::Pixbuf::create_from_file(backname); + auto sized=pixbuf->scale_simple(width,height,Gdk::INTERP_BILINEAR); + gtk_image_set_from_pixbuf(m_back.gobj(),sized->gobj()); + pixbuf.reset(); + sized.reset(); + } + }else{ + default_background(); + } + + + dialog1.set_config(&configs,&m_back); + btnset.signal_clicked().connect(sigc::mem_fun(*this,&MyWin::btnset_clicked)); + + //Show Everything + show_all_children(); +} + +void MyWin::btnset_clicked(){ + dialog1.show_all(); +} + +void MyWin::default_background(){ + auto pixbuf=Gdk::Pixbuf::create_from_xpm_data(winpe); + auto sized=pixbuf->scale_simple(640,360,Gdk::INTERP_BILINEAR); + gtk_image_set_from_pixbuf(m_back.gobj(),sized->gobj()); + pixbuf.reset(); + sized.reset(); +} diff --git a/Gtkmm3/gtk103_cfgtest2/src/MyWin.hh b/Gtkmm3/gtk103_cfgtest2/src/MyWin.hh new file mode 100644 index 0000000..661f948 --- /dev/null +++ b/Gtkmm3/gtk103_cfgtest2/src/MyWin.hh @@ -0,0 +1,22 @@ +#pragma once + +#include +#include "SetDialog.hh" + +class MyWin : public Gtk::Window{ +public: + MyWin(); +private: + //Child Widgets + Gtk::Overlay m_overlay; + Gtk::Image m_back; + Gtk::Button btnset; + + //Setting Dialog and config + conf_map configs; + SetDialog dialog1; + + //Signal Handlers + void btnset_clicked(); + void default_background(); +}; diff --git a/Gtkmm3/gtk103_cfgtest2/src/SetDialog.cc b/Gtkmm3/gtk103_cfgtest2/src/SetDialog.cc new file mode 100644 index 0000000..7a8a760 --- /dev/null +++ b/Gtkmm3/gtk103_cfgtest2/src/SetDialog.cc @@ -0,0 +1,84 @@ +#include "SetDialog.hh" + +SetDialog::SetDialog(Gtk::Window &parent) +:vbox(Gtk::ORIENTATION_VERTICAL,5), +hbox(Gtk::ORIENTATION_HORIZONTAL,5), +btnback("BackGround") +{ + Gtk::Label label1("BackGround File Name:"); + //Ininalize Dialog + set_title("Settings"); + set_default_size(300,150); + set_transient_for(parent); + add_button("OK",Gtk::RESPONSE_OK); + add_button("Cancel",Gtk::RESPONSE_CANCEL); + + //Add Widgets + auto pbox=get_content_area(); + vbox.set_halign(Gtk::ALIGN_CENTER); + vbox.set_valign(Gtk::ALIGN_CENTER); + pbox->pack_start(vbox); + + //Button Box + hbox.pack_start(entry_back,Gtk::PACK_SHRINK); + hbox.pack_start(btnback,Gtk::PACK_SHRINK); + vbox.pack_start(label1,Gtk::PACK_SHRINK); + vbox.pack_start(hbox,Gtk::PACK_SHRINK); + + //Signals + btnback.signal_clicked().connect(sigc::mem_fun(*this,&SetDialog::btnback_clicked)); +} + +void SetDialog::set_config(conf_map * src_config,Gtk::Image * src_image){ + //Set Config to the Dialog + configs1=src_config; + img_back=src_image; + std::string filename=(*src_config)["background"]; + entry_back.set_text(filename); +} + +void SetDialog::on_response(int response_id){ + if(response_id == Gtk::RESPONSE_OK){ + Glib::ustring backname=entry_back.get_text(); + //Change Background + if(!backname.empty()){ + auto pixbuf=Gdk::Pixbuf::create_from_file(backname); + auto sized=pixbuf->scale_simple(640,360,Gdk::INTERP_BILINEAR); + gtk_image_set_from_pixbuf(img_back->gobj(),sized->gobj()); + pixbuf.reset(); + sized.reset(); + } + //Write filename to config file + outfile.open("config",std::ios_base::out); + if(outfile.is_open()){ + outfile<<"background="<signal_response().connect(sigc::mem_fun(*this,&SetDialog::dialog_reponse)); + + //Add a FileFilter + auto filter_any=Gtk::FileFilter::create(); + filter_any->set_name("Any Files"); + filter_any->add_pattern("*"); + dialog->add_filter(filter_any); + + dialog->show(); +} + +void SetDialog::dialog_reponse(int response_id){ + if(response_id == Gtk::RESPONSE_ACCEPT){ + //Set filename to entry + Glib::ustring filename=dialog->get_filename(); + entry_back.set_text(filename); + } + dialog.reset(); +} diff --git a/Gtkmm3/gtk103_cfgtest2/src/SetDialog.hh b/Gtkmm3/gtk103_cfgtest2/src/SetDialog.hh new file mode 100644 index 0000000..8a91b2d --- /dev/null +++ b/Gtkmm3/gtk103_cfgtest2/src/SetDialog.hh @@ -0,0 +1,30 @@ +#pragma once + +#include +#include "../cfgfile2/cfgfile.hh" + +class SetDialog : public Gtk::Dialog{ +public: + SetDialog(Gtk::Window & parent); + void set_config(conf_map * src_config,Gtk::Image * src_image); +protected: + void on_response(int response_id) override; +private: + //Child widgets + Gtk::Box vbox,hbox; + Gtk::Button btnback; + Gtk::Entry entry_back; + Gtk::Image * img_back; + + //File Chooser Dialog + Glib::RefPtr dialog; + + //File Config + std::fstream outfile; + conf_map *configs1; + + //Signal Handlers + void btnload_clicked(); + void btnback_clicked(); + void dialog_reponse(int response_id); +}; diff --git a/Gtkmm3/gtk103_cfgtest2/src/main.cc b/Gtkmm3/gtk103_cfgtest2/src/main.cc new file mode 100644 index 0000000..3c8b613 --- /dev/null +++ b/Gtkmm3/gtk103_cfgtest2/src/main.cc @@ -0,0 +1,7 @@ +#include "MyWin.hh" + +int main(int argc,char **argv){ + auto app=Gtk::Application::create(argc,argv,"org.gtk.daleclack"); + MyWin window; + return app->run(window); +}