diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2025-05-23 09:13:11 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2025-05-23 09:13:11 +0200 |
| commit | ddce5043e70de5eab3d35b0986faf9a12933dedf (patch) | |
| tree | ebe2a333ee8c6a2cb67d567a0f2a67dbe4c18d4f /lib/src | |
| parent | ef525d8cce452c31012dbc2009b36e21bc1e1811 (diff) | |
| download | turns-ddce5043e70de5eab3d35b0986faf9a12933dedf.tar.xz turns-ddce5043e70de5eab3d35b0986faf9a12933dedf.zip | |
lib: add clear method to TurnOrder
Diffstat (limited to 'lib/src')
| -rw-r--r-- | lib/src/turns-turn-order.c | 39 | ||||
| -rw-r--r-- | lib/src/turns-turn-order.h | 8 | ||||
| -rw-r--r-- | lib/src/turnsmm/turn-order.cpp | 5 | ||||
| -rw-r--r-- | lib/src/turnsmm/turn-order.hpp | 1 |
4 files changed, 52 insertions, 1 deletions
diff --git a/lib/src/turns-turn-order.c b/lib/src/turns-turn-order.c index 071e4c5..5d6f99b 100644 --- a/lib/src/turns-turn-order.c +++ b/lib/src/turns-turn-order.c @@ -73,6 +73,27 @@ static void sort_participants(TurnsTurnOrder * self) g_list_model_items_changed(G_LIST_MODEL(self), 0, participant_count, participant_count); } +static void clear_participants(TurnsTurnOrder * self) +{ + g_return_if_fail(TURNS_IS_TURN_ORDER(self)); + + g_slist_free_full(self->participants, g_object_unref); + self->participants = nullptr; +} + +static void set_running(TurnsTurnOrder * self, gboolean value) +{ + g_return_if_fail(TURNS_IS_TURN_ORDER(self)); + + if (self->running == value) + { + return; + } + + self->running = value; + g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_RUNNING]); +} + static void handle_participant_property_changed(TurnsParticipant const *, GParamSpec *, TurnsTurnOrder * self) { sort_participants(self); @@ -120,7 +141,7 @@ static void turns_turn_order_finalize(GObject * self) { auto instance = TURNS_TURN_ORDER(self); - g_slist_free_full(instance->participants, g_object_unref); + clear_participants(instance); G_OBJECT_CLASS(turns_turn_order_parent_class)->finalize(self); } @@ -193,6 +214,22 @@ void turns_turn_order_add(TurnsTurnOrder * self, TurnsParticipant * participant) g_list_model_items_changed(G_LIST_MODEL(self), position, 0, 1); } +void turns_turn_order_clear(TurnsTurnOrder * self) +{ + g_return_if_fail(TURNS_IS_TURN_ORDER(self)); + + auto old_size = turns_turn_order_get_participant_count(self); + clear_participants(self); + + g_object_freeze_notify(G_OBJECT(self)); + + set_running(self, false); + + g_object_thaw_notify(G_OBJECT(self)); + + g_list_model_items_changed(G_LIST_MODEL(self), 0, old_size, 0); +} + gsize turns_turn_order_get_participant_count(TurnsTurnOrder const * self) { g_return_val_if_fail(TURNS_IS_TURN_ORDER((TurnsTurnOrder *)self), 0); diff --git a/lib/src/turns-turn-order.h b/lib/src/turns-turn-order.h index ce4d992..a69700f 100644 --- a/lib/src/turns-turn-order.h +++ b/lib/src/turns-turn-order.h @@ -59,6 +59,14 @@ TurnsTurnOrder * turns_turn_order_new(void) G_GNUC_WARN_UNUSED_RESULT; void turns_turn_order_add(TurnsTurnOrder * self, TurnsParticipant * participant); /** + * turns_turn_order_clear: + * @self: a turn order + * + * Removes all participants from a turn order. + */ +void turns_turn_order_clear(TurnsTurnOrder * self); + +/** * turns_turn_order_get_participant_count: * @self: a turn order. * diff --git a/lib/src/turnsmm/turn-order.cpp b/lib/src/turnsmm/turn-order.cpp index 7fefa01..35694b2 100644 --- a/lib/src/turnsmm/turn-order.cpp +++ b/lib/src/turnsmm/turn-order.cpp @@ -93,6 +93,11 @@ namespace Turns return turns_turn_order_add(unwrap(this), unwrap(participant)); } + auto TurnOrder::clear() noexcept -> void + { + return turns_turn_order_clear(Glib::unwrap(this)); + } + auto TurnOrder::get_participant_count() const noexcept -> std::size_t { return turns_turn_order_get_participant_count(unwrap(this)); diff --git a/lib/src/turnsmm/turn-order.hpp b/lib/src/turnsmm/turn-order.hpp index caaac24..64f72aa 100644 --- a/lib/src/turnsmm/turn-order.hpp +++ b/lib/src/turnsmm/turn-order.hpp @@ -50,6 +50,7 @@ namespace Turns [[nodiscard]] auto gobj_copy() noexcept -> BaseObjectType *; auto add(Glib::RefPtr<Participant> const & participant) noexcept -> void; + auto clear() noexcept -> void; [[nodiscard]] auto get_participant_count() const noexcept -> std::size_t; [[nodiscard]] auto get_running() const noexcept -> bool; |
