[Spice-devel] [PATCH spice-gtk 4/6] usb-device-widget: Use an info_bar for error messages

Hans de Goede hdegoede at redhat.com
Wed Feb 22 08:28:24 PST 2012


And in general gnome-hig-ify usb-device-widget:
* Use spacing instead of padding so that there is no padding at the
  outside/border of the widget, allowing the user to control the border size.
* Use multiple of 6 as spacing / indentation values
* Show the label left justified and bold, show the checkboxes (and the info
  bar) 12 pixels indented from the label

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 gtk/spicy.c             |    5 ++-
 gtk/usb-device-widget.c |   88 ++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 79 insertions(+), 14 deletions(-)

diff --git a/gtk/spicy.c b/gtk/spicy.c
index 40b724e..0486610 100644
--- a/gtk/spicy.c
+++ b/gtk/spicy.c
@@ -437,13 +437,16 @@ static void menu_cb_select_usb_devices(GtkAction *action, void *data)
                     GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
                     NULL);
     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
+    gtk_container_set_border_width(GTK_CONTAINER(dialog), 12);
+    gtk_box_set_spacing(GTK_BOX(gtk_bin_get_child(GTK_BIN(dialog))), 12);
+
     area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
 
     usb_device_widget = spice_usb_device_widget_new(win->conn->session,
                                                     "%s %s");
     g_signal_connect(usb_device_widget, "connect-failed",
                      G_CALLBACK(usb_connect_failed), NULL);
-    gtk_box_pack_start(GTK_BOX(area), usb_device_widget, TRUE, TRUE, 5);
+    gtk_box_pack_start(GTK_BOX(area), usb_device_widget, TRUE, TRUE, 0);
 
     /* This shrinks the dialog when USB devices are unplugged */
     g_signal_connect(usb_device_widget, "remove",
diff --git a/gtk/usb-device-widget.c b/gtk/usb-device-widget.c
index 4b504ca..1bfffc0 100644
--- a/gtk/usb-device-widget.c
+++ b/gtk/usb-device-widget.c
@@ -70,6 +70,7 @@ struct _SpiceUsbDeviceWidgetPrivate {
     SpiceSession *session;
     gchar *device_format_string;
     SpiceUsbDeviceManager *manager;
+    GtkWidget *info_bar;
 };
 
 static guint signals[LAST_SIGNAL] = { 0, };
@@ -118,6 +119,48 @@ static void spice_usb_device_widget_set_property(GObject       *gobject,
     }
 }
 
