diff options
Diffstat (limited to 'lib/src/turns-turn-order.cpp')
| -rw-r--r-- | lib/src/turns-turn-order.cpp | 41 |
1 files changed, 40 insertions, 1 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)); |
