diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2025-05-16 11:12:43 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2025-05-16 11:12:43 +0200 |
| commit | 84fb875123201f28a3333285b6323037b08accb4 (patch) | |
| tree | d588328fbb4ffcfc803d4cde7f749566984ea28c /lib/src | |
| parent | 06200268231281ce925c8eea83cfd30fa824af2b (diff) | |
| download | turns-84fb875123201f28a3333285b6323037b08accb4.tar.xz turns-84fb875123201f28a3333285b6323037b08accb4.zip | |
lib: implement ListModel interface for TurnOrder
Diffstat (limited to 'lib/src')
| -rw-r--r-- | lib/src/turns-turn-order.cpp | 41 | ||||
| -rw-r--r-- | lib/src/turnsmm/participant.cpp | 10 | ||||
| -rw-r--r-- | lib/src/turnsmm/participant.hpp | 4 | ||||
| -rw-r--r-- | lib/src/turnsmm/turn-order.cpp | 12 | ||||
| -rw-r--r-- | lib/src/turnsmm/turn-order.hpp | 9 |
5 files changed, 74 insertions, 2 deletions
diff --git a/lib/src/turns-turn-order.cpp b/lib/src/turns-turn-order.cpp index 287e19c..3d1b4eb 100644 --- a/lib/src/turns-turn-order.cpp +++ b/lib/src/turns-turn-order.cpp @@ -1,9 +1,13 @@ #include "turns-turn-order.h" +#include "turns-participant.h" + +#include <gio/gio.h> #include <glib-object.h> #include <glib.h> #include <array> +#include <bit> #include <cstddef> #include <limits> @@ -13,11 +17,17 @@ struct _TurnsTurnOrder { GObject parent_instance; + GList participants; gsize participant_count; gboolean running; }; -G_DEFINE_FINAL_TYPE(TurnsTurnOrder, turns_turn_order, G_TYPE_OBJECT); +static void turns_turn_order_list_model_init(GListModelInterface * iface); + +G_DEFINE_FINAL_TYPE_WITH_CODE(TurnsTurnOrder, + turns_turn_order, + G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL, turns_turn_order_list_model_init)); G_END_DECLS @@ -78,10 +88,39 @@ static void turns_turn_order_class_init(TurnsTurnOrderClass * klass) static void turns_turn_order_init(TurnsTurnOrder * self) { + self->participants = { + .data = nullptr, + .next = nullptr, + .prev = nullptr, + }; self->participant_count = 0; self->running = false; } +static gpointer turns_turn_order_list_model_get_item(TurnsTurnOrder * self, guint position) +{ + g_return_val_if_fail(position < self->participant_count, nullptr); + return g_list_nth_data(&self->participants, position); +} + +static guint turns_turn_order_list_model_get_n_items(TurnsTurnOrder * self) +{ + return turns_turn_order_get_participant_count(self); +} + +static GType turns_turn_order_list_model_get_item_type(TurnsTurnOrder * self) +{ + static_cast<void>(self); + return TURNS_TYPE_PARTICIPANT; +} + +static void turns_turn_order_list_model_init(GListModelInterface * iface) +{ + iface->get_item = std::bit_cast<decltype(iface->get_item)>(&turns_turn_order_list_model_get_item); + iface->get_item_type = std::bit_cast<decltype(iface->get_item_type)>(&turns_turn_order_list_model_get_item_type); + iface->get_n_items = std::bit_cast<decltype(iface->get_n_items)>(&turns_turn_order_list_model_get_n_items); +} + TurnsTurnOrder * turns_turn_order_new() { return TURNS_TURN_ORDER(g_object_new(TURNS_TYPE_TURN_ORDER, nullptr)); diff --git a/lib/src/turnsmm/participant.cpp b/lib/src/turnsmm/participant.cpp index 5cc3db6..2c7ca08 100644 --- a/lib/src/turnsmm/participant.cpp +++ b/lib/src/turnsmm/participant.cpp @@ -48,6 +48,16 @@ namespace Turns return new Participant(TURNS_PARTICIPANT(object)); } + auto Participant::get_base_type() -> GType + { + return turns_participant_get_type(); + } + + auto Participant::get_type() -> GType + { + return _class.init().get_type(); + } + Participant::Participant() : Glib::ObjectBase{nullptr} , Glib::Object{Glib::ConstructParams{_class.init()}} diff --git a/lib/src/turnsmm/participant.hpp b/lib/src/turnsmm/participant.hpp index b41c64b..04c4fe8 100644 --- a/lib/src/turnsmm/participant.hpp +++ b/lib/src/turnsmm/participant.hpp @@ -8,6 +8,7 @@ #include <glibmm/propertyproxy.h> #include <glibmm/refptr.h> #include <glibmm/ustring.h> +#include <glib-object.h> namespace Turns { @@ -20,6 +21,9 @@ namespace Turns using CppClassType = class Participant_Class; using CppObjectType = Participant; + auto static get_base_type() -> GType; + auto static get_type() -> GType; + Participant(); Participant(Glib::ustring const & name, float priority, Disposition disposition); diff --git a/lib/src/turnsmm/turn-order.cpp b/lib/src/turnsmm/turn-order.cpp index 8e1914d..8ff7210 100644 --- a/lib/src/turnsmm/turn-order.cpp +++ b/lib/src/turnsmm/turn-order.cpp @@ -11,6 +11,8 @@ #include <glibmm/refptr.h> #include <glibmm/wrap.h> +#include <giomm/listmodel.h> + #include <glib-object.h> #include <bit> @@ -45,6 +47,16 @@ namespace Turns return new TurnOrder(TURNS_TURN_ORDER(object)); } + auto TurnOrder::get_base_type() -> GType + { + return turns_turn_order_get_type(); + } + + auto TurnOrder::get_type() -> GType + { + return _class.init().get_type(); + } + TurnOrder::TurnOrder() : Glib::ObjectBase{nullptr} , Glib::Object{Glib::ConstructParams{_class.init()}} diff --git a/lib/src/turnsmm/turn-order.hpp b/lib/src/turnsmm/turn-order.hpp index 25fc0b5..2dfa2ca 100644 --- a/lib/src/turnsmm/turn-order.hpp +++ b/lib/src/turnsmm/turn-order.hpp @@ -8,12 +8,16 @@ #include <glibmm/refptr.h> #include <glibmm/ustring.h> +#include <giomm/listmodel.h> +#include <glib-object.h> + #include <cstddef> namespace Turns { - class TurnOrder final : public Glib::Object + class TurnOrder final : public Glib::Object, + public Gio::ListModel { public: using BaseClassType = TurnsTurnOrderClass; @@ -21,6 +25,9 @@ namespace Turns using CppClassType = class TurnOrder_Class; using CppObjectType = TurnOrder; + auto static get_base_type() -> GType; + auto static get_type() -> GType; + TurnOrder(); [[nodiscard]] auto gobj() noexcept -> BaseObjectType *; |
