[file-roller] make GthMenuButton derive from GtkMenuButton



commit 0c8ee48faaafe1e1ecc83653bc9ab29a724e9f0c
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Mon Dec 3 14:10:29 2012 +0100

    make GthMenuButton derive from GtkMenuButton

 src/gth-menu-button.c |  186 +++---------------------------------------------
 src/gth-menu-button.h |    4 +-
 2 files changed, 14 insertions(+), 176 deletions(-)
---
diff --git a/src/gth-menu-button.c b/src/gth-menu-button.c
index d18c855..d08213d 100644
--- a/src/gth-menu-button.c
+++ b/src/gth-menu-button.c
@@ -26,8 +26,6 @@
 #define MENU_ID "gth-menu-button-menu-id"
 
 struct _GthMenuButtonPrivate {
-	guint      active : 1;
-	GtkMenu   *menu;
 	GtkWidget *icon_widget;
 	GtkWidget *label_widget;
 };
@@ -42,26 +40,14 @@ enum {
 	PROP_LABEL,
 	PROP_USE_UNDERLINE,
 	PROP_STOCK_ID,
-	PROP_ICON_NAME,
-	PROP_MENU
+	PROP_ICON_NAME
 };
 
 
 static int signals[LAST_SIGNAL];
 
 
-G_DEFINE_TYPE (GthMenuButton, gth_menu_button, GTK_TYPE_TOGGLE_BUTTON)
-
-
-static void
-gth_menu_button_state_changed (GtkWidget    *widget,
-			       GtkStateType  previous_state)
-{
-	GthMenuButton *self = GTH_MENU_BUTTON (widget);
-
-	if (! gtk_widget_is_sensitive (widget) && (self->priv->menu != NULL))
-		gtk_menu_shell_deactivate (GTK_MENU_SHELL (self->priv->menu));
-}
+G_DEFINE_TYPE (GthMenuButton, gth_menu_button, GTK_TYPE_MENU_BUTTON)
 
 
 static void
