nautilus r14003 - in trunk: . libnautilus-private src src/file-manager



Author: cneumair
Date: Sat Mar 29 21:21:47 2008
New Revision: 14003
URL: http://svn.gnome.org/viewvc/nautilus?rev=14003&view=rev

Log:
2008-03-29  Christian Neumair  <cneumair gnome org>

	* libnautilus-private/apps_nautilus_preferences.schemas.in:
	* libnautilus-private/nautilus-global-preferences.c
	(nautilus_global_preferences_get_default_folder_viewer_preference_a
	s_iid):
	* libnautilus-private/nautilus-global-preferences.h:
	* libnautilus-private/nautilus-icon-canvas-item.c
	(create_label_layout),
	(nautilus_icon_canvas_item_get_max_text_width):
	* libnautilus-private/nautilus-icon-container.c
	(lay_down_one_column), (get_max_icon_dimensions),
	(lay_down_icons_vertical), (lay_down_icons_vertical_desktop),
	(lay_down_icons), (size_allocate),
	(nautilus_icon_container_update_icon),
	(nautilus_icon_container_set_layout_mode),
	(nautilus_icon_container_start_renaming_selected_item),
	(nautilus_icon_container_set_forced_icon_size),
	(nautilus_icon_container_set_all_columns_same_width):
	* libnautilus-private/nautilus-icon-container.h:
	* libnautilus-private/nautilus-icon-private.h:
	* libnautilus-private/nautilus-metadata.h:
	* src/file-manager/fm-icon-container.c
	(fm_icon_container_get_icon_images),
	(fm_icon_container_get_icon_text):
	* src/file-manager/fm-icon-view.c
	(get_stored_icon_position_callback),
	(fm_icon_view_supports_manual_layout),
	(fm_icon_view_supports_tighter_layout), (update_layout_menus),
	(fm_icon_view_real_set_directory_sort_reversed),
	(fm_icon_view_get_directory_auto_layout),
	(fm_icon_view_real_get_directory_auto_layout),
	(fm_icon_view_set_directory_auto_layout),
	(fm_icon_view_real_set_directory_auto_layout),
	(fm_icon_view_real_set_directory_tighter_layout),
	(real_supports_manual_layout), (get_default_zoom_level),
	(set_labels_beside_icons), (set_columns_same_width),
	(fm_icon_view_begin_loading), (fm_icon_view_set_zoom_level),
	(fm_icon_view_zoom_to_level),
	(fm_icon_view_restore_default_zoom_level),
	(default_zoom_level_changed_callback),
	(all_columns_same_width_changed_callback),
	(fm_icon_view_set_property), (fm_icon_view_class_init),
	(fm_icon_view_get_id), (fm_icon_view_init), (fm_icon_view_create),
	(fm_compact_view_create), (fm_icon_view_is_compact),
	(fm_icon_view_register):
	* src/file-manager/fm-icon-view.h:
	* src/nautilus-file-management-properties.c
	(nautilus_file_management_properties_dialog_setup):
	* src/nautilus-file-management-properties.glade:
	Added compact view.


Modified:
   trunk/ChangeLog
   trunk/libnautilus-private/apps_nautilus_preferences.schemas.in
   trunk/libnautilus-private/nautilus-global-preferences.c
   trunk/libnautilus-private/nautilus-global-preferences.h
   trunk/libnautilus-private/nautilus-icon-canvas-item.c
   trunk/libnautilus-private/nautilus-icon-container.c
   trunk/libnautilus-private/nautilus-icon-container.h
   trunk/libnautilus-private/nautilus-icon-private.h
   trunk/libnautilus-private/nautilus-metadata.h
   trunk/src/file-manager/fm-icon-container.c
   trunk/src/file-manager/fm-icon-view.c
   trunk/src/file-manager/fm-icon-view.h
   trunk/src/nautilus-file-management-properties.c
   trunk/src/nautilus-file-management-properties.glade

Modified: trunk/libnautilus-private/apps_nautilus_preferences.schemas.in
==============================================================================
--- trunk/libnautilus-private/apps_nautilus_preferences.schemas.in	(original)
+++ trunk/libnautilus-private/apps_nautilus_preferences.schemas.in	Sat Mar 29 21:21:47 2008
@@ -532,8 +532,8 @@
          <short>Default folder viewer</short>
          <long>
 	 When a folder is visited this viewer is used unless you have selected
-	 another view for that particular folder. Possible values are "list_view"
-	 and "icon_view".
+	 another view for that particular folder. Possible values are "list_view",
+	 "icon_view" and "compact_view".
          </long>
       </locale>
     </schema>
@@ -663,6 +663,36 @@
          </long>
       </locale>
     </schema>    
+
+   <!-- Icon View -->
+    <schema>
+      <key>/schemas/apps/nautilus/compact_view/default_zoom_level</key>
+      <applyto>/apps/nautilus/compact_view/default_zoom_level</applyto>
+      <owner>nautilus</owner>
+      <type>string</type>
+      <default>standard</default>
+      <locale name="C">
+         <short>Default compact view zoom level</short>
+         <long>
+             Default zoom level used by the compact view.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/nautilus/compact_view/all_columns_have_same_width</key>
+      <applyto>/apps/nautilus/compact_view/all_columns_have_same_width</applyto>
+      <owner>nautilus</owner>
+      <type>string</type>
+      <default>standard</default>
+      <locale name="C">
+         <short>All columns have same width</short>
+         <long>
+             If this preference is set, all columns in the compact view have the same
+	     width. Otherwise, the width of each column is determined seperately.
+         </long>
+      </locale>
+    </schema>
     
     <!-- List View -->
 

Modified: trunk/libnautilus-private/nautilus-global-preferences.c
==============================================================================
--- trunk/libnautilus-private/nautilus-global-preferences.c	(original)
+++ trunk/libnautilus-private/nautilus-global-preferences.c	Sat Mar 29 21:21:47 2008
@@ -137,6 +137,7 @@
 
 static EelEnumerationEntry default_folder_viewer_enum_entries[] = {
 	{ "icon_view",	    N_("Icon View"),	NAUTILUS_DEFAULT_FOLDER_VIEWER_ICON_VIEW },
+	{ "compact_view",   N_("Compact View"),	NAUTILUS_DEFAULT_FOLDER_VIEWER_COMPACT_VIEW },
 	{ "list_view",	    N_("List View"),	NAUTILUS_DEFAULT_FOLDER_VIEWER_LIST_VIEW }
 };
 
@@ -415,6 +416,14 @@
 	  PREFERENCE_INTEGER,
 	  GINT_TO_POINTER (96)
 	},
