[gnome-color-manager] Add the ability to delete saved devices



commit 4d962592cb441175eac05cf5c42a32d6b4df338e
Author: Richard Hughes <richard hughsie com>
Date:   Tue Nov 24 11:21:17 2009 +0000

    Add the ability to delete saved devices

 data/gcm-prefs.ui |   18 +++++++++++-
 src/gcm-client.c  |   74 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/gcm-client.h  |    3 ++
 src/gcm-prefs.c   |   58 +++++++++++++++++++++++++++++++++++++----
 4 files changed, 145 insertions(+), 8 deletions(-)
---
diff --git a/data/gcm-prefs.ui b/data/gcm-prefs.ui
index ff7593e..2a7d4dd 100644
--- a/data/gcm-prefs.ui
+++ b/data/gcm-prefs.ui
@@ -363,6 +363,20 @@
                         <property name="visible">True</property>
                         <property name="spacing">6</property>
                         <child>
+                          <object class="GtkButton" id="button_delete">
+                            <property name="label" translatable="yes">_Delete</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
                           <object class="GtkButton" id="button_calibrate">
                             <property name="label" translatable="yes">_Calibrate</property>
                             <property name="visible">True</property>
@@ -372,7 +386,7 @@
                           </object>
                           <packing>
                             <property name="expand">False</property>
-                            <property name="position">0</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
                         <child>
@@ -386,7 +400,7 @@
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
-                            <property name="position">1</property>
+                            <property name="position">2</property>
                           </packing>
                         </child>
                       </object>
diff --git a/src/gcm-client.c b/src/gcm-client.c
index c725d2d..fc9fa36 100644
--- a/src/gcm-client.c
+++ b/src/gcm-client.c
@@ -723,6 +723,80 @@ out:
 }
 
 /**
+ * gcm_client_delete_device:
+ **/
+gboolean
+gcm_client_delete_device (GcmClient *client, GcmDevice *device, GError **error)
+{
+	gboolean ret = FALSE;
+	gchar *id = NULL;
+	gchar *data = NULL;
+	gchar *filename = NULL;
+	GKeyFile *keyfile = NULL;
+	gboolean connected;
+
+	g_return_val_if_fail (GCM_IS_CLIENT (client), FALSE);
+	g_return_val_if_fail (GCM_IS_DEVICE (device), FALSE);
+
+	/* check removable */
+	g_object_get (device,
+		      "connected", &connected,
+		      "id", &id,
+		      NULL);
+	if (connected) {
+		if (error != NULL)
+			*error = g_error_new (1, 0, "device is still connected");
+		goto out;
+	}
+
+	/* try to remove from array */
+	ret = g_ptr_array_remove (client->priv->array, device);
+	if (!ret) {
+		if (error != NULL)
+			*error = g_error_new (1, 0, "not found in device array");
+		goto out;
+	}
+
+	/* get the config file */
+	filename = gcm_utils_get_default_config_location ();
+	egg_debug ("removing %s from %s", id, filename);
+
+	/* load the config file */
+	keyfile = g_key_file_new ();
+	ret = g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, error);
+	if (!ret)
+		goto out;
+
+	/* remove from the config file */
+	g_key_file_remove_group (keyfile, id, error);
+	if (!ret)
+		goto out;
+
+	/* convert to string */
+	data = g_key_file_to_data (keyfile, NULL, error);
+	if (data == NULL) {
+		ret = FALSE;
+		goto out;
+	}
+
+	/* save contents */
+	ret = g_file_set_contents (filename, data, -1, error);
+	if (!ret)
+		goto out;
+
+	/* emit a signal */
+	egg_debug ("emit removed: %s", id);
+	g_signal_emit (client, signals[SIGNAL_REMOVED], 0, device);
+out:
+	g_free (id);
+	g_free (data);
+	g_free (filename);
+	if (keyfile != NULL)
+		g_key_file_free (keyfile);
+	return ret;
+}
+
+/**
  * gcm_client_get_property:
  **/
 static void
diff --git a/src/gcm-client.h b/src/gcm-client.h
index 7dc181b..4e28c23 100644
--- a/src/gcm-client.h
+++ b/src/gcm-client.h
@@ -63,6 +63,9 @@ GcmClient	*gcm_client_new					(void);
 
 GcmDevice	*gcm_client_get_device_by_id			(GcmClient		*client,
 								 const gchar		*id);
