From 7b7374b220b51f73b76823762666d9e8b82dccf4 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sat, 17 Aug 2024 13:52:39 +0200 Subject: ui: add color reset buttons Implements: #7 --- ui/include/turns/ui/widgets/preferences.hpp | 29 +++++++---- ui/res/ui.cmb | 46 +++++++++++++++-- ui/src/widgets/preferences.cpp | 78 +++++++++++++++++------------ 3 files changed, 106 insertions(+), 47 deletions(-) (limited to 'ui') diff --git a/ui/include/turns/ui/widgets/preferences.hpp b/ui/include/turns/ui/widgets/preferences.hpp index 21b6eef..749d4fd 100644 --- a/ui/include/turns/ui/widgets/preferences.hpp +++ b/ui/include/turns/ui/widgets/preferences.hpp @@ -1,14 +1,15 @@ #ifndef TURNS_UI_WIDGETS_PREFERENCES_HPP #define TURNS_UI_WIDGETS_PREFERENCES_HPP -#include "turns/adw/actionrow.hpp" #include "turns/adw/preferencespage.hpp" #include "turns/ui/widgets/template_widget.hpp" #include +#include #include +#include #include #include @@ -19,23 +20,29 @@ namespace turns::ui::widgets { auto constexpr inline static children = std::array{ - "friendly", - "hostile", - "secret", + "friendly_reset_button", + "hostile_reset_button", + "secret_reset_button", + "friendly_color_button", + "hostile_color_button", + "secret_color_button", }; explicit preferences(Glib::RefPtr settings = {}); private: - Glib::RefPtr m_settings; + auto bind_reset(Glib::ustring const & key, Gtk::Button * button) -> void; + auto bind_setting(Glib::ustring const & key, Gtk::ColorDialogButton * button) -> void; + auto update_sensitive(Glib::ustring const & key, Gtk::Button * button) -> void; - adw::ActionRow * m_friendly; - adw::ActionRow * m_hostile; - adw::ActionRow * m_secret; + Glib::RefPtr m_settings; - Gtk::ColorDialogButton m_friendly_button{}; - Gtk::ColorDialogButton m_hostile_button{}; - Gtk::ColorDialogButton m_secret_button{}; + Gtk::Button * m_friendly_reset_button{}; + Gtk::Button * m_hostile_reset_button{}; + Gtk::Button * m_secret_reset_button{}; + Gtk::ColorDialogButton * m_friendly_color_button{}; + Gtk::ColorDialogButton * m_hostile_color_button{}; + Gtk::ColorDialogButton * m_secret_color_button{}; }; } // namespace turns::ui::widgets diff --git a/ui/res/ui.cmb b/ui/res/ui.cmb index 0e3de6d..2538784 100644 --- a/ui/res/ui.cmb +++ b/ui/res/ui.cmb @@ -69,9 +69,18 @@ (4,5,"GtkListBox","view",4,None,None,None,-1,None,None), (6,1,"AdwPreferencesPage","gtkmm__CustomObject_preferences",None,None,None,None,None,None,None), (6,2,"AdwPreferencesGroup","colors",1,None,None,None,None,None,None), - (6,3,"AdwActionRow","friendly",2,None,None,None,None,None,None), + (6,3,"AdwActionRow",None,2,None,None,None,None,None,None), (6,4,"AdwActionRow","hostile",2,None,None,None,1,None,None), - (6,5,"AdwActionRow","secret",2,None,None,None,2,None,None) + (6,5,"AdwActionRow","secret",2,None,None,None,2,None,None), + (6,7,"GtkColorDialogButton","friendly_color_button",3,None,None,None,-1,None,None), + (6,10,"GtkColorDialogButton","hostile_color_button",4,None,None,None,1,None,None), + (6,11,"GtkColorDialogButton","secret_color_button",5,None,None,None,1,None,None), + (6,12,"GtkColorDialog",None,7,None,None,None,-1,None,None), + (6,13,"GtkColorDialog",None,10,None,None,None,-1,None,None), + (6,14,"GtkColorDialog",None,11,None,None,None,-1,None,None), + (6,15,"GtkButton","hostile_reset_button",4,None,None,None,1,None,None), + (6,16,"GtkButton","friendly_reset_button",3,None,None,None,1,None,None), + (6,17,"GtkButton","secret_reset_button",5,None,None,None,1,None,None) (1,1,"AdwApplicationWindow","content",None,None,None,None,None,2,None,None,None,None), @@ -178,9 +187,27 @@ (4,5,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), (6,1,"AdwPreferencesPage","icon-name","preferences-system-symbolic",None,None,None,None,None,None,None,None,None), (6,2,"AdwPreferencesGroup","title","Colors",1,None,None,None,None,None,None,None,None), + (6,3,"AdwActionRow","activatable-widget","7",None,None,None,None,None,None,None,None,None), (6,3,"AdwPreferencesRow","title","Friendly",1,None,None,None,None,None,None,None,None), + (6,4,"AdwActionRow","activatable-widget","10",None,None,None,None,None,None,None,None,None), (6,4,"AdwPreferencesRow","title","Hostile",1,None,None,None,None,None,None,None,None), - (6,5,"AdwPreferencesRow","title","Secret",1,None,None,None,None,None,None,None,None) + (6,5,"AdwActionRow","activatable-widget","11",None,None,None,None,None,None,None,None,None), + (6,5,"AdwPreferencesRow","title","Secret",1,None,None,None,None,None,None,None,None), + (6,7,"GtkColorDialogButton","dialog",None,None,None,None,None,12,None,None,None,None), + (6,7,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), + (6,10,"GtkColorDialogButton","dialog",None,None,None,None,None,13,None,None,None,None), + (6,10,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), + (6,11,"GtkColorDialogButton","dialog",None,None,None,None,None,14,None,None,None,None), + (6,11,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), + (6,12,"GtkColorDialog","with-alpha","False",None,None,None,None,None,None,None,None,None), + (6,13,"GtkColorDialog","with-alpha","False",None,None,None,None,None,None,None,None,None), + (6,14,"GtkColorDialog","with-alpha","False",None,None,None,None,None,None,None,None,None), + (6,15,"GtkButton","icon-name","process-stop-symbolic",None,None,None,None,None,None,None,None,None), + (6,15,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), + (6,16,"GtkButton","icon-name","process-stop-symbolic",None,None,None,None,None,None,None,None,None), + (6,16,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), + (6,17,"GtkButton","icon-name","process-stop-symbolic",None,None,None,None,None,None,None,None,None), + (6,17,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None) (1,1,"GtkWidget",2,2,None,1,None,None,None,None), @@ -226,7 +253,13 @@ (4,5,"GtkWidget",2,2,None,1,None,None,None,None), (1,32,"GtkWidget",1,1,None,None,None,None,None,None), (1,32,"GtkWidget",2,2,None,1,None,None,None,None), - (1,32,"GtkWidget",2,3,None,1,None,None,None,None) + (1,32,"GtkWidget",2,3,None,1,None,None,None,None), + (6,15,"GtkWidget",1,1,None,None,None,None,None,None), + (6,15,"GtkWidget",2,2,None,1,None,None,None,None), + (6,16,"GtkWidget",1,1,None,None,None,None,None,None), + (6,16,"GtkWidget",2,2,None,1,None,None,None,None), + (6,17,"GtkWidget",1,1,None,None,None,None,None,None), + (6,17,"GtkWidget",2,2,None,1,None,None,None,None) (1,1,"GtkWidget",2,2,"name","background"), @@ -253,6 +286,9 @@ (4,2,"GtkWidget",2,2,"name","osd"), (4,5,"GtkWidget",2,2,"name","boxed-list"), (1,32,"GtkWidget",2,2,"name","pill"), - (1,32,"GtkWidget",2,3,"name","suggested-action") + (1,32,"GtkWidget",2,3,"name","suggested-action"), + (6,15,"GtkWidget",2,2,"name","circular"), + (6,16,"GtkWidget",2,2,"name","circular"), + (6,17,"GtkWidget",2,2,"name","circular") diff --git a/ui/src/widgets/preferences.cpp b/ui/src/widgets/preferences.cpp index 24de613..187da2e 100644 --- a/ui/src/widgets/preferences.cpp +++ b/ui/src/widgets/preferences.cpp @@ -1,14 +1,19 @@ #include "turns/ui/widgets/preferences.hpp" -#include "turns/adw/actionrow.hpp" #include "turns/ui/widgets/template_widget.hpp" +#include + +#include #include #include +#include +#include #include #include +#include #include #include @@ -25,44 +30,55 @@ namespace turns::ui::widgets : Glib::ObjectBase{TYPE_NAME} , template_widget{TEMPLATE} , m_settings{settings} - , m_friendly{get_widget("friendly")} - , m_hostile{get_widget("hostile")} - , m_secret{get_widget("secret")} + , m_friendly_reset_button{get_widget("friendly_reset_button")} + , m_hostile_reset_button{get_widget("hostile_reset_button")} + , m_secret_reset_button{get_widget("secret_reset_button")} + , m_friendly_color_button{get_widget("friendly_color_button")} + , m_hostile_color_button{get_widget("hostile_color_button")} + , m_secret_color_button{get_widget("secret_color_button")} { if (!m_settings) { return; } - m_friendly->add_suffix(m_friendly_button); - m_friendly->set_activatable_widget(m_friendly_button); - m_friendly_button.set_dialog(Gtk::ColorDialog::create()); - m_friendly_button.set_valign(Gtk::Align::CENTER); - m_settings->bind("disposition-color-friendly", - m_friendly_button.property_rgba(), - Gio::Settings::BindFlags::DEFAULT, - [](auto value) { return Gdk::RGBA{value}; }, - [](auto color) { return color.to_string(); }); + { + auto key = "disposition-color-friendly"; + bind_reset(key, m_friendly_reset_button); + bind_setting(key, m_friendly_color_button); + } + + { + auto key = "disposition-color-hostile"; + bind_reset(key, m_hostile_reset_button); + bind_setting(key, m_hostile_color_button); + } + + { + auto key = "disposition-color-secret"; + bind_reset(key, m_secret_reset_button); + bind_setting(key, m_secret_color_button); + } + } + + auto preferences::bind_reset(Glib::ustring const & key, Gtk::Button * button) -> void + { + m_settings->signal_changed(key).connect([=, this](auto) { update_sensitive(key, button); }); + update_sensitive(key, button); + button->signal_clicked().connect(sigc::bind(sigc::mem_fun(*m_settings, &Gio::Settings::reset), key)); + } - m_hostile->add_suffix(m_hostile_button); - m_hostile->set_activatable_widget(m_hostile_button); - m_hostile_button.set_dialog(Gtk::ColorDialog::create()); - m_hostile_button.set_valign(Gtk::Align::CENTER); - m_settings->bind("disposition-color-hostile", - m_hostile_button.property_rgba(), - Gio::Settings::BindFlags::DEFAULT, - [](auto value) { return Gdk::RGBA{value}; }, - [](auto color) { return color.to_string(); }); + auto preferences::bind_setting(Glib::ustring const & key, Gtk::ColorDialogButton * button) -> void + { + m_settings->bind(key, button->property_rgba(), Gio::Settings::BindFlags::DEFAULT, [](auto value) { + return Gdk::RGBA{value}; + }, [](auto color) { return color.to_string(); }); + } - m_secret->add_suffix(m_secret_button); - m_secret->set_activatable_widget(m_secret_button); - m_secret_button.set_dialog(Gtk::ColorDialog::create()); - m_secret_button.set_valign(Gtk::Align::CENTER); - m_settings->bind("disposition-color-secret", - m_secret_button.property_rgba(), - Gio::Settings::BindFlags::DEFAULT, - [](auto value) { return Gdk::RGBA{value}; }, - [](auto color) { return color.to_string(); }); + auto preferences::update_sensitive(Glib::ustring const & key, Gtk::Button * button) -> void + { + auto v = Glib::Variant{}; + button->set_sensitive(m_settings->get_user_value(key, v)); } } // namespace turns::ui::widgets \ No newline at end of file -- cgit v1.2.3