[Xfce4-commits] <thunar:jannis/new-shortcuts-pane> Implement state changes when hovering shortcuts or their action buttons.

Jannis Pohlmann noreply at xfce.org
Mon Jun 6 19:44:01 CEST 2011


Updating branch refs/heads/jannis/new-shortcuts-pane
         to 8d656e584358b67999f5c0fbac8af82b6f72690a (commit)
       from 96e9454346b72c34a8f0740f3ec680fcc79c7bce (commit)

commit 8d656e584358b67999f5c0fbac8af82b6f72690a
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Mon Jun 6 19:43:23 2011 +0200

    Implement state changes when hovering shortcuts or their action buttons.

 thunar/thunar-shortcut-row.c |  163 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 133 insertions(+), 30 deletions(-)

diff --git a/thunar/thunar-shortcut-row.c b/thunar/thunar-shortcut-row.c
index f0ec1bf..59d2636 100644
--- a/thunar/thunar-shortcut-row.c
+++ b/thunar/thunar-shortcut-row.c
@@ -48,32 +48,40 @@ enum
 
 
 
-static void     thunar_shortcut_row_constructed        (GObject           *object);
-static void     thunar_shortcut_row_dispose            (GObject           *object);
-static void     thunar_shortcut_row_finalize           (GObject           *object);
-static void     thunar_shortcut_row_get_property       (GObject           *object,
-                                                        guint              prop_id,
-                                                        GValue            *value,
-                                                        GParamSpec        *pspec);
-static void     thunar_shortcut_row_set_property       (GObject           *object,
-                                                        guint              prop_id,
-                                                        const GValue      *value,
-                                                        GParamSpec        *pspec);
-static gboolean thunar_shortcut_row_button_press_event (GtkWidget         *widget,
-                                                        GdkEventButton    *event);
-static gboolean thunar_shortcut_row_expose_event       (GtkWidget         *widget,
-                                                        GdkEventExpose    *event);
-static gboolean thunar_shortcut_row_focus              (GtkWidget         *widget,
-                                                        GtkDirectionType   direction);
-static gboolean thunar_shortcut_row_focus_in_event     (GtkWidget         *widget,
-                                                        GdkEventFocus     *event);
-static gboolean thunar_shortcut_row_focus_out_event    (GtkWidget         *widget,
-                                                        GdkEventFocus     *event);
-static void     thunar_shortcut_row_icon_changed       (ThunarShortcutRow *row);
-static void     thunar_shortcut_row_label_changed      (ThunarShortcutRow *row);
-static void     thunar_shortcut_row_file_changed       (ThunarShortcutRow *row);
-static void     thunar_shortcut_row_volume_changed     (ThunarShortcutRow *row);
-static void     thunar_shortcut_row_icon_size_changed  (ThunarShortcutRow *row);
+static void     thunar_shortcut_row_constructed          (GObject           *object);
+static void     thunar_shortcut_row_dispose              (GObject           *object);
+static void     thunar_shortcut_row_finalize             (GObject           *object);
+static void     thunar_shortcut_row_get_property         (GObject           *object,
+                                                          guint              prop_id,
+                                                          GValue            *value,
+                                                          GParamSpec        *pspec);
+static void     thunar_shortcut_row_set_property         (GObject           *object,
+                                                          guint              prop_id,
+                                                          const GValue      *value,
+                                                          GParamSpec        *pspec);
+static gboolean thunar_shortcut_row_button_press_event   (GtkWidget         *widget,
+                                                          GdkEventButton    *event);
+static gboolean thunar_shortcut_row_enter_notify_event   (GtkWidget         *widget,
+                                                          GdkEventCrossing  *event);
+static gboolean thunar_shortcut_row_leave_notify_event   (GtkWidget         *widget,
+                                                          GdkEventCrossing  *event);
+static gboolean thunar_shortcut_row_expose_event         (GtkWidget         *widget,
+                                                          GdkEventExpose    *event);
+static gboolean thunar_shortcut_row_focus                (GtkWidget         *widget,
+                                                          GtkDirectionType   direction);
+static gboolean thunar_shortcut_row_focus_in_event       (GtkWidget         *widget,
+                                                          GdkEventFocus     *event);
+static gboolean thunar_shortcut_row_focus_out_event      (GtkWidget         *widget,
+                                                          GdkEventFocus     *event);
+static void     thunar_shortcut_row_button_state_changed (ThunarShortcutRow *row,
+                                                          GtkStateType       previous_state,
+                                                          GtkWidget         *button);
+static void     thunar_shortcut_row_icon_changed         (ThunarShortcutRow *row);
+static void     thunar_shortcut_row_label_changed        (ThunarShortcutRow *row);
+static void     thunar_shortcut_row_file_changed         (ThunarShortcutRow *row);
+static void     thunar_shortcut_row_eject_icon_changed   (ThunarShortcutRow *row);
+static void     thunar_shortcut_row_volume_changed       (ThunarShortcutRow *row);
+static void     thunar_shortcut_row_icon_size_changed    (ThunarShortcutRow *row);
 
 
 
