diff --git a/plugins/upcoming-events/event-list.ui b/plugins/upcoming-events/event-list.ui
index b65d04377d96996a88e394d7c5594d9d5f7ee660..744ec1a1a2ab2102735f73b47fb5b31662b53ed9 100644
--- a/plugins/upcoming-events/event-list.ui
+++ b/plugins/upcoming-events/event-list.ui
@@ -38,6 +38,9 @@
events
diff --git a/plugins/upcoming-events/stylesheet/common.css b/plugins/upcoming-events/stylesheet/common.css
index 123fe6b4b7cb71164d14c1fd2a3f9fb3c1accad4..5e0553e05d52c7bea4b5ebd77eaefa636537335a 100644
--- a/plugins/upcoming-events/stylesheet/common.css
+++ b/plugins/upcoming-events/stylesheet/common.css
@@ -5,19 +5,27 @@ phosh-upcoming-events {
}
phosh-upcoming-events list {
+ background: none;
+}
+
+phosh-upcoming-events list row {
+ background: none;
+}
+
+phosh-upcoming-events .event-list-listbox {
background-color: transparent;
}
-phosh-upcoming-events row {
+phosh-upcoming-events .event-list-listbox row {
border-radius: 6px;
background: shade(@phosh_notification_bg_color, 1.3);
}
-phosh-upcoming-events row:hover {
+phosh-upcoming-events .event-list-listbox row:hover {
background: shade(@phosh_notification_bg_color, 1.5);
}
-phosh-upcoming-events row:active {
+phosh-upcoming-events .event-list-listbox row:active {
background: shade(@phosh_notification_bg_color, 1.8);
}
diff --git a/plugins/upcoming-events/upcoming-events.c b/plugins/upcoming-events/upcoming-events.c
index 05a681858a35307b4e147416dbca2529f0ee0b30..959e838f1c55ea09978e0ae34bd88a6ebf5d65f0 100644
--- a/plugins/upcoming-events/upcoming-events.c
+++ b/plugins/upcoming-events/upcoming-events.c
@@ -11,6 +11,7 @@
#include "event-list.h"
#include "calendar-event.h"
#include "upcoming-events.h"
+#include "gtkfilterlistmodel.h"
#include "phosh-plugin-upcoming-events-phosh-calendar-dbus.h"
@@ -37,8 +38,9 @@ struct _PhoshUpcomingEvents {
GCancellable *cancel;
GtkStack *stack;
- GtkBox *events_box;
- GPtrArray *event_lists;
+ GtkListBox *events_box;
+ GListModel *event_lists;
+ GtkFilterListModel *event_lists_filtered;
GListStore *events;
GHashTable *event_ids;
GDateTime *since;
@@ -59,7 +61,7 @@ phosh_upcoming_events_finalize (GObject *object)
{
PhoshUpcomingEvents *self = PHOSH_UPCOMING_EVENTS (object);
- g_ptr_array_free (self->event_lists, TRUE);
+ g_clear_object (&self->event_lists_filtered);
g_clear_handle_id (&self->today_changed_timeout_id, g_source_remove);
g_cancellable_cancel (self->cancel);
g_clear_object (&self->cancel);
@@ -158,23 +160,16 @@ calendar_event_begin_compare (gconstpointer a,
static void
-update_event_lists_visibility (PhoshUpcomingEvents *self)
+refilter_event_lists (PhoshUpcomingEvents *self)
{
- int visible_lists = 0;
+ const char *child_name = "no-events";
- for (uint i = 0; i < self->event_lists->len; i++) {
- PhoshEventList *event_list = PHOSH_EVENT_LIST (self->event_lists->pdata[i]);
- uint events = phosh_event_list_get_n_events (event_list);
- gboolean visibility = !self->skip_empty || events != 0;
+ gtk_filter_list_model_refilter (self->event_lists_filtered);
- gtk_widget_set_visible (GTK_WIDGET (event_list), visibility);
- visible_lists += visibility;
- }
+ if (!self->skip_empty || g_list_model_get_n_items (G_LIST_MODEL (self->event_lists_filtered)))
+ child_name = "events-window";
- if (!self->skip_empty || visible_lists)
- gtk_stack_set_visible_child_name (self->stack, "events-window");
- else
- gtk_stack_set_visible_child_name (self->stack, "no-events");
+ gtk_stack_set_visible_child_name (self->stack, child_name);
}
@@ -222,14 +217,17 @@ on_events_added_or_updated (PhoshUpcomingEvents *self, GVariant *events)
NULL);
}
- update_event_lists_visibility (self);
+ refilter_event_lists (self);
if (changed == FALSE)
return;
/* Changed events might be tz change so refilter days */
- for (int i = 0; i < self->event_lists->len; i++)
- phosh_event_list_set_today (g_ptr_array_index (self->event_lists, i), self->since);
+ for (int i = 0; i < g_list_model_get_n_items (self->event_lists); i++) {
+ g_autoptr (PhoshEventList) el = g_list_model_get_item (self->event_lists, i);
+
+ phosh_event_list_set_today (el, self->since);
+ }
}
#undef EVENT_FORMAT
@@ -258,6 +256,8 @@ on_events_removed (PhoshUpcomingEvents *self, GStrv ids)
g_hash_table_remove (self->event_ids, id);
}
+ refilter_event_lists (self);
+
g_debug ("Removed %d events of %d", removed, g_strv_length (ids));
}
@@ -273,8 +273,11 @@ update_calendar (PhoshUpcomingEvents *self, gboolean force_reload)
load_events (self, force_reload);
- for (int i = 0; i < self->event_lists->len; i++)
- phosh_event_list_set_today (g_ptr_array_index (self->event_lists, i), self->since);
+ for (int i = 0; i < g_list_model_get_n_items (self->event_lists); i++) {
+ g_autoptr (PhoshEventList) el = g_list_model_get_item (self->event_lists, i);
+
+ phosh_event_list_set_today (el, self->since);
+ }
/* Rearm timer */
setup_date_change_timeout (self);
@@ -357,7 +360,40 @@ on_skip_empty_changed (PhoshUpcomingEvents *self)
gtk_button_set_image (GTK_BUTTON (self->skip_empty_btn),
gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON));
- update_event_lists_visibility (self);
+ refilter_event_lists (self);
+}
+
+
+static gboolean
+filter_event_lists_func (gpointer item, gpointer user_data)
+{
+ PhoshUpcomingEvents *self = PHOSH_UPCOMING_EVENTS (user_data);
+ PhoshEventList *event_list = PHOSH_EVENT_LIST (item);
+
+ if (!self->skip_empty)
+ return TRUE;
+
+ return phosh_event_list_get_n_events (event_list) > 0;
+}
+
+
+static GtkWidget *
+create_event_list_func (gpointer item, gpointer user_data)
+{
+ PhoshUpcomingEvents *self = PHOSH_UPCOMING_EVENTS (user_data);
+ PhoshEventList *el;
+ int day_offset;
+
+ g_object_get (G_OBJECT (item), "day-offset", &day_offset, NULL);
+
+ el = g_object_new (PHOSH_TYPE_EVENT_LIST,
+ "day-offset", day_offset,
+ "today", self->since,
+ "model", self->events,
+ "visible", TRUE,
+ NULL);
+
+ return GTK_WIDGET (el);
}
@@ -375,11 +411,7 @@ on_num_days_changed (PhoshUpcomingEvents *self)
g_debug ("Number of days changed to %u; reconfiguring event lists", self->num_days);
- for (int i = 0; i < self->event_lists->len; i++) {
- GtkWidget *child = g_ptr_array_index (self->event_lists, i);
- gtk_container_remove (GTK_CONTAINER (self->events_box), child);
- }
- g_ptr_array_remove_range (self->event_lists, 0, self->event_lists->len);
+ g_list_store_remove_all (G_LIST_STORE (self->event_lists));
for (int i = 0; i < self->num_days; i++) {
GtkWidget *event_list = g_object_new (PHOSH_TYPE_EVENT_LIST,
@@ -388,10 +420,16 @@ on_num_days_changed (PhoshUpcomingEvents *self)
"model", self->events,
"visible", TRUE,
NULL);
- gtk_container_add (GTK_CONTAINER (self->events_box), event_list);
- g_ptr_array_add (self->event_lists, event_list);
+
+ g_list_store_append (G_LIST_STORE (self->event_lists), event_list);
}
+ gtk_list_box_bind_model (self->events_box,
+ G_LIST_MODEL (self->event_lists_filtered),
+ create_event_list_func,
+ self,
+ NULL);
+
load_events (self, FALSE);
}
@@ -449,7 +487,11 @@ phosh_upcoming_events_init (PhoshUpcomingEvents *self)
self,
G_CONNECT_SWAPPED);
- self->event_lists = g_ptr_array_new ();
+ self->event_lists = G_LIST_MODEL (g_list_store_new (PHOSH_TYPE_EVENT_LIST));
+ self->event_lists_filtered = gtk_filter_list_model_new (self->event_lists,
+ filter_event_lists_func,
+ self,
+ NULL);
self->events = g_list_store_new (PHOSH_TYPE_CALENDAR_EVENT);
self->event_ids = g_hash_table_new_full (g_str_hash,
diff --git a/plugins/upcoming-events/upcoming-events.ui b/plugins/upcoming-events/upcoming-events.ui
index 78aa3e2cc26f1a7961c171a9519bdeafdffa4827..33c64ad3778dae591ba6df2a99103ae2d6eed8d1 100644
--- a/plugins/upcoming-events/upcoming-events.ui
+++ b/plugins/upcoming-events/upcoming-events.ui
@@ -40,9 +40,9 @@
never
1
-