[network-manager-netbook] Inherit list items from GtkEventBox so that they'd have a GdkWindow.



commit 6ee823f1c47a69dde562305f73604f5121539cd8
Author: Tambet Ingo <tambet gmail com>
Date:   Tue Jun 2 16:56:45 2009 +0300

    Inherit list items from GtkEventBox so that they'd have a GdkWindow.
    Fix a bunch of drawing hacks.
    Add priority to items and a signal to notify it's changes so that the list
    can order the items correctly.
---
 src/nmn-item.c      |   58 +++++++++++++++++++++++++++++++++++++++++++++-----
 src/nmn-item.h      |   10 +++++++-
 src/nmn-list.c      |   10 ++++----
 src/nmn-list.h      |    3 +-
 src/nmn-networks.c  |   12 ++--------
 src/nmn-wifi-list.c |    9 +------
 6 files changed, 72 insertions(+), 30 deletions(-)

diff --git a/src/nmn-item.c b/src/nmn-item.c
index 52306fe..1f8224f 100644
--- a/src/nmn-item.c
+++ b/src/nmn-item.c
@@ -3,13 +3,14 @@
 #include "nmn-item.h"
 #include "nmn-icon-cache.h"
 
-G_DEFINE_TYPE (NmnItem, nmn_item, GTK_TYPE_HBOX)
+G_DEFINE_TYPE (NmnItem, nmn_item, GTK_TYPE_EVENT_BOX)
 
 enum {
     CONNECT_REQUESTED,
     DISCONNECT_REQUESTED,
     REMOVE_REQUESTED,
     DELETE,
+    PRIORITY_CHANGED,
     LAST_SIGNAL
 };
 
@@ -18,6 +19,8 @@ static guint signals[LAST_SIGNAL];
 #define NMN_ITEM_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NMN_TYPE_ITEM, NmnItemPrivate))
 
 typedef struct {
+    GtkBox *box;
+
     GtkWidget *icon;
     GtkLabel *name;
     GtkWidget *status_separator;
@@ -27,6 +30,7 @@ typedef struct {
     GtkButton *connect;
     GtkWidget *remove;
     NmnItemStatus status;
+    guint priority;
 } NmnItemPrivate;
 
 GtkWidget *
@@ -96,6 +100,8 @@ nmn_item_set_status (NmnItem *item,
             gtk_button_set_label (priv->connect, "Disconnect");
             break;
         }
+
+        nmn_item_set_status_visible (item, TRUE);
     }
 }
 
@@ -158,12 +164,13 @@ nmn_item_set_delete_visible (NmnItem *item,
         gtk_container_add (GTK_CONTAINER (priv->remove),
                            gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON));
 
-        gtk_box_pack_end (GTK_BOX (item), priv->remove, FALSE, FALSE, 0);
+        gtk_box_pack_end (priv->box, priv->remove, FALSE, FALSE, 0);
+        gtk_widget_show_all (priv->remove);
         g_signal_connect_swapped (priv->remove, "clicked",
                                   G_CALLBACK (nmn_item_delete),
                                   item);
     } else if (!visible && priv->remove) {
-        gtk_container_remove (GTK_CONTAINER (item), priv->remove);
+        gtk_container_remove (GTK_CONTAINER (priv->box), priv->remove);
         priv->remove = NULL;
     }
 }
@@ -194,6 +201,29 @@ nmn_item_remove_request (NmnItem *self)
     g_signal_emit (self, signals[REMOVE_REQUESTED], 0);
 }
 
