nautilus r14365 - in trunk: . src



Author: cneumair
Date: Tue Jul 15 22:22:05 2008
New Revision: 14365
URL: http://svn.gnome.org/viewvc/nautilus?rev=14365&view=rev

Log:
2008-07-16  Christian Neumair  <cneumair gnome org>

	* src/nautilus-pathbar.c (desktop_location_changed_callback),
	(nautilus_path_bar_finalize), (reload_icons),
	(get_custom_user_icon_info), (get_type_icon_info),
	(nautilus_path_bar_update_button_appearance),
	(nautilus_path_bar_update_button_state),
	(button_data_file_changed), (make_directory_button),
	(nautilus_path_bar_check_parent_path):
	* src/nautilus-pathbar.h:
	Dynamically update buttons on file changes instead of hard-coding them
	once, both labels and icons. Refactor icon code.
	Add TODO notice about reaction to XDG directory changes.
	Comment out usage of custom icons for path bar buttons, due to
	GDK pixbuf issues when scaling down large images #80925.


Modified:
   trunk/ChangeLog
   trunk/src/nautilus-pathbar.c
   trunk/src/nautilus-pathbar.h

Modified: trunk/src/nautilus-pathbar.c
==============================================================================
--- trunk/src/nautilus-pathbar.c	(original)
+++ trunk/src/nautilus-pathbar.c	Tue Jul 15 22:22:05 2008
@@ -135,8 +135,8 @@
 static void     nautilus_path_bar_screen_changed           (GtkWidget       *widget,
 							    GdkScreen       *previous_screen);
 static void     nautilus_path_bar_check_icon_theme         (NautilusPathBar *path_bar);
-static void     nautilus_path_bar_update_button_appearance (NautilusPathBar *path_bar,
-							    ButtonData      *button_data,
+static void     nautilus_path_bar_update_button_appearance (ButtonData      *button_data);
+static void     nautilus_path_bar_update_button_state      (ButtonData      *button_data,
 							    gboolean         current_dir);
 static gboolean nautilus_path_bar_update_path              (NautilusPathBar *path_bar,
 							    GFile           *file_path);
@@ -192,11 +192,6 @@
 	path_bar->desktop_path = nautilus_get_desktop_location ();
 	path_bar->home_path = g_file_new_for_path (g_get_home_dir ());
 	desktop_is_home = g_file_equal (path_bar->home_path, path_bar->desktop_path);
-
-        if (path_bar->home_icon) {
-                g_object_unref (path_bar->home_icon);
-                path_bar->home_icon = NULL;
-        }
 	
 	update_button_types (path_bar);
 }
@@ -431,19 +426,6 @@
 		path_bar->desktop_path = NULL;
 	}
 
-	if (path_bar->root_icon) {
-		g_object_unref (path_bar->root_icon);
-		path_bar->root_icon = NULL;
-	}
-	if (path_bar->home_icon) {
-                g_object_unref (path_bar->home_icon);
-		path_bar->home_icon = NULL;
-	}
-	if (path_bar->desktop_icon) {
-		g_object_unref (path_bar->desktop_icon);
-		path_bar->desktop_icon = NULL;
-	}
-
 	g_signal_handlers_disconnect_by_func (nautilus_trash_monitor_get (),
 					      trash_state_changed_cb, path_bar);
 
@@ -1045,28 +1027,12 @@
 {
         GList *list;
 
-        if (path_bar->root_icon) {
-                g_object_unref (path_bar->root_icon);
-                path_bar->root_icon = NULL;
-        }
-        if (path_bar->home_icon) {
-                g_object_unref (path_bar->home_icon);
-                path_bar->home_icon = NULL;
-        }
-        if (path_bar->desktop_icon) {
-                g_object_unref (path_bar->desktop_icon);
-                path_bar->desktop_icon = NULL;
-        }
-
-
         for (list = path_bar->button_list; list; list = list->next) {
                 ButtonData *button_data;
-                gboolean current_dir;
 
                 button_data = BUTTON_DATA (list->data);
-		if (button_data->type != NORMAL_BUTTON) {
-                	current_dir = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_data->button));
-                	nautilus_path_bar_update_button_appearance (path_bar, button_data, current_dir);
+		if (button_data->type != NORMAL_BUTTON || button_data->is_base_dir) {
+                	nautilus_path_bar_update_button_appearance (button_data);
 		}
 
         }
