a piece of the mega patch



Hi all,

I have extracted the pathbar part of the mega-patch from Jamie
McCracken.


laurentB.
http://home.gna.org/monkeybubble

Index: src/nautilus-spatial-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-spatial-window.c,v
retrieving revision 1.433
diff -u -r1.433 nautilus-spatial-window.c
--- src/nautilus-spatial-window.c	21 Jun 2004 18:33:43 -0000	1.433
+++ src/nautilus-spatial-window.c	23 Jul 2004 08:08:09 -0000
@@ -89,10 +89,9 @@
         guint save_geometry_timeout_id;	  
 	
 	GtkWidget *content_box;
-	GtkWidget *location_button;
-	GtkWidget *location_label;
 	GtkWidget *location_statusbar;
 
+	GtkWidget *pathbar_box;
 	GnomeVFSURI *location;
 };
 
@@ -430,151 +429,130 @@
 	}
 }
 
-
 static void
-location_menu_item_activated_callback (GtkWidget *menu_item,
-				       NautilusSpatialWindow *window)
+pathbar_button_clicked_callback	(GtkWidget *button,
+                                 GdkEventButton *event,
+                                 NautilusSpatialWindow *window)
 {
 	GnomeVFSURI *uri;
 	char *location;
-	GdkEvent *event;
 
-	uri = g_object_get_data (G_OBJECT (menu_item), "uri");
-	location = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
-	event = gtk_get_current_event();
+	if (GTK_IS_TOGGLE_BUTTON (button)) {
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button) , TRUE);
+	}
 
+	uri = g_object_get_data (G_OBJECT (button), "uri");
+	location = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
+	
 	if (!gnome_vfs_uri_equal (uri, window->details->location))
 	{
-		if (event != NULL && ((GdkEventAny *) event)->type == GDK_BUTTON_RELEASE &&
-		   (((GdkEventButton *) event)->button == 2 ||
-		   (((GdkEventButton *) event)->state & GDK_SHIFT_MASK) != 0))
+		if (event != NULL && event->type == GDK_BUTTON_PRESS &&
+		   (event->button == 2 ||
+		   (event->state & GDK_SHIFT_MASK) != 0))
 		{
 			nautilus_window_open_location (NAUTILUS_WINDOW (window), location, TRUE);
 		} else {
-			nautilus_window_open_location (NAUTILUS_WINDOW (window), location, FALSE);
+			nautilus_window_open_location (NAUTILUS_WINDOW (window), location,FALSE);
 		}
-		
-	}
-
-	if (event != NULL) {
-		gdk_event_free (event);
 	}
-
 	g_free (location);
 	
 }
 
 static void