+gboolean	 gcm_client_delete_device			(GcmClient		*client,
+								 GcmDevice		*device,
+								 GError			**error);
 gboolean	 gcm_client_add_connected			(GcmClient		*client,
 								 GError			**error);
 gboolean	 gcm_client_add_saved				(GcmClient		*client,
diff --git a/src/gcm-prefs.c b/src/gcm-prefs.c
index eadb511..91e7058 100644
--- a/src/gcm-prefs.c
+++ b/src/gcm-prefs.c
@@ -529,6 +529,23 @@ out:
 }
 
 /**
+ * gcm_prefs_delete_cb:
+ **/
+static void
+gcm_prefs_delete_cb (GtkWidget *widget, gpointer data)
+{
+	gboolean ret;
+	GError *error = NULL;
+
+	/* try to delete device */
+	ret = gcm_client_delete_device (gcm_client, current_device, &error);
+	if (!ret) {
+		egg_warning ("failed to delete: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+/**
  * gcm_prefs_reset_cb:
  **/
 static void
@@ -776,6 +793,7 @@ gcm_prefs_devices_treeview_clicked_cb (GtkTreeSelection *selection, gboolean dat
 	gfloat localgamma;
 	gfloat brightness;
 	gfloat contrast;
+	gboolean connected;
 	gchar *filename;
 	guint i;
 	gchar *id;
@@ -825,6 +843,7 @@ gcm_prefs_devices_treeview_clicked_cb (GtkTreeSelection *selection, gboolean dat
 		      "gamma", &localgamma,
 		      "brightness", &brightness,
 		      "contrast", &contrast,
+		      "connected", &connected,
 		      NULL);
 
 	/* set adjustments */
@@ -872,6 +891,10 @@ gcm_prefs_devices_treeview_clicked_cb (GtkTreeSelection *selection, gboolean dat
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "label_profile"));
 	gtk_widget_set_sensitive (widget, TRUE);
 
+	/* can we delete this device? */
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_delete"));
+	gtk_widget_set_sensitive (widget, !connected);
+
 	/* can this device calibrate */
 	gcm_prefs_set_calibrate_button_sensitivity ();
 
@@ -1046,14 +1069,12 @@ gcm_prefs_profile_combo_changed_cb (GtkWidget *widget, gpointer data)
 	GcmProfileType profile_type = GCM_PROFILE_TYPE_UNKNOWN;
 	const gchar *profile_type_text;
 
-	active = gtk_combo_box_get_active (GTK_COMBO_BOX(widget));
-	egg_debug ("now %i", active);
-
 	/* no devices */
 	if (current_device == NULL)
 		return;
 
 	/* no selection */
+	active = gtk_combo_box_get_active (GTK_COMBO_BOX(widget));
 	if (active == -1)
 		return;
 
@@ -1403,10 +1424,34 @@ gcm_prefs_added_cb (GcmClient *gcm_client_, GcmDevice *gcm_device, gpointer user
 static void
 gcm_prefs_removed_cb (GcmClient *gcm_client_, GcmDevice *gcm_device, gpointer user_data)
 {
+	gboolean connected;
+	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	GtkWidget *widget;
+	gboolean ret;
+
+	/* remove from the UI */
 	gcm_prefs_remove_device (gcm_device);
 
+	/* get device properties */
+	g_object_get (gcm_device,
+		      "connected", &connected,
+		      NULL);
+
 	/* ensure this device is re-added if it's been saved */
-	gcm_client_add_saved (gcm_client, NULL);
+	if (connected)
+		gcm_client_add_saved (gcm_client, NULL);
+
+	/* select the first device */
+	ret = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store_devices), &iter);
+	if (!ret)
+		return;
+
+	/* click it */
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "treeview_devices"));
+	gtk_tree_view_set_model (GTK_TREE_VIEW (widget), GTK_TREE_MODEL (list_store_devices));
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+	gtk_tree_selection_select_iter (selection, &iter);
 }
 
 /**
@@ -1419,8 +1464,6 @@ gcm_prefs_startup_idle_cb (gpointer user_data)
 	gboolean ret;
 	GError *error = NULL;
 
-	egg_warning ("idle add");
-
 	/* add profiles we can find */
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "combobox_profile"));
 	gcm_prefs_add_profiles (widget);
@@ -1611,6 +1654,9 @@ main (int argc, char **argv)
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_reset"));
 	g_signal_connect (widget, "clicked",
 			  G_CALLBACK (gcm_prefs_reset_cb), NULL);
+	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_delete"));
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gcm_prefs_delete_cb), NULL);
 	gtk_widget_set_sensitive (widget, FALSE);
 	widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_calibrate"));
 	g_signal_connect (widget, "clicked",



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]