@@ -1152,64 +1118,68 @@
         g_signal_emit (path_bar, path_bar_signals [PATH_CLICKED], 0, button_data->path);
 }
 
-static GdkPixbuf *
-get_icon_for_file_path (GFile *location, const char *NAUTILUS_ICON_FOLDER_name)
+static NautilusIconInfo *
+get_custom_user_icon_info (ButtonData *button_data)
 {
-	NautilusFile *file;
-	NautilusIconInfo *info;
-	GdkPixbuf *pixbuf;
+/* Bug 80925: With tiny display sizes we get huge memory allocations. */
+#if 0
+	NautilusIconInfo *icon_info;
+	GFile *icon_file;
+	GIcon *icon;
+	char *custom_icon_uri;
 
-	file = nautilus_file_get (location);
-	
-	if (file != NULL &&
-	    nautilus_file_check_if_ready (file,
-					  NAUTILUS_FILE_ATTRIBUTES_FOR_ICON)) {
-		info = nautilus_file_get_icon (file, NAUTILUS_PATH_BAR_ICON_SIZE, 0);
-		pixbuf = nautilus_icon_info_get_pixbuf_at_size (info, NAUTILUS_PATH_BAR_ICON_SIZE);
-		g_object_unref (info);
-		return pixbuf;
+	icon = NULL;
+
+	if (button_data->file != NULL) {
+		custom_icon_uri = nautilus_file_get_custom_icon (button_data->file);
+		if (custom_icon_uri != NULL) {
+			icon_file = g_file_new_for_uri (custom_icon_uri);
+
+			if (g_file_is_native (icon_file)) {
+				icon = g_file_icon_new (icon_file);
+			}
+
+			g_object_unref (icon_file);
+			g_free (custom_icon_uri);
+		}
 	}
 
-	nautilus_file_unref (file);
-
-	info = nautilus_icon_info_lookup_from_name (NAUTILUS_ICON_FOLDER_name, NAUTILUS_PATH_BAR_ICON_SIZE);
-	pixbuf = nautilus_icon_info_get_pixbuf_at_size (info, NAUTILUS_PATH_BAR_ICON_SIZE);
-	g_object_unref (info);
-	
-	return pixbuf;
+	if (icon != NULL) {
+		icon_info = nautilus_icon_info_lookup (icon, NAUTILUS_PATH_BAR_ICON_SIZE);
+		g_object_unref (icon);
+
+		return icon_info;
+	}
+#endif
+
+	return NULL;
 }
 
-static GdkPixbuf *
-get_button_image (NautilusPathBar *path_bar,
-		  ButtonType  button_type)
+static NautilusIconInfo *
+get_type_icon_info (ButtonData *button_data)
 {
-	switch (button_type)
+	switch (button_data->type)
         {
 		case ROOT_BUTTON:
-			if (path_bar->root_icon != NULL) {
-				return path_bar->root_icon;
-                       	}
-
-			path_bar->root_icon = get_icon_for_file_path (path_bar->root_path, NAUTILUS_ICON_FILESYSTEM);
-			return path_bar->root_icon;
+			return nautilus_icon_info_lookup_from_name (NAUTILUS_ICON_FILESYSTEM,
+								    NAUTILUS_PATH_BAR_ICON_SIZE);
 
 		case HOME_BUTTON:
-		      	if (path_bar->home_icon != NULL) {
-		      		return path_bar->home_icon;
-			}
-
-			path_bar->home_icon = get_icon_for_file_path (path_bar->root_path, NAUTILUS_ICON_HOME);
-			return path_bar->home_icon;
+			return nautilus_icon_info_lookup_from_name (NAUTILUS_ICON_HOME,
+								    NAUTILUS_PATH_BAR_ICON_SIZE);
 
                 case DESKTOP_BUTTON:
-                      	if (path_bar->desktop_icon != NULL) {
-				return path_bar->desktop_icon;
+			return nautilus_icon_info_lookup_from_name (NAUTILUS_ICON_DESKTOP,
+								    NAUTILUS_PATH_BAR_ICON_SIZE);
+
+                case NORMAL_BUTTON:
+			if (button_data->is_base_dir) {
+				return nautilus_icon_info_lookup_from_name (NAUTILUS_ICON_FOLDER,
+									    NAUTILUS_PATH_BAR_ICON_SIZE);
 			}
-			path_bar->desktop_icon = get_icon_for_file_path (path_bar->root_path, NAUTILUS_ICON_DESKTOP);
-      			return path_bar->desktop_icon;
 
 	    	default:
-                       return NULL;
+			return NULL;
         }
   
        	return NULL;
@@ -1274,15 +1244,14 @@
 }
 
 static void
-nautilus_path_bar_update_button_appearance (NautilusPathBar *path_bar,
-				            ButtonData *button_data,
-				            gboolean    current_dir)
+nautilus_path_bar_update_button_appearance (ButtonData *button_data)
 {
+	NautilusIconInfo *icon_info;
+	GdkPixbuf *pixbuf;
         const gchar *dir_name = get_dir_name (button_data);
-	
 
         if (button_data->label != NULL) {
-                if (current_dir) {
+                if (gtk_label_get_use_markup (GTK_LABEL (button_data->label))) {
 			char *markup;
 
 	  		markup = g_markup_printf_escaped ("<b>%s</b>", dir_name);
@@ -1294,19 +1263,44 @@
         }
 
         if (button_data->image != NULL) {
-		if (button_data->type == MOUNT_BUTTON || (button_data->type == NORMAL_BUTTON && button_data->is_base_dir) ) {
-	
-			/* set custom icon for roots */
-			if (button_data->custom_icon) {
-				gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), button_data->custom_icon);  
-			}
+		if (button_data->custom_icon) {
+			gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), button_data->custom_icon);  
+			gtk_widget_show (GTK_WIDGET (button_data->image));
 		} else {
-	                GdkPixbuf *pixbuf;
-	                pixbuf = get_button_image (path_bar, button_data->type);
-       	        	gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), pixbuf);
+			icon_info = get_custom_user_icon_info (button_data);
+			if (icon_info == NULL) {
+				icon_info = get_type_icon_info (button_data);
+			}
+
+			pixbuf = NULL;
+
+			if (icon_info != NULL) {
+				pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, NAUTILUS_PATH_BAR_ICON_SIZE);
+				g_object_unref (icon_info);
+			}
+
+			if (pixbuf != NULL) {
+				gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), pixbuf);
+				gtk_widget_show (GTK_WIDGET (button_data->image));
+				g_object_unref (pixbuf);
+			} else {
+				gtk_widget_hide (GTK_WIDGET (button_data->image));
+			}
 		}
         }
 
