diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2024-07-17 01:07:22 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2024-07-17 01:07:22 +0200 |
| commit | 1435da0c878b705035fda0dfbdb31013645ce2f9 (patch) | |
| tree | 09cc77f78544b6f21c6bc635722e6fdcf8b26c67 /app/src | |
| parent | 225bfa26409243db96a0d36100561c257d0488f9 (diff) | |
| download | turns-1435da0c878b705035fda0dfbdb31013645ce2f9.tar.xz turns-1435da0c878b705035fda0dfbdb31013645ce2f9.zip | |
app/ui: implement basic turn tracking
Diffstat (limited to 'app/src')
| -rw-r--r-- | app/src/application.cpp | 5 | ||||
| -rw-r--r-- | app/src/widgets/turn_order_view.cpp | 15 | ||||
| -rw-r--r-- | app/src/windows/tracker.cpp | 102 |
3 files changed, 104 insertions, 18 deletions
diff --git a/app/src/application.cpp b/app/src/application.cpp index efa1ce0..bf49a6e 100644 --- a/app/src/application.cpp +++ b/app/src/application.cpp @@ -61,8 +61,11 @@ namespace turns::app adw_style_manager_set_color_scheme(style_manager, ADW_COLOR_SCHEME_PREFER_LIGHT); m_application->add_action("quit", sigc::mem_fun(*this, &application::handle_action_quit)); - m_application->set_accel_for_action("app.quit", "<ctrl>q"); + m_application->set_accel_for_action("app.quit", "<Primary>q"); m_application->set_accel_for_action("win.clear", "<Primary>x"); + m_application->set_accel_for_action("win.next", "<Primary>space"); + m_application->set_accel_for_action("win.previous", "<Primary>BackSpace"); + m_application->set_accel_for_action("win.add_participant", "<Primary>a"); register_derived_widgets(); } diff --git a/app/src/widgets/turn_order_view.cpp b/app/src/widgets/turn_order_view.cpp index 700dfd3..c2b4afa 100644 --- a/app/src/widgets/turn_order_view.cpp +++ b/app/src/widgets/turn_order_view.cpp @@ -4,6 +4,7 @@ #include "turns/domain/participant.hpp" #include "turns/lang/messages.hpp" +#include <algorithm> #include <format> #include <sigc++/functors/mem_fun.h> @@ -23,6 +24,7 @@ namespace turns::app::widgets , m_view{get_widget<Gtk::ListBox>("view")} { m_view->bind_model(m_model->list_model(), sigc::mem_fun(*this, &turn_order_view::handle_create_row)); + m_model->property_active_participant().signal_changed().connect(sigc::mem_fun(*this, &turn_order_view::handle_active_participant_changed)); } auto turn_order_view::get_model() const noexcept -> Glib::RefPtr<domain::turn_order> @@ -30,6 +32,19 @@ namespace turns::app::widgets return m_model; } + auto turn_order_view::handle_active_participant_changed() -> void + { + std::ranges::for_each(m_view->get_children(), [](auto c) { c->remove_css_class("active-participant"); }); + + auto index = m_model->active_participant(); + if (index != std::numeric_limits<domain::turn_order::active_participant_type>::max()) + { + auto row = m_view->get_row_at_index(index); + row->add_css_class("active-participant"); + row->grab_focus(); + } + } + auto turn_order_view::handle_create_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget * { auto participant = std::dynamic_pointer_cast<domain::participant>(item); diff --git a/app/src/windows/tracker.cpp b/app/src/windows/tracker.cpp index 5af405b..7712539 100644 --- a/app/src/windows/tracker.cpp +++ b/app/src/windows/tracker.cpp @@ -30,34 +30,23 @@ namespace turns::app::windows , m_controls{builder->get_widget<Gtk::Revealer>("controls")} , m_empty(builder->get_widget<Gtk::Widget>("empty")) , m_stack{builder->get_widget<Gtk::Stack>("stack")} + , m_start{builder->get_widget<Gtk::Button>("start")} , m_title(ADW_WINDOW_TITLE(builder->get_widget<Gtk::Widget>("title")->gobj())) , m_turn_order{Gtk::make_managed<widgets::turn_order_view>()} , m_subtitle{Glib::wrap(GTK_WIDGET(m_title)), "subtitle"} { - m_stack->add(*m_turn_order); - - auto clear_action = add_action("clear", sigc::mem_fun(*m_turn_order->get_model(), &domain::turn_order::clear)); - add_action("add_participant", sigc::mem_fun(*this, &tracker::handle_add_participant)); - add_action_with_parameter("delete", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &tracker::handle_delete_participant)); - add_action_with_parameter("edit", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &tracker::handle_edit_participant)); - auto start_action = add_action("start", sigc::mem_fun(*m_turn_order->get_model(), &domain::turn_order::start)); - - Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), - clear_action->property_enabled(), - Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + setup_actions(); - Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), - m_controls->property_reveal_child(), - Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + m_stack->add(*m_turn_order); Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), m_stack->property_visible_child(), Glib::Binding::Flags::SYNC_CREATE, [this](auto empty) { return empty ? m_empty : m_turn_order; }); - Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), - start_action->property_enabled(), - Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + Glib::Binding::bind_property(m_turn_order->get_model()->property_running(), + m_controls->property_reveal_child(), + Glib::Binding::Flags::SYNC_CREATE); // clang-format off Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), @@ -91,4 +80,83 @@ namespace turns::app::windows dialog->present(this); } + auto tracker::handle_stop() -> void + { + m_turn_order->get_model()->stop(); + } + + auto tracker::setup_actions() -> void + { + // win.add_participant + // depends-on: turn_order:state == stopped + { + auto action = add_action("add_participant", sigc::mem_fun(*this, &tracker::handle_add_participant)); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_running(), + action->property_enabled(), + Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + } + + // win.clear + // depends-on: turn_order:empty == false + { + auto action = add_action("clear", sigc::mem_fun(*m_turn_order->get_model(), &domain::turn_order::clear)); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), + action->property_enabled(), + Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + } + + // win.next + // depends-on: turn_order:state == running + { + auto action = add_action("next", sigc::mem_fun(*m_turn_order->get_model(), &domain::turn_order::next)); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_running(), + action->property_enabled(), + Glib::Binding::Flags::SYNC_CREATE); + } + + // win.previous + // depends-on: turn_order:has_previous == true + { + auto action = add_action("previous", sigc::mem_fun(*m_turn_order->get_model(), &domain::turn_order::previous)); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_has_previous(), + action->property_enabled(), + Glib::Binding::Flags::SYNC_CREATE); + } + + // win.start + // depends-on: turn_order:empty == false + { + auto action = add_action("start", sigc::mem_fun(*m_turn_order->get_model(), &domain::turn_order::start)); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_empty(), + action->property_enabled(), + Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_running(), + m_start->property_visible(), + Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN); + } + + // win.stop + // depends-on: turn_order:running == true + { + auto action = add_action("stop", sigc::mem_fun(*this, &tracker::handle_stop)); + + Glib::Binding::bind_property(m_turn_order->get_model()->property_running(), + action->property_enabled(), + Glib::Binding::Flags::SYNC_CREATE); + } + + // win.delete + // win.edit + { + add_action_with_parameter("delete", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &tracker::handle_delete_participant)); + add_action_with_parameter("edit", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &tracker::handle_edit_participant)); + } + } + } // namespace turns::app::windows |