+
+	/* Compact Icon View Default Preferences */
+	{ NAUTILUS_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL,
+	  PREFERENCE_STRING,
+	  "standard",
+	  NULL, NULL,
+	  "default_zoom_level"
+	},
 	
 	/* List View Default Preferences */
 	{ NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_SORT_ORDER,
@@ -706,6 +715,8 @@
 
 	if (preference_value == NAUTILUS_DEFAULT_FOLDER_VIEWER_LIST_VIEW) {
 		viewer_iid = NAUTILUS_LIST_VIEW_IID;
+	} else if (preference_value == NAUTILUS_DEFAULT_FOLDER_VIEWER_COMPACT_VIEW) {
+		viewer_iid = NAUTILUS_COMPACT_VIEW_IID;
 	} else {
 		viewer_iid = NAUTILUS_ICON_VIEW_IID;
 	}

Modified: trunk/libnautilus-private/nautilus-global-preferences.h
==============================================================================
--- trunk/libnautilus-private/nautilus-global-preferences.h	(original)
+++ trunk/libnautilus-private/nautilus-global-preferences.h	Sat Mar 29 21:21:47 2008
@@ -109,13 +109,15 @@
 enum
 {
 	NAUTILUS_DEFAULT_FOLDER_VIEWER_ICON_VIEW,
+	NAUTILUS_DEFAULT_FOLDER_VIEWER_COMPACT_VIEW,
 	NAUTILUS_DEFAULT_FOLDER_VIEWER_LIST_VIEW,
 	NAUTILUS_DEFAULT_FOLDER_VIEWER_OTHER
 };
 
 /* These IIDs are used by the preferences code and in nautilus-application.c */
-#define NAUTILUS_ICON_VIEW_IID	     "OAFIID:Nautilus_File_Manager_Icon_View"
-#define NAUTILUS_LIST_VIEW_IID	     "OAFIID:Nautilus_File_Manager_List_View"
+#define NAUTILUS_ICON_VIEW_IID		"OAFIID:Nautilus_File_Manager_Icon_View"
+#define NAUTILUS_COMPACT_VIEW_IID	"OAFIID:Nautilus_File_Manager_Compact_View"
+#define NAUTILUS_LIST_VIEW_IID		"OAFIID:Nautilus_File_Manager_List_View"
 
 
 /* Icon View */
@@ -143,6 +145,10 @@
 /* The default size for thumbnail icons */
 #define NAUTILUS_PREFERENCES_ICON_VIEW_THUMBNAIL_SIZE			"icon_view/thumbnail_size"
 
+/* Compact View */
+#define NAUTILUS_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL		"compact_view/default_zoom_level"
+#define NAUTILUS_PREFERENCES_COMPACT_VIEW_ALL_COLUMNS_SAME_WIDTH	"compact_view/all_columns_same_width"
+
 /* List View */
 #define NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_SORT_IN_REVERSE_ORDER	"list_view/default_sort_in_reverse_order"
 #define NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_SORT_ORDER		"list_view/default_sort_order"

Modified: trunk/libnautilus-private/nautilus-icon-canvas-item.c
==============================================================================
--- trunk/libnautilus-private/nautilus-icon-canvas-item.c	(original)
+++ trunk/libnautilus-private/nautilus-icon-canvas-item.c	Sat Mar 29 21:21:47 2008
@@ -62,6 +62,7 @@
 #define MAX_TEXT_WIDTH_STANDARD 135
 #define MAX_TEXT_WIDTH_TIGHTER 80
 #define MAX_TEXT_WIDTH_BESIDE 90
+#define MAX_TEXT_WIDTH_BESIDE_TOP_TO_BOTTOM 300
 
 /* Private part of the NautilusIconCanvasItem structure. */
 struct NautilusIconCanvasItemDetails {
@@ -1816,6 +1817,11 @@
 	 (g_ascii_isdigit (*(p+1)) && \
 	  g_ascii_isdigit (*(p+2))))
 
+#define IS_COMPACT_VIEW(container) \
+        container->details->layout_mode == NAUTILUS_ICON_LAYOUT_T_B_L_R && \
+        container->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE
+
+
 static PangoLayout *
 create_label_layout (NautilusIconCanvasItem *item,
 		     const char *text)
@@ -1872,6 +1878,9 @@
 
 	pango_layout_set_spacing (layout, LABEL_LINE_SPACING);
 	pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR);