@@ -85,9 +71,6 @@ gth_menu_button_set_property (GObject      *object,
 	case PROP_ICON_NAME:
 		gth_menu_button_set_icon_name (self, g_value_get_string (value));
 		break;
-	case PROP_MENU:
-		gth_menu_button_set_menu (self, g_value_get_object (value));
-		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -116,9 +99,6 @@ gth_menu_button_get_property (GObject    *object,
 	case PROP_ICON_NAME:
 		g_value_set_string (value, gth_menu_button_get_icon_name (self));
 		break;
-	case PROP_MENU:
-		g_value_set_object (value, self->priv->menu);
-		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -126,112 +106,6 @@ gth_menu_button_get_property (GObject    *object,
 }
 
 
-/* Callback for the "deactivate" signal on the pop-up menu.
- * This is used so that we unset the state of the toggle button
- * when the pop-up menu disappears.
- */
-static int
-menu_deactivate_cb (GtkMenuShell  *menu_shell,
-		    GthMenuButton *self)
-{
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), FALSE);
-	return TRUE;
-}
-
-
-static void
-menu_position_func (GtkMenu       *menu,
-                    int           *x,
-                    int           *y,
-                    gboolean      *push_in,
-                    GthMenuButton *self)
-{
-	GtkWidget             *widget = GTK_WIDGET (self);
-	GtkRequisition         menu_req;
-	GtkTextDirection       direction;
-	cairo_rectangle_int_t  monitor;
-	int                    monitor_num;
-	GdkScreen             *screen;
-	GtkAllocation          allocation;
-
-	gtk_widget_get_preferred_size (GTK_WIDGET (self->priv->menu), &menu_req, NULL);
-
-	direction = gtk_widget_get_direction (widget);
-
-	screen = gtk_widget_get_screen (GTK_WIDGET (menu));
-	monitor_num = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (widget));
-	if (monitor_num < 0)
-		monitor_num = 0;
-	gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-	gtk_widget_get_allocation (widget, &allocation);
-
-	gdk_window_get_origin (gtk_widget_get_window (widget), x, y);
-	*x += allocation.x;
-	*y += allocation.y;
-
-	if (direction == GTK_TEXT_DIR_LTR)
-		*x += MAX (allocation.width - menu_req.width, 0);
-	else if (menu_req.width > allocation.width)
-		*x -= menu_req.width - allocation.width;
-
-	if ((*y + allocation.height + menu_req.height) <= monitor.y + monitor.height)
-		*y += allocation.height;
-	else if ((*y - menu_req.height) >= monitor.y)
-		*y -= menu_req.height;
-	else if (monitor.y + monitor.height - (*y + allocation.height) > *y)
-		*y += allocation.height;
-	else
-		*y -= menu_req.height;
-
-	*push_in = FALSE;
-}
-
-
-static void
-popup_menu_under_button (GthMenuButton  *self,
-                         GdkEventButton *event)
-{
-	g_signal_emit (self, signals[SHOW_MENU], 0);
-
-	if (self->priv->menu == NULL)
-		return;
-
-	if (gtk_menu_get_attach_widget (self->priv->menu) != NULL)
-		gtk_menu_detach (self->priv->menu);
-	gtk_menu_popup (self->priv->menu, NULL, NULL,
-			(GtkMenuPositionFunc) menu_position_func,
-			self,
-			event ? event->button : 0,
-			event ? event->time : gtk_get_current_event_time ());
-}
-
-
-static gboolean
-toggle_button_toggled_cb (GtkToggleButton *togglebutton,
-			  gpointer         user_data)
-{
-	GthMenuButton *self = user_data;
-	gboolean       toggle_active = gtk_toggle_button_get_active (togglebutton);
-
-	if (self->priv->menu == NULL)
-		return FALSE;
-
-	if (self->priv->active != toggle_active) {
-		self->priv->active = toggle_active;
-		g_object_notify (G_OBJECT (self), "active");
-
-		if (self->priv->active && ! gtk_widget_get_visible (GTK_WIDGET (self->priv->menu))) {
-			/* we get here only when the menu is activated by a key
-			 * press, so that we can select the first menu item */
-			popup_menu_under_button (self, NULL);
-			gtk_menu_shell_select_first (GTK_MENU_SHELL (self->priv->menu), FALSE);
-		}
-	}
-
-	return FALSE;
-}
-
-
 static gboolean
 toggle_button_press_event_cb (GtkWidget      *widget,
                               GdkEventButton *event,
@@ -239,22 +113,17 @@ toggle_button_press_event_cb (GtkWidget      *widget,
 {
 	GthMenuButton *self = user_data;
 
-	if ((event->button == 1) && (self->priv->menu != NULL))  {
-		popup_menu_under_button (self, event);
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+	if (event->button == 1)
+		g_signal_emit (self, signals[SHOW_MENU], 0);
 
-		return TRUE;
-	}
-	else
-		return FALSE;
+	return FALSE;
 }
 
 
 static void
 gth_menu_button_class_init (GthMenuButtonClass *klass)
 {
-	GObjectClass   *object_class;
-	GtkWidgetClass *widget_class;
+	GObjectClass *object_class;
 
 	g_type_class_add_private (klass, sizeof (GthMenuButtonPrivate));
 
@@ -262,9 +131,6 @@ gth_menu_button_class_init (GthMenuButtonClass *klass)
 	object_class->set_property = gth_menu_button_set_property;
 	object_class->get_property = gth_menu_button_get_property;
 
-	widget_class = (GtkWidgetClass *) klass;
-	widget_class->state_changed = gth_menu_button_state_changed;
-
 	/* signals */
 
 	/**
@@ -319,13 +185,6 @@ gth_menu_button_class_init (GthMenuButtonClass *klass)
 							      "The name of the themed icon displayed on the item",
 							      NULL,
 							      G_PARAM_READABLE | G_PARAM_WRITABLE));
-	g_object_class_install_property (object_class,
-					 PROP_MENU,
-					 g_param_spec_object ("menu",
-							      "Menu",
-							      "The dropdown menu",
-							      GTK_TYPE_MENU,
-							      G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
 
@@ -341,8 +200,6 @@ gth_menu_button_init (GthMenuButton *self)
 	GtkWidget   *box;
 
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_MENU_BUTTON, GthMenuButtonPrivate);
-	self->priv->menu = NULL;
-	self->priv->active = FALSE;
 
 	gtk_widget_style_get (GTK_WIDGET (self),
 			      "image-spacing", &image_spacing,
@@ -389,10 +246,6 @@ gth_menu_button_init (GthMenuButton *self)
 	/* signals */
 
 	g_signal_connect (self,
-			  "toggled",
-			  G_CALLBACK (toggle_button_toggled_cb),
-			  self);
-	g_signal_connect (self,
 			  "button-press-event",
 		          G_CALLBACK (toggle_button_press_event_cb),
 		          self);
@@ -527,33 +380,18 @@ gth_menu_button_set_menu (GthMenuButton *self,
 	g_return_if_fail (GTH_IS_MENU_BUTTON (self));
 	g_return_if_fail (GTK_IS_MENU (menu) || menu == NULL);
 
-	if (self->priv->menu != GTK_MENU (menu)) {
-		if ((self->priv->menu != NULL) && gtk_widget_get_visible (GTK_WIDGET (self->priv->menu)))
-			gtk_menu_shell_deactivate (GTK_MENU_SHELL (self->priv->menu));
-
-		self->priv->menu = GTK_MENU (menu);
-
-		if (self->priv->menu != NULL) {
-			g_object_add_weak_pointer (G_OBJECT (self->priv->menu), (gpointer *) &self->priv->menu);
-
-			gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
-			g_signal_connect (self->priv->menu,
-					  "deactivate",
-					  G_CALLBACK (menu_deactivate_cb),
-					  self);
-		}
-		else
-			gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
-	}
-
-	g_object_notify (G_OBJECT (self), "menu");
+	g_object_set (self, "menu", menu, NULL);
 }
 
 
 GtkWidget *
 gth_menu_button_get_menu (GthMenuButton *self)
 {
+	GtkWidget *menu;
+
 	g_return_val_if_fail (GTH_IS_MENU_BUTTON (self), NULL);
 
-	return GTK_WIDGET (self->priv->menu);
+	g_object_get (self, "menu", &menu, NULL);
+
+	return menu;
 }
diff --git a/src/gth-menu-button.h b/src/gth-menu-button.h
index 9ae199a..776d7cf 100644
--- a/src/gth-menu-button.h
+++ b/src/gth-menu-button.h
@@ -40,13 +40,13 @@ typedef struct _GthMenuButtonPrivate GthMenuButtonPrivate;
 
 struct _GthMenuButton
 {
-	GtkToggleButton parent;
+	GtkMenuButton parent;
 	GthMenuButtonPrivate *priv;
 };
 
 struct _GthMenuButtonClass
 {
-	GtkToggleButtonClass parent_class;
+	GtkMenuButtonClass parent_class;
 
 	/*< signals >*/
 



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