@@ -128,6 +136,8 @@ thunar_shortcut_row_class_init (ThunarShortcutRowClass *klass)
 
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->button_press_event = thunar_shortcut_row_button_press_event;
+  gtkwidget_class->enter_notify_event = thunar_shortcut_row_enter_notify_event;
+  gtkwidget_class->leave_notify_event = thunar_shortcut_row_leave_notify_event;
   gtkwidget_class->expose_event = thunar_shortcut_row_expose_event;
   gtkwidget_class->focus = thunar_shortcut_row_focus;
   gtkwidget_class->focus_in_event = thunar_shortcut_row_focus_in_event;
@@ -217,7 +227,11 @@ thunar_shortcut_row_init (ThunarShortcutRow *row)
   row->action_button = gtk_button_new ();
   gtk_button_set_relief (GTK_BUTTON (row->action_button), GTK_RELIEF_NONE);
   gtk_box_pack_start (GTK_BOX (box), row->action_button, FALSE, TRUE, 0);
-  gtk_widget_hide (row->action_button);
+  gtk_widget_show (row->action_button);
+
+  /* adjust the state transitions of the button */
+  g_signal_connect_swapped (row->action_button, "state-changed",
+                            G_CALLBACK (thunar_shortcut_row_button_state_changed), row);
 
   /* create the action button image */
   row->action_image = gtk_image_new ();