+	if (IS_COMPACT_VIEW (container)) {
+		pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
+	}
 
 	/* Create a font description */
 	if (container->details->font) {
@@ -2424,14 +2433,19 @@
 nautilus_icon_canvas_item_get_max_text_width (NautilusIconCanvasItem *item)
 {
 	EelCanvasItem *canvas_item;
-	
+
 	canvas_item = EEL_CANVAS_ITEM (item);
 	if (nautilus_icon_container_is_tighter_layout (NAUTILUS_ICON_CONTAINER (canvas_item->canvas))) {
 		return MAX_TEXT_WIDTH_TIGHTER * canvas_item->canvas->pixels_per_unit;
 	} else {
 				
                 if (NAUTILUS_ICON_CONTAINER (canvas_item->canvas)->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE) {
-			return MAX_TEXT_WIDTH_BESIDE * canvas_item->canvas->pixels_per_unit;
+			if (NAUTILUS_ICON_CONTAINER (canvas_item->canvas)->details->layout_mode == NAUTILUS_ICON_LAYOUT_T_B_L_R ||
+			    NAUTILUS_ICON_CONTAINER (canvas_item->canvas)->details->layout_mode == NAUTILUS_ICON_LAYOUT_T_B_R_L) {
+				return MAX_TEXT_WIDTH_BESIDE_TOP_TO_BOTTOM * canvas_item->canvas->pixels_per_unit;
+			} else {
+				return MAX_TEXT_WIDTH_BESIDE * canvas_item->canvas->pixels_per_unit;
+			}
                 } else {
 			return MAX_TEXT_WIDTH_STANDARD * canvas_item->canvas->pixels_per_unit;
                 }

Modified: trunk/libnautilus-private/nautilus-icon-container.c
==============================================================================
--- trunk/libnautilus-private/nautilus-icon-container.c	(original)
+++ trunk/libnautilus-private/nautilus-icon-container.c	Sat Mar 29 21:21:47 2008
@@ -1001,6 +1001,40 @@
 }
 
 static void
+lay_down_one_column (NautilusIconContainer *container,
+		     GList *line_start,
+		     GList *line_end,
+		     double x,
+		     double y_start,
+		     double y_iter,
+		     GArray *positions)
+{
+	GList *p;
+	NautilusIcon *icon;
+	double y;
+	IconPositions *position;
+	int i;
+
+	/* FIXME: Should layout differently when in RTL base mode */
+
+	/* Lay out the icons along the baseline. */
+	y = y_start;
+	i = 0;
+	for (p = line_start; p != line_end; p = p->next) {
+		icon = p->data;
+
+		position = &g_array_index (positions, IconPositions, i++);
+
+		icon_set_position
+			(icon,
+			 x + position->x_offset,
+			 y + position->y_offset);
+
+		y += y_iter;
+	}
+}
+
+static void
 lay_down_icons_horizontal (NautilusIconContainer *container,
 			   GList *icons,
 			   double start_y)
@@ -1162,6 +1196,160 @@
 }
 
 static void
+get_max_icon_dimensions (GList *icon_start,
+			 GList *icon_end,
+			 double *max_icon_width,
+			 double *max_icon_height,
+			 double *max_text_width,
+			 double *max_text_height)
+{
+	NautilusIcon *icon;
+	EelDRect icon_bounds;
+	EelDRect text_bounds;
+	GList *p;
+
+	*max_icon_width = *max_text_width = 0.0;
+	*max_icon_height = *max_text_height = 0.0;
+
+	/* Would it be worth caching these bounds for the next loop? */
+	for (p = icon_start; p != icon_end; p = p->next) {
+		icon = p->data;
+
+		icon_bounds = nautilus_icon_canvas_item_get_icon_rectangle (icon->item);
+		*max_icon_width = MAX (*max_icon_width, ceil (icon_bounds.x1 - icon_bounds.x0));
+		*max_icon_height = MAX (*max_icon_height, ceil (icon_bounds.y1 - icon_bounds.y0));
+
+		text_bounds = nautilus_icon_canvas_item_get_text_rectangle (icon->item);
+		*max_text_width = MAX (*max_text_width, ceil (text_bounds.x1 - text_bounds.x0));
+		*max_text_height = MAX (*max_text_height, ceil (text_bounds.y1 - text_bounds.y0));
+	}
+}
+
+/* column-wise layout. At the moment, this only works with label-beside-icon (used by "Compact View"). */
+static void
+lay_down_icons_vertical (NautilusIconContainer *container,
+			 GList *icons,
+			 double start_y)
+{
+	GList *p, *line_start;
+	NautilusIcon *icon;
+	double canvas_width, x, canvas_height;
+	GArray *positions;
+	IconPositions *position;
+	EelDRect icon_bounds;
+	EelDRect text_bounds;
+	EelCanvasItem *item;
+
+	double line_height;
+
+	double max_height;
+	double max_height_with_borders;
+	double max_width;
+	double max_width_in_column;
+
+	double max_text_width, max_icon_width;
+	double max_text_height, max_icon_height;
+	int height;
+	int i;
+
+	g_assert (NAUTILUS_IS_ICON_CONTAINER (container));
+	g_assert (container->details->label_position == NAUTILUS_ICON_LABEL_POSITION_BESIDE);
+
+	if (icons == NULL) {
+		return;
+	}
+
+	positions = g_array_new (FALSE, FALSE, sizeof (IconPositions));
+
+	/* Lay out icons a column at a time. */
+	canvas_width = CANVAS_WIDTH(container);
+	canvas_height = CANVAS_HEIGHT(container);
+
+	max_icon_width = max_text_width = 0.0;
+	max_icon_height = max_text_height = 0.0;
+
+	get_max_icon_dimensions (icons, NULL,
+				 &max_icon_width, &max_icon_height,
+				 &max_text_width, &max_text_height);
+
+	max_width = max_icon_width + max_text_width;
+	max_height = MAX (max_icon_height, max_text_height);
+	max_height_with_borders = ICON_PAD_TOP + max_height + ICON_PAD_BOTTOM;
+
+	line_height = ICON_PAD_TOP;
+	line_start = icons;
+	x = 0;
+	i = 0;
+
+	max_width_in_column = 0.0;
+
+	for (p = icons; p != NULL; p = p->next) {
+		icon = p->data;
+		item = EEL_CANVAS_ITEM (icon->item);
+
+		/* If this icon doesn't fit, it's time to lay out the column that's queued up. */
+		if (line_start != p && line_height + max_height_with_borders + ICON_PAD_BOTTOM > canvas_height ) {
+			x += ICON_PAD_LEFT;
+
+			/* correctly set (per-column) width */
+			if (!container->details->all_columns_same_width) {
+				for (i = 0; i < (int) positions->len; i++) {
+					position = &g_array_index (positions, IconPositions, i);
+					position->width = max_width_in_column;
+				}
+			}
+
+			lay_down_one_column (container, line_start, p, x, CONTAINER_PAD_TOP, max_height_with_borders, positions);
+
+			/* Advance to next column. */
+			if (container->details->all_columns_same_width) {
+				x += max_width + ICON_PAD_RIGHT;
+			} else {
+				x += max_width_in_column + ICON_PAD_RIGHT;
+			}
+
+			line_height = ICON_PAD_TOP;
+			line_start = p;
+			i = 0;
+
+			max_width_in_column = 0;
+		}
+
+		icon_bounds = nautilus_icon_canvas_item_get_icon_rectangle (icon->item);
+		text_bounds = nautilus_icon_canvas_item_get_text_rectangle (icon->item);
+
+		max_width_in_column = MAX (max_width_in_column,
+					   ceil (icon_bounds.x1 - icon_bounds.x0) +
+					   ceil (text_bounds.x1 - text_bounds.x0));
+
+		g_array_set_size (positions, i + 1);
+		position = &g_array_index (positions, IconPositions, i++);
+		if (container->details->all_columns_same_width) {
+			position->width = max_width;
+		}
+		position->height = max_height;
+		position->y_offset = ICON_PAD_TOP;
+		position->x_offset = ICON_PAD_LEFT;
+
+		position->x_offset += max_icon_width - ceil (icon_bounds.x1 - icon_bounds.x0);
+
+		height = MAX (ceil (icon_bounds.y1 - icon_bounds.y0), ceil(text_bounds.y1 - text_bounds.y0));
+		position->y_offset += (max_height - height) / 2;
+
+		/* Add this icon. */
+		line_height += max_height_with_borders;
+	}
+
+	/* Lay down that last column of icons. */
+	if (line_start != NULL) {
+		x += ICON_PAD_LEFT;
+		lay_down_one_column (container, line_start, NULL, x, CONTAINER_PAD_TOP, max_height_with_borders, positions);
+	}
+
+	g_array_free (positions, TRUE);
+}
+
+static void
 snap_position (NautilusIconContainer *container,
 	       NautilusIcon *icon,
 	       int *x, int *y)
@@ -1488,7 +1676,7 @@
 }
 
 static void
-lay_down_icons_vertical (NautilusIconContainer *container, GList *icons)
+lay_down_icons_vertical_desktop (NautilusIconContainer *container, GList *icons)
 {
 	GList *p, *placed_icons, *unplaced_icons;
 	int total, new_length, placed;
@@ -1669,7 +1857,11 @@
 		
 	case NAUTILUS_ICON_LAYOUT_T_B_L_R:
 	case NAUTILUS_ICON_LAYOUT_T_B_R_L:
-		lay_down_icons_vertical (container, icons);
+		if (nautilus_icon_container_get_is_desktop (container)) {
+			lay_down_icons_vertical_desktop (container, icons);
+		} else {
+			lay_down_icons_vertical (container, icons, start_y);
+		}
 		break;
 		
 	default:
@@ -3157,6 +3349,10 @@
 		need_layout_redone = TRUE;
 	}
 
+	if (allocation->height != widget->allocation.height) {
+		need_layout_redone = TRUE;
+	}
+
 	GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
 
 	container->details->has_been_allocated = TRUE;
@@ -5768,9 +5964,14 @@
 	/* compute the maximum size based on the scale factor */
 	min_image_size = MINIMUM_IMAGE_SIZE * EEL_CANVAS (container)->pixels_per_unit;
 	max_image_size = MAX (MAXIMUM_IMAGE_SIZE * EEL_CANVAS (container)->pixels_per_unit, NAUTILUS_ICON_MAXIMUM_SIZE);
-		
+
 	/* Get the appropriate images for the file. */
-	icon_get_size (container, icon, &icon_size);
+	if (container->details->forced_icon_size > 0) {
+		icon_size = container->details->forced_icon_size;
+	} else {
+		icon_get_size (container, icon, &icon_size);
+	}
+
 
 	icon_size = MAX (icon_size, min_image_size);
 	icon_size = MIN (icon_size, max_image_size);
@@ -5787,7 +5988,10 @@
 							     &has_open_window);
 
 
-	pixbuf = nautilus_icon_info_get_pixbuf (icon_info);
+	if (container->details->forced_icon_size > 0)
+		pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
+	else
+		pixbuf = nautilus_icon_info_get_pixbuf (icon_info);
 	nautilus_icon_info_get_attach_points (icon_info, &attach_points, &n_attach_points);
 	has_embedded_text_rect = nautilus_icon_info_get_embedded_rect (icon_info,
 								       &embedded_text_rect);
@@ -6803,6 +7007,7 @@
 	g_return_if_fail (NAUTILUS_IS_ICON_CONTAINER (container));
 
 	container->details->layout_mode = mode;
+	invalidate_label_sizes (container);
 
 	redo_layout (container);
 
