Merge branch 'ui-load-saved-app-filter' into 'master'

Fix partial loss of parental controls settings when partially updating them

See merge request pwithnall/malcontent!101
This commit is contained in:
Philip Withnall 2020-11-02 13:31:08 +00:00
commit a045e9fc51
2 changed files with 56 additions and 12 deletions

View File

@ -290,6 +290,21 @@ on_switch_active_changed_cb (GtkSwitch *s,
g_signal_emit (self, signals[SIGNAL_CHANGED], 0); g_signal_emit (self, signals[SIGNAL_CHANGED], 0);
} }
static void
update_listbox_row_switch (MctRestrictApplicationsSelector *self,
GtkSwitch *w)
{
GAppInfo *app = g_object_get_data (G_OBJECT (w), "GAppInfo");
gboolean allowed = mct_app_filter_is_appinfo_allowed (self->app_filter, app);
gtk_switch_set_active (w, !allowed);
if (allowed)
g_hash_table_remove (self->blocklisted_apps, app);
else
g_hash_table_add (self->blocklisted_apps, g_object_ref (app));
}
static GtkWidget * static GtkWidget *
create_row_for_app_cb (gpointer item, create_row_for_app_cb (gpointer item,
gpointer user_data) gpointer user_data)
@ -298,7 +313,6 @@ create_row_for_app_cb (gpointer item,
GAppInfo *app = G_APP_INFO (item); GAppInfo *app = G_APP_INFO (item);
g_autoptr(GIcon) icon = NULL; g_autoptr(GIcon) icon = NULL;
GtkWidget *box, *w; GtkWidget *box, *w;
gboolean allowed;
const gchar *app_name; const gchar *app_name;
gint size; gint size;
GtkStyleContext *context; GtkStyleContext *context;
@ -345,16 +359,8 @@ create_row_for_app_cb (gpointer item,
gtk_widget_show_all (box); gtk_widget_show_all (box);
/* Fetch status from AccountService */ /* Fetch status from AccountService */
allowed = mct_app_filter_is_appinfo_allowed (self->app_filter, app);
gtk_switch_set_active (GTK_SWITCH (w), !allowed);
g_object_set_data_full (G_OBJECT (w), "GAppInfo", g_object_ref (app), g_object_unref); g_object_set_data_full (G_OBJECT (w), "GAppInfo", g_object_ref (app), g_object_unref);
update_listbox_row_switch (self, GTK_SWITCH (w));
if (allowed)
g_hash_table_remove (self->blocklisted_apps, app);
else
g_hash_table_add (self->blocklisted_apps, g_object_ref (app));
g_signal_connect (w, "notify::active", G_CALLBACK (on_switch_active_changed_cb), self); g_signal_connect (w, "notify::active", G_CALLBACK (on_switch_active_changed_cb), self);
return box; return box;
@ -751,6 +757,7 @@ mct_restrict_applications_selector_set_app_filter (MctRestrictApplicationsSelect
MctAppFilter *app_filter) MctAppFilter *app_filter)
{ {
g_autoptr(MctAppFilter) owned_app_filter = NULL; g_autoptr(MctAppFilter) owned_app_filter = NULL;
guint n_apps;
g_return_if_fail (MCT_IS_RESTRICT_APPLICATIONS_SELECTOR (self)); g_return_if_fail (MCT_IS_RESTRICT_APPLICATIONS_SELECTOR (self));
@ -768,6 +775,30 @@ mct_restrict_applications_selector_set_app_filter (MctRestrictApplicationsSelect
g_clear_pointer (&self->app_filter, mct_app_filter_unref); g_clear_pointer (&self->app_filter, mct_app_filter_unref);
self->app_filter = mct_app_filter_ref (app_filter); self->app_filter = mct_app_filter_ref (app_filter);
reload_apps (self); /* Update the status of each app row. */
n_apps = g_list_model_get_n_items (G_LIST_MODEL (self->apps));
for (guint i = 0; i < n_apps; i++)
{
GtkListBoxRow *row;
GtkWidget *box, *w;
g_autoptr(GList) children = NULL; /* (element-type GtkWidget) */
/* Navigate the widget hierarchy set up in create_row_for_app_cb(). */
row = gtk_list_box_get_row_at_index (self->listbox, i);
g_assert (row != NULL && GTK_IS_LIST_BOX_ROW (row));
box = gtk_bin_get_child (GTK_BIN (row));
g_assert (box != NULL && GTK_IS_BOX (box));
children = gtk_container_get_children (GTK_CONTAINER (box));
g_assert (children != NULL);
w = g_list_nth_data (children, 2);
g_assert (w != NULL && GTK_IS_SWITCH (w));
update_listbox_row_switch (self, GTK_SWITCH (w));
}
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_APP_FILTER]); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_APP_FILTER]);
} }

View File

@ -313,6 +313,12 @@ update_app_filter_from_user (MctUserControls *self)
g_debug ("Retrieved new app filter for user '%s'", act_user_get_user_name (self->user)); g_debug ("Retrieved new app filter for user '%s'", act_user_get_user_name (self->user));
} }
static void
update_restricted_apps (MctUserControls *self)
{
mct_restrict_applications_dialog_set_app_filter (self->restrict_applications_dialog, self->filter);
}
static void static void
update_categories_from_language (MctUserControls *self) update_categories_from_language (MctUserControls *self)
{ {
@ -385,7 +391,7 @@ update_oars_level (MctUserControls *self)
{ {
GsContentRatingSystem rating_system; GsContentRatingSystem rating_system;
g_autofree gchar *rating_age_category = NULL; g_autofree gchar *rating_age_category = NULL;
guint maximum_age; guint maximum_age, selected_age;
gsize i; gsize i;
gboolean all_categories_unset; gboolean all_categories_unset;
#if AS_CHECK_VERSION(0, 7, 15) #if AS_CHECK_VERSION(0, 7, 15)
@ -423,9 +429,15 @@ update_oars_level (MctUserControls *self)
{ {
g_clear_pointer (&rating_age_category, g_free); g_clear_pointer (&rating_age_category, g_free);
rating_age_category = g_strdup (_("All Ages")); rating_age_category = g_strdup (_("All Ages"));
selected_age = oars_disabled_age;
}
else
{
selected_age = maximum_age;
} }
gtk_label_set_label (self->oars_button_label, rating_age_category); gtk_label_set_label (self->oars_button_label, rating_age_category);
self->selected_age = selected_age;
} }
static void static void
@ -550,6 +562,7 @@ setup_parental_control_settings (MctUserControls *self)
gtk_widget_set_sensitive (GTK_WIDGET (self), is_authorized); gtk_widget_set_sensitive (GTK_WIDGET (self), is_authorized);
update_restricted_apps (self);
update_categories_from_language (self); update_categories_from_language (self);
update_oars_level (self); update_oars_level (self);
update_allow_app_installation (self); update_allow_app_installation (self);