+guint
+nmn_item_get_priority (NmnItem *self)
+{
+    g_return_val_if_fail (NMN_IS_ITEM (self), G_MAXUINT);
+
+    return NMN_ITEM_GET_PRIVATE (self)->priority;
+}
+
+void
+nmn_item_set_priority (NmnItem *self,
+                       guint priority)
+{
+    NmnItemPrivate *priv;
+
+    g_return_if_fail (NMN_IS_ITEM (self));
+
+    priv = NMN_ITEM_GET_PRIVATE (self);
+    if (priv->priority != priority) {
+        priv->priority = priority;
+        g_signal_emit (self, signals[PRIORITY_CHANGED], 0, priority);
+    }
+}
+
 static void
 nmn_item_connect (NmnItem *item)
 {
@@ -226,11 +256,14 @@ nmn_item_init (NmnItem *item)
     GtkWidget *hbox;
     GtkWidget *w;
 
+    priv->box = GTK_BOX (gtk_hbox_new (FALSE, 6));
+    gtk_container_set_border_width (GTK_CONTAINER (priv->box), 6);
+
     priv->icon = gtk_image_new ();
-    gtk_box_pack_start (GTK_BOX (item), priv->icon, FALSE, FALSE, 0);
+    gtk_box_pack_start (priv->box, priv->icon, FALSE, FALSE, 0);
 
     vbox = gtk_vbox_new (FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (item), vbox, TRUE, TRUE, 0);
+    gtk_box_pack_start (priv->box, vbox, TRUE, TRUE, 0);
 
     hbox = gtk_hbox_new (FALSE, 12);
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
@@ -269,7 +302,10 @@ nmn_item_init (NmnItem *item)
 
     priv->remove = NULL;
 
-    gtk_widget_show_all (GTK_WIDGET (item));
+    priv->priority = G_MAXUINT;
+
+    gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET (priv->box));
+    gtk_widget_show_all (GTK_WIDGET (priv->box));
 }
 
 static void
@@ -318,4 +354,14 @@ nmn_item_class_init (NmnItemClass *class)
          NULL, NULL,
          g_cclosure_marshal_VOID__VOID,
          G_TYPE_NONE, 0);
+
+    signals[PRIORITY_CHANGED] = g_signal_new 
+        ("priority-changed",
+         G_OBJECT_CLASS_TYPE (class),
+         G_SIGNAL_RUN_LAST,
+         G_STRUCT_OFFSET (NmnItemClass, priority_changed),
+         NULL, NULL,
+         g_cclosure_marshal_VOID__UINT,
+         G_TYPE_NONE, 1,
+         G_TYPE_UINT);
 }