@@ -7022,7 +7227,11 @@
 		eel_editable_label_set_line_wrap (EEL_EDITABLE_LABEL (details->rename_widget), TRUE);
 		eel_editable_label_set_line_wrap_mode (EEL_EDITABLE_LABEL (details->rename_widget), PANGO_WRAP_WORD_CHAR);
 		eel_editable_label_set_draw_outline (EEL_EDITABLE_LABEL (details->rename_widget), TRUE);
-		eel_editable_label_set_justify (EEL_EDITABLE_LABEL (details->rename_widget), GTK_JUSTIFY_CENTER);
+
+		if (details->label_position != NAUTILUS_ICON_LABEL_POSITION_BESIDE) {
+			eel_editable_label_set_justify (EEL_EDITABLE_LABEL (details->rename_widget), GTK_JUSTIFY_CENTER);
+		}
+
 		gtk_misc_set_padding (GTK_MISC (details->rename_widget), 1, 1);
 		gtk_layout_put (GTK_LAYOUT (container),
 				details->rename_widget, 0, 0);
@@ -7591,6 +7800,34 @@
 	container->details->drag_allow_moves = allow_moves;
 }
 
+void
+nautilus_icon_container_set_forced_icon_size (NautilusIconContainer *container,
+					      int                    forced_icon_size)
+{
+	g_return_if_fail (NAUTILUS_IS_ICON_CONTAINER (container));
+
+	if (forced_icon_size != container->details->forced_icon_size) {
+		container->details->forced_icon_size = forced_icon_size;
+
+		invalidate_label_sizes (container);
+		nautilus_icon_container_request_update_all (container);
+	}
+}
+
+void
+nautilus_icon_container_set_all_columns_same_width (NautilusIconContainer *container,
+						    gboolean               all_columns_same_width)
+{
+	g_return_if_fail (NAUTILUS_IS_ICON_CONTAINER (container));
+
+	if (all_columns_same_width != container->details->all_columns_same_width) {
+		container->details->all_columns_same_width = all_columns_same_width;
+
+		invalidate_label_sizes (container);
+		nautilus_icon_container_request_update_all (container);
+	}
+}
+
 /* NautilusIconContainerAccessible */
 
 static NautilusIconContainerAccessiblePrivate *

Modified: trunk/libnautilus-private/nautilus-icon-container.h
==============================================================================
--- trunk/libnautilus-private/nautilus-icon-container.h	(original)
+++ trunk/libnautilus-private/nautilus-icon-container.h	Sat Mar 29 21:21:47 2008
@@ -302,6 +302,10 @@
 gboolean          nautilus_icon_container_get_allow_moves               (NautilusIconContainer  *container);
 void              nautilus_icon_container_set_allow_moves               (NautilusIconContainer  *container,
 									 gboolean                allow_moves);
+void		  nautilus_icon_container_set_forced_icon_size		(NautilusIconContainer  *container,
+									 int                     forced_icon_size);
+void		  nautilus_icon_container_set_all_columns_same_width	(NautilusIconContainer  *container,
+									 gboolean                all_columns_same_width);
 
 gboolean	  nautilus_icon_container_is_layout_rtl			(NautilusIconContainer  *container);
 

Modified: trunk/libnautilus-private/nautilus-icon-private.h
==============================================================================
--- trunk/libnautilus-private/nautilus-icon-private.h	(original)
+++ trunk/libnautilus-private/nautilus-icon-private.h	Sat Mar 29 21:21:47 2008
@@ -224,6 +224,10 @@
 	gboolean single_click_mode;
 	gboolean auto_layout;
 	gboolean tighter_layout;
+
+	/* Whether for the vertical layout, all columns are supposed to
+	 * have the same width. */
+	gboolean all_columns_same_width;
 	
 	/* Layout mode */
 	NautilusIconLayoutMode layout_mode;
@@ -231,6 +235,9 @@
 	/* Label position */
 	NautilusIconLabelPosition label_position;
 
+	/* Forced icon size, iff greater than 0 */
+	int forced_icon_size;
+
 	/* Should the container keep icons aligned to a grid */
 	gboolean keep_aligned;
 

Modified: trunk/libnautilus-private/nautilus-metadata.h
==============================================================================
--- trunk/libnautilus-private/nautilus-metadata.h	(original)
+++ trunk/libnautilus-private/nautilus-metadata.h	Sat Mar 29 21:21:47 2008
@@ -52,6 +52,8 @@
 #define NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER    	"list_view_column_order"
 #define NAUTILUS_METADATA_SUBKEY_COLUMNS                        "columns" 
 
+#define NAUTILUS_METADATA_KEY_COMPACT_VIEW_ZOOM_LEVEL		"compact_view_zoom_level"
+
 #define NAUTILUS_METADATA_KEY_WINDOW_GEOMETRY			"window_geometry"
 #define NAUTILUS_METADATA_KEY_WINDOW_SCROLL_POSITION		"window_scroll_position"
 #define NAUTILUS_METADATA_KEY_WINDOW_SHOW_HIDDEN_FILES		"window_show_hidden_files"

Modified: trunk/src/file-manager/fm-icon-container.c
==============================================================================
--- trunk/src/file-manager/fm-icon-container.c	(original)
+++ trunk/src/file-manager/fm-icon-container.c	Sat Mar 29 21:21:47 2008
@@ -82,19 +82,28 @@
 	
 	if (emblem_pixbufs != NULL) {
 		emblem_size = nautilus_icon_get_emblem_size_for_icon_size (size);
-		
-		emblems_to_ignore = fm_directory_view_get_emblem_names_to_exclude 
-			(FM_DIRECTORY_VIEW (icon_view));
-		*emblem_pixbufs = nautilus_file_get_emblem_pixbufs (file,
-								    emblem_size,
-								    FALSE,
-								    emblems_to_ignore);
-		g_strfreev (emblems_to_ignore);
+		/* don't return images larger than the actual icon size */
+		emblem_size = MIN (emblem_size, size);
+
+		if (emblem_size > 0) {
+			emblems_to_ignore = fm_directory_view_get_emblem_names_to_exclude 
+				(FM_DIRECTORY_VIEW (icon_view));
+			*emblem_pixbufs = nautilus_file_get_emblem_pixbufs (file,
+									    emblem_size,
+									    FALSE,
+									    emblems_to_ignore);
+			g_strfreev (emblems_to_ignore);
+		}
 	}
 
 	*has_window_open = nautilus_file_has_open_window (file);
 
-	flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS;
+	flags = 0;
+	if (!fm_icon_view_is_compact (icon_view) ||
+	    nautilus_icon_container_get_zoom_level (container) > NAUTILUS_ZOOM_LEVEL_STANDARD) {
+		flags |= NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS;
+	}
+
 	if (use_embedding) {
 		flags |= NAUTILUS_FILE_ICON_FLAGS_EMBEDDING_TEXT;
 	}
@@ -321,6 +330,11 @@
 		*editable_text = nautilus_file_get_display_name (file);
 	}
 
