summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/include/turns/app/windows/participant_editor.hpp12
-rw-r--r--app/src/windows/main.cpp2
-rw-r--r--app/src/windows/participant_editor.cpp7
-rw-r--r--app/tests/widgets/participant_row.cpp3
-rw-r--r--app/tests/windows/participant_editor.cpp7
-rw-r--r--domain/include/turns/domain/participant.hpp12
-rw-r--r--domain/include/turns/domain/turn_order.hpp3
-rw-r--r--domain/src/participant.cpp27
-rw-r--r--domain/src/turn_order.cpp4
-rw-r--r--domain/tests/participant.cpp52
-rw-r--r--domain/tests/turn_order.cpp46
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);
}
}