diff options
Diffstat (limited to 'ui')
| -rw-r--r-- | ui/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | ui/include/turns/ui/widgets/preferences.hpp | 42 | ||||
| -rw-r--r-- | ui/include/turns/ui/windows/tracker.hpp | 8 | ||||
| -rw-r--r-- | ui/res/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | ui/res/ui.cmb | 24 | ||||
| -rw-r--r-- | ui/src/widgets/preferences.cpp | 68 | ||||
| -rw-r--r-- | ui/src/windows/tracker.cpp | 6 | ||||
| -rw-r--r-- | ui/src/windows/tracker/actions.cpp | 13 |
8 files changed, 155 insertions, 8 deletions
diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index b3a03c9..844460a 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -3,6 +3,7 @@ add_library("ui" "src/init.cpp" "src/widgets/participant_row.cpp" + "src/widgets/preferences.cpp" "src/widgets/turn_order_view.cpp" "src/windows/participant_editor.cpp" "src/windows/tracker.cpp" diff --git a/ui/include/turns/ui/widgets/preferences.hpp b/ui/include/turns/ui/widgets/preferences.hpp new file mode 100644 index 0000000..21b6eef --- /dev/null +++ b/ui/include/turns/ui/widgets/preferences.hpp @@ -0,0 +1,42 @@ +#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 <glibmm/refptr.h> + +#include <giomm/settings.h> + +#include <gtkmm/colordialogbutton.h> + +#include <array> + +namespace turns::ui::widgets +{ + struct preferences : template_widget<preferences, adw::PreferencesPage> + { + + auto constexpr inline static children = std::array{ + "friendly", + "hostile", + "secret", + }; + + explicit preferences(Glib::RefPtr<Gio::Settings> settings = {}); + + private: + Glib::RefPtr<Gio::Settings> m_settings; + + adw::ActionRow * m_friendly; + adw::ActionRow * m_hostile; + adw::ActionRow * m_secret; + + Gtk::ColorDialogButton m_friendly_button{}; + Gtk::ColorDialogButton m_hostile_button{}; + Gtk::ColorDialogButton m_secret_button{}; + }; +} // namespace turns::ui::widgets + +#endif
\ No newline at end of file diff --git a/ui/include/turns/ui/windows/tracker.hpp b/ui/include/turns/ui/windows/tracker.hpp index e14f08a..c6cbccb 100644 --- a/ui/include/turns/ui/windows/tracker.hpp +++ b/ui/include/turns/ui/windows/tracker.hpp @@ -3,6 +3,7 @@ #include "turns/adw/toastoverlay.hpp" #include "turns/core/turn_order.hpp" +#include "turns/ui/widgets/preferences.hpp" #include "turns/ui/widgets/turn_order_view.hpp" #include <glibmm/propertyproxy.h> @@ -17,11 +18,13 @@ #include <gtkmm/applicationwindow.h> #include <gtkmm/builder.h> #include <gtkmm/button.h> +#include <gtkmm/cssprovider.h> #include <gtkmm/filedialog.h> #include <gtkmm/revealer.h> #include <gtkmm/stack.h> #include <gtkmm/widget.h> -#include <gtkmm/cssprovider.h> + +#include <adwaita.h> #include <exception> #include <string> @@ -45,6 +48,7 @@ namespace turns::ui::windows auto delete_participant(Glib::VariantBase param) -> void; auto edit_participant(Glib::VariantBase param) -> void; auto open() -> void; + auto preferences() -> void; auto save(bool force_ask) -> void; auto stop() -> void; @@ -70,6 +74,7 @@ namespace turns::ui::windows Gtk::Widget * m_title; Glib::RefPtr<core::turn_order> m_turn_order; widgets::turn_order_view * m_turn_order_view; + Glib::RefPtr<Gio::Settings> m_settings{}; Glib::PropertyProxy<Glib::ustring> m_subtitle; Glib::RefPtr<Gio::File> m_file{}; @@ -77,7 +82,6 @@ namespace turns::ui::windows std::string m_file_buffer{}; Glib::RefPtr<Gtk::CssProvider> m_css{}; - Glib::RefPtr<Gio::Settings> m_settings{}; }; } // namespace turns::ui::windows diff --git a/ui/res/CMakeLists.txt b/ui/res/CMakeLists.txt index 94d41ef..ff58108 100644 --- a/ui/res/CMakeLists.txt +++ b/ui/res/CMakeLists.txt @@ -6,6 +6,7 @@ target_link_libraries("ui-res" PRIVATE set(UI_FILES "widgets/participant_row.ui" + "widgets/preferences.ui" "widgets/turn_order_view.ui" "windows/participant_editor.ui" "windows/tracker.ui" diff --git a/ui/res/ui.cmb b/ui/res/ui.cmb index 28ef448..0e3de6d 100644 --- a/ui/res/ui.cmb +++ b/ui/res/ui.cmb @@ -5,7 +5,8 @@ (1,None,None,"windows/tracker.ui",None,None,None,None,None,None,None), (2,None,None,"windows/participant_editor.ui",None,None,None,None,None,None,None), (3,1,None,"widgets/participant_row.ui",None,None,None,None,None,None,None), - (4,1,None,"widgets/turn_order_view.ui",None,None,None,None,None,None,None) + (4,1,None,"widgets/turn_order_view.ui",None,None,None,None,None,None,None), + (6,1,None,"widgets/preferences.ui",None,None,None,None,None,None,None) </ui> <ui_library> (1,"gtk","4.14",None), @@ -39,6 +40,7 @@ (1,32,"GtkButton",None,31,None,None,None,None,None,None), (1,33,"(item)",None,9,None,None,None,3,None,None), (1,34,"(item)",None,9,None,None,None,1,None,None), + (1,44,"(item)",None,9,None,None,None,5,None,None), (2,1,"AdwDialog","participant_editor",None,None,None,None,-1,None,None), (2,2,"AdwToolbarView",None,1,None,None,None,-1,None,None), (2,3,"AdwHeaderBar",None,2,None,"top",None,-1,None,None), @@ -64,7 +66,12 @@ (4,2,"GtkProgressBar","progress",1,None,None,None,None,None,None), (4,3,"GtkScrolledWindow",None,1,None,None,None,1,None,None), (4,4,"AdwClamp",None,3,None,None,None,-1,None,None), - (4,5,"GtkListBox","view",4,None,None,None,-1,None,None) + (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,4,"AdwActionRow","hostile",2,None,None,None,1,None,None), + (6,5,"AdwActionRow","secret",2,None,None,None,2,None,None) </object> <object_property> (1,1,"AdwApplicationWindow","content",None,None,None,None,None,2,None,None,None,None), @@ -84,8 +91,8 @@ (1,8,"GtkActionable","action-name","win.add_participant",None,None,None,None,None,None,None,None,None), (1,8,"GtkButton","icon-name","contact-new",None,None,None,None,None,None,None,None,None), (1,8,"GtkWidget","tooltip-text","Add participant",1,None,None,None,None,None,None,None,None), - (1,10,"(item)","action","app.quit",None,None,None,None,None,None,None,None,None), - (1,10,"(item)","label","_Quit",1,None,None,None,None,None,None,None,None), + (1,10,"(item)","action","win.preferences",None,None,None,None,None,None,None,None,None), + (1,10,"(item)","label","_Preferences",1,None,None,None,None,None,None,None,None), (1,18,"GtkActionable","action-name","win.start",None,None,None,None,None,None,None,None,None), (1,18,"GtkButton","icon-name","media-playback-start-symbolic",None,None,None,None,None,None,None,None,None), (1,18,"GtkWidget","tooltip-text","Start turn order",1,None,None,None,None,None,None,None,None), @@ -114,6 +121,8 @@ (1,33,"(item)","label","Save as...",1,None,None,None,None,None,None,None,None), (1,34,"(item)","action","win.open",None,None,None,None,None,None,None,None,None), (1,34,"(item)","label","_Open...",1,None,None,None,None,None,None,None,None), + (1,44,"(item)","action","app.quit",None,None,None,None,None,None,None,None,None), + (1,44,"(item)","label","_Quit",1,None,None,None,None,None,None,None,None), (2,1,"AdwDialog","child",None,None,None,None,None,2,None,None,None,None), (2,1,"AdwDialog","default-widget",None,None,None,None,None,None,None,None,None,None), (2,1,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None), @@ -166,7 +175,12 @@ (4,4,"GtkWidget","margin-end","12",None,None,None,None,None,None,None,None,None), (4,4,"GtkWidget","margin-start","12",None,None,None,None,None,None,None,None,None), (4,4,"GtkWidget","margin-top","12",None,None,None,None,None,None,None,None,None), - (4,5,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None) + (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,"AdwPreferencesRow","title","Friendly",1,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) </object_property> <object_data> (1,1,"GtkWidget",2,2,None,1,None,None,None,None), diff --git a/ui/src/widgets/preferences.cpp b/ui/src/widgets/preferences.cpp new file mode 100644 index 0000000..24de613 --- /dev/null +++ b/ui/src/widgets/preferences.cpp @@ -0,0 +1,68 @@ +#include "turns/ui/widgets/preferences.hpp" + +#include "turns/adw/actionrow.hpp" +#include "turns/ui/widgets/template_widget.hpp" + +#include <glibmm/objectbase.h> +#include <glibmm/refptr.h> + +#include <giomm/settings.h> + +#include <gtkmm/colordialog.h> +#include <gtkmm/enums.h> + +#include <gdkmm/rgba.h> + +namespace turns::ui::widgets +{ + namespace + { + auto constexpr static TYPE_NAME = "preferences"; + auto constexpr static TEMPLATE = "/widgets/preferences.ui"; + } // namespace + + preferences::preferences(Glib::RefPtr<Gio::Settings> settings) + : Glib::ObjectBase{TYPE_NAME} + , template_widget{TEMPLATE} + , m_settings{settings} + , m_friendly{get_widget<adw::ActionRow>("friendly")} + , m_hostile{get_widget<adw::ActionRow>("hostile")} + , m_secret{get_widget<adw::ActionRow>("secret")} + { + 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<Glib::ustring, Gdk::RGBA>("disposition-color-friendly", + m_friendly_button.property_rgba(), + Gio::Settings::BindFlags::DEFAULT, + [](auto value) { return Gdk::RGBA{value}; }, + [](auto color) { return color.to_string(); }); + + 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<Glib::ustring, Gdk::RGBA>("disposition-color-hostile", + m_hostile_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<Glib::ustring, Gdk::RGBA>("disposition-color-secret", + m_secret_button.property_rgba(), + Gio::Settings::BindFlags::DEFAULT, + [](auto value) { return Gdk::RGBA{value}; }, + [](auto color) { return color.to_string(); }); + } + +} // namespace turns::ui::widgets
\ No newline at end of file diff --git a/ui/src/windows/tracker.cpp b/ui/src/windows/tracker.cpp index c6dc731..b9a55c0 100644 --- a/ui/src/windows/tracker.cpp +++ b/ui/src/windows/tracker.cpp @@ -4,6 +4,7 @@ #include "turns/adw/toastoverlay.hpp" #include "turns/core/turn_order.hpp" #include "turns/lang/messages.hpp" +#include "turns/ui/widgets/preferences.hpp" #include "turns/ui/widgets/turn_order_view.hpp" #include <sigc++/adaptors/bind.h> @@ -15,6 +16,7 @@ #include <glibmm/refptr.h> #include <glibmm/ustring.h> #include <glibmm/varianttype.h> +#include <glibmm/wrap.h> #include <giomm/liststore.h> #include <giomm/settings.h> @@ -53,9 +55,9 @@ namespace turns::ui::windows , m_title{builder->get_widget<Gtk::Widget>("title")} , m_turn_order{core::turn_order::create()} , m_turn_order_view{Gtk::make_managed<widgets::turn_order_view>(m_turn_order)} + , m_settings{Gio::Settings::create("ch.arknet.Turns")} , m_subtitle{m_title, "subtitle"} , m_css{Gtk::CssProvider::create()} - , m_settings{Gio::Settings::create("ch.arknet.Turns")} { setup_colors(); setup_actions(); @@ -141,10 +143,12 @@ namespace turns::ui::windows // win.delete // win.edit // win.open + // win.preferences { add_action_with_parameter("delete", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &tracker::delete_participant)); add_action_with_parameter("edit", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &tracker::edit_participant)); add_action("open", sigc::mem_fun(*this, &tracker::open)); + add_action("preferences", sigc::mem_fun(*this, &tracker::preferences)); } // win.save diff --git a/ui/src/windows/tracker/actions.cpp b/ui/src/windows/tracker/actions.cpp index 3210089..c26afbf 100644 --- a/ui/src/windows/tracker/actions.cpp +++ b/ui/src/windows/tracker/actions.cpp @@ -1,6 +1,8 @@ +#include "turns/adw/preferencesdialog.hpp" #include "turns/core/participant.hpp" #include "turns/core/turn_order.hpp" #include "turns/lang/messages.hpp" +#include "turns/ui/widgets/preferences.hpp" #include "turns/ui/windows/participant_editor.hpp" #include "turns/ui/windows/tracker.hpp" @@ -14,10 +16,12 @@ #include <glibmm/wrap.h> #include <giomm/liststore.h> +#include <giomm/settings.h> #include <gtkmm/builder.h> #include <gtkmm/filedialog.h> #include <gtkmm/filefilter.h> +#include <gtkmm/object.h> #include <adwaita.h> #include <gio/gio.h> @@ -89,6 +93,15 @@ namespace turns::ui::windows dialog->open(sigc::bind(sigc::mem_fun(*this, &tracker::on_open_response), dialog)); } + auto tracker::preferences() -> void + { + auto preferences = Gtk::make_managed<widgets::preferences>(m_settings); + auto dialog = Gtk::make_managed<adw::PreferencesDialog>(); + dialog->add(*preferences); + adw_preferences_dialog_set_visible_page(Glib::unwrap(dialog), Glib::unwrap(preferences)); + dialog->present(this); + } + auto tracker::save(bool force_ask) -> void { if (m_file && !force_ask) |