+	if (fm_icon_view_is_compact (icon_view)) {
+		*additional_text = NULL;
+		return;
+	}
+
 	if (NAUTILUS_IS_DESKTOP_ICON_FILE (file)) {
 		/* Don't show the normal extra information for desktop icons, it doesn't
 		 * make sense. */

Modified: trunk/src/file-manager/fm-icon-view.c
==============================================================================
--- trunk/src/file-manager/fm-icon-view.c	(original)
+++ trunk/src/file-manager/fm-icon-view.c	Sat Mar 29 21:21:47 2008
@@ -74,6 +74,12 @@
 
 #define POPUP_PATH_ICON_APPEARANCE		"/selection/Icon Appearance Items"
 
+enum 
+{
+	PROP_0,
+	PROP_COMPACT
+};
+
 typedef struct {
 	const NautilusFileSortType sort_type;
 	const char *metadata_text;
@@ -108,6 +114,8 @@
 
 	gboolean filter_by_screen;
 	int num_screens;
+
+	gboolean compact;
 };
 
 
@@ -166,6 +174,7 @@
 static void                 fm_icon_view_set_directory_tighter_layout (FMIconView           *icon_view,
 								       NautilusFile         *file,
 								       gboolean              tighter_layout);
+static gboolean              fm_icon_view_supports_manual_layout      (FMIconView           *icon_view);
 static const SortCriterion *get_sort_criterion_by_sort_type           (NautilusFileSortType  sort_type);
 static void                 set_sort_criterion_by_sort_type           (FMIconView           *icon_view,
 								       NautilusFileSortType  sort_type);
@@ -177,6 +186,7 @@
 								       gboolean              start_flag);
 static void                 update_layout_menus                       (FMIconView           *view);
 
