diff options
| -rw-r--r-- | app/include/turns/app/windows/participant_editor.hpp | 12 | ||||
| -rw-r--r-- | app/src/windows/main.cpp | 2 | ||||
| -rw-r--r-- | app/src/windows/participant_editor.cpp | 7 | ||||
| -rw-r--r-- | app/tests/widgets/participant_row.cpp | 3 | ||||
| -rw-r--r-- | app/tests/windows/participant_editor.cpp | 7 | ||||
| -rw-r--r-- | domain/include/turns/domain/participant.hpp | 12 | ||||
| -rw-r--r-- | domain/include/turns/domain/turn_order.hpp | 3 | ||||
| -rw-r--r-- | domain/src/participant.cpp | 27 | ||||
| -rw-r--r-- | domain/src/turn_order.cpp | 4 | ||||
| -rw-r--r-- | domain/tests/participant.cpp | 52 | ||||
| -rw-r--r-- | domain/tests/turn_order.cpp | 46 |
11 files changed, 128 insertions, 47 deletions
diff --git a/app/include/turns/app/windows/participant_editor.hpp b/app/include/turns/app/windows/participant_editor.hpp index 36c1d37..764b9ba 100644 --- a/app/include/turns/app/windows/participant_editor.hpp +++ b/app/include/turns/app/windows/participant_editor.hpp @@ -3,14 +3,16 @@ #include "turns/domain/participant.hpp" +#include <utility> + #include <adwaita.h> #include <glibmm/refptr.h> #include <gtkmm/builder.h> #include <gtkmm/button.h> -#include <gtkmm/widget.h> -#include <gtkmm/stringlist.h> -#include <gtkmm/signallistitemfactory.h> #include <gtkmm/listitem.h> +#include <gtkmm/signallistitemfactory.h> +#include <gtkmm/stringlist.h> +#include <gtkmm/widget.h> #include <sigc++/signal.h> @@ -19,7 +21,9 @@ namespace turns::app::windows struct participant_editor : Gtk::Widget { - using signal_finished_type = sigc::signal<void(Glib::ustring, float)>; + using signal_finished_type = sigc::signal<void(decltype(std::declval<domain::participant const>().get_name()), + decltype(std::declval<domain::participant const>().get_priority()), + decltype(std::declval<domain::participant const>().get_disposition()))>; participant_editor(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder, Glib::RefPtr<domain::participant> obj = {}); diff --git a/app/src/windows/main.cpp b/app/src/windows/main.cpp index a8f8739..68d2c5f 100644 --- a/app/src/windows/main.cpp +++ b/app/src/windows/main.cpp @@ -69,7 +69,7 @@ namespace turns::app::windows { auto [lifeline, dialog] = editor_for(nullptr); dialog->present(this); - dialog->signal_finished().connect([this](auto name, auto priority) { m_participant_list_data->append(name, priority); }); + dialog->signal_finished().connect([this](auto name, auto priority, auto disposition) { m_participant_list_data->append(name, priority, disposition); }); } auto main::handle_clear() -> void diff --git a/app/src/windows/participant_editor.cpp b/app/src/windows/participant_editor.cpp index 5ca6602..1c97442 100644 --- a/app/src/windows/participant_editor.cpp +++ b/app/src/windows/participant_editor.cpp @@ -40,10 +40,11 @@ namespace turns::app::windows adw_combo_row_set_factory(m_disposition, GTK_LIST_ITEM_FACTORY(m_disposition_factory->gobj())); adw_combo_row_set_model(m_disposition, G_LIST_MODEL(m_disposition_model->gobj())); - if (obj) + if (m_participant) { gtk_editable_set_text(GTK_EDITABLE(m_name), m_participant->property_name().get_value().c_str()); adw_spin_row_set_value(m_priority, m_participant->property_priority().get_value()); + adw_combo_row_set_selected(m_disposition, static_cast<unsigned>(m_participant->get_disposition())); } } @@ -61,14 +62,16 @@ namespace turns::app::windows { auto name = gtk_editable_get_text(GTK_EDITABLE(m_name)); auto priority = adw_spin_row_get_value(m_priority); + auto disposition = static_cast<domain::disposition>(adw_combo_row_get_selected(m_disposition)); if (m_participant) { m_participant->set_name(name); m_participant->set_priority(priority); + m_participant->set_disposition(disposition); } - m_signal_finished.emit(name, priority); + m_signal_finished.emit(name, priority, disposition); adw_dialog_close(m_adw); } diff --git a/app/tests/widgets/participant_row.cpp b/app/tests/widgets/participant_row.cpp index 0e91ad7..04950ad 100644 --- a/app/tests/widgets/participant_row.cpp +++ b/app/tests/widgets/participant_row.cpp @@ -1,5 +1,6 @@ #include "turns/app/widgets/participant_row.hpp" +#include "turns/domain/disposition.hpp" #include "turns/domain/participant.hpp" #include "turns/lang/messages.hpp" @@ -23,7 +24,7 @@ namespace turns::app::widgets::tests SECTION("can be created with a participant") { - REQUIRE(Gtk::make_managed<participant_row>(domain::participant::create("Tazmyla Fireforge", 13))); + REQUIRE(Gtk::make_managed<participant_row>(domain::participant::create("Tazmyla Fireforge", 13, domain::disposition::secret))); } } diff --git a/app/tests/windows/participant_editor.cpp b/app/tests/windows/participant_editor.cpp index 15c9975..5808740 100644 --- a/app/tests/windows/participant_editor.cpp +++ b/app/tests/windows/participant_editor.cpp @@ -1,6 +1,7 @@ #include "turns/app/windows/participant_editor.hpp" #include "turns/domain/participant.hpp" +#include "turns/domain/disposition.hpp" #include "turns/lang/messages.hpp" #include <catch2/catch_test_macros.hpp> @@ -60,7 +61,7 @@ namespace turns::app::windows::tests SECTION("allows binding to the finished signal") { - REQUIRE((instance->signal_finished().connect([](auto, auto){})).connected()); + REQUIRE((instance->signal_finished().connect([](auto, auto, auto){})).connected()); } } @@ -69,7 +70,7 @@ namespace turns::app::windows::tests auto locale = GENERATE("en_US.UTF-8", "de_CH.UTF-8"); setlocale(LC_ALL, locale); - auto participant = domain::participant::create("Qibi Babblebranch", 12); + auto participant = domain::participant::create("Qibi Babblebranch", 12, domain::disposition::neutral); auto builder = Gtk::Builder::create_from_resource("/ch/arknet/Turns/windows/participant_editor.ui"); auto instance = Gtk::Builder::get_widget_derived<participant_editor>(builder, "participant_editor", participant); auto window = Gtk::Window{}; @@ -105,7 +106,7 @@ namespace turns::app::windows::tests SECTION("allows binding to the finished signal") { - REQUIRE((instance->signal_finished().connect([](auto, auto){})).connected()); + REQUIRE((instance->signal_finished().connect([](auto, auto, auto){})).connected()); } } diff --git a/domain/include/turns/domain/participant.hpp b/domain/include/turns/domain/participant.hpp index 3f249d5..d845c77 100644 --- a/domain/include/turns/domain/participant.hpp +++ b/domain/include/turns/domain/participant.hpp @@ -1,6 +1,8 @@ #ifndef TURNS_DOMAIN_PARTICIPANT_HPP #define TURNS_DOMAIN_PARTICIPANT_HPP +#include "turns/domain/disposition.hpp" + #include <compare> #include <glibmm/object.h> @@ -14,12 +16,17 @@ namespace turns::domain struct participant : Glib::Object { - auto static create(Glib::ustring name, float priority) -> Glib::RefPtr<participant>; + auto static create(Glib::ustring name, float priority, disposition disposition) -> Glib::RefPtr<participant>; - participant(Glib::ustring name, float priority); + participant(Glib::ustring name, float priority, disposition disposition); auto operator<=>(participant const & other) const noexcept -> std::partial_ordering; + auto property_disposition() -> Glib::PropertyProxy<disposition>; + auto property_disposition() const -> Glib::PropertyProxy_ReadOnly<disposition>; + auto get_disposition() const noexcept -> disposition; + auto set_disposition(disposition value) -> void; + auto property_name() -> Glib::PropertyProxy<Glib::ustring>; auto property_name() const -> Glib::PropertyProxy_ReadOnly<Glib::ustring>; auto get_name() const -> Glib::ustring; @@ -31,6 +38,7 @@ namespace turns::domain auto set_priority(float value) -> void; private: + Glib::Property<disposition> m_disposition; Glib::Property<Glib::ustring> m_name; Glib::Property<float> m_priority; }; diff --git a/domain/include/turns/domain/turn_order.hpp b/domain/include/turns/domain/turn_order.hpp index ba9bc3a..d7f8821 100644 --- a/domain/include/turns/domain/turn_order.hpp +++ b/domain/include/turns/domain/turn_order.hpp @@ -1,6 +1,7 @@ #ifndef TURNS_DOMAIN_TURN_ORDER_HPP #define TURNS_DOMAIN_TURN_ORDER_HPP +#include "turns/domain/disposition.hpp" #include "turns/domain/participant.hpp" #include <giomm/liststore.h> @@ -20,7 +21,7 @@ namespace turns::domain auto static create() -> Glib::RefPtr<turn_order>; auto append(Glib::RefPtr<participant> item) -> void; - auto append(Glib::ustring const & name, float priority) -> void; + auto append(Glib::ustring const & name, float priority, disposition disposition) -> void; auto remove(Glib::RefPtr<participant> item) -> void; private: diff --git a/domain/src/participant.cpp b/domain/src/participant.cpp index 08c6deb..5265eb3 100644 --- a/domain/src/participant.cpp +++ b/domain/src/participant.cpp @@ -8,13 +8,14 @@ namespace turns::domain { - auto participant::create(Glib::ustring name, float priority) -> Glib::RefPtr<participant> + auto participant::create(Glib::ustring name, float priority, disposition disposition) -> Glib::RefPtr<participant> { - return Glib::make_refptr_for_instance(new participant{name, priority}); + return Glib::make_refptr_for_instance(new participant{name, priority, disposition}); } - participant::participant(Glib::ustring name, float priority) + participant::participant(Glib::ustring name, float priority, disposition disposition) : Glib::ObjectBase{typeid(participant)} + , m_disposition{*this, "disposition", disposition} , m_name{*this, "name", name} , m_priority{*this, "priority", priority} { @@ -25,6 +26,16 @@ namespace turns::domain return m_priority <=> other.m_priority; } + auto participant::get_disposition() const noexcept -> disposition + { + return m_disposition; + } + + auto participant::set_disposition(disposition value) -> void + { + m_disposition = value; + } + auto participant::get_name() const -> Glib::ustring { return m_name; @@ -45,6 +56,16 @@ namespace turns::domain m_priority = value; } + auto participant::property_disposition() -> Glib::PropertyProxy<disposition> + { + return m_disposition.get_proxy(); + } + + auto participant::property_disposition() const -> Glib::PropertyProxy_ReadOnly<disposition> + { + return m_disposition.get_proxy(); + } + auto participant::property_name() -> Glib::PropertyProxy<Glib::ustring> { return m_name.get_proxy(); diff --git a/domain/src/turn_order.cpp b/domain/src/turn_order.cpp index eddd468..4f1ed3b 100644 --- a/domain/src/turn_order.cpp +++ b/domain/src/turn_order.cpp @@ -42,9 +42,9 @@ namespace turns::domain } } - auto turn_order::append(Glib::ustring const & name, float priority) -> void + auto turn_order::append(Glib::ustring const & name, float priority, disposition disposition) -> void { - auto participant = participant::create(name, priority); + auto participant = participant::create(name, priority, disposition); participant->property_priority().signal_changed().connect([this] { sort(comparator); }); append(participant); } diff --git a/domain/tests/participant.cpp b/domain/tests/participant.cpp index 6db98f7..dd244f4 100644 --- a/domain/tests/participant.cpp +++ b/domain/tests/participant.cpp @@ -1,4 +1,5 @@ #include "turns/domain/participant.hpp" +#include "turns/domain/disposition.hpp" #include <catch2/catch_test_macros.hpp> @@ -13,11 +14,52 @@ namespace turns::domain::tests { auto constexpr constructed_name = "Vana Thistletop"; auto constexpr constructed_priority = 17; - auto instance = participant{constructed_name, constructed_priority}; + auto constexpr constructed_disposition = disposition::friendly; + auto instance = participant{constructed_name, constructed_priority, constructed_disposition}; SECTION("can be created") { - REQUIRE(participant::create(constructed_name, constructed_priority)); + REQUIRE(participant::create(constructed_name, constructed_priority, constructed_disposition)); + } + + SECTION("allows access to its disposition via the associated accessors") + { + SECTION("allowing to get it") + { + REQUIRE(instance.get_disposition() == constructed_disposition); + } + + SECTION("allowing to get it via a constant object") + { + auto const & cref = instance; + REQUIRE(cref.get_disposition() == constructed_disposition); + } + + SECTION("allowing to set it") + { + instance.set_disposition(disposition::hostile); + REQUIRE(instance.get_disposition() == disposition::hostile); + } + } + + SECTION("allows access to its disposition via the associated property") + { + SECTION("allowing to get it") + { + REQUIRE(instance.property_disposition() == constructed_disposition); + } + + SECTION("allowing to get it via a constant object") + { + auto const & cref = instance; + REQUIRE(cref.property_disposition() == constructed_disposition); + } + + SECTION("allowing to set it") + { + instance.property_disposition() = disposition::hostile; + REQUIRE(instance.get_disposition() == disposition::hostile); + } } SECTION("allows access to its name via the associated accessors") @@ -102,9 +144,9 @@ namespace turns::domain::tests SECTION("can be compared with another participant") { - auto equivalent_instance = participant{"Equivalent", constructed_priority}; - auto lesser_instance = participant{"Lesser", constructed_priority - 1}; - auto greater_instance = participant{"Greater", constructed_priority + 1}; + auto equivalent_instance = participant{"Equivalent", constructed_priority, constructed_disposition}; + auto lesser_instance = participant{"Lesser", constructed_priority - 1, constructed_disposition}; + auto greater_instance = participant{"Greater", constructed_priority + 1, constructed_disposition}; SECTION("yielding std::partial_ordering::equivalent for itself") { diff --git a/domain/tests/turn_order.cpp b/domain/tests/turn_order.cpp index 7172ffc..f1f2653 100644 --- a/domain/tests/turn_order.cpp +++ b/domain/tests/turn_order.cpp @@ -27,19 +27,19 @@ namespace turns::domain::tests SECTION("accepts a new participant in form of a refptr") { - instance.append(participant::create("Honey Bunches of Oats", 12)); + instance.append(participant::create("Honey Bunches of Oats", 12, disposition::friendly)); REQUIRE(instance.get_n_items() == 1); } SECTION("accepts a new participant in form of components") { - instance.append("River along the Field", 14); + instance.append("River along the Field", 14, disposition::friendly); REQUIRE(instance.get_n_items() == 1); } SECTION("does nothing when trying to remove an item by refptr if no items were added beforehand") { - instance.remove(participant::create("Patch in the Forest", 3)); + instance.remove(participant::create("Patch in the Forest", 3, disposition::friendly)); REQUIRE(instance.get_n_items() == 0); } @@ -51,7 +51,7 @@ namespace turns::domain::tests SECTION("allows the removal of an item by refptr if the same item was added beforehand") { - auto item = participant::create("Blank Canvas", 23); + auto item = participant::create("Blank Canvas", 23, disposition::friendly); instance.append(item); instance.remove(item); REQUIRE(instance.get_n_items() == 0); @@ -59,9 +59,9 @@ namespace turns::domain::tests SECTION("does nothing when trying to remove an item by refptr that was not added beforehand") { - auto item = participant::create("Blank Canvas", 23); + auto item = participant::create("Blank Canvas", 23, disposition::friendly); instance.append(item); - instance.remove(participant::create("Spell of Rain", 6)); + instance.remove(participant::create("Spell of Rain", 6, disposition::friendly)); REQUIRE(instance.get_n_items() == 1); } @@ -69,22 +69,22 @@ namespace turns::domain::tests { SECTION("when appending the higher one last") { - instance.append(participant::create("Snow on the Field", 2)); - instance.append(participant::create("Bees behind the Cottage", 8)); + instance.append(participant::create("Snow on the Field", 2, disposition::friendly)); + instance.append(participant::create("Bees behind the Cottage", 8, disposition::friendly)); REQUIRE(instance.get_item(0)->get_name() == "Bees behind the Cottage"); } SECTION("when appending the higher one first") { - instance.append(participant::create("Bees behind the Cottage", 8)); - instance.append(participant::create("Snow on the Field", 2)); + instance.append(participant::create("Bees behind the Cottage", 8, disposition::friendly)); + instance.append(participant::create("Snow on the Field", 2, disposition::friendly)); REQUIRE(instance.get_item(0)->get_name() == "Bees behind the Cottage"); } SECTION("keeping the insertion order when appending items with equal priority") { - instance.append(participant::create("Snow on the Field", 8)); - instance.append(participant::create("Bees behind the Cottage", 8)); + instance.append(participant::create("Snow on the Field", 8, disposition::friendly)); + instance.append(participant::create("Bees behind the Cottage", 8, disposition::friendly)); REQUIRE(instance.get_item(0)->get_name() == "Snow on the Field"); } } @@ -93,29 +93,29 @@ namespace turns::domain::tests { SECTION("when appending the higher one last") { - instance.append("Tree Blossom", 6); - instance.append("Fish in the River", 12); + instance.append("Tree Blossom", 6, disposition::friendly); + instance.append("Fish in the River", 12, disposition::friendly); REQUIRE(instance.get_item(0)->get_name() == "Fish in the River"); } SECTION("when appending the higher one first") { - instance.append("Fish in the River", 12); - instance.append("Tree Blossom", 6); + instance.append("Fish in the River", 12, disposition::friendly); + instance.append("Tree Blossom", 6, disposition::friendly); REQUIRE(instance.get_item(0)->get_name() == "Fish in the River"); } SECTION("keeping the insertion order when appending items with equal priority") { - instance.append("Fish in the River", 6); - instance.append("Tree Blossom", 6); + instance.append("Fish in the River", 6, disposition::friendly); + instance.append("Tree Blossom", 6, disposition::friendly); REQUIRE(instance.get_item(0)->get_name() == "Fish in the River"); } } SECTION("does not accept the same item twice by the same refptr") { - auto item = participant::create("Angelic Berry", 9); + auto item = participant::create("Angelic Berry", 9, disposition::friendly); instance.append(item); instance.append(item); REQUIRE(instance.get_n_items() == 1); @@ -123,8 +123,8 @@ namespace turns::domain::tests SECTION("does not accept the same item twice by different refptrs") { - auto item_one = participant::create("Misty Meadow", 14.2); - auto item_two = participant::create("Misty Meadow", 14.2); + auto item_one = participant::create("Misty Meadow", 14.2, disposition::friendly); + auto item_two = participant::create("Misty Meadow", 14.2, disposition::friendly); instance.append(item_one); instance.append(item_two); REQUIRE(instance.get_n_items() == 1); @@ -132,8 +132,8 @@ namespace turns::domain::tests SECTION("does not accept the same item twice by components") { - instance.append("Frozen Apple Tree", 2.1); - instance.append("Frozen Apple Tree", 2.1); + instance.append("Frozen Apple Tree", 2.1, disposition::friendly); + instance.append("Frozen Apple Tree", 2.1, disposition::friendly); REQUIRE(instance.get_n_items() == 1); } } |