-menu_deactivate_callback (GtkWidget *menu,
-			  gpointer   data)
+nautilus_spatial_window_set_pathbar (NautilusSpatialWindow *window, const char *location)
 {
-	GMainLoop *loop;
-
-	loop = data;
-
-	if (g_main_loop_is_running (loop)) {
-		g_main_loop_quit (loop);
+	GnomeVFSURI *uri;
+	char *name, *uri_location;
+	GtkWidget *button, *hbox, *label, *image;
+	GtkRcStyle *rc_style;
+	gboolean use_toggle_button, use_home_shortcut;
+	
+	uri = NULL;
+	if (location != NULL) {
+		uri = gnome_vfs_uri_new (location);
+	
 	}
-}
-
-static void
-menu_popup_pos (GtkMenu   *menu,
-		gint      *x,
-		gint      *y,
-		gboolean  *push_in,
-		gpointer	user_data)
-{
-	GtkWidget *widget;
-	GtkRequisition menu_requisition, button_requisition;
 
-	widget = user_data;
 
-	gtk_widget_size_request (GTK_WIDGET (menu), &menu_requisition);
-	gtk_widget_size_request (widget, &button_requisition);
-
-	gdk_window_get_origin (widget->window, x, y);
+	
+	/* deallocate existing pathbar */
+	gtk_container_foreach (GTK_CONTAINER (window->details->pathbar_box),
+			       (GtkCallback) gtk_widget_destroy,
+			       NULL);
 
-	*y -= menu_requisition.height - button_requisition.height;
+	/* use a toggle button for the current folder only */
+	use_toggle_button = TRUE;
+	while (uri != NULL) {
 
-	*push_in = TRUE;
-}
+		
+		uri_location = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD);
 
-static void
-location_button_clicked_callback (GtkWidget *widget, NautilusSpatialWindow *window)
-{
-	GtkWidget *popup, *menu_item, *first_item;
-	GnomeVFSURI *uri;
-	char *name;
-	GMainLoop *loop;
+		use_home_shortcut = (strcmp (uri_location, g_get_home_dir ())  == 0);
+		g_free (uri_location);
 
+		if (use_home_shortcut) {
+			name = g_strdup("Home");
+		} else {
+			name = g_strconcat (" ", nautilus_get_uri_shortname_for_display (uri), NULL);
+		}
 	
-	g_return_if_fail (window->details->location != NULL);
+		if (use_toggle_button) {
+			button = gtk_toggle_button_new ();
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button) , TRUE);
+			use_toggle_button = FALSE;
+		} else {
+			button = gtk_button_new ();
+		}
 
-	popup = gtk_menu_new ();
-	first_item = NULL;
-	uri = gnome_vfs_uri_ref (window->details->location);
-	while (uri != NULL) {
-		name = nautilus_get_uri_shortname_for_display (uri);
-		menu_item = gtk_image_menu_item_new_with_label (name);
-		if (first_item == NULL) {
-			first_item = menu_item;
+		rc_style = gtk_widget_get_modifier_style (button);
+		rc_style->xthickness = 0;
+		rc_style->ythickness = 0;
+		gtk_widget_modify_style (button, rc_style);
+		gtk_widget_show (button);
+
+		hbox = gtk_hbox_new (FALSE, 1);
+		gtk_container_add (GTK_CONTAINER (button), hbox);
+		gtk_widget_show (hbox);
+
+		if (use_home_shortcut) {
+			image = gtk_image_new_from_stock (GTK_STOCK_HOME, GTK_ICON_SIZE_MENU);
+			gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+			gtk_widget_show (image);
 		}
+	
+		label = gtk_label_new (name);
+		gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+		gtk_widget_show (label);
 		
+		gtk_box_pack_end (GTK_BOX (window->details->pathbar_box), button, FALSE, FALSE, 0);
+
+
 		g_free (name);
-		gtk_widget_show (menu_item);
-		g_signal_connect (menu_item, "activate",
-				  G_CALLBACK (location_menu_item_activated_callback),
+		
+		g_object_set_data_full (G_OBJECT (button), "uri", uri, (GDestroyNotify)gnome_vfs_uri_unref);
+		g_signal_connect (button, 
+			  	  "button_press_event", 
+			  	  G_CALLBACK (pathbar_button_clicked_callback),
 				  window);
-		g_object_set_data_full (G_OBJECT (menu_item), "uri", uri, (GDestroyNotify)gnome_vfs_uri_unref);
-
-		gtk_menu_shell_prepend (GTK_MENU_SHELL (popup), menu_item);
+		
+		/* don't create anymore buttons if we use the home shortcut */
+		if (use_home_shortcut) {
+			return;
+		}
 
 		uri = gnome_vfs_uri_get_parent (uri);
-	}
-	gtk_menu_set_screen (GTK_MENU (popup), gtk_widget_get_screen (widget));
-
-	loop = g_main_loop_new (NULL, FALSE);
 
-	g_signal_connect (popup, "deactivate",
-			  G_CALLBACK (menu_deactivate_callback),
-			  loop);
-
-	gtk_grab_add (popup);
-	gtk_menu_popup (GTK_MENU (popup), NULL, NULL, menu_popup_pos, widget, 1, GDK_CURRENT_TIME);
-	gtk_menu_shell_select_item (GTK_MENU_SHELL (popup), first_item);
-	g_main_loop_run (loop);
-	gtk_grab_remove (popup);
-	g_main_loop_unref (loop);
- 	gtk_object_sink (GTK_OBJECT (popup));
+	}
 }
 
 void
 nautilus_spatial_window_set_location_button  (NautilusSpatialWindow *window,
 					      const char            *location)
 {
-	GnomeVFSURI *uri;
-	char *name;
 	
-	uri = NULL;
-	if (location != NULL) {
-		uri = gnome_vfs_uri_new (location);
-	}
-	if (uri != NULL) {
-		name = nautilus_get_uri_shortname_for_display (uri);
-		gtk_label_set_label (GTK_LABEL (window->details->location_label),
-				     name);
-		g_free (name);
-		gtk_widget_set_sensitive (window->details->location_button, TRUE);
-	} else {
-		gtk_label_set_label (GTK_LABEL (window->details->location_label),
-				     "");
-		gtk_widget_set_sensitive (window->details->location_button, FALSE);
-	}
-
-	if (window->details->location != NULL) {
-		gnome_vfs_uri_unref (window->details->location);
-	}
-	window->details->location = uri;
+	nautilus_spatial_window_set_pathbar(window,location);
+	
 }
 
 static void