+
 static void fm_icon_view_iface_init (NautilusViewIface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (FMIconView, fm_icon_view, FM_TYPE_DIRECTORY_VIEW, 
@@ -249,6 +259,10 @@
 	g_assert (position != NULL);
 	g_assert (FM_IS_ICON_VIEW (icon_view));
 
+	if (!fm_icon_view_supports_manual_layout (icon_view)) {
+		return FALSE;
+	}
+
 	/* Doing parsing in the "C" locale instead of the one set
 	 * by the user ensures that data in the metafile is not in
 	 * a locale-specific format. It's only necessary for floating
@@ -606,6 +620,16 @@
 }
 
 static gboolean
+fm_icon_view_supports_manual_layout (FMIconView *view)
+{
+	g_return_val_if_fail (FM_IS_ICON_VIEW (view), FALSE);
+
+	return EEL_CALL_METHOD_WITH_RETURN_VALUE
+		(FM_ICON_VIEW_CLASS, view,
+		 supports_manual_layout, (view));
+}
+
+static gboolean
 fm_icon_view_supports_keep_aligned (FMIconView *view)
 {
 	g_return_val_if_fail (FM_IS_ICON_VIEW (view), FALSE);
@@ -625,6 +649,12 @@
 		 supports_labels_beside_icons, (view));
 }
 
+static gboolean
+fm_icon_view_supports_tighter_layout (FMIconView *view)
+{
+	return !fm_icon_view_is_compact (view);
+}
+
 static void
 update_layout_menus (FMIconView *view)
 {
@@ -649,6 +679,9 @@
 						      FM_ACTION_TIGHTER_LAYOUT);
 		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
 					      fm_icon_view_using_tighter_layout (view));
+		gtk_action_set_sensitive (action, fm_icon_view_supports_tighter_layout (view));
+		gtk_action_set_visible (action, fm_icon_view_supports_tighter_layout (view));
+
 		action = gtk_action_group_get_action (view->details->icon_action_group,
 						      FM_ACTION_REVERSED_ORDER);
 		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
@@ -656,6 +689,11 @@
 		gtk_action_set_sensitive (action, is_auto_layout);
 	}
 
+	action = gtk_action_group_get_action (view->details->icon_action_group,
+					      FM_ACTION_MANUAL_LAYOUT);
+	gtk_action_set_visible (action,
+				fm_icon_view_supports_manual_layout (view));
+
 	/* Clean Up is only relevant for manual layout */
 	action = gtk_action_group_get_action (view->details->icon_action_group,
 					      FM_ACTION_CLEAN_UP);
@@ -772,7 +810,7 @@
 fm_icon_view_real_get_directory_sort_reversed (FMIconView *icon_view,
 					       NautilusFile *file)
 {
-	return  nautilus_file_get_boolean_metadata
+	return nautilus_file_get_boolean_metadata
 		(file,
 		 NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
 		 get_default_sort_in_reverse_order ());
@@ -797,8 +835,9 @@
 					       NautilusFile *file,
 					       gboolean sort_reversed)
 {
-	nautilus_file_set_boolean_metadata
-		(file, NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
+	return nautilus_file_set_boolean_metadata
+		(file,
+		 NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
 		 get_default_sort_in_reverse_order (),
 		 sort_reversed);
 }
@@ -863,6 +902,10 @@
 		return FALSE;
 	}
 
+	if (!fm_icon_view_supports_manual_layout (icon_view)) {
+		return TRUE;
+	}
+
 	return EEL_CALL_METHOD_WITH_RETURN_VALUE
 		(FM_ICON_VIEW_CLASS, icon_view,
 		 get_directory_auto_layout, (icon_view, file));
@@ -872,6 +915,8 @@
 fm_icon_view_real_get_directory_auto_layout (FMIconView *icon_view,
 					     NautilusFile *file)
 {
+
+
 	return nautilus_file_get_boolean_metadata
 		(file, NAUTILUS_METADATA_KEY_ICON_VIEW_AUTO_LAYOUT, !get_default_directory_manual_layout ());
 }
@@ -881,7 +926,8 @@
 					NautilusFile *file,
 					gboolean auto_layout)
 {
-	if (!fm_icon_view_supports_auto_layout (icon_view)) {
+	if (!fm_icon_view_supports_auto_layout (icon_view) ||
+	    !fm_icon_view_supports_manual_layout (icon_view)) {
 		return;
 	}
 
@@ -894,6 +940,10 @@
 					     NautilusFile *file,
 					     gboolean auto_layout)
 {
+	if (!fm_icon_view_supports_manual_layout (icon_view)) {
+		return;
+	}
+
 	nautilus_file_set_boolean_metadata
 		(file, NAUTILUS_METADATA_KEY_ICON_VIEW_AUTO_LAYOUT,
 		 !get_default_directory_manual_layout (),
@@ -950,6 +1000,10 @@
 						NautilusFile *file,
 						gboolean tighter_layout)
 {
+	if (!fm_icon_view_supports_tighter_layout (icon_view)) {
+		return;
+	}
+
 	nautilus_file_set_boolean_metadata
 		(file, NAUTILUS_METADATA_KEY_ICON_VIEW_TIGHTER_LAYOUT,
 		 get_default_directory_tighter_layout (),
@@ -965,6 +1019,14 @@
 }
 
 static gboolean
+real_supports_manual_layout (FMIconView *view)
+{
+	g_return_val_if_fail (FM_IS_ICON_VIEW (view), FALSE);
+
+	return !fm_icon_view_is_compact (view);
+}
+
+static gboolean
 real_supports_keep_aligned (FMIconView *view)
 {
 	g_return_val_if_fail (FM_IS_ICON_VIEW (view), FALSE);
@@ -1027,9 +1089,11 @@
 }
 
 static NautilusZoomLevel default_zoom_level = NAUTILUS_ZOOM_LEVEL_STANDARD;
+static NautilusZoomLevel default_compact_zoom_level = NAUTILUS_ZOOM_LEVEL_STANDARD;
+#define DEFAULT_ZOOM_LEVEL(icon_view) icon_view->details->compact ? default_compact_zoom_level : default_zoom_level
 
 static NautilusZoomLevel
-get_default_zoom_level (void)
+get_default_zoom_level (FMIconView *icon_view)
 {
 	static gboolean auto_storage_added = FALSE;
 
@@ -1037,9 +1101,11 @@
 		auto_storage_added = TRUE;
 		eel_preferences_add_auto_enum (NAUTILUS_PREFERENCES_ICON_VIEW_DEFAULT_ZOOM_LEVEL,
 					       (int *) &default_zoom_level);
+		eel_preferences_add_auto_enum (NAUTILUS_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL,
+					       (int *) &default_compact_zoom_level);
 	}
 
-	return CLAMP (default_zoom_level, NAUTILUS_ZOOM_LEVEL_SMALLEST, NAUTILUS_ZOOM_LEVEL_LARGEST);
+	return CLAMP (DEFAULT_ZOOM_LEVEL(icon_view), NAUTILUS_ZOOM_LEVEL_SMALLEST, NAUTILUS_ZOOM_LEVEL_LARGEST);
 }
 
 static void
@@ -1048,7 +1114,8 @@
 	gboolean labels_beside;
 
 	if (fm_icon_view_supports_labels_beside_icons (icon_view)) {
-		labels_beside = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ICON_VIEW_LABELS_BESIDE_ICONS);
+		labels_beside = fm_icon_view_is_compact (icon_view) ||
+				eel_preferences_get_boolean (NAUTILUS_PREFERENCES_ICON_VIEW_LABELS_BESIDE_ICONS);
 		
 		if (labels_beside) {
 			nautilus_icon_container_set_label_position
@@ -1063,6 +1130,17 @@
 }
 
 static void
+set_columns_same_width (FMIconView *icon_view)
+{
+	gboolean all_columns_same_width;
+
+	if (fm_icon_view_is_compact (icon_view)) {
+		all_columns_same_width = eel_preferences_get_boolean (NAUTILUS_PREFERENCES_COMPACT_VIEW_ALL_COLUMNS_SAME_WIDTH);
+		nautilus_icon_container_set_all_columns_same_width (get_icon_container (icon_view), all_columns_same_width);
+	}
+}
+
+static void
 fm_icon_view_begin_loading (FMDirectoryView *view)
 {
 	FMIconView *icon_view;
@@ -1106,10 +1184,18 @@
 	
 	/* Set up the zoom level from the metadata. */
 	if (fm_directory_view_supports_zooming (FM_DIRECTORY_VIEW (icon_view))) {
-		level = nautilus_file_get_integer_metadata
-			(file, 
-			 NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL, 
-			 get_default_zoom_level ());
+		if (icon_view->details->compact) {
+			level = nautilus_file_get_integer_metadata
+				(file, 
+				 NAUTILUS_METADATA_KEY_COMPACT_VIEW_ZOOM_LEVEL, 
+				 get_default_zoom_level (icon_view));
+		} else {
+			level = nautilus_file_get_integer_metadata
+				(file, 
+				 NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL, 
+				 get_default_zoom_level (icon_view));
+		}
+
 		fm_icon_view_set_zoom_level (icon_view, level, TRUE);
 	}
 
@@ -1132,6 +1218,7 @@
 		 fm_icon_view_get_directory_tighter_layout (icon_view, file));
 
 	set_labels_beside_icons (icon_view);
+	set_columns_same_width (icon_view);
 
 	/* We must set auto-layout last, because it invokes the layout_changed 
 	 * callback, which works incorrectly if the other layout criteria are
@@ -1180,11 +1267,19 @@
 		return;
 	}
 
-	nautilus_file_set_integer_metadata
-		(fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (view)), 
-		 NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL, 
-		 get_default_zoom_level (),
-		 new_level);
+	if (view->details->compact) {
+		nautilus_file_set_integer_metadata
+			(fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (view)), 
+			 NAUTILUS_METADATA_KEY_COMPACT_VIEW_ZOOM_LEVEL, 
+			 get_default_zoom_level (view),
+			 new_level);
+	} else {
+		nautilus_file_set_integer_metadata
+			(fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (view)), 
+			 NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL, 
+			 get_default_zoom_level (view),
+			 new_level);
+	}
 
 	nautilus_icon_container_set_zoom_level (icon_container, new_level);
 
@@ -1216,7 +1311,7 @@
 {
 	FMIconView *icon_view;
 
-	g_return_if_fail (FM_IS_ICON_VIEW (view));
+	g_assert (FM_IS_ICON_VIEW (view));
 
 	icon_view = FM_ICON_VIEW (view);
 	fm_icon_view_set_zoom_level (icon_view, zoom_level, FALSE);
@@ -1225,8 +1320,13 @@
 static void
 fm_icon_view_restore_default_zoom_level (FMDirectoryView *view)
 {
+	FMIconView *icon_view;
+
+	g_return_if_fail (FM_IS_ICON_VIEW (view));
+
+	icon_view = FM_ICON_VIEW (view);
 	fm_directory_view_zoom_to_level
-		(view, get_default_zoom_level ());
+		(view, get_default_zoom_level (icon_view));
 }
 
 static gboolean 
@@ -2358,10 +2458,16 @@
 
 	if (fm_directory_view_supports_zooming (FM_DIRECTORY_VIEW (icon_view))) {
 		file = fm_directory_view_get_directory_as_file (FM_DIRECTORY_VIEW (icon_view));
-		
-		level = nautilus_file_get_integer_metadata (file, 
-							    NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL, 
-							    get_default_zoom_level ());
+
+		if (fm_icon_view_is_compact (icon_view)) {
+			level = nautilus_file_get_integer_metadata (file, 
+								    NAUTILUS_METADATA_KEY_COMPACT_VIEW_ZOOM_LEVEL, 
+								    get_default_zoom_level (icon_view));
+		} else {
+			level = nautilus_file_get_integer_metadata (file, 
+								    NAUTILUS_METADATA_KEY_ICON_VIEW_ZOOM_LEVEL, 
+								    get_default_zoom_level (icon_view));
+		}
 		fm_directory_view_zoom_to_level (FM_DIRECTORY_VIEW (icon_view), level);
 	}
 }
@@ -2379,6 +2485,19 @@
 }
 
 static void
+all_columns_same_width_changed_callback (gpointer callback_data)
+{
+	FMIconView *icon_view;
+
+	g_assert (FM_IS_ICON_VIEW (callback_data));
+
+	icon_view = FM_ICON_VIEW (callback_data);
+
+	set_columns_same_width (icon_view);
+}
+
+
+static void
 fm_icon_view_sort_directories_first_changed (FMDirectoryView *directory_view)
 {
 	FMIconView *icon_view;
@@ -2566,6 +2685,34 @@
 	}
 }
 
+static void
+fm_icon_view_set_property (GObject         *object,
+			   guint            prop_id,
+			   const GValue    *value,
+			   GParamSpec      *pspec)
+{
+	FMIconView *icon_view;
+  
+	icon_view = FM_ICON_VIEW (object);
+
+	switch (prop_id)  {
+		case PROP_COMPACT:
+			icon_view->details->compact = g_value_get_boolean (value);
+			if (icon_view->details->compact) {
+				nautilus_icon_container_set_layout_mode (get_icon_container (icon_view),
+									 NAUTILUS_ICON_LAYOUT_T_B_L_R);
+				nautilus_icon_container_set_forced_icon_size (get_icon_container (icon_view),
+									      NAUTILUS_ICON_SIZE_SMALLEST);
+			}
+		break;
+
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+
 
 static void
 fm_icon_view_class_init (FMIconViewClass *klass)
@@ -2574,6 +2721,7 @@
 
 	fm_directory_view_class = FM_DIRECTORY_VIEW_CLASS (klass);
 
+	G_OBJECT_CLASS (klass)->set_property = fm_icon_view_set_property;
 	G_OBJECT_CLASS (klass)->finalize = fm_icon_view_finalize;
 
 	GTK_OBJECT_CLASS (klass)->destroy = fm_icon_view_destroy;
@@ -2620,6 +2768,7 @@
 
 	klass->clean_up = fm_icon_view_real_clean_up;
 	klass->supports_auto_layout = real_supports_auto_layout;
+	klass->supports_manual_layout = real_supports_manual_layout;
 	klass->supports_keep_aligned = real_supports_keep_aligned;
 	klass->supports_labels_beside_icons = real_supports_labels_beside_icons;
         klass->get_directory_auto_layout = fm_icon_view_real_get_directory_auto_layout;
@@ -2630,6 +2779,16 @@
         klass->set_directory_sort_by = fm_icon_view_real_set_directory_sort_by;
         klass->set_directory_sort_reversed = fm_icon_view_real_set_directory_sort_reversed;
         klass->set_directory_tighter_layout = fm_icon_view_real_set_directory_tighter_layout;
+
+	g_object_class_install_property (G_OBJECT_CLASS (klass),
+					 PROP_COMPACT,
+					 g_param_spec_boolean ("compact",
+							       "Compact",
+							       "Whether this view provides a compact listing",
+							       FALSE,
+							       G_PARAM_WRITABLE |
+							       G_PARAM_CONSTRUCT_ONLY));
+
 }
 
 static const char *
@@ -2638,6 +2797,11 @@
 	if (FM_IS_DESKTOP_ICON_VIEW (view)) {
 		return FM_DESKTOP_ICON_VIEW_ID;
 	}
+
+	if (fm_icon_view_is_compact (FM_ICON_VIEW (view))) {
+		return FM_COMPACT_VIEW_ID;
+	}
+
 	return FM_ICON_VIEW_ID;
 }
 
@@ -2698,6 +2862,13 @@
 						  labels_beside_icons_changed_callback,
 						  icon_view, G_OBJECT (icon_view));
 
+	eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL,
+						  default_zoom_level_changed_callback,
+						  icon_view, G_OBJECT (icon_view));
+	eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_COMPACT_VIEW_ALL_COLUMNS_SAME_WIDTH,
+						  all_columns_same_width_changed_callback,
+						  icon_view, G_OBJECT (icon_view));
+
 	g_signal_connect_object (get_icon_container (icon_view), "handle_netscape_url",
 				 G_CALLBACK (icon_view_handle_netscape_url), icon_view, 0);
 	g_signal_connect_object (get_icon_container (icon_view), "handle_uri_list",
@@ -2711,7 +2882,18 @@
 {
 	FMIconView *view;
 
-	view = g_object_new (FM_TYPE_ICON_VIEW, "window", window, NULL);
+	view = g_object_new (FM_TYPE_ICON_VIEW, "window", window, "compact", FALSE, NULL);
+	g_object_ref (view);
+	gtk_object_sink (GTK_OBJECT (view));
+	return NAUTILUS_VIEW (view);
+}
+
+static NautilusView *
+fm_compact_view_create (NautilusWindowInfo *window)
+{
+	FMIconView *view;
+
+	view = g_object_new (FM_TYPE_ICON_VIEW, "window", window, "compact", TRUE, NULL);
 	g_object_ref (view);
 	gtk_object_sink (GTK_OBJECT (view));
 	return NAUTILUS_VIEW (view);
@@ -2738,6 +2920,15 @@
 	return FALSE;
 }
 
+#define TRANSLATE_VIEW_INFO(view_info) \
+	view_info.label = _(view_info.label); \
+	view_info.view_as_label = _(view_info.view_as_label); \
+	view_info.view_as_label_with_mnemonic = _(view_info.view_as_label_with_mnemonic); \
+	view_info.error_label = _(view_info.error_label); \
+	view_info.startup_error_label = _(view_info.startup_error_label); \
+	view_info.display_location_label = _(view_info.display_location_label); \
+	
+
 static NautilusViewInfo fm_icon_view = {
 	FM_ICON_VIEW_ID,
 	N_("Icons"),
@@ -2750,15 +2941,30 @@
 	fm_icon_view_supports_uri
 };
 
+static NautilusViewInfo fm_compact_view = {
+	FM_COMPACT_VIEW_ID,
+	N_("Compact"),
+	N_("Compact View"),
+	N_("_Compact View"),
+	N_("The compact view encountered an error."),
+	N_("The compact view encountered an error while starting up."),
+	N_("Display this location with the compact view."),
+	fm_compact_view_create,
+	fm_icon_view_supports_uri
+};
+
+gboolean
+fm_icon_view_is_compact (FMIconView *view)
+{
+	return view->details->compact;
+}
+
 void
 fm_icon_view_register (void)
 {
-	fm_icon_view.label = _(fm_icon_view.label);
-	fm_icon_view.view_as_label = _(fm_icon_view.view_as_label);
-	fm_icon_view.view_as_label_with_mnemonic = _(fm_icon_view.view_as_label_with_mnemonic);
-	fm_icon_view.error_label = _(fm_icon_view.error_label);
-	fm_icon_view.startup_error_label = _(fm_icon_view.startup_error_label);
-	fm_icon_view.display_location_label = _(fm_icon_view.display_location_label);
-	
+	TRANSLATE_VIEW_INFO (fm_icon_view)
 	nautilus_view_factory_register (&fm_icon_view);
+
+	TRANSLATE_VIEW_INFO (fm_compact_view)
+	nautilus_view_factory_register (&fm_compact_view);
 }

Modified: trunk/src/file-manager/fm-icon-view.h
==============================================================================
--- trunk/src/file-manager/fm-icon-view.h	(original)
+++ trunk/src/file-manager/fm-icon-view.h	Sat Mar 29 21:21:47 2008
@@ -37,6 +37,7 @@
 #define FM_IS_ICON_VIEW_CLASS(klass)		(GTK_CHECK_CLASS_TYPE ((klass), FM_TYPE_ICON_VIEW))
 
 #define FM_ICON_VIEW_ID "OAFIID:Nautilus_File_Manager_Icon_View"
+#define FM_COMPACT_VIEW_ID "OAFIID:Nautilus_File_Manager_Compact_View"
 
 typedef struct FMIconViewDetails FMIconViewDetails;
 
@@ -86,6 +87,13 @@
 	 */
 	gboolean (* supports_auto_layout)	 (FMIconView *view);
 
+	/* supports_manual_layout is a function pointer that subclasses may
+	 * override to control whether or not the manual layout options
+	 * should be enabled. The default implementation returns TRUE iff
+	 * not in compact mode.
+	 */
+	gboolean (* supports_manual_layout)	 (FMIconView *view);
+
 	/* supports_auto_layout is a function pointer that subclasses may
 	 * override to control whether snap-to-grid mode
 	 * should be enabled. The default implementation returns FALSE.
@@ -105,6 +113,7 @@
 				    NautilusFile *a,
 				    NautilusFile *b);
 void    fm_icon_view_filter_by_screen (FMIconView *icon_view, gboolean filter);
+gboolean fm_icon_view_is_compact   (FMIconView *icon_view);
 
 void    fm_icon_view_register       (void);
 

Modified: trunk/src/nautilus-file-management-properties.c
==============================================================================
--- trunk/src/nautilus-file-management-properties.c	(original)
+++ trunk/src/nautilus-file-management-properties.c	Sat Mar 29 21:21:47 2008
@@ -50,6 +50,7 @@
 /* string enum preferences */
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_DEFAULT_VIEW_WIDGET "default_view_combobox"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ICON_VIEW_ZOOM_WIDGET "icon_view_zoom_combobox"
+#define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_COMPACT_VIEW_ZOOM_WIDGET "compact_view_zoom_combobox"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_LIST_VIEW_ZOOM_WIDGET "list_view_zoom_combobox"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_SORT_ORDER_WIDGET "sort_order_combobox"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_DATE_FORMAT_WIDGET "date_format_combobox"
@@ -62,6 +63,7 @@
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_FOLDERS_FIRST_WIDGET "sort_folders_first_checkbutton"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_COMPACT_LAYOUT_WIDGET "compact_layout_checkbutton"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_LABELS_BESIDE_ICONS_WIDGET "labels_beside_icons_checkbutton"
+#define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ALL_COLUMNS_SAME_WIDTH "all_columns_same_width_checkbutton"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ALWAYS_USE_BROWSER_WIDGET "always_use_browser_checkbutton"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ALWAYS_USE_LOCATION_ENTRY_WIDGET "always_use_location_entry_checkbutton"
 #define NAUTILUS_FILE_MANAGEMENT_PROPERTIES_TRASH_CONFIRM_WIDGET "trash_confirm_checkbutton"
@@ -77,6 +79,7 @@
 
 static const char * const default_view_values[] = {
 	"icon_view",
+	"compact_view",
 	"list_view",
 	NULL
 };
@@ -661,6 +664,8 @@
 	/* setup gconf stuff */
 	eel_gconf_monitor_add ("/apps/nautilus/icon_view");
 	eel_gconf_preload_cache ("/apps/nautilus/icon_view", GCONF_CLIENT_PRELOAD_ONELEVEL);
+	eel_gconf_monitor_add ("/apps/nautilus/compact_view");
+	eel_gconf_preload_cache ("/apps/nautilus/compact_view", GCONF_CLIENT_PRELOAD_ONELEVEL);
 	eel_gconf_monitor_add ("/apps/nautilus/list_view");
 	eel_gconf_preload_cache ("/apps/nautilus/list_view", GCONF_CLIENT_PRELOAD_ONELEVEL);
 	eel_gconf_monitor_add ("/apps/nautilus/preferences");
@@ -671,7 +676,7 @@
 	/* setup UI */
 	nautilus_file_management_properties_size_group_create (xml_dialog, 
 							       "views_label",
-							       4);
+							       5);
 	nautilus_file_management_properties_size_group_create (xml_dialog,
 							       "captions_label",
 							       3);
@@ -688,6 +693,9 @@
 					    NAUTILUS_FILE_MANAGEMENT_PROPERTIES_LABELS_BESIDE_ICONS_WIDGET,
 					    NAUTILUS_PREFERENCES_ICON_VIEW_LABELS_BESIDE_ICONS);
 	eel_preferences_glade_connect_bool (xml_dialog,
+					    NAUTILUS_FILE_MANAGEMENT_PROPERTIES_ALL_COLUMNS_SAME_WIDTH,
+					    NAUTILUS_PREFERENCES_COMPACT_VIEW_ALL_COLUMNS_SAME_WIDTH);
+	eel_preferences_glade_connect_bool (xml_dialog,
 					    NAUTILUS_FILE_MANAGEMENT_PROPERTIES_FOLDERS_FIRST_WIDGET,
 					    NAUTILUS_PREFERENCES_SORT_DIRECTORIES_FIRST); 
 	eel_preferences_glade_connect_bool (xml_dialog,
@@ -726,6 +734,10 @@
 							     NAUTILUS_PREFERENCES_ICON_VIEW_DEFAULT_ZOOM_LEVEL,
 							     (const char **) zoom_values);
 	eel_preferences_glade_connect_string_enum_combo_box (xml_dialog,
+							     NAUTILUS_FILE_MANAGEMENT_PROPERTIES_COMPACT_VIEW_ZOOM_WIDGET,
+							     NAUTILUS_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL,
+							     (const char **) zoom_values);
+	eel_preferences_glade_connect_string_enum_combo_box (xml_dialog,
 							     NAUTILUS_FILE_MANAGEMENT_PROPERTIES_LIST_VIEW_ZOOM_WIDGET,
 							     NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_ZOOM_LEVEL,
 							     (const char **) zoom_values);

Modified: trunk/src/nautilus-file-management-properties.glade
==============================================================================
--- trunk/src/nautilus-file-management-properties.glade	(original)
+++ trunk/src/nautilus-file-management-properties.glade	Sat Mar 29 21:21:47 2008
@@ -168,6 +168,7 @@
 				<widget class="GtkComboBox" id="default_view_combobox">
 				  <property name="visible">True</property>
 				  <property name="items" translatable="yes">Icon View
+Compact View
 List View</property>
 				  <property name="add_tearoffs">False</property>
 				  <property name="focus_on_click">True</property>
@@ -460,6 +461,149 @@
 	      </child>
 
 	      <child>
+		<widget class="GtkVBox" id="vbox">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Compact View Defaults&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">0</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">12</property>
+
+			      <child>
+				<widget class="GtkLabel" id="views_label_4">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">_Default zoom level:</property>
+				  <property name="use_underline">True</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				  <property name="mnemonic_widget">compact_view_zoom_combobox</property>
+				  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+				  <property name="width_chars">-1</property>
+				  <property name="single_line_mode">False</property>
+				  <property name="angle">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkComboBox" id="compact_view_zoom_combobox">
+				  <property name="visible">True</property>
+				  <property name="items" translatable="yes">25%
+50%
+75%
+100%
+150%
+200%
+400%</property>
+				  <property name="add_tearoffs">False</property>
+				  <property name="focus_on_click">True</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkCheckButton" id="all_columns_same_width_checkbutton">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">A_ll columns have the same width</property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			      <property name="active">False</property>
+			      <property name="inconsistent">False</property>
+			      <property name="draw_indicator">True</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
 		<widget class="GtkVBox" id="vbox4">
 		  <property name="visible">True</property>
 		  <property name="homogeneous">False</property>
@@ -517,7 +661,7 @@
 			      <child>
 				<widget class="GtkLabel" id="views_label_3">
 				  <property name="visible">True</property>
-				  <property name="label" translatable="yes">_Default zoom level:</property>
+				  <property name="label" translatable="yes">D_efault zoom level:</property>
 				  <property name="use_underline">True</property>
 				  <property name="use_markup">False</property>
 				  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -1172,7 +1316,7 @@
 			      <child>
 				<widget class="GtkLabel" id="captions_label_0">
 				  <property name="visible">True</property>
-				  <property name="label" translatable="no"></property>
+				  <property name="label"></property>
 				  <property name="use_underline">False</property>
 				  <property name="use_markup">False</property>
 				  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -1224,7 +1368,7 @@
 			      <child>
 				<widget class="GtkLabel" id="captions_label_1">
 				  <property name="visible">True</property>
-				  <property name="label" translatable="no"></property>
+				  <property name="label"></property>
 				  <property name="use_underline">True</property>
 				  <property name="use_markup">False</property>
 				  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -1276,7 +1420,7 @@
 			      <child>
 				<widget class="GtkLabel" id="captions_label_2">
 				  <property name="visible">True</property>
-				  <property name="label" translatable="no"></property>
+				  <property name="label"></property>
 				  <property name="use_underline">False</property>
 				  <property name="use_markup">False</property>
 				  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -1516,7 +1660,7 @@
 		      <child>
 			<widget class="GtkLabel" id="label32">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="no">    </property>
+			  <property name="label">    </property>
 			  <property name="use_underline">False</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>



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