summaryrefslogtreecommitdiff
path: root/lib/src/turns-turn-order.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/src/turns-turn-order.cpp')
-rw-r--r--lib/src/turns-turn-order.cpp41
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));