@@ -582,9 +560,6 @@
 {
 	GtkShadowType shadow_type;
 	GtkWidget *frame;
-	GtkRcStyle *rc_style;
-	GtkWidget *arrow;
-	GtkWidget *hbox;
 
 	window->details = g_new0 (NautilusSpatialWindowDetails, 1);
 	window->affect_spatial_window_on_next_location_change = TRUE;
@@ -601,30 +576,6 @@
 	gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (window->details->location_statusbar), 
 					   FALSE);
 
-	window->details->location_button = gtk_button_new ();
-	gtk_button_set_relief (GTK_BUTTON (window->details->location_button),
-			       GTK_RELIEF_NONE);
-	rc_style = gtk_widget_get_modifier_style (window->details->location_button);
-	rc_style->xthickness = 0;
-	rc_style->ythickness = 0;
-	gtk_widget_modify_style (window->details->location_button, 
-				 rc_style);
-
-	gtk_widget_show (window->details->location_button);
-
-	hbox = gtk_hbox_new (FALSE, 3);
-	gtk_container_add (GTK_CONTAINER (window->details->location_button), 
-			   hbox);
-	gtk_widget_show (hbox);
-	
-	window->details->location_label = gtk_label_new ("");
-	gtk_box_pack_start (GTK_BOX (hbox), window->details->location_label,
-			    FALSE, FALSE, 0);
-	gtk_widget_show (window->details->location_label);
-	
-	arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
-	gtk_box_pack_start (GTK_BOX (hbox), arrow, FALSE, FALSE, 0);
-	gtk_widget_show (arrow);
 
 	frame = gtk_frame_new (NULL);
 	gtk_widget_style_get (GTK_WIDGET (window->details->location_statusbar), 
@@ -634,14 +585,16 @@
 			    frame, TRUE, TRUE, 0);
 	gtk_widget_show (frame);
 
+	window->details->pathbar_box = gtk_hbox_new (FALSE, 1);
+	gtk_widget_show (window->details->pathbar_box);
+
 	gtk_container_add (GTK_CONTAINER (frame), 
-			   window->details->location_button);
+			   window->details->pathbar_box);
 	
-	gtk_widget_set_sensitive (window->details->location_button, FALSE);
-	g_signal_connect (window->details->location_button, 
-			  "clicked", 
-			  G_CALLBACK (location_button_clicked_callback), window);
 	gtk_widget_show (window->details->location_statusbar);
+
+
+
 }
 
 static void


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