From 473ce13537dd9017c811f88097d867958ede2c62 Mon Sep 17 00:00:00 2001 From: daleclack Date: Wed, 7 Jun 2023 12:01:36 +0800 Subject: [PATCH] Add gtk150 --- Gtk4/gtk148_listview/src/MainWin.cpp | 14 ++++- Gtkmm4/gtk150_prefs4/src/MainWin.cc | 7 +++ Gtkmm4/gtk150_prefs4/src/MainWin.hh | 5 ++ Gtkmm4/gtk150_prefs4/src/MyPrefs.cc | 87 +++++++++++++++++++++++++++- Gtkmm4/gtk150_prefs4/src/MyPrefs.hh | 47 ++++++++++++++- 5 files changed, 154 insertions(+), 6 deletions(-) diff --git a/Gtk4/gtk148_listview/src/MainWin.cpp b/Gtk4/gtk148_listview/src/MainWin.cpp index 4c6f4f7..4debe00 100644 --- a/Gtk4/gtk148_listview/src/MainWin.cpp +++ b/Gtk4/gtk148_listview/src/MainWin.cpp @@ -65,7 +65,8 @@ static void btnadd_clicked(GtkWidget *widget, MainWin *win) g_list_store_append(G_LIST_STORE(model), my_item_new(str)); } -static void btnremove_clicked(GtkWidget *widget, MainWin *win){ +static void btnremove_clicked(GtkWidget *widget, MainWin *win) +{ // Get the position of selected item GtkSingleSelection *selection = win->selection; guint position = gtk_single_selection_get_selected(selection); @@ -75,12 +76,21 @@ static void btnremove_clicked(GtkWidget *widget, MainWin *win){ g_list_store_remove(store, position); } -static void btnremove_all_clicked(GtkWidget *widget, MainWin *win){ +static void btnremove_all_clicked(GtkWidget *widget, MainWin *win) +{ // Remove all data from store GListModel *model = win->model; g_list_store_remove_all(G_LIST_STORE(model)); } +static void selection_changed(GtkSelectionModel *model, + guint position, + guint n_data, + MainWin *win) +{ + +} + static void main_win_dispose(GObject *object) { // Clear List Model diff --git a/Gtkmm4/gtk150_prefs4/src/MainWin.cc b/Gtkmm4/gtk150_prefs4/src/MainWin.cc index 2efd9e3..765e2b7 100644 --- a/Gtkmm4/gtk150_prefs4/src/MainWin.cc +++ b/Gtkmm4/gtk150_prefs4/src/MainWin.cc @@ -27,6 +27,9 @@ MainWin::MainWin(){ context_menu.set_menu_model(model); context_menu.set_parent(m_overlay); context_menu.set_has_arrow(false); + + // Add actions + add_action("back", sigc::mem_fun(*this, &MainWin::back_activated)); // Add widgets m_overlay.set_child(m_background); @@ -39,3 +42,7 @@ void MainWin::pressed(int n_click, double x, double y){ context_menu.popup(); } +void MainWin::back_activated(){ + prefs_win.present(); +} + diff --git a/Gtkmm4/gtk150_prefs4/src/MainWin.hh b/Gtkmm4/gtk150_prefs4/src/MainWin.hh index 7cc4c8f..c2e5d25 100644 --- a/Gtkmm4/gtk150_prefs4/src/MainWin.hh +++ b/Gtkmm4/gtk150_prefs4/src/MainWin.hh @@ -1,6 +1,7 @@ #pragma once #include +#include "MyPrefs.hh" class MainWin : public Gtk::ApplicationWindow { @@ -19,6 +20,10 @@ private: // Gesture for right click Glib::RefPtr right_click; + // Prefs Window + MyPrefs prefs_win; + // Signal Handler void pressed(int n_click, double x, double y); + void back_activated(); }; diff --git a/Gtkmm4/gtk150_prefs4/src/MyPrefs.cc b/Gtkmm4/gtk150_prefs4/src/MyPrefs.cc index a3df508..9036aad 100644 --- a/Gtkmm4/gtk150_prefs4/src/MyPrefs.cc +++ b/Gtkmm4/gtk150_prefs4/src/MyPrefs.cc @@ -1,5 +1,86 @@ #include "MyPrefs.hh" -MyPrefs::MyPrefs(){ - -} \ No newline at end of file +MyPrefs::MyPrefs() + : main_box(Gtk::Orientation::VERTICAL, 5), + views_box(Gtk::Orientation::HORIZONTAL, 5), + buttons_box(Gtk::Orientation::HORIZONTAL, 5) +{ + // Initalize the window + set_icon_name("org.gtk.daleclack"); + set_default_size(800, 450); + + // Create List Store for folders_view + folder_store = Gio::ListStore::create(); + folder_select = Gtk::SingleSelection::create(folder_store); + folders_view.set_model(folder_select); + + // Fill the store + folder_store->append(MyItem::create("User's home folder", Glib::get_home_dir())); + folder_store->append(MyItem::create("test2", "test3")); + + // Initalize factory to renderer the object + folder_image_factory = Gtk::SignalListItemFactory::create(); + folder_image_factory->signal_setup().connect(sigc::mem_fun(*this, &MyPrefs::folder_image_setup)); + folder_image_factory->signal_bind().connect(sigc::mem_fun(*this, &MyPrefs::folder_image_bind)); + folder_string_factory = Gtk::SignalListItemFactory::create(); + folder_string_factory->signal_setup().connect(sigc::mem_fun(*this, &MyPrefs::folder_string_setup)); + folder_string_factory->signal_bind().connect(sigc::mem_fun(*this, &MyPrefs::folder_string_bind)); + + // Create Columns and append + folder_image_column = Gtk::ColumnViewColumn::create(" ", folder_image_factory); + folder_string_column = Gtk::ColumnViewColumn::create("Names", folder_string_factory); + folders_view.append_column(folder_image_column); + folders_view.append_column(folder_string_column); + + // Add timer to scan + selection_timer = Glib::signal_timeout().connect(sigc::mem_fun(*this, &MyPrefs::timeout_func), 16); + + // Pack widgets + folders_view.set_expand(); + images_view.set_expand(); + views_box.append(folders_view); + views_box.append(images_view); + main_box.append(views_box); + main_box.append(buttons_box); + set_child(main_box); +} + +void MyPrefs::folder_image_setup(const Glib::RefPtr &item){ + // Add image to show + item->set_child(image_folder); +} + +void MyPrefs::folder_image_bind(const Glib::RefPtr &item){ + // Get the image widget + auto image = dynamic_cast(item->get_child()); + + // Bind the value of item + auto value = Glib::RefPtr(dynamic_cast(item->get_item().get())); + + // Set image + image->set_from_icon_name(value->icon_name); +} + +void MyPrefs::folder_string_setup(const Glib::RefPtr &item) +{ + // Add a label to the item + item->set_child(label_folder); +} + +void MyPrefs::folder_string_bind(const Glib::RefPtr &item) +{ + // Get the label + auto label = dynamic_cast(item->get_child()); + + // Bind the value of item + auto value = Glib::RefPtr(dynamic_cast(item->get_item().get())); + + // Set the label + label->set_label(value->file_name); +} + +bool MyPrefs::timeout_func(){ + // Refresh the view for folders + // Refresh the view for images + return true; +} diff --git a/Gtkmm4/gtk150_prefs4/src/MyPrefs.hh b/Gtkmm4/gtk150_prefs4/src/MyPrefs.hh index e95d0ac..86fba77 100644 --- a/Gtkmm4/gtk150_prefs4/src/MyPrefs.hh +++ b/Gtkmm4/gtk150_prefs4/src/MyPrefs.hh @@ -2,10 +2,55 @@ #include +// The Gio List Store +class MyItem : public Glib::ObjectBase +{ +public: + static Glib::RefPtr create(Glib::ustring file_name1, std::string path1){ + MyItem *item = new MyItem; + item->file_name = file_name1; + item->path = path1; + item->icon_name = "folder"; + return Glib::RefPtr(item); + } + Glib::ustring file_name; + Glib::ustring icon_name; + std::string path; +}; + +// These typedefs is to simplify the complex type names... +typedef Glib::RefPtr MyFactory; +typedef Glib::RefPtr MySelection; +typedef Glib::RefPtr> MyStore; +typedef Glib::RefPtr MyColumn; + class MyPrefs : public Gtk::Window { public: MyPrefs(); + private: - Glib::RefPtr stack_builder; + // Child widgets + Gtk::ColumnView folders_view, images_view; + Gtk::Box main_box, views_box, buttons_box; + + // The Selection in a store + MySelection folder_select; + // The store to save the item + MyStore folder_store; + // Item Factory to renderer the objects + MyFactory folder_image_factory, folder_string_factory; + MyColumn folder_image_column, folder_string_column; + Gtk::Label label_folder; + Gtk::Image image_folder; + + // Timer to scan the selection, for the absense of "changed" signal + sigc::connection selection_timer; + bool timeout_func(); + + // Signal Handlers + void folder_image_setup(const Glib::RefPtr &item); + void folder_image_bind(const Glib::RefPtr &item); + void folder_string_setup(const Glib::RefPtr &item); + void folder_string_bind(const Glib::RefPtr &item); };