changeset 58:9cbb0f8a66c4

Add setting to disable preferences widgets This just makes the widgets in the preferences application insensitive, settings can still be changed by directly editing the configuration file.
author Guido Berhoerster <guido+pui@berhoerster.name>
date Tue, 06 Sep 2022 19:11:21 +0200
parents 76989c84bd20
children e3fc9db49d36
files org.guido-berhoerster.code.package-update-indicator.gschema.xml pui-prefs-application.c
diffstat 2 files changed, 61 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/org.guido-berhoerster.code.package-update-indicator.gschema.xml	Tue Sep 06 09:02:57 2022 +0200
+++ b/org.guido-berhoerster.code.package-update-indicator.gschema.xml	Tue Sep 06 19:11:21 2022 +0200
@@ -30,5 +30,10 @@
       <summary>Hide menu items</summary>
       <description>List of indicator menu items to be hidden.</description>
     </key>
+    <key name="disable-preferences" type="as">
+      <default>[]</default>
+      <summary>Disable preferences</summary>
+      <description>List of preference widgets to be disabled.</description>
+    </key>
   </schema>
 </schemalist>
--- a/pui-prefs-application.c	Tue Sep 06 09:02:57 2022 +0200
+++ b/pui-prefs-application.c	Tue Sep 06 19:11:21 2022 +0200
@@ -32,6 +32,9 @@
 struct _PuiPrefsApplication {
 	GtkApplication	parent_instance;
 	GSettings	*settings;
+	GtkWidget	*update_command_entry;
+	GtkWidget	*refresh_interval_combo_box;
+	GtkWidget	*use_mobile_check_button;
 };
 
 G_DEFINE_TYPE(PuiPrefsApplication, pui_prefs_application, GTK_TYPE_APPLICATION)
@@ -117,6 +120,38 @@
 }
 
 static void
+update_widgets(PuiPrefsApplication *self)
+{
+	gchar **	disabled_preferences;
+
+	g_return_if_fail(self->update_command_entry != NULL);
+	g_return_if_fail(self->refresh_interval_combo_box != NULL);
+	g_return_if_fail(self->use_mobile_check_button != NULL);
+
+	disabled_preferences = g_settings_get_strv(self->settings,
+	    "disable-preferences");
+	g_return_if_fail(disabled_preferences != NULL);
+	gtk_widget_set_sensitive(self->update_command_entry,
+	    !g_strv_contains((const gchar * const *)disabled_preferences,
+	    "update-command"));
+	gtk_widget_set_sensitive(self->refresh_interval_combo_box,
+	    !g_strv_contains((const gchar * const *)disabled_preferences,
+	    "refresh-interval"));
+	gtk_widget_set_sensitive(self->use_mobile_check_button,
+	    !g_strv_contains((const gchar * const *)disabled_preferences,
+	    "use-mobile-connection"));
+	g_strfreev(disabled_preferences);
+}
+
+static void
+on_disable_preferences_changed(GSettings *settings, gchar *key,
+    gpointer user_data)
+{
+	g_debug("setting disable-preferences changed");
+	update_widgets(user_data);
+}
+
+static void
 pui_prefs_application_startup(GApplication *application)
 {
 	PuiPrefsApplication *self = PUI_PREFS_APPLICATION(application);
@@ -125,9 +160,6 @@
 	GtkBuilder	*builder;
 	GtkWidget	*window;
 	GtkTreeModel	*tree_model;
-	GtkWidget	*update_command_entry;
-	GtkWidget	*refresh_interval_combo_box;
-	GtkWidget	*use_mobile_check_button;
 
 	application_class->startup(application);
 
@@ -141,25 +173,31 @@
 	    "package-update-indicator/preferences/pui-prefs-window.ui");
 	window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
 	gtk_application_add_window(GTK_APPLICATION(self), GTK_WINDOW(window));
-	update_command_entry = GTK_WIDGET(gtk_builder_get_object(builder,
+	self->update_command_entry = GTK_WIDGET(gtk_builder_get_object(builder,
 	    "update-command"));
-	refresh_interval_combo_box = GTK_WIDGET(gtk_builder_get_object(builder,
-	    "refresh-interval"));
-	tree_model =
-	    gtk_combo_box_get_model(GTK_COMBO_BOX(refresh_interval_combo_box));
-	use_mobile_check_button = GTK_WIDGET(gtk_builder_get_object(builder,
+	self->refresh_interval_combo_box =
+	    GTK_WIDGET(gtk_builder_get_object(builder, "refresh-interval"));
+	tree_model = gtk_combo_box_get_model(
+	    GTK_COMBO_BOX(self->refresh_interval_combo_box));
+	self->use_mobile_check_button =
+	    GTK_WIDGET(gtk_builder_get_object(builder,
 	    "use-mobile-connection"));
 
 	/* bind settings to widgets */
 	self->settings = pui_settings_new();
 	g_settings_bind(self->settings, "update-command",
-	    update_command_entry, "text", G_SETTINGS_BIND_DEFAULT);
+	    self->update_command_entry, "text", G_SETTINGS_BIND_DEFAULT);
 	g_settings_bind_with_mapping(self->settings, "refresh-interval",
-	    refresh_interval_combo_box, "active", G_SETTINGS_BIND_DEFAULT,
-	    map_refresh_interval_to_index, map_index_to_refresh_interval,
-	    tree_model, NULL);
+	    self->refresh_interval_combo_box, "active",
+	    G_SETTINGS_BIND_DEFAULT, map_refresh_interval_to_index,
+	    map_index_to_refresh_interval, tree_model, NULL);
 	g_settings_bind(self->settings, "use-mobile-connection",
-	    use_mobile_check_button, "active", G_SETTINGS_BIND_DEFAULT);
+	    self->use_mobile_check_button, "active", G_SETTINGS_BIND_DEFAULT);
+
+	/* watch disable-preferences setting in order to update the window */
+	g_signal_connect(self->settings, "changed::disable-preferences",
+	    G_CALLBACK(on_disable_preferences_changed), self);
+	update_widgets(self);
 
 	/* show window */
 	gtk_widget_show(window);
@@ -189,6 +227,10 @@
 		g_clear_object(&self->settings);
 	}
 
+	self->update_command_entry = NULL;
+	self->refresh_interval_combo_box = NULL;
+	self->use_mobile_check_button = NULL;
+
 	G_OBJECT_CLASS(pui_prefs_application_parent_class)->dispose(object);
 }