diff --git a/src/nmn-item.h b/src/nmn-item.h
index f8bde34..095ba08 100644
--- a/src/nmn-item.h
+++ b/src/nmn-item.h
@@ -13,11 +13,11 @@
 #define NMN_ITEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NMN_TYPE_ITEM, NmnItemClass))
 
 typedef struct {
-    GtkHBox parent;
+    GtkEventBox parent;
 } NmnItem;
 
 typedef struct {
-    GtkHBoxClass parent;
+    GtkEventBoxClass parent;
 
     /* Methods */
     void (*connect) (NmnItem *self);
@@ -28,6 +28,8 @@ typedef struct {
     void (*disconnect_requested) (NmnItem *self);
     void (*remove_requested) (NmnItem *self);
     void (*delete) (NmnItem *self);
+    void (*priority_changed) (NmnItem *self,
+                              guint priority);
 } NmnItemClass;
 
 typedef enum {
@@ -64,4 +66,8 @@ void       nmn_item_connect_request (NmnItem *self);
 void       nmn_item_disconnect_request (NmnItem *self);
 void       nmn_item_remove_request (NmnItem *self);
 
+guint      nmn_item_get_priority (NmnItem *self);
+void       nmn_item_set_priority (NmnItem *self,
+                                  guint priority);
+
 #endif /* NMN_ITEM_H */
diff --git a/src/nmn-list.c b/src/nmn-list.c
index 736b98d..4cac77e 100644
--- a/src/nmn-list.c
+++ b/src/nmn-list.c
@@ -122,12 +122,12 @@ drag_end (GtkWidget *widget, GdkDragContext *drag_context, gpointer user_data)
 
 void
 nmn_list_add_item (NmnList *list,
-                   GtkWidget *item)
+                   NmnItem *item)
 {
     g_return_if_fail (NMN_IS_LIST (list));
-    g_return_if_fail (GTK_IS_WIDGET (item));
+    g_return_if_fail (NMN_IS_ITEM (item));
 
-    gtk_drag_source_set (item, GDK_BUTTON1_MASK, 
+    gtk_drag_source_set (GTK_WIDGET (item), GDK_BUTTON1_MASK, 
                          nmn_list_targets, G_N_ELEMENTS (nmn_list_targets),
                          GDK_ACTION_MOVE);
 
@@ -147,8 +147,8 @@ nmn_list_add_item (NmnList *list,
                       G_CALLBACK (drag_end),
                       list);
 
-    gtk_box_pack_start (GTK_BOX (list), item, FALSE, FALSE, 0);
-    gtk_widget_queue_resize (GTK_WIDGET (list));
+    gtk_box_pack_start (GTK_BOX (list), GTK_WIDGET (item), FALSE, FALSE, 0);
+    gtk_widget_show (GTK_WIDGET (item));
 }
 
 
diff --git a/src/nmn-list.h b/src/nmn-list.h
index d84d4c4..7146255 100644
--- a/src/nmn-list.h
+++ b/src/nmn-list.h
@@ -4,6 +4,7 @@
 #define NMN_LIST_H
 
 #include <gtk/gtk.h>
+#include <nmn-item.h>
 
 #define NMN_TYPE_LIST            (nmn_list_get_type ())
 #define NMN_LIST(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMN_TYPE_LIST, NmnList))
@@ -24,6 +25,6 @@ GType nmn_list_get_type (void);
 
 GtkWidget *nmn_list_new (void);
 void       nmn_list_add_item (NmnList *list,
-                              GtkWidget *item);
+                              NmnItem *item);
 
 #endif /* NMN_LIST_H */
diff --git a/src/nmn-networks.c b/src/nmn-networks.c
index 75b7903..c7dc9d8 100644
--- a/src/nmn-networks.c
+++ b/src/nmn-networks.c
@@ -85,10 +85,9 @@ typedef struct {
 static void
 remove_connections_cb (GtkWidget *widget, gpointer data)
 {
+    NmnNetworkItem *item = NMN_NETWORK_ITEM (widget);
     RemoveInfo *info = (RemoveInfo *) data;
-    NmnNetworkItem *item;
 
-    item = NMN_NETWORK_ITEM (gtk_bin_get_child (GTK_BIN (widget)));
     if ((info->item && (NmnItem *) item == info->item) ||
         (info->exported && nmn_network_item_get_connection (item) == info->exported) ||
         (info->device && nmn_network_item_get_device (item) == info->device))
@@ -132,12 +131,8 @@ item_added (NmnDeviceHandler *handler,
             gpointer user_data)
 {
     NmnNetworks *self = NMN_NETWORKS (user_data);
-    GtkWidget *event_box;
 
-    event_box = gtk_event_box_new ();
-    gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (item));
-    gtk_widget_show_all (event_box);
-    nmn_list_add_item (NMN_LIST (self), event_box);
+    nmn_list_add_item (NMN_LIST (self), item);
     g_signal_connect (item, "remove-requested", G_CALLBACK (item_remove_requested), self);
 
     find_ac_for_item (self, NMN_NETWORK_ITEM (item));
@@ -192,8 +187,7 @@ device_removed (NMClient *client,
 static void
 acs_changed_cb (GtkWidget *widget, gpointer data)
 {
-    find_ac_for_item (NMN_NETWORKS (data),
-                      NMN_NETWORK_ITEM (gtk_bin_get_child (GTK_BIN (widget))));
+    find_ac_for_item (NMN_NETWORKS (data), NMN_NETWORK_ITEM (widget));
 }
 
 static void
diff --git a/src/nmn-wifi-list.c b/src/nmn-wifi-list.c
index e819b15..5e07b89 100644
--- a/src/nmn-wifi-list.c
+++ b/src/nmn-wifi-list.c
@@ -86,15 +86,14 @@ static void
 matching_ap_cb (GtkWidget *widget,
                 gpointer user_data)
 {
+    NmnWifiItem *item = NMN_WIFI_ITEM (widget);
     MatchingAPInfo *info = (MatchingAPInfo *) user_data;
-    NmnWifiItem *item;
     NMAccessPoint *ap;
     const GByteArray *ssid;
 
     if (info->have_match)
         return;
 
-    item = NMN_WIFI_ITEM (gtk_bin_get_child (GTK_BIN (widget)));
     ap = nmn_wifi_item_get_ap (item);
 
     ssid = nm_access_point_get_ssid (ap);
@@ -158,16 +157,12 @@ ap_added (NMDeviceWifi *device,
     NmnWifiList *list = NMN_WIFI_LIST (user_data);
     NmnWifiListPrivate *priv = GET_PRIVATE (list);
     GtkWidget *item;
-    GtkWidget *event_box;
 
     if (ignore_ap (list, device, ap))
         return;
 
     item = nmn_wifi_item_new (priv->nm_data, device, ap);
-    event_box = gtk_event_box_new ();
-    gtk_container_add (GTK_CONTAINER (event_box), item);
-    gtk_widget_show_all (event_box);
-    nmn_list_add_item (NMN_LIST (list), event_box);
+    nmn_list_add_item (NMN_LIST (list), NMN_ITEM (item));
     g_signal_connect (item, "connect-requested", G_CALLBACK (connect_requested), list);
 }
 



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