summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/CMakeLists.txt1
-rw-r--r--app/include/turns/app/application.hpp2
-rw-r--r--app/include/turns/app/widgets/participant_row.hpp5
-rw-r--r--app/include/turns/app/widgets/turn_order_view.hpp48
-rw-r--r--app/include/turns/app/windows/main.hpp7
-rw-r--r--app/src/application.cpp14
-rw-r--r--app/src/widgets/participant_row.cpp20
-rw-r--r--app/src/widgets/turn_order_view.cpp66
-rw-r--r--app/src/windows/main.cpp36
9 files changed, 151 insertions, 48 deletions
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 4f024a4..eb426ca 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -3,6 +3,7 @@
add_library("app"
"src/application.cpp"
"src/widgets/participant_row.cpp"
+ "src/widgets/turn_order_view.cpp"
"src/windows/main.cpp"
"src/windows/participant_editor.cpp"
)
diff --git a/app/include/turns/app/application.hpp b/app/include/turns/app/application.hpp
index 81fe333..6506dd7 100644
--- a/app/include/turns/app/application.hpp
+++ b/app/include/turns/app/application.hpp
@@ -27,6 +27,8 @@ namespace turns::app
auto on_shutdown() -> void;
auto on_startup() -> void;
+ auto register_derived_widgets() -> void;
+
AdwApplication * m_adw;
Glib::RefPtr<Gtk::Application> m_application;
windows::main * m_main;
diff --git a/app/include/turns/app/widgets/participant_row.hpp b/app/include/turns/app/widgets/participant_row.hpp
index a8f225f..79de1e9 100644
--- a/app/include/turns/app/widgets/participant_row.hpp
+++ b/app/include/turns/app/widgets/participant_row.hpp
@@ -28,9 +28,6 @@ namespace turns::app::widgets
participant_row(Glib::RefPtr<domain::participant> participant);
- auto set_subtitle(Glib::ustring const & value) -> void;
- auto set_title(Glib::ustring const & value) -> void;
-
private:
auto handle_delete() -> void;
auto handle_edit() -> void;
@@ -41,7 +38,9 @@ namespace turns::app::widgets
Gtk::Label * m_title;
Gtk::ToggleButton * m_toggle_defeated;
+ Glib::RefPtr<Glib::Binding> m_subtitle_label{};
Glib::RefPtr<Glib::Binding> m_subtitle_visibility{};
+ Glib::RefPtr<Glib::Binding> m_title_label{};
Glib::RefPtr<Glib::Binding> m_title_visibility{};
Glib::RefPtr<Glib::Binding> m_toggle_defeated_icon{};
};
diff --git a/app/include/turns/app/widgets/turn_order_view.hpp b/app/include/turns/app/widgets/turn_order_view.hpp
new file mode 100644
index 0000000..c55483a
--- /dev/null
+++ b/app/include/turns/app/widgets/turn_order_view.hpp
@@ -0,0 +1,48 @@
+#ifndef TURNS_APP_WIDGETS_TURN_ORDER_VIEW_HPP
+#define TURNS_APP_WIDGETS_TURN_ORDER_VIEW_HPP
+
+#include "turns/app/widgets/template_widget.hpp"
+#include "turns/domain/turn_order.hpp"
+#include "turns/domain/participant.hpp"
+#include "turns/domain/disposition.hpp"
+
+#include <array>
+
+#include <glibmm/object.h>
+#include <glibmm/propertyproxy.h>
+#include <glibmm/refptr.h>
+#include <gtkmm/listbox.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/widget.h>
+#include <glibmm/ustring.h>
+
+namespace turns::app::widgets
+{
+ struct turn_order_view : template_widget<turn_order_view, Gtk::ScrolledWindow>
+ {
+ auto constexpr inline static children = std::array{
+ "view",
+ };
+
+ turn_order_view();
+
+ auto append(Glib::ustring name, float priority, domain::disposition disposition) -> void;
+ auto clear() -> void;
+ auto get(std::size_t index) -> Glib::RefPtr<domain::participant>;
+ auto remove(std::size_t index) -> void;
+
+
+ auto get_n_items() const noexcept -> unsigned int;
+ auto property_n_items() const -> Glib::PropertyProxy_ReadOnly<unsigned int>;
+
+ private:
+ auto handle_create_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget *;
+
+ Glib::RefPtr<domain::turn_order> m_model;
+ Gtk::ListBox * m_view;
+
+ Glib::PropertyProxy_ReadOnly<unsigned int> m_n_items;
+ };
+} // namespace turns::app::widgets
+
+#endif \ No newline at end of file
diff --git a/app/include/turns/app/windows/main.hpp b/app/include/turns/app/windows/main.hpp
index 694876e..5e13cf0 100644
--- a/app/include/turns/app/windows/main.hpp
+++ b/app/include/turns/app/windows/main.hpp
@@ -2,6 +2,7 @@
#define TURNS_APP_WINDOWS_MAIN_WINDOW_HPP
#include "turns/domain/turn_order.hpp"
+#include "turns/app/widgets/turn_order_view.hpp"
#include <adwaita.h>
#include <giomm/simpleaction.h>
@@ -25,19 +26,15 @@ namespace turns::app::windows
main(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder);
private:
- auto handle_create_list_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget *;
auto handle_add_participant() -> void;
auto handle_clear() -> void;
auto handle_edit_participant(Glib::VariantBase param) -> void;
AdwApplicationWindow * m_adw;
Gtk::Widget * m_empty;
- Gtk::ListBox * m_participant_list;
Gtk::Stack * m_stack;
AdwWindowTitle * m_title;
- Gtk::ScrolledWindow * m_turn_order;
-
- Glib::RefPtr<domain::turn_order> m_participant_list_data;
+ widgets::turn_order_view * m_turn_order;
Glib::PropertyProxy<Glib::ustring> m_subtitle;
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 <glibmm/wrap.h>
@@ -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<windows::main>(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<windows::main>(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", "<ctrl>q");
m_application->set_accel_for_action("win.clear", "<Primary>x");
+
+ register_derived_widgets();
+ }
+
+ auto application::register_derived_widgets() -> void
+ {
+ static_cast<void>(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<int>::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 <format>
+
+#include <sigc++/functors/mem_fun.h>
+
+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<turn_order_view, Gtk::ScrolledWindow>{TEMPLATE}
+ , m_model{domain::turn_order::create()}
+ , m_view{get_widget<Gtk::ListBox>("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<domain::participant>
+ {
+ 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<unsigned int>
+ {
+ return m_n_items;
+ }
+
+ auto turn_order_view::handle_create_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget *
+ {
+ auto participant = std::dynamic_pointer_cast<domain::participant>(item);
+ return Gtk::make_managed<widgets::participant_row>(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<Gtk::Widget>("empty"))
- , m_participant_list{builder->get_widget<Gtk::ListBox>("participant_list")}
, m_stack{builder->get_widget<Gtk::Stack>("stack")}
, m_title(ADW_WINDOW_TITLE(builder->get_widget<Gtk::Widget>("title")->gobj()))
- , m_turn_order{builder->get_widget<Gtk::ScrolledWindow>("turn_order")}
- , m_participant_list_data{domain::turn_order::create()}
+ , m_turn_order{Gtk::make_managed<widgets::turn_order_view>()}
, 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<Glib::Variant<int>>(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<Glib::Object> const item) -> Gtk::Widget *
- {
- auto participant = std::dynamic_pointer_cast<domain::participant>(item);
- return Gtk::make_managed<widgets::participant_row>(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<void>(param);
auto index = Glib::VariantBase::cast_dynamic<Glib::Variant<int>>(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);
}