+}
+
+static void
+nautilus_path_bar_update_button_state (ButtonData *button_data,
+				       gboolean    current_dir)
+{
+	if (button_data->label != NULL) {
+		g_object_set (button_data->label, "use-markup", current_dir, NULL);
+	}
+
+	nautilus_path_bar_update_button_appearance (button_data);
+
         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_data->button)) != current_dir) {
                 button_data->ignore_changes = TRUE;
                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button_data->button), current_dir);
@@ -1447,24 +1441,23 @@
 button_data_file_changed (NautilusFile *file,
 			  ButtonData *button_data)
 {
+	GFile *location;
 	char *display_name;
-	char *markup;
+
+	location = nautilus_file_get_location (file);
+	if (!g_file_equal (button_data->path, location)) {
+		button_data->path = g_object_ref (location);
+	}
+	g_object_unref (location);
 
 	display_name = nautilus_file_get_display_name (file);
-	if (!eel_strcmp (display_name, button_data->dir_name)) {
+	if (eel_strcmp (display_name, button_data->dir_name) != 0) {
 		g_free (button_data->dir_name);
 		button_data->dir_name = g_strdup (display_name);
-
-		/* keep in sync with nautilus_path_bar_update_button_appearance()
-		 */
-		if (gtk_label_get_use_markup (GTK_LABEL (button_data->label))) {
-	  		markup = g_markup_printf_escaped ("<b>%s</b>", button_data->dir_name);
-	  		gtk_label_set_markup (GTK_LABEL (button_data->label), markup);
-	  		g_free (markup);
-		} else {
-			gtk_label_set_text (GTK_LABEL (button_data->label), button_data->dir_name);
-		}
 	}
+
+	nautilus_path_bar_update_button_appearance (button_data);
+
 	g_free (display_name);
 }
 
@@ -1492,19 +1485,20 @@
         button_data->type = find_button_type (path_bar, path, button_data);
         button_data->button = gtk_toggle_button_new ();
 	gtk_button_set_focus_on_click (GTK_BUTTON (button_data->button), FALSE);
+	/* TODO update button type when xdg directories change */
 
 	button_data->drag_info.target_location = g_object_ref (path);
-	
+
+	button_data->image = gtk_image_new ();
+
         switch (button_data->type) {
                 case ROOT_BUTTON:
-                        button_data->image = gtk_image_new ();
                         child = button_data->image;
                         button_data->label = NULL;
                         break;
                 case HOME_BUTTON:
                 case DESKTOP_BUTTON:
 		case MOUNT_BUTTON:
-                        button_data->image = gtk_image_new ();
                         button_data->label = gtk_label_new (NULL);
                         label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
                         gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
@@ -1514,24 +1508,13 @@
                         break;
 		case NORMAL_BUTTON:
     		default:
-			if (base_dir) {
-	                        button_data->image = gtk_image_new ();
-        	                button_data->label = gtk_label_new (NULL);
-        	                label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
-        	                gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
-        	                child = gtk_hbox_new (FALSE, 2);
-        	                gtk_box_pack_start (GTK_BOX (child), button_data->image, FALSE, FALSE, 0);
-        	                gtk_box_pack_start (GTK_BOX (child), label_alignment, FALSE, FALSE, 0);
-				button_data->is_base_dir = TRUE;
-				button_data->custom_icon = get_icon_for_file_path (path, NAUTILUS_ICON_FOLDER);
-			} else {
-				button_data->is_base_dir = FALSE;
-	      			button_data->label = gtk_label_new (NULL);
-      				label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
-      				gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
-      				child = label_alignment;
-      				button_data->image = NULL;
-			}
+			button_data->label = gtk_label_new (NULL);
+			label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+			gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
+			child = gtk_hbox_new (FALSE, 2);
+			gtk_box_pack_start (GTK_BOX (child), button_data->image, FALSE, FALSE, 0);
+			gtk_box_pack_start (GTK_BOX (child), label_alignment, FALSE, FALSE, 0);
+			button_data->is_base_dir = base_dir;
         }
 
   	/* label_alignment is created because we can't override size-request
@@ -1563,7 +1546,7 @@
         gtk_container_add (GTK_CONTAINER (button_data->button), child);
         gtk_widget_show_all (button_data->button);
 
-        nautilus_path_bar_update_button_appearance (path_bar, button_data, current_dir);
+        nautilus_path_bar_update_button_state (button_data, current_dir);
 
         g_signal_connect (button_data->button, "clicked", G_CALLBACK (button_clicked_cb), button_data);
         g_object_weak_ref (G_OBJECT (button_data->button), (GWeakNotify) button_data_free, button_data);
@@ -1619,9 +1602,8 @@
 
                 for (list = path_bar->button_list; list; list = list->next) {
 
-	  		nautilus_path_bar_update_button_appearance (path_bar,
-					  			    BUTTON_DATA (list->data),
-						                    (list == current_path) ? TRUE : FALSE);
+	  		nautilus_path_bar_update_button_state (BUTTON_DATA (list->data),
+							       (list == current_path) ? TRUE : FALSE);
 		}
 
                 if (!gtk_widget_get_child_visible (BUTTON_DATA (current_path->data)->button)) {

Modified: trunk/src/nautilus-pathbar.h
==============================================================================
--- trunk/src/nautilus-pathbar.h	(original)
+++ trunk/src/nautilus-pathbar.h	Tue Jul 15 22:22:05 2008
@@ -43,10 +43,6 @@
 	GFile *home_path;
 	GFile *desktop_path;
 
-	GdkPixbuf *root_icon;
-	GdkPixbuf *home_icon;
-	GdkPixbuf *desktop_icon;
-
 	GList *button_list;
 	GList *first_scrolled_button;
 	GList *fake_root;



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