From 44d2614a260d2b029a79c59ee7fdd45e1958feb8 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Tue, 16 Jul 2024 13:02:46 +0200 Subject: app: extract turn order view --- app/src/application.cpp | 14 ++++++-- app/src/widgets/participant_row.cpp | 20 ++++------- app/src/widgets/turn_order_view.cpp | 66 +++++++++++++++++++++++++++++++++++++ app/src/windows/main.cpp | 36 ++++++++------------ 4 files changed, 96 insertions(+), 40 deletions(-) create mode 100644 app/src/widgets/turn_order_view.cpp (limited to 'app/src') diff --git a/app/src/application.cpp b/app/src/application.cpp index 1d38ea1..35dcfdb 100644 --- a/app/src/application.cpp +++ b/app/src/application.cpp @@ -1,5 +1,6 @@ #include "turns/app/application.hpp" +#include "turns/app/widgets/turn_order_view.hpp" #include "turns/app/windows/main.hpp" #include @@ -29,9 +30,6 @@ namespace turns::app m_adw = adw_application_new("ch.arknet.Turns", G_APPLICATION_DEFAULT_FLAGS); m_application = Glib::wrap(GTK_APPLICATION(m_adw)); - auto builder = Gtk::Builder::create_from_resource("/ch/arknet/Turns/windows/main.ui"); - m_main = Gtk::Builder::get_widget_derived(builder, "main"); - m_application->signal_activate().connect(sigc::mem_fun(*this, &application::on_activate)); m_application->signal_shutdown().connect(sigc::mem_fun(*this, &application::on_shutdown)); m_application->signal_startup().connect(sigc::mem_fun(*this, &application::on_startup)); @@ -44,6 +42,9 @@ namespace turns::app auto application::on_activate() -> void { + auto builder = Gtk::Builder::create_from_resource("/ch/arknet/Turns/windows/main.ui"); + m_main = Gtk::Builder::get_widget_derived(builder, "main"); + m_application->add_window(*m_main); m_main->present(); } @@ -62,6 +63,13 @@ namespace turns::app m_application->add_action("quit", sigc::mem_fun(*this, &application::handle_action_quit)); m_application->set_accel_for_action("app.quit", "q"); m_application->set_accel_for_action("win.clear", "x"); + + register_derived_widgets(); + } + + auto application::register_derived_widgets() -> void + { + static_cast(widgets::turn_order_view{}); } } // namespace turns::app \ No newline at end of file diff --git a/app/src/widgets/participant_row.cpp b/app/src/widgets/participant_row.cpp index 9e0419a..75321e5 100644 --- a/app/src/widgets/participant_row.cpp +++ b/app/src/widgets/participant_row.cpp @@ -45,22 +45,14 @@ namespace turns::app::widgets if (participant) { - set_title(participant->get_name()); - auto priority = participant->get_priority(); - set_subtitle(std::vformat(_(lang::priority_number), std::make_format_args(priority))); - } - } - - auto participant_row::set_subtitle(Glib::ustring const & value) -> void - { - m_subtitle->property_label() = value; - } + m_title_label = Glib::Binding::bind_property(participant->property_name(), m_title->property_label(), Glib::Binding::Flags::SYNC_CREATE); - auto participant_row::set_title(Glib::ustring const & value) -> void - { - m_title->property_label() = value; + m_subtitle_label = Glib::Binding::bind_property(participant->property_priority(), + m_subtitle->property_label(), + Glib::Binding::Flags::SYNC_CREATE, + [](auto n) { return std::vformat(_(lang::priority_number), std::make_format_args(n)); }); + } } - auto participant_row::handle_delete() -> void { auto index = Glib::Variant::create(get_index()); diff --git a/app/src/widgets/turn_order_view.cpp b/app/src/widgets/turn_order_view.cpp new file mode 100644 index 0000000..9d49ad8 --- /dev/null +++ b/app/src/widgets/turn_order_view.cpp @@ -0,0 +1,66 @@ +#include "turns/app/widgets/turn_order_view.hpp" + +#include "turns/app/widgets/participant_row.hpp" +#include "turns/domain/participant.hpp" +#include "turns/lang/messages.hpp" + +#include + +#include + +namespace turns::app::widgets +{ + namespace + { + auto constexpr static TYPE_NAME = "turn_order_view"; + auto constexpr static TEMPLATE = "/ch/arknet/Turns/widgets/turn_order_view.ui"; + } // namespace + + turn_order_view::turn_order_view() + : Glib::ObjectBase(TYPE_NAME) + , template_widget{TEMPLATE} + , m_model{domain::turn_order::create()} + , m_view{get_widget("view")} + , m_n_items{m_model.get(), "n_items"} + { + m_view->bind_model(m_model, sigc::mem_fun(*this, &turn_order_view::handle_create_row)); + } + + auto turn_order_view::append(Glib::ustring name, float priority, domain::disposition disposition) -> void + { + auto participant = domain::participant::create(name, priority, disposition); + m_model->append(participant); + } + + auto turn_order_view::clear() -> void + { + m_model->remove_all(); + } + + auto turn_order_view::get(std::size_t index) -> Glib::RefPtr + { + return m_model->get_item(index); + } + + auto turn_order_view::remove(std::size_t index) -> void + { + m_model->remove(index); + } + + auto turn_order_view::get_n_items() const noexcept -> unsigned int + { + return m_n_items; + } + + auto turn_order_view::property_n_items() const -> Glib::PropertyProxy_ReadOnly + { + return m_n_items; + } + + auto turn_order_view::handle_create_row(Glib::RefPtr const item) -> Gtk::Widget * + { + auto participant = std::dynamic_pointer_cast(item); + return Gtk::make_managed(participant); + } + +} // namespace turns::app::widgets \ No newline at end of file diff --git a/app/src/windows/main.cpp b/app/src/windows/main.cpp index 68d2c5f..04d7329 100644 --- a/app/src/windows/main.cpp +++ b/app/src/windows/main.cpp @@ -27,60 +27,50 @@ namespace turns::app::windows : Gtk::ApplicationWindow{base} , m_adw{ADW_APPLICATION_WINDOW(gobj())} , m_empty(builder->get_widget("empty")) - , m_participant_list{builder->get_widget("participant_list")} , m_stack{builder->get_widget("stack")} , m_title(ADW_WINDOW_TITLE(builder->get_widget("title")->gobj())) - , m_turn_order{builder->get_widget("turn_order")} - , m_participant_list_data{domain::turn_order::create()} + , m_turn_order{Gtk::make_managed()} , m_subtitle{Glib::wrap(GTK_WIDGET(m_title)), "subtitle"} - , m_clear_action{add_action("clear", sigc::mem_fun(*this, &main::handle_clear))} + , m_clear_action{add_action("clear", sigc::mem_fun(*m_turn_order, &widgets::turn_order_view::clear))} { - m_clear_action_enabled = Glib::Binding::bind_property(m_participant_list_data->property_n_items(), + m_stack->add(*m_turn_order); + + // clang-format off + m_clear_action_enabled = Glib::Binding::bind_property(m_turn_order->property_n_items(), m_clear_action->property_enabled(), Glib::Binding::Flags::SYNC_CREATE); - m_visible_child_widget = Glib::Binding::bind_property(m_participant_list_data->property_n_items(), + m_visible_child_widget = Glib::Binding::bind_property(m_turn_order->property_n_items(), m_stack->property_visible_child(), Glib::Binding::Flags::SYNC_CREATE, [this](auto count) { return count ? m_turn_order : m_empty; }); - m_subtitle_text = Glib::Binding::bind_property(m_participant_list_data->property_n_items(), + m_subtitle_text = Glib::Binding::bind_property(m_turn_order->property_n_items(), m_subtitle, Glib::Binding::Flags::SYNC_CREATE, [](auto count) { return count ? "" : _(lang::no_active_turn_order); }); - - m_participant_list->bind_model(m_participant_list_data, sigc::mem_fun(*this, &main::handle_create_list_row)); + // clang-format on add_action("add_participant", sigc::mem_fun(*this, &main::handle_add_participant)); add_action_with_parameter("delete", Glib::VARIANT_TYPE_INT32, [this](auto param) { auto index = Glib::VariantBase::cast_dynamic>(param); - m_participant_list_data->remove(index.get()); + m_turn_order->remove(index.get()); }); add_action_with_parameter("edit", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &main::handle_edit_participant)); } - auto main::handle_create_list_row(Glib::RefPtr const item) -> Gtk::Widget * - { - auto participant = std::dynamic_pointer_cast(item); - return Gtk::make_managed(participant); - } - auto main::handle_add_participant() -> void { auto [lifeline, dialog] = editor_for(nullptr); dialog->present(this); - dialog->signal_finished().connect([this](auto name, auto priority, auto disposition) { m_participant_list_data->append(name, priority, disposition); }); - } - - auto main::handle_clear() -> void - { - m_participant_list_data->remove_all(); + dialog->signal_finished().connect(sigc::mem_fun(*m_turn_order, &widgets::turn_order_view::append)); } auto main::handle_edit_participant(Glib::VariantBase param) -> void { + static_cast(param); auto index = Glib::VariantBase::cast_dynamic>(param); - auto participant = m_participant_list_data->get_item(index.get()); + auto participant = m_turn_order->get(index.get()); auto [lifeline, dialog] = editor_for(participant); dialog->present(this); } -- cgit v1.2.3