[baobab/wip/vala: 19/23] Move popup menu in the chart widget



commit a19c5f2cbe61af4d79a9b5c82e56167a8cea4b25
Author: Paolo Borelli <pborelli gnome org>
Date:   Fri Jan 6 00:06:32 2012 +0100

    Move popup menu in the chart widget
    
    Move the popup menu functionality in the chart widget implementation.

 src/baobab-chart.c |  197 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 164 insertions(+), 33 deletions(-)
---
diff --git a/src/baobab-chart.c b/src/baobab-chart.c
index cc8fb86..3dd065c 100644
--- a/src/baobab-chart.c
+++ b/src/baobab-chart.c
@@ -46,13 +46,6 @@ G_DEFINE_ABSTRACT_TYPE (BaobabChart, baobab_chart, GTK_TYPE_WIDGET);
 #define BAOBAB_CHART_MAX_DEPTH 8
 #define BAOBAB_CHART_MIN_DEPTH 1
 
-enum
-{
-  LEFT_BUTTON   = 1,
-  MIDDLE_BUTTON = 2,
-  RIGHT_BUTTON  = 3
-};
-
 struct _BaobabChartPrivate
 {
   guint name_column;
@@ -73,6 +66,8 @@ struct _BaobabChartPrivate
   GList *first_item;
   GList *last_item;
   GList *highlighted_item;
+
+  GtkWidget *popup_menu;
 };
 
 /* Signals */
@@ -104,6 +99,7 @@ const BaobabChartColor baobab_chart_tango_colors[] = {{0.94, 0.16, 0.16}, /* tan
 static void baobab_chart_class_init (BaobabChartClass *class);
 static void baobab_chart_init (BaobabChart *object);
 static void baobab_chart_realize (GtkWidget *widget);
+static void baobab_chart_unrealize (GtkWidget *widget);
 static void baobab_chart_dispose (GObject *object);
 static void baobab_chart_size_allocate (GtkWidget *widget,
                                         GtkAllocation *allocation);
@@ -126,8 +122,9 @@ static void baobab_chart_interpolate_colors (BaobabChartColor *color,
                                              BaobabChartColor colora,
                                              BaobabChartColor colorb,
                                              gdouble percentage);
-static gint baobab_chart_button_release (GtkWidget *widget,
-                                         GdkEventButton *event);
+static gint baobab_chart_button_press_event (GtkWidget      *widget,
+                                             GdkEventButton *event);
+static gboolean baobab_chart_popup_menu (GtkWidget *widget);
 static gint baobab_chart_scroll (GtkWidget *widget,
                                  GdkEventScroll *event);
 static gint baobab_chart_motion_notify (GtkWidget *widget,
@@ -162,8 +159,11 @@ baobab_chart_class_init (BaobabChartClass *class)
 
   /* GtkWidget signals */
   widget_class->realize = baobab_chart_realize;
+  widget_class->unrealize = baobab_chart_unrealize;
   widget_class->draw = baobab_chart_draw;
   widget_class->size_allocate = baobab_chart_size_allocate;
+  widget_class->button_press_event = baobab_chart_button_press_event;
+  widget_class->popup_menu = baobab_chart_popup_menu;
   widget_class->scroll_event = baobab_chart_scroll;
 
   /* Baobab Chart abstract methods */
@@ -302,6 +302,22 @@ baobab_chart_realize (GtkWidget *widget)
 }
 
 static void
+baobab_chart_unrealize (GtkWidget *widget)
+{
+  BaobabChart *chart;
+
+  chart = BAOBAB_CHART (widget);
+
+  if (chart->priv->popup_menu)
+    {
+      gtk_widget_destroy (chart->priv->popup_menu);
+      chart->priv->popup_menu = NULL;
+    }
+
+  GTK_WIDGET_CLASS (baobab_chart_parent_class)->unrealize (widget);
+}
+
+static void
 baobab_chart_size_allocate (GtkWidget     *widget,
                             GtkAllocation *allocation)
 {
@@ -825,34 +841,156 @@ baobab_chart_get_item_color (BaobabChartColor *color,
     }
 }
 
