[file-roller] menu action: added a show-arrow property



commit 282376ac753658c7a01fc6939fab6e20fa00b50b
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Dec 6 10:17:39 2012 +0100

    menu action: added a show-arrow property

 src/gth-toggle-menu-action.c      |   31 +++++++++++++++--
 src/gth-toggle-menu-action.h      |    1 +
 src/gth-toggle-menu-tool-button.c |   69 +++++++++++++++++++++---------------
 3 files changed, 69 insertions(+), 32 deletions(-)
---
diff --git a/src/gth-toggle-menu-action.c b/src/gth-toggle-menu-action.c
index 07bf070..2a09d60 100644
--- a/src/gth-toggle-menu-action.c
+++ b/src/gth-toggle-menu-action.c
@@ -32,12 +32,14 @@ G_DEFINE_TYPE (GthToggleMenuAction, gth_toggle_menu_action, GTK_TYPE_TOGGLE_ACTI
 /* Properties */
 enum {
         PROP_0,
+        PROP_SHOW_ARROW,
         PROP_MENU,
         PROP_MENU_HALIGN
 };
 
 
 struct _GthToggleMenuActionPrivate {
+	gboolean         show_arrow;
 	GtkWidget       *menu;
 	GtkAlign         menu_halign;
 	GthShowMenuFunc  show_menu_func;
@@ -50,6 +52,7 @@ static void
 gth_toggle_menu_action_init (GthToggleMenuAction *self)
 {
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_TOGGLE_MENU_ACTION, GthToggleMenuActionPrivate);
+	self->priv->show_arrow = TRUE;
 	self->priv->menu = gtk_menu_new ();
 	g_object_ref_sink (self->priv->menu);
 }
@@ -63,12 +66,17 @@ gth_toggle_menu_action_set_property (GObject      *object,
 				     GParamSpec   *pspec)
 {
 	GthToggleMenuAction *self = GTH_TOGGLE_MENU_ACTION (object);
+	GtkWidget           *tmp;
 
 	switch (property_id) {
+	case PROP_SHOW_ARROW:
+		self->priv->show_arrow = g_value_get_boolean (value);
+		break;
 	case PROP_MENU:
-		if (self->priv->menu != NULL)
-			g_object_unref (self->priv->menu);
+		tmp = self->priv->menu;
 		self->priv->menu = g_value_dup_object (value);
+		g_object_unref (tmp);
+		g_object_notify (G_OBJECT (self), "menu");
 		break;
 	case PROP_MENU_HALIGN:
 		self->priv->menu_halign = g_value_get_enum (value);
@@ -88,6 +96,9 @@ gth_toggle_menu_action_get_property (GObject    *object,
 	GthToggleMenuAction *self = GTH_TOGGLE_MENU_ACTION (object);
 
 	switch (property_id) {
+	case PROP_SHOW_ARROW:
+		g_value_set_boolean (value, self->priv->show_arrow);
+		break;
 	case PROP_MENU:
 		g_value_set_object (value, self->priv->menu);
 		break;
@@ -118,7 +129,7 @@ gth_toggle_menu_action_create_tool_item (GtkAction *action)
 	GtkWidget           *tool_item;
 
 	tool_item = g_object_new (GTH_TYPE_TOGGLE_MENU_TOOL_BUTTON,
-				  "show-arrow", TRUE,
+				  "show-arrow", self->priv->show_arrow,
 				  NULL);
 	if (self->priv->show_menu_func != NULL)
 		g_signal_connect (tool_item,
@@ -170,6 +181,13 @@ gth_toggle_menu_action_class_init (GthToggleMenuActionClass *klass)
 	/* properties */
 
 	g_object_class_install_property (object_class,
+					 PROP_SHOW_ARROW,
+					 g_param_spec_boolean ("show-arrow",
+                                                               "Show Arrow",
+                                                               "Whether to show an arrow",
+                                                               TRUE,
+                                                               G_PARAM_READWRITE));
+	g_object_class_install_property (object_class,
 					 PROP_MENU,
 					 g_param_spec_object ("menu",
                                                               "Menu",
@@ -213,3 +231,10 @@ gth_toggle_menu_action_get_menu_halign (GthToggleMenuAction *self)
 {
 	return self->priv->menu_halign;
 }
+
+
+gboolean
+gth_toggle_menu_action_get_show_arrow (GthToggleMenuAction *self)
+{
+	return self->priv->show_arrow;
+}
diff --git a/src/gth-toggle-menu-action.h b/src/gth-toggle-menu-action.h
index 64949b0..30fa3f2 100644
--- a/src/gth-toggle-menu-action.h
+++ b/src/gth-toggle-menu-action.h
@@ -56,6 +56,7 @@ void        gth_toggle_menu_action_set_show_menu_func (GthToggleMenuAction *acti
 						       GDestroyNotify       destroy);
 GtkWidget * gth_toggle_menu_action_get_menu           (GthToggleMenuAction *action);
 GtkAlign    gth_toggle_menu_action_get_menu_halign    (GthToggleMenuAction *self);
+gboolean    gth_toggle_menu_action_get_show_arrow     (GthToggleMenuAction *self);
 
 G_END_DECLS
 
diff --git a/src/gth-toggle-menu-tool-button.c b/src/gth-toggle-menu-tool-button.c
index 8c76136..9ae8177 100644
--- a/src/gth-toggle-menu-tool-button.c
+++ b/src/gth-toggle-menu-tool-button.c
@@ -159,12 +159,12 @@ gth_toggle_menu_tool_button_construct_contents (GtkToolItem *tool_item)
 	style = gtk_tool_item_get_toolbar_style (GTK_TOOL_ITEM (button));
 
 	if (style != GTK_TOOLBAR_TEXT) {
-		if ((button->priv->stock_id != NULL) && (button->priv->icon_name != NULL))
+		if ((button->priv->stock_id != NULL) || (button->priv->icon_name != NULL))
 			need_icon = TRUE;
 	}
 
-	if ((style == GTK_TOOLBAR_TEXT) | (style == GTK_TOOLBAR_BOTH)) {
-		if ((button->priv->stock_id != NULL) && (button->priv->label_text != NULL))
+	if ((style == GTK_TOOLBAR_TEXT) || (style == GTK_TOOLBAR_BOTH)) {
+		if ((button->priv->stock_id != NULL) || (button->priv->label_text != NULL))
 			need_label = TRUE;
 	}
 
@@ -176,27 +176,12 @@ gth_toggle_menu_tool_button_construct_contents (GtkToolItem *tool_item)
 		need_label = TRUE;
 	}
 
-#if 0
-	if ((style == GTK_TOOLBAR_ICONS)
-	    && (button->priv->icon_widget == NULL)
-	    && (button->priv->stock_id == NULL)
-	    && button->priv->icon_name == NULL)
-	{
-		need_label = TRUE;
-		need_icon = FALSE;
-		style = GTK_TOOLBAR_TEXT;
-	}
-
-	if ((style == GTK_TOOLBAR_TEXT)
-	    && (button->priv->label_widget == NULL)
-	    && (button->priv->stock_id == NULL)
-	    && (button->priv->label_text == NULL))
-	{
-		need_label = FALSE;
-		need_icon = TRUE;
-		style = GTK_TOOLBAR_ICONS;
+	if ((style == GTK_TOOLBAR_BOTH) && (! need_label || ! need_icon)) {
+		if (need_icon && ! need_label)
+			style = GTK_TOOLBAR_ICONS;
+		else if (need_label && ! need_icon)
+			style = GTK_TOOLBAR_TEXT;
 	}
-#endif
 
 	if (need_label) {
 		if (button->priv->label_widget) {
@@ -399,6 +384,21 @@ gth_toggle_menu_tool_button_style_updated (GtkWidget *widget)
 
 
 static void
+gth_toggle_menu_tool_button_map (GtkWidget *widget)
+{
+	GthToggleMenuToolButton *button = GTH_TOGGLE_MENU_TOOL_BUTTON (widget);
+
+	GTK_WIDGET_CLASS (gth_toggle_menu_tool_button_parent_class)->map (widget);
+
+	if (gtk_menu_get_attach_widget (button->priv->menu) != NULL)
+		gtk_menu_detach (button->priv->menu);
+
+	g_object_set (button->priv->menu, "halign", button->priv->menu_halign, NULL);
+	g_object_set (button->priv->menu_button, "menu", button->priv->menu, NULL);
+}
+
+
+static void
 gth_toggle_menu_tool_button_set_property (GObject      *object,
 					  guint         prop_id,
 					  const GValue *value,
@@ -547,10 +547,12 @@ gth_toggle_menu_tool_button_create_menu_proxy (GtkToolItem *item)
 	if (menu_image != NULL)
 		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), menu_image);
 
-	g_object_ref (button->priv->menu);
-	if (gtk_menu_get_attach_widget (button->priv->menu) != NULL)
-		gtk_menu_detach (button->priv->menu);
-	gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), GTK_WIDGET (button->priv->menu));
+	if (button->priv->menu != NULL) {
+		g_object_ref (button->priv->menu);
+		if (gtk_menu_get_attach_widget (button->priv->menu) != NULL)
+			gtk_menu_detach (button->priv->menu);
+		gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), GTK_WIDGET (button->priv->menu));
+	}
 
 	gtk_tool_item_set_proxy_menu_item (item, MENU_ID, menu_item);
 
@@ -583,6 +585,7 @@ gth_toggle_menu_tool_button_class_init (GthToggleMenuToolButtonClass *klass)
 	widget_class = (GtkWidgetClass *) klass;
 	widget_class->state_changed = gth_toggle_menu_tool_button_state_changed;
 	widget_class->style_updated = gth_toggle_menu_tool_button_style_updated;
+	widget_class->map = gth_toggle_menu_tool_button_map;
 
 	tool_item_class = (GtkToolItemClass *) klass;
 	tool_item_class->create_menu_proxy = gth_toggle_menu_tool_button_create_menu_proxy;
@@ -712,6 +715,8 @@ gth_toggle_menu_tool_button_update (GtkActivatable *activatable,
 	if (! GTK_IS_TOGGLE_ACTION (action))
 		return;
 
+	g_print ("property name: %s\n", property_name);
+
 	button = GTH_TOGGLE_MENU_TOOL_BUTTON (activatable);
 
 	if (strcmp (property_name, "active") == 0) {
@@ -735,6 +740,9 @@ gth_toggle_menu_tool_button_update (GtkActivatable *activatable,
 		else if (strcmp (property_name, "menu-halign") == 0) {
 			gth_toggle_menu_tool_button_set_menu_halign (button, gth_toggle_menu_action_get_menu_halign (GTH_TOGGLE_MENU_ACTION (action)));
 		}
+		else if (strcmp (property_name, "show-arrow") == 0) {
+			gth_toggle_menu_tool_button_set_show_arrow (button, gth_toggle_menu_action_get_show_arrow (GTH_TOGGLE_MENU_ACTION (action)));
+		}
 	}
 }
 
@@ -963,9 +971,12 @@ gth_toggle_menu_tool_button_set_menu (GthToggleMenuToolButton *button,
 		if ((button->priv->menu != NULL) && gtk_widget_get_visible (GTK_WIDGET (button->priv->menu)))
 			gtk_menu_shell_deactivate (GTK_MENU_SHELL (button->priv->menu));
 
-		button->priv->menu = GTK_MENU (menu);
 		if (button->priv->menu != NULL)
-			g_object_add_weak_pointer (G_OBJECT (button->priv->menu), (gpointer *) &button->priv->menu);
+			g_object_unref (button->priv->menu);
+		button->priv->menu = g_object_ref (menu);
+
+		if (gtk_menu_get_attach_widget (button->priv->menu) != NULL)
+			gtk_menu_detach (button->priv->menu);
 
 		g_object_set (button->priv->menu, "halign", button->priv->menu_halign, NULL);
 		g_object_set (button->priv->menu_button, "menu", button->priv->menu, NULL);



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