@@ -331,6 +345,7 @@ thunar_shortcut_row_set_property (GObject      *object,
       break;
 
     case PROP_EJECT_ICON:
+      g_debug ("set eject icon");
       thunar_shortcut_row_set_eject_icon (row, g_value_get_object (value));
       break;
 
@@ -402,6 +417,54 @@ thunar_shortcut_row_button_press_event (GtkWidget      *widget,
 
 
 static gboolean
+thunar_shortcut_row_enter_notify_event (GtkWidget        *widget,
+                                        GdkEventCrossing *event)
+{
+  _thunar_return_val_if_fail (THUNAR_IS_SHORTCUT_ROW (widget), FALSE);
+  
+  if (gtk_widget_get_state (widget) != GTK_STATE_SELECTED)
+    gtk_widget_set_state (widget, GTK_STATE_PRELIGHT);
+
+  return TRUE;
+}
+
+
+
+static gboolean
+thunar_shortcut_row_leave_notify_event (GtkWidget        *widget,
+                                        GdkEventCrossing *event)
+{
+  ThunarShortcutRow *row = THUNAR_SHORTCUT_ROW (widget);
+  gint               x;
+  gint               y;
+  gint               width;
+  gint               height;
+
+  _thunar_return_val_if_fail (THUNAR_IS_SHORTCUT_ROW (widget), FALSE);
+
+  /* check whether the row is hovered but not selected */
+  if (gtk_widget_get_state (widget) == GTK_STATE_PRELIGHT)
+    {
+      /* determine the location of the pointer relative to the action button */
+      gtk_widget_get_pointer (row->action_button, &x, &y);
+
+      /* determine the geometry of the button window */
+      gdk_window_get_geometry (gtk_widget_get_window (row->action_button),
+                               NULL, NULL, &width, &height, NULL);
+
+      /* the pointer has left the row widget itself but we only
+       * reset the prelight state if the mouse is not hovering
+       * the button either */
+      if (x < 0 || y < 0 || x >= width || y >= height)
+        gtk_widget_set_state (widget, GTK_STATE_NORMAL);
+    }
+
+  return TRUE;
+}
+
+
+
+static gboolean
 thunar_shortcut_row_expose_event (GtkWidget      *widget,
                                   GdkEventExpose *event)
 {
@@ -522,12 +585,39 @@ thunar_shortcut_row_focus_out_event (GtkWidget     *widget,
 
 
 static void
+thunar_shortcut_row_button_state_changed (ThunarShortcutRow *row,
+                                          GtkStateType       previous_state,
+                                          GtkWidget         *button)
+{
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+
+  _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+
+  if (gtk_widget_get_state (row->action_button) == GTK_STATE_PRELIGHT
+      && gtk_widget_get_state (GTK_WIDGET (row)) == GTK_STATE_PRELIGHT)
+    {
+      gtk_widget_get_pointer (row->action_button, &x, &y);
+
+      gdk_window_get_geometry (gtk_widget_get_window (row->action_button),
+                               NULL, NULL, &width, &height, NULL);
+
+      if (x < 0 || y < 0 || x >= width || y >= height)
+        gtk_widget_set_state (row->action_button, GTK_STATE_NORMAL);
+    }
+}
+
+
+
+static void
 thunar_shortcut_row_icon_changed (ThunarShortcutRow *row)
 {
   _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
 
   /* update the icon image */
-  gtk_image_set_from_gicon (GTK_IMAGE (row->icon_image), row->icon, GTK_ICON_SIZE_DIALOG);
+  gtk_image_set_from_gicon (GTK_IMAGE (row->icon_image), row->icon, row->icon_size);
   gtk_widget_set_visible (row->icon_image, row->icon != NULL);
 }
 
@@ -545,6 +635,18 @@ thunar_shortcut_row_label_changed (ThunarShortcutRow *row)
 
 
 
+static void
+thunar_shortcut_row_eject_icon_changed (ThunarShortcutRow *row)
+{
+  _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
+
+  /* update the action button image */
+  gtk_image_set_from_gicon (GTK_IMAGE (row->action_image), row->eject_icon,
+                            GTK_ICON_SIZE_MENU);
+}
+
+
+
 
 static void
 thunar_shortcut_row_file_changed (ThunarShortcutRow *row)
@@ -591,7 +693,7 @@ thunar_shortcut_row_volume_changed (ThunarShortcutRow *row)
 
       /* update the icon image */
       icon = g_volume_get_icon (row->volume);
-      gtk_image_set_from_gicon (GTK_IMAGE (row->icon_image), icon, GTK_ICON_SIZE_DIALOG);
+      gtk_image_set_from_gicon (GTK_IMAGE (row->icon_image), icon, row->icon_size);
       gtk_widget_set_visible (row->icon_image, icon != NULL);
       g_object_unref (icon);
 
@@ -611,7 +713,6 @@ thunar_shortcut_row_icon_size_changed (ThunarShortcutRow *row)
   _thunar_return_if_fail (THUNAR_IS_SHORTCUT_ROW (row));
 
   gtk_image_set_pixel_size (GTK_IMAGE (row->icon_image), row->icon_size);
-  gtk_image_set_pixel_size (GTK_IMAGE (row->action_image), row->icon_size);
 }
 
 
@@ -675,6 +776,8 @@ thunar_shortcut_row_set_eject_icon (ThunarShortcutRow *row,
   else
     row->eject_icon = NULL;
 
+  thunar_shortcut_row_eject_icon_changed (row);
+
   g_object_notify (G_OBJECT (row), "eject-icon");
 }
 



More information about the Xfce4-commits mailing list