event: Allow to end events by level
The level here is an abstract value but in fact matches the profile level. Well make this a property when fixing #35.
This commit is contained in:
committed by
Guido Günther
parent
0a16ebe4af
commit
3c02259156
@@ -430,6 +430,52 @@ fbd_event_end_feedbacks (FbdEvent *self)
|
||||
g_slist_foreach (self->feedbacks, (GFunc)fbd_feedback_end, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* fbd_event_end_feedbacks_by_level:
|
||||
* @self: The Event
|
||||
* @level: The profile level
|
||||
*
|
||||
* End all feedback strictly above the given profile level.
|
||||
*/
|
||||
void
|
||||
fbd_event_end_feedbacks_by_level (FbdEvent *self, guint level)
|
||||
{
|
||||
g_autoptr (GSList) feedbacks = NULL;
|
||||
guint num = 0;
|
||||
|
||||
g_return_if_fail (FBD_IS_EVENT (self));
|
||||
/* Copy the list as we will remove feedbacks from self->feedbacks */
|
||||
feedbacks = g_slist_copy (fbd_event_get_feedbacks (self));
|
||||
|
||||
for (GSList *l = feedbacks; l; l = l->next) {
|
||||
FbdFeedbackBase *fb = FBD_FEEDBACK_BASE (l->data);
|
||||
guint event_level;
|
||||
|
||||
event_level = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fb), "fbd-level"));
|
||||
if (event_level > level)
|
||||
num++;
|
||||
}
|
||||
|
||||
if (num == 0)
|
||||
return;
|
||||
|
||||
g_debug ("Will end %d feedbacks of event %s", num, fbd_event_get_event (self));
|
||||
/* Set 'explicit' if we end all remaining feedbacks */
|
||||
if (num == g_slist_length (self->feedbacks))
|
||||
fbd_event_set_end_reason (self, FBD_EVENT_END_REASON_EXPLICIT);
|
||||
|
||||
for (GSList *l = feedbacks; l; l = l->next) {
|
||||
FbdFeedbackBase *fb = FBD_FEEDBACK_BASE (l->data);
|
||||
guint event_level;
|
||||
|
||||
event_level = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (fb), "fbd-level"));
|
||||
if (event_level > level) {
|
||||
fbd_event_remove_feedback (self, fb);
|
||||
fbd_feedback_end (fb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* fbd_event_get_feedbacks_ended:
|
||||
* @self: The Event
|
||||
|
||||
Reference in New Issue
Block a user