+static void spice_usb_device_widget_hide_info_bar(SpiceUsbDeviceWidget *self)
+{
+    SpiceUsbDeviceWidgetPrivate *priv = self->priv;
+
+    if (priv->info_bar) {
+        gtk_widget_destroy(priv->info_bar);
+        priv->info_bar = NULL;
+    }
+}
+
+static void
+spice_usb_device_widget_show_info_bar(SpiceUsbDeviceWidget *self,
+                                      const gchar          *message,
+                                      GtkMessageType        message_type,
+                                      const gchar          *stock_icon_id)
+{
+    SpiceUsbDeviceWidgetPrivate *priv = self->priv;
+    GtkWidget *info_bar, *content_area, *hbox, *widget;
+
+    spice_usb_device_widget_hide_info_bar(self);
+
+    info_bar = gtk_info_bar_new();
+    gtk_info_bar_set_message_type(GTK_INFO_BAR(info_bar), message_type);
+
+    content_area = gtk_info_bar_get_content_area(GTK_INFO_BAR(info_bar));
+    hbox = gtk_hbox_new(FALSE, 12);
+    gtk_container_add(GTK_CONTAINER(content_area), hbox);
+
+    widget = gtk_image_new_from_stock(stock_icon_id,
+                                      GTK_ICON_SIZE_SMALL_TOOLBAR);
+    gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
+
+    widget = gtk_label_new(message);
+    gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
+
+    priv->info_bar = gtk_alignment_new(0.0, 0.0, 1.0, 0.0);
+    gtk_alignment_set_padding(GTK_ALIGNMENT(priv->info_bar), 0, 0, 12, 0);
+    gtk_container_add(GTK_CONTAINER(priv->info_bar), info_bar);
+    gtk_box_pack_start(GTK_BOX(self), priv->info_bar, FALSE, FALSE, 0);
+    gtk_widget_show_all(priv->info_bar);
+}
+
 static GObject *spice_usb_device_widget_constructor(
     GType gtype, guint n_properties, GObjectConstructParam *properties)
 {
@@ -129,6 +172,7 @@ static GObject *spice_usb_device_widget_constructor(
     GError *err = NULL;
     GtkWidget *label;
     gboolean enabled;
+    gchar *str;
     int i;
 
     {
@@ -165,16 +209,21 @@ static GObject *spice_usb_device_widget_constructor(
             err_msg = err->message;
     }
 
+    label = gtk_label_new(NULL);
+    str = g_strdup_printf("<b>%s</b>", _("Select USB devices to redirect"));
+    gtk_label_set_markup(GTK_LABEL (label), str);
+    g_free(str);
+    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+    gtk_box_pack_start(GTK_BOX(self), label, FALSE, FALSE, 0);
+
     if (err_msg) {
-        label = gtk_label_new(err_msg);
-        gtk_box_pack_start(GTK_BOX(self), label, TRUE, TRUE, 5);
+        spice_usb_device_widget_show_info_bar(self, err_msg,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_STOCK_DIALOG_WARNING);
         g_clear_error(&err);
         return obj;
     }
 
-    label = gtk_label_new(_("Select USB devices to redirect"));
-    gtk_box_pack_start(GTK_BOX(self), label, TRUE, TRUE, 5);
-
     for (i = 0; i < devices->len; i++)
         device_added_cb(NULL, g_ptr_array_index(devices, i), self);
 
@@ -286,11 +335,22 @@ GtkWidget *spice_usb_device_widget_new(SpiceSession    *session,
     return g_object_new(SPICE_TYPE_USB_DEVICE_WIDGET,
                         "session", session,
                         "device-format-string", device_format_string,
+                        "spacing", 6,
                         NULL);
 }
 
 /* ------------------------------------------------------------------ */
 /* callbacks                                                          */
+
+static SpiceUsbDevice *get_usb_device(GtkWidget *widget)
+{
+    if (!GTK_IS_ALIGNMENT(widget))
+        return NULL;
+
+    widget = gtk_bin_get_child(GTK_BIN(widget));
+    return g_object_get_data(G_OBJECT(widget), "usb-device");
+}
+
 typedef struct _connect_cb_data {
     GtkWidget *check;
     SpiceUsbDeviceWidget *self;
@@ -359,13 +419,13 @@ static void device_added_cb(SpiceUsbDeviceManager *manager,
 {
     SpiceUsbDeviceWidget *self = SPICE_USB_DEVICE_WIDGET(user_data);
     SpiceUsbDeviceWidgetPrivate *priv = self->priv;
-    GtkWidget *check;
+    GtkWidget *align, *check;
     gchar *desc;
 
     desc = spice_usb_device_get_description(device,
                                             priv->device_format_string);
-
     check = gtk_check_button_new_with_label(desc);
+    g_free(desc);
 
     if (spice_usb_device_manager_is_device_connected(priv->manager,
                                                      device))
@@ -378,15 +438,17 @@ static void device_added_cb(SpiceUsbDeviceManager *manager,
     g_signal_connect(G_OBJECT(check), "clicked",
                      G_CALLBACK(checkbox_clicked_cb), self);
 
-    gtk_box_pack_start(GTK_BOX(self), check, TRUE, TRUE, 5);
-    gtk_widget_show(check);
-
-    g_free(desc);
+    align = gtk_alignment_new(0, 0, 0, 0);
+    gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 12, 0);
+    gtk_container_add(GTK_CONTAINER(align), check);
+    gtk_box_pack_end(GTK_BOX(self), align, FALSE, FALSE, 0);
+    spice_usb_device_widget_update_status(self);
+    gtk_widget_show_all(align);
 }
 
 static void destroy_widget_by_usb_device(GtkWidget *widget, gpointer user_data)
 {
-    if (g_object_get_data(G_OBJECT(widget), "usb-device") == user_data)
+    if (get_usb_device(widget) == user_data)
         gtk_widget_destroy(widget);
 }
 
@@ -401,7 +463,7 @@ static void device_removed_cb(SpiceUsbDeviceManager *manager,
 
 static void set_inactive_by_usb_device(GtkWidget *widget, gpointer user_data)
 {
-    if (g_object_get_data(G_OBJECT(widget), "usb-device") == user_data)
+    if (get_usb_device(widget) == user_data)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
 }
 
-- 
1.7.7.6



More information about the Spice-devel mailing list