[baobab/wip/vala: 17/41] Move popup menu in the chart widget
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [baobab/wip/vala: 17/41] Move popup menu in the chart widget
- Date: Sun, 8 Jan 2012 20:27:56 +0000 (UTC)
commit 7723d6a0943b41e508eb15c14c55f2c1fc8e76ec
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 212ee8c..e3da649 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 */
@@ -306,6 +306,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)
{
@@ -829,34 +845,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)
@@ -1003,10 +1141,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
@@ -1037,9 +1171,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]