summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog24
-rw-r--r--libnautilus-private/apps_nautilus_preferences.schemas.in49
-rw-r--r--libnautilus-private/nautilus-global-preferences.c11
-rw-r--r--libnautilus-private/nautilus-global-preferences.h4
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.c3
-rw-r--r--libnautilus-private/nautilus-icon-container.c147
-rw-r--r--libnautilus-private/nautilus-icon-container.h2
-rw-r--r--libnautilus-private/nautilus-icon-info.h2
8 files changed, 240 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 70a979af0..2c2740149 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
2008-08-18 Christian Neumair <cneumair@gnome.org>
+ * libnautilus-private/apps_nautilus_preferences.schemas.in:
+ * libnautilus-private/nautilus-global-preferences.c:
+ * libnautilus-private/nautilus-global-preferences.h:
+ Add "icon_view/text_ellipsis_limit" and "desktop/text_ellipsis_limit".
+ They specify the maximum number of lines to display before the file
+ names should be ellipsized.
+
+ * libnautilus-private/nautilus-icon-canvas-item.c
+ (draw_or_measure_label_text):
+ * libnautilus-private/nautilus-icon-container.c
+ (text_ellipsis_limit_changed_container_callback),
+ (nautilus_icon_container_constructor),
+ (nautilus_icon_container_class_init),
+ (get_text_ellipsis_limit_for_zoom),
+ (text_ellipsis_limit_changed_callback),
+ (desktop_text_ellipsis_limit_changed_callback),
+ (nautilus_icon_container_instance_init),
+ (nautilus_icon_container_get_layout_height):
+ * libnautilus-private/nautilus-icon-container.h:
+ * libnautilus-private/nautilus-icon-info.h:
+ Connect icon container to text ellipsis limit preferences.
+
+2008-08-18 Christian Neumair <cneumair@gnome.org>
+
* libnautilus-private/nautilus-icon-canvas-item.c
(nautilus_icon_canvas_item_event):
Raise icon when hovering with the mouse over it.
diff --git a/libnautilus-private/apps_nautilus_preferences.schemas.in b/libnautilus-private/apps_nautilus_preferences.schemas.in
index d69e64442..c21580261 100644
--- a/libnautilus-private/apps_nautilus_preferences.schemas.in
+++ b/libnautilus-private/apps_nautilus_preferences.schemas.in
@@ -701,6 +701,38 @@ most cases, this should be left alone. -->Sans 10</default>
</locale>
</schema>
+ <schema>
+ <key>/schemas/apps/nautilus/icon_view/text_ellipsis_limit</key>
+ <applyto>/apps/nautilus/icon_view/text_ellipsis_limit</applyto>
+ <type>list</type>
+ <list_type>string</list_type>
+ <default>[3]</default>
+ <locale name="C">
+ <short>Text Ellipsis Limit</short>
+ <long>
+ A string specifying how parts of overlong file names
+ should be replaced by ellipses, depending on the zoom
+ level.
+ Each of the list entries is of the form "Zoom Level:Integer".
+ For each specified zoom level, if the given integer is
+ larger than 0, the file name will not exceed the given number of lines.
+ If the integer is 0 or smaller, no limit is imposed on the specified zoom level.
+ A default entry of the form "Integer" without any specified zoom level
+ is also allowed. It defines the maximum number of lines for all other zoom levels.
+ Examples:
+ 0 - always display overlong file names;
+ 3 - shorten file names if they exceed three lines;
+ smallest:5,smaller:4,0 - shorten file names if they exceed five lines
+ for zoom level "smallest". Shorten file names if they exceed four lines
+ for zoom level "smaller". Do not shorten file names for other zoom levels.
+
+ Available zoom levels:
+ smallest (33%), smaller (50%), small (66%), standard (100%), large (150%),
+ larger (200%), largest (400%)
+ </long>
+ </locale>
+ </schema>
+
<!-- Icon View -->
<schema>
<key>/schemas/apps/nautilus/compact_view/default_zoom_level</key>
@@ -1056,6 +1088,23 @@ most cases, this should be left alone. -->Sans 10</default>
</long>
</locale>
</schema>
+
+ <schema>
+ <key>/schemas/apps/nautilus/desktop/text_ellipsis_limit</key>
+ <applyto>/apps/nautilus/desktop/text_ellipsis_limit</applyto>
+ <type>integer</type>
+ <default>3</default>
+ <locale name="C">
+ <short>Text Ellipsis Limit</short>
+ <long>
+ An integer specifying how parts of overlong file names
+ should be replaced by ellipses on the desktop.
+ If the number is larger than 0, the file name will not exceed
+ the given number of lines. If the number is 0 or smaller, no
+ limit is imposed on the number of displayed lines.
+ </long>
+ </locale>
+ </schema>
</schemalist>
</gconfschemafile>
diff --git a/libnautilus-private/nautilus-global-preferences.c b/libnautilus-private/nautilus-global-preferences.c
index cce84f926..e1f8813cb 100644
--- a/libnautilus-private/nautilus-global-preferences.c
+++ b/libnautilus-private/nautilus-global-preferences.c
@@ -432,7 +432,12 @@ static const PreferenceDefault preference_defaults[] = {
PREFERENCE_INTEGER,
GINT_TO_POINTER (96)
},
-
+ { NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT,
+ PREFERENCE_STRING_ARRAY,
+ "3",
+ NULL,NULL,
+ NULL,
+ },
/* Compact Icon View Default Preferences */
{ NAUTILUS_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL,
PREFERENCE_STRING,
@@ -533,6 +538,10 @@ static const PreferenceDefault preference_defaults[] = {
PREFERENCE_STRING_ARRAY,
"", NULL, NULL, NULL
},
+ { NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT,
+ PREFERENCE_INTEGER,
+ GINT_TO_POINTER (3)
+ },
{ NULL }
};
diff --git a/libnautilus-private/nautilus-global-preferences.h b/libnautilus-private/nautilus-global-preferences.h
index ad4520eac..4386b3537 100644
--- a/libnautilus-private/nautilus-global-preferences.h
+++ b/libnautilus-private/nautilus-global-preferences.h
@@ -153,6 +153,10 @@ enum
/* The default size for thumbnail icons */
#define NAUTILUS_PREFERENCES_ICON_VIEW_THUMBNAIL_SIZE "icon_view/thumbnail_size"
+/* ellipsization preferences */
+#define NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT "icon_view/text_ellipsis_limit"
+#define NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT "desktop/text_ellipsis_limit"
+
/* 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_have_same_width"
diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c
index b2afd6831..6226b57c5 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.c
+++ b/libnautilus-private/nautilus-icon-canvas-item.c
@@ -1106,7 +1106,8 @@ draw_or_measure_label_text (NautilusIconCanvasItem *item,
/* VOODOO-TODO, cf. compute_text_rectangle() */
pango_layout_set_height (editable_layout, G_MININT);
} else {
- pango_layout_set_height (editable_layout, -3);
+ pango_layout_set_height (editable_layout,
+ nautilus_icon_container_get_layout_height (container));
}
layout_get_full_size (editable_layout, &editable_width, &editable_height, &editable_for_layout_height, &editable_dx);
}
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index c09091f48..fd77d36ac 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -45,6 +45,8 @@
#include <eel/eel-editable-label.h>
#include <eel/eel-marshal.h>
#include <eel/eel-string.h>
+#include <eel/eel-preferences.h>
+#include <eel/eel-enumeration.h>
#include <eel/eel-canvas-rect-ellipse.h>
#include <libgnomeui/gnome-icon-item.h>
#include <gdk/gdkkeysyms.h>
@@ -5099,6 +5101,41 @@ grab_notify_cb (GtkWidget *widget,
}
}
+static void
+text_ellipsis_limit_changed_container_callback (gpointer callback_data)
+{
+ NautilusIconContainer *container;
+
+ container = NAUTILUS_ICON_CONTAINER (callback_data);
+ invalidate_label_sizes (container);
+ schedule_redo_layout (container);
+}
+
+static GObject*
+nautilus_icon_container_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params)
+{
+ NautilusIconContainer *container;
+ GObject *object;
+
+ object = G_OBJECT_CLASS (parent_class)->constructor (type,
+ n_construct_params,
+ construct_params);
+
+ container = NAUTILUS_ICON_CONTAINER (object);
+ if (nautilus_icon_container_get_is_desktop (container)) {
+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT,
+ text_ellipsis_limit_changed_container_callback,
+ container);
+ } else {
+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT,
+ text_ellipsis_limit_changed_container_callback,
+ container);
+ }
+
+ return object;
+}
/* Initialization. */
@@ -5109,6 +5146,7 @@ nautilus_icon_container_class_init (NautilusIconContainerClass *class)
EelCanvasClass *canvas_class;
GtkBindingSet *binding_set;
+ G_OBJECT_CLASS (class)->constructor = nautilus_icon_container_constructor;
G_OBJECT_CLASS (class)->finalize = finalize;
GTK_OBJECT_CLASS (class)->destroy = destroy;
@@ -5611,11 +5649,88 @@ handle_focus_out_event (GtkWidget *widget, GdkEventFocus *event, gpointer user_d
return FALSE;
}
+
+static int text_ellipsis_limits[NAUTILUS_ZOOM_LEVEL_N_ENTRIES];
+static int desktop_text_ellipsis_limit;
+
+static gboolean
+get_text_ellipsis_limit_for_zoom (char **strs,
+ const char *zoom_level,
+ int *limit)
+{
+ char **p;
+ char *str;
+ gboolean success;
+
+ success = FALSE;
+
+ /* default */
+ *limit = 3;
+
+ if (zoom_level != NULL) {
+ str = g_strdup_printf ("%s:%%d", zoom_level);
+ } else {
+ str = g_strdup ("%d");
+ }
+
+ if (strs != NULL) {
+ for (p = strs; *p != NULL; p++) {
+ if (sscanf (*p, str, limit)) {
+ success = TRUE;
+ }
+ }
+ }
+
+ g_free (str);
+
+ return success;
+}
+
+static void
+text_ellipsis_limit_changed_callback (gpointer callback_data)
+{
+ char **pref;
+ unsigned int i;
+ int one_limit;
+ const EelEnumeration *eenum;
+ const EelEnumerationEntry *entry;
+
+ pref = eel_preferences_get_string_array (NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT);
+
+ /* set default */
+ get_text_ellipsis_limit_for_zoom (pref, NULL, &one_limit);
+ for (i = 0; i < NAUTILUS_ZOOM_LEVEL_N_ENTRIES; i++) {
+ text_ellipsis_limits[i] = one_limit;
+ }
+
+ /* override for each zoom level */
+ eenum = eel_enumeration_lookup ("default_zoom_level");
+ g_assert (eenum != NULL);
+ for (i = 0; i < eel_enumeration_get_length (eenum); i++) {
+ entry = eel_enumeration_get_nth_entry (eenum, i);
+ if (get_text_ellipsis_limit_for_zoom (pref, entry->name, &one_limit)) {
+ text_ellipsis_limits[entry->value] = one_limit;
+ }
+ }
+
+ g_strfreev (pref);
+}
+
+static void
+desktop_text_ellipsis_limit_changed_callback (gpointer callback_data)
+{
+ int pref;
+
+ pref = eel_preferences_get_integer (NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT);
+ desktop_text_ellipsis_limit = pref;
+}
+
static void
nautilus_icon_container_instance_init (NautilusIconContainer *container)
{
NautilusIconContainerDetails *details;
EelBackground *background;
+ static gboolean setup_prefs = FALSE;
details = g_new0 (NautilusIconContainerDetails, 1);
@@ -5651,6 +5766,20 @@ nautilus_icon_container_instance_init (NautilusIconContainer *container)
eel_preferences_add_callback (NAUTILUS_PREFERENCES_THEME,
nautilus_icon_container_theme_changed,
container);
+
+ if (!setup_prefs) {
+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT,
+ text_ellipsis_limit_changed_callback,
+ NULL);
+ text_ellipsis_limit_changed_callback (NULL);
+
+ eel_preferences_add_callback (NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT,
+ desktop_text_ellipsis_limit_changed_callback,
+ NULL);
+ desktop_text_ellipsis_limit_changed_callback (NULL);
+
+ setup_prefs = TRUE;
+ }
}
typedef struct {
@@ -8844,5 +8973,23 @@ nautilus_icon_container_is_layout_vertical (NautilusIconContainer *container)
container->details->layout_mode == NAUTILUS_ICON_LAYOUT_T_B_R_L);
}
+int
+nautilus_icon_container_get_layout_height (NautilusIconContainer *container)
+{
+ int limit;
+
+ if (nautilus_icon_container_get_is_desktop (container)) {
+ limit = desktop_text_ellipsis_limit;
+ } else {
+ limit = text_ellipsis_limits[container->details->zoom_level];
+ }
+
+ if (limit <= 0) {
+ return G_MININT;
+ }
+
+ return -limit;
+}
+
#endif /* ! NAUTILUS_OMIT_SELF_CHECK */
diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h
index ed9d1d3c5..893743b75 100644
--- a/libnautilus-private/nautilus-icon-container.h
+++ b/libnautilus-private/nautilus-icon-container.h
@@ -252,6 +252,8 @@ void nautilus_icon_container_set_label_position (Nautilu
void nautilus_icon_container_sort (NautilusIconContainer *container);
void nautilus_icon_container_freeze_icon_positions (NautilusIconContainer *container);
+int nautilus_icon_container_get_layout_height (NautilusIconContainer *container);
+
/* operations on all icons */
void nautilus_icon_container_unselect_all (NautilusIconContainer *view);
diff --git a/libnautilus-private/nautilus-icon-info.h b/libnautilus-private/nautilus-icon-info.h
index c5dadd310..dcf07dfff 100644
--- a/libnautilus-private/nautilus-icon-info.h
+++ b/libnautilus-private/nautilus-icon-info.h
@@ -20,6 +20,8 @@ typedef enum {
NAUTILUS_ZOOM_LEVEL_LARGEST
} NautilusZoomLevel;
+#define NAUTILUS_ZOOM_LEVEL_N_ENTRIES (NAUTILUS_ZOOM_LEVEL_LARGEST + 1)
+
/* Nominal icon sizes for each Nautilus zoom level.
* This scheme assumes that icons are designed to
* fit in a square space, though each image needn't