+static void
+popup_menu_detach (GtkWidget *attach_widget,
+                   GtkMenu   *menu)
+{
+  BAOBAB_CHART (attach_widget)->priv->popup_menu = NULL;
+}
+
+static void
+popup_menu_activate_up (GtkMenuItem *checkmenuitem,
+                        BaobabChart *chart)
+{
+  baobab_chart_move_up_root (chart);
+}
+
+static void
+popup_menu_activate_zoom_in (GtkMenuItem *checkmenuitem,
+                             BaobabChart *chart)
+{
+  baobab_chart_zoom_in (chart);
+}
+
+static void
+popup_menu_activate_zoom_out (GtkMenuItem *checkmenuitem,
+                              BaobabChart *chart)
+{
+  baobab_chart_zoom_out (chart);
+}
+
+static void
+popup_menu_activate_snapshot (GtkMenuItem *checkmenuitem,
+                              BaobabChart *chart)
+{
+  baobab_chart_save_snapshot (chart);
+}
+
+static void
+do_popup_menu (BaobabChart    *chart,
+               GdkEventButton *event)
+{
+  GtkWidget *menu;
+  GtkWidget *up_item;
+  GtkWidget *zoom_in_item;
+  GtkWidget *zoom_out_item;
+  GtkWidget *snapshot_item;
+  GtkTreePath *root_path;
+
+  menu = gtk_menu_new ();
+  chart->priv->popup_menu = menu;
+
+  gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (chart), popup_menu_detach);
+
+  up_item = gtk_image_menu_item_new_with_label (_("Move to parent folder"));
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (up_item),
+                                 gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU));
+
+  zoom_in_item = gtk_image_menu_item_new_with_label (_("Zoom in")) ;
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (zoom_in_item),
+                                 gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
+
+  zoom_out_item = gtk_image_menu_item_new_with_label (_("Zoom out"));
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (zoom_out_item),
+                                 gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
+
+  snapshot_item = gtk_image_menu_item_new_with_label (_("Save screenshot"));
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (snapshot_item),
+                                 gtk_image_new_from_file (BAOBAB_PIX_DIR "shot.png"));
+
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), up_item);
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_separator_menu_item_new ());
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), zoom_in_item);
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), zoom_out_item);
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_separator_menu_item_new ());
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), snapshot_item);
+
+  g_signal_connect (up_item, "activate",
+                    G_CALLBACK (popup_menu_activate_up), chart);
+  g_signal_connect (zoom_in_item, "activate",
+                    G_CALLBACK (popup_menu_activate_zoom_in), chart);
+  g_signal_connect (zoom_out_item, "activate",
+                    G_CALLBACK (popup_menu_activate_zoom_out), chart);
+  g_signal_connect (snapshot_item, "activate",
+                    G_CALLBACK (popup_menu_activate_snapshot), chart);
+
+  gtk_widget_show_all (menu);
+
+  root_path = baobab_chart_get_root (chart);
+
+  gtk_widget_set_sensitive (up_item,
+                            (!chart->priv->is_frozen) &&
+                            ((root_path != NULL) &&
+                            (gtk_tree_path_get_depth (root_path) > 1)));
+  gtk_widget_set_sensitive (zoom_in_item,
+                            baobab_chart_can_zoom_in (chart));
+  gtk_widget_set_sensitive (zoom_out_item,
+                            baobab_chart_can_zoom_out (chart));
+
+  gtk_menu_popup (GTK_MENU (menu),
+                  NULL, NULL, NULL, NULL,
+                  event ? event->button : 0,
+                  event ? event->time : gtk_get_current_event_time ());
+
+  gtk_tree_path_free (root_path);
+}
+
 static gint
-baobab_chart_button_release (GtkWidget      *widget,
-                             GdkEventButton *event)
+baobab_chart_button_press_event (GtkWidget      *widget,
+                                 GdkEventButton *event)
 {
   BaobabChart *chart = BAOBAB_CHART (widget);
 
-  if (chart->priv->is_frozen)
-    return TRUE;
-
-  switch (event->button)
+  if (event->type == GDK_BUTTON_PRESS)
     {
-    case LEFT_BUTTON:
-      /* Enter into a subdir */
-      if (chart->priv->highlighted_item != NULL)
-        g_signal_emit (BAOBAB_CHART (widget), baobab_chart_signals[ITEM_ACTIVATED], 0,
-                       &((BaobabChartItem*) chart->priv->highlighted_item->data)->iter);
-
-      break;
+      if (gdk_event_triggers_context_menu ((GdkEvent *) event))
+        {
+          do_popup_menu (chart, event);
+          return TRUE;
+        }
+      else if (!chart->priv->is_frozen)
+        {
+          switch (event->button)
+            {
+              case 1:
+                /* Enter into a subdir */
+                if (chart->priv->highlighted_item != NULL)
+                  g_signal_emit (chart,
+                                 baobab_chart_signals[ITEM_ACTIVATED], 0,
+                                 &((BaobabChartItem*) chart->priv->highlighted_item->data)->iter);
+                break;
+
+              case 2:
+                /* Go back to the parent dir */
+                baobab_chart_move_up_root (chart);
+                break;
+            }
 
-    case MIDDLE_BUTTON:
-      /* Go back to the parent dir */
-      baobab_chart_move_up_root (BAOBAB_CHART (widget));
-      break;
+          return TRUE;
+        }
     }
 
   return FALSE;
 }
 
+static gboolean
+baobab_chart_popup_menu (GtkWidget *widget)
+{
+  do_popup_menu (BAOBAB_CHART (widget), NULL);
+
+  return TRUE;
+}
+
 static gint
 baobab_chart_scroll (GtkWidget *widget,
                      GdkEventScroll *event)
@@ -999,10 +1137,6 @@ baobab_chart_connect_signals (BaobabChart *chart,
                     "leave-notify-event",
                     G_CALLBACK (baobab_chart_leave_notify),
                     chart);
-  g_signal_connect (chart,
-                    "button-release-event",
-                    G_CALLBACK (baobab_chart_button_release),
-                    chart);
 }
 
 static void
@@ -1033,9 +1167,6 @@ baobab_chart_disconnect_signals (BaobabChart  *chart,
   g_signal_handlers_disconnect_by_func (chart,
                                         baobab_chart_leave_notify,
                                         chart);
-  g_signal_handlers_disconnect_by_func (chart,
-                                        baobab_chart_button_release,
-                                        chart);
 }
 
 static gboolean



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