diff options
author | Andy Hertzfeld <andy@src.gnome.org> | 2001-04-13 00:21:10 +0000 |
---|---|---|
committer | Andy Hertzfeld <andy@src.gnome.org> | 2001-04-13 00:21:10 +0000 |
commit | 69835b77f7b3114f1c202b0cf88e25c7459b3bd6 (patch) | |
tree | 9442d454c21870d15b4a3a1b3f19b16db0453dba | |
parent | c60a70bf37f92241e1d6c5ac8884aca47c4ebe86 (diff) | |
download | nautilus-69835b77f7b3114f1c202b0cf88e25c7459b3bd6.tar.gz |
implemented "Show/Hide All Annotations", as well as some miscellaneous
implemented "Show/Hide All Annotations", as well as some
miscellaneous fixes
* libnautilus-extensions/nautilus-canvas-note-item.c:
(nautilus_canvas_note_item_set_note_text), (get_arrow_height),
(draw_item_aa_text), (nautilus_canvas_note_item_point),
(nautilus_canvas_note_item_update):
made the arrow height respect the scale factor
* libnautilus-extensions/nautilus-icon-canvas-item.c,h:
(nautilus_icon_canvas_item_initialize_class),
(nautilus_icon_canvas_item_translate),
(nautilus_icon_canvas_item_set_show_annotation),
(nautilus_icon_canvas_item_event):
override the translate method to move the annotation, too
* libnautilus-extensions/nautilus-icon-container.c,h:
(nautilus_icon_container_is_showing_all_annotations),
(nautilus_icon_container_set_show_all_annotations):
added a "show all" instance variable and access routines to
the icon container
* src/file-manager/fm-icon-view.c: (update_annotation_menu_items),
(show_annotations_callback), (hide_annotations_callback),
(fm_icon_view_merge_menus), (fm_icon_view_update_menus),
(icon_container_activate_callback):
added menu items for show/hide annotations
* src/file-manager/nautilus-icon-view-ui.xml:
added menu items and commands
-rw-r--r-- | ChangeLog | 33 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-canvas-note-item.c | 17 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-icon-canvas-item.c | 85 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-icon-canvas-item.h | 6 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-icon-container.c | 25 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-icon-container.h | 3 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-icon-private.h | 3 | ||||
-rw-r--r-- | libnautilus-private/nautilus-canvas-note-item.c | 17 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-canvas-item.c | 85 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-canvas-item.h | 6 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-container.c | 25 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-container.h | 3 | ||||
-rw-r--r-- | libnautilus-private/nautilus-icon-private.h | 3 | ||||
-rw-r--r-- | src/file-manager/fm-icon-view.c | 47 | ||||
-rw-r--r-- | src/file-manager/nautilus-icon-view-ui.xml | 8 |
15 files changed, 309 insertions, 57 deletions
@@ -1,5 +1,38 @@ 2001-04-12 Andy Hertzfeld <andy@eazel.com> + implemented "Show/Hide All Annotations", as well as some + miscellaneous fixes + + * libnautilus-extensions/nautilus-canvas-note-item.c: + (nautilus_canvas_note_item_set_note_text), (get_arrow_height), + (draw_item_aa_text), (nautilus_canvas_note_item_point), + (nautilus_canvas_note_item_update): + made the arrow height respect the scale factor + + * libnautilus-extensions/nautilus-icon-canvas-item.c,h: + (nautilus_icon_canvas_item_initialize_class), + (nautilus_icon_canvas_item_translate), + (nautilus_icon_canvas_item_set_show_annotation), + (nautilus_icon_canvas_item_event): + override the translate method to move the annotation, too + + * libnautilus-extensions/nautilus-icon-container.c,h: + (nautilus_icon_container_is_showing_all_annotations), + (nautilus_icon_container_set_show_all_annotations): + added a "show all" instance variable and access routines to + the icon container + + * src/file-manager/fm-icon-view.c: (update_annotation_menu_items), + (show_annotations_callback), (hide_annotations_callback), + (fm_icon_view_merge_menus), (fm_icon_view_update_menus), + (icon_container_activate_callback): + added menu items for show/hide annotations + + * src/file-manager/nautilus-icon-view-ui.xml: + added menu items and commands + +2001-04-12 Andy Hertzfeld <andy@eazel.com> + keep showing an annotation as long as the mouse remains in the emblem or in the annotation itself. diff --git a/libnautilus-extensions/nautilus-canvas-note-item.c b/libnautilus-extensions/nautilus-canvas-note-item.c index d179d9de4..c07472c55 100644 --- a/libnautilus-extensions/nautilus-canvas-note-item.c +++ b/libnautilus-extensions/nautilus-canvas-note-item.c @@ -360,7 +360,6 @@ nautilus_canvas_note_item_set_note_text (NautilusCanvasNoteItem *note_item, cons note_item->x2 = floor (note_item->x1 + (width / item->canvas->pixels_per_unit) + .5); note_item->y2 = floor (note_item->y1 + 4.0 + (height / item->canvas->pixels_per_unit) + .5); - update_item_bounding_box (note_item); g_free (display_text); @@ -674,10 +673,12 @@ nautilus_canvas_note_item_bounds (GnomeCanvasItem *item, double *x1, double *y1, *y2 = note_item->y2 + hwidth; } -/* utility routine to map raw annotation text into text to be displayed */ -/* for now this is pretty naive and only handles free-form text, just returning - * the first suitable annotation it can find - */ +/* fetch the height of the arrow scaled to the current coordinates */ +static int +get_arrow_height (GnomeCanvasItem *item) +{ + return ARROW_HEIGHT / item->canvas->pixels_per_unit; +} /* utility routine to draw a text string into the passed-in item */ static void @@ -710,7 +711,7 @@ draw_item_aa_text (GnomeCanvasBuf *buf, GnomeCanvasItem *item, const char *note_ eel_smooth_text_layout_set_line_wrap_width (smooth_text_layout, width - 4); dest_bounds.x0 = 0; - dest_bounds.y0 = ARROW_HEIGHT; + dest_bounds.y0 = get_arrow_height (item); dest_bounds.x1 = width; dest_bounds.y1 = height; @@ -899,7 +900,7 @@ nautilus_canvas_note_item_point (GnomeCanvasItem *item, double x, double y, int /* handle the arrow if we're in aa mode */ if (item->canvas->aa) { old_top = y1; - y1 += ARROW_HEIGHT; + y1 += get_arrow_height (item); if (y >= old_top && y <= y1) { arrow_half_width = get_arrow_half_width (x1, x2); @@ -960,7 +961,7 @@ nautilus_canvas_note_item_update (GnomeCanvasItem *item, double affine[6], ArtSV if (item->canvas->aa) { x0 = note_item->x1; - y0 = note_item->y1 + ARROW_HEIGHT; + y0 = note_item->y1 + get_arrow_height (item); x1 = note_item->x2; y1 = note_item->y2; diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.c b/libnautilus-extensions/nautilus-icon-canvas-item.c index 83c4a4317..c47a986bf 100644 --- a/libnautilus-extensions/nautilus-icon-canvas-item.c +++ b/libnautilus-extensions/nautilus-icon-canvas-item.c @@ -50,6 +50,7 @@ #include <eel/eel-gtk-macros.h> #include <eel/eel-gnome-extensions.h> #include <eel/eel-graphic-effects.h> +#include "nautilus-annotation.h" #include "nautilus-file-utilities.h" #include "nautilus-icon-factory.h" #include "nautilus-theme.h" @@ -193,6 +194,10 @@ static double nautilus_icon_canvas_item_point (GnomeCanvasItem int cx, int cy, GnomeCanvasItem **actual_item); +static void nautilus_icon_canvas_item_translate (GnomeCanvasItem *item, + double dx, + double dy); + static void nautilus_icon_canvas_item_bounds (GnomeCanvasItem *item, double *x1, double *y1, @@ -299,6 +304,7 @@ nautilus_icon_canvas_item_initialize_class (NautilusIconCanvasItemClass *class) item_class->point = nautilus_icon_canvas_item_point; item_class->bounds = nautilus_icon_canvas_item_bounds; item_class->event = nautilus_icon_canvas_item_event; + item_class->translate = nautilus_icon_canvas_item_translate; nautilus_preferences_add_auto_integer (NAUTILUS_PREFERENCES_CLICK_POLICY, &click_policy_auto_value); @@ -366,6 +372,22 @@ nautilus_icon_canvas_item_destroy (GtkObject *object) EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object)); } +/* handle translate calls by moving the annotation, too, if it's showing */ +static void +nautilus_icon_canvas_item_translate (GnomeCanvasItem *item, double dx, double dy) +{ + NautilusIconCanvasItem *icon_item; + + g_message ("in translate, x %f y %f", dx, dy); + + EEL_CALL_PARENT (GNOME_CANVAS_ITEM_CLASS, translate, (item, dx, dy)); + + icon_item = NAUTILUS_ICON_CANVAS_ITEM (item); + if (icon_item->details->annotation) { + gnome_canvas_item_move (icon_item->details->annotation, dx, dy); + } +} + /* Currently we require pixbufs in this format (for hit testing). * Perhaps gdk-pixbuf will be changed so it can do the hit testing * and we won't have this requirement any more. @@ -1977,6 +1999,27 @@ nautilus_icon_canvas_item_set_note_state (NautilusIconCanvasItem *icon_item, int } } +/* handle showing or hiding annotations associated with this emblem, if any */ +void +nautilus_icon_canvas_item_set_show_annotation (NautilusIconCanvasItem *icon_item, gboolean show_flag) +{ + NautilusIcon *icon; + + if ((show_flag && icon_item->details->annotation != NULL) || + (!show_flag && icon_item->details->annotation == NULL)) { + return; + } + + if (show_flag) { + /* we need to calculate the emblem_index, but just use a fixed one for now */ + icon = (NautilusIcon*) icon_item->user_data; + if (nautilus_annotation_get_count (NAUTILUS_FILE (icon->data)) > 0) { + create_annotation (icon_item, 1); + } + } else { + remove_annotation (icon_item); + } +} /* handle events */ @@ -2040,15 +2083,21 @@ nautilus_icon_canvas_item_event (GnomeCanvasItem *item, GdkEvent *event) icon_item->details->is_active = 0; icon_item->details->is_highlighted_for_drop = FALSE; - /* if the item has an annotation and the mouse is in it - * don't reset the note_state + /* if we're in "show all annotations" mode, don't respond to + * entering or leaving */ - gdk_window_get_pointer (GTK_WIDGET (item->canvas)->window, &x, &y, NULL); - gnome_canvas_window_to_world (item->canvas, x, y, &world_x, &world_y); - mouse_over_item = gnome_canvas_get_item_at (item->canvas, world_x, world_y); + if (!nautilus_icon_container_is_showing_all_annotations (NAUTILUS_ICON_CONTAINER (item->canvas))) { + + /* if the item has an annotation and the mouse is in it + * don't reset the note_state + */ + gdk_window_get_pointer (GTK_WIDGET (item->canvas)->window, &x, &y, NULL); + gnome_canvas_window_to_world (item->canvas, x, y, &world_x, &world_y); + mouse_over_item = gnome_canvas_get_item_at (item->canvas, world_x, world_y); - if (mouse_over_item == NULL || mouse_over_item != icon_item->details->annotation) { - nautilus_icon_canvas_item_set_note_state (icon_item, 0); + if (mouse_over_item == NULL || mouse_over_item != icon_item->details->annotation) { + nautilus_icon_canvas_item_set_note_state (icon_item, 0); + } } gnome_canvas_item_request_update (item); @@ -2058,18 +2107,20 @@ nautilus_icon_canvas_item_event (GnomeCanvasItem *item, GdkEvent *event) case GDK_MOTION_NOTIFY: motion_event = (GdkEventMotion*) event; - world_rect.x0 = motion_event->x; - world_rect.y0 = motion_event->y; - world_rect.x1 = world_rect.x0 + 1.0; - world_rect.y1 = world_rect.y0 + 1.0; + if (!nautilus_icon_container_is_showing_all_annotations (NAUTILUS_ICON_CONTAINER (item->canvas))) { + world_rect.x0 = motion_event->x; + world_rect.y0 = motion_event->y; + world_rect.x1 = world_rect.x0 + 1.0; + world_rect.y1 = world_rect.y0 + 1.0; - eel_gnome_canvas_world_to_canvas_rectangle - (GNOME_CANVAS_ITEM (item)->canvas, &world_rect, &hit_rect); + eel_gnome_canvas_world_to_canvas_rectangle + (GNOME_CANVAS_ITEM (item)->canvas, &world_rect, &hit_rect); - /* hit-test so we can handle tooltips for emblems */ - nautilus_icon_canvas_item_hit_test_full (icon_item, &hit_rect, &hit_type, &hit_index); - emblem_state = hit_type == EMBLEM_HIT ? hit_index : 0; - nautilus_icon_canvas_item_set_note_state (icon_item, emblem_state); + /* hit-test so we can handle tooltips for emblems */ + nautilus_icon_canvas_item_hit_test_full (icon_item, &hit_rect, &hit_type, &hit_index); + emblem_state = hit_type == EMBLEM_HIT ? hit_index : 0; + nautilus_icon_canvas_item_set_note_state (icon_item, emblem_state); + } return TRUE; default: diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.h b/libnautilus-extensions/nautilus-icon-canvas-item.h index b56c9aefd..08a76b5fc 100644 --- a/libnautilus-extensions/nautilus-icon-canvas-item.h +++ b/libnautilus-extensions/nautilus-icon-canvas-item.h @@ -107,8 +107,10 @@ void nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasI void nautilus_icon_canvas_item_get_icon_rectangle (NautilusIconCanvasItem *item, ArtDRect *world_rectangle); void nautilus_icon_canvas_item_update_bounds (NautilusIconCanvasItem *item); -void nautilus_icon_canvas_item_set_note_state (NautilusIconCanvasItem *icon_item, int new_state); - +void nautilus_icon_canvas_item_set_note_state (NautilusIconCanvasItem *icon_item, + int new_state); +void nautilus_icon_canvas_item_set_show_annotation (NautilusIconCanvasItem *icon_item, + gboolean show_flag); void nautilus_icon_canvas_item_set_smooth_font (NautilusIconCanvasItem *item, EelScalableFont *font); void nautilus_icon_canvas_item_set_smooth_font_size (NautilusIconCanvasItem *item, diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c index 3a88d75e9..2e1de1c60 100644 --- a/libnautilus-extensions/nautilus-icon-container.c +++ b/libnautilus-extensions/nautilus-icon-container.c @@ -5179,6 +5179,31 @@ nautilus_icon_container_get_note_text (NautilusIconContainer *container, return note_text; } +/* return the state of the show all annotations flag */ +gboolean +nautilus_icon_container_is_showing_all_annotations (NautilusIconContainer *container) +{ + return container->details->show_all_annotations; +} + +/* set the state of the show all annotations flag */ +void +nautilus_icon_container_set_show_all_annotations (NautilusIconContainer *container, + gboolean show_flag) +{ + GList *p; + NautilusIcon *icon; + + if (container->details->show_all_annotations != show_flag) { + container->details->show_all_annotations = show_flag; + + for (p = container->details->icons; p != NULL; p = p->next) { + icon = p->data; + nautilus_icon_canvas_item_set_show_annotation (icon->item, show_flag); + } + } +} + /* Return if the icon container is a fixed size */ gboolean nautilus_icon_container_get_is_fixed_size (NautilusIconContainer *container) diff --git a/libnautilus-extensions/nautilus-icon-container.h b/libnautilus-extensions/nautilus-icon-container.h index 4510110ec..e6cbd02f0 100644 --- a/libnautilus-extensions/nautilus-icon-container.h +++ b/libnautilus-extensions/nautilus-icon-container.h @@ -183,6 +183,9 @@ gboolean nautilus_icon_container_is_empty (Nautilu gboolean nautilus_icon_container_is_auto_layout (NautilusIconContainer *container); void nautilus_icon_container_set_auto_layout (NautilusIconContainer *container, gboolean auto_layout); +gboolean nautilus_icon_container_is_showing_all_annotations (NautilusIconContainer *container); +void nautilus_icon_container_set_show_all_annotations (NautilusIconContainer *container, + gboolean show_flag); gboolean nautilus_icon_container_is_tighter_layout (NautilusIconContainer *container); void nautilus_icon_container_set_tighter_layout (NautilusIconContainer *container, gboolean tighter_layout); diff --git a/libnautilus-extensions/nautilus-icon-private.h b/libnautilus-extensions/nautilus-icon-private.h index d31a13265..fb7cc9a64 100644 --- a/libnautilus-extensions/nautilus-icon-private.h +++ b/libnautilus-extensions/nautilus-icon-private.h @@ -204,6 +204,9 @@ struct NautilusIconContainerDetails { /* Set to TRUE after first allocation has been done */ gboolean has_been_allocated; + /* flag to control showing all the annotations */ + gboolean show_all_annotations; + /* Is the container fixed or resizable */ gboolean is_fixed_size; diff --git a/libnautilus-private/nautilus-canvas-note-item.c b/libnautilus-private/nautilus-canvas-note-item.c index d179d9de4..c07472c55 100644 --- a/libnautilus-private/nautilus-canvas-note-item.c +++ b/libnautilus-private/nautilus-canvas-note-item.c @@ -360,7 +360,6 @@ nautilus_canvas_note_item_set_note_text (NautilusCanvasNoteItem *note_item, cons note_item->x2 = floor (note_item->x1 + (width / item->canvas->pixels_per_unit) + .5); note_item->y2 = floor (note_item->y1 + 4.0 + (height / item->canvas->pixels_per_unit) + .5); - update_item_bounding_box (note_item); g_free (display_text); @@ -674,10 +673,12 @@ nautilus_canvas_note_item_bounds (GnomeCanvasItem *item, double *x1, double *y1, *y2 = note_item->y2 + hwidth; } -/* utility routine to map raw annotation text into text to be displayed */ -/* for now this is pretty naive and only handles free-form text, just returning - * the first suitable annotation it can find - */ +/* fetch the height of the arrow scaled to the current coordinates */ +static int +get_arrow_height (GnomeCanvasItem *item) +{ + return ARROW_HEIGHT / item->canvas->pixels_per_unit; +} /* utility routine to draw a text string into the passed-in item */ static void @@ -710,7 +711,7 @@ draw_item_aa_text (GnomeCanvasBuf *buf, GnomeCanvasItem *item, const char *note_ eel_smooth_text_layout_set_line_wrap_width (smooth_text_layout, width - 4); dest_bounds.x0 = 0; - dest_bounds.y0 = ARROW_HEIGHT; + dest_bounds.y0 = get_arrow_height (item); dest_bounds.x1 = width; dest_bounds.y1 = height; @@ -899,7 +900,7 @@ nautilus_canvas_note_item_point (GnomeCanvasItem *item, double x, double y, int /* handle the arrow if we're in aa mode */ if (item->canvas->aa) { old_top = y1; - y1 += ARROW_HEIGHT; + y1 += get_arrow_height (item); if (y >= old_top && y <= y1) { arrow_half_width = get_arrow_half_width (x1, x2); @@ -960,7 +961,7 @@ nautilus_canvas_note_item_update (GnomeCanvasItem *item, double affine[6], ArtSV if (item->canvas->aa) { x0 = note_item->x1; - y0 = note_item->y1 + ARROW_HEIGHT; + y0 = note_item->y1 + get_arrow_height (item); x1 = note_item->x2; y1 = note_item->y2; diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c index 83c4a4317..c47a986bf 100644 --- a/libnautilus-private/nautilus-icon-canvas-item.c +++ b/libnautilus-private/nautilus-icon-canvas-item.c @@ -50,6 +50,7 @@ #include <eel/eel-gtk-macros.h> #include <eel/eel-gnome-extensions.h> #include <eel/eel-graphic-effects.h> +#include "nautilus-annotation.h" #include "nautilus-file-utilities.h" #include "nautilus-icon-factory.h" #include "nautilus-theme.h" @@ -193,6 +194,10 @@ static double nautilus_icon_canvas_item_point (GnomeCanvasItem int cx, int cy, GnomeCanvasItem **actual_item); +static void nautilus_icon_canvas_item_translate (GnomeCanvasItem *item, + double dx, + double dy); + static void nautilus_icon_canvas_item_bounds (GnomeCanvasItem *item, double *x1, double *y1, @@ -299,6 +304,7 @@ nautilus_icon_canvas_item_initialize_class (NautilusIconCanvasItemClass *class) item_class->point = nautilus_icon_canvas_item_point; item_class->bounds = nautilus_icon_canvas_item_bounds; item_class->event = nautilus_icon_canvas_item_event; + item_class->translate = nautilus_icon_canvas_item_translate; nautilus_preferences_add_auto_integer (NAUTILUS_PREFERENCES_CLICK_POLICY, &click_policy_auto_value); @@ -366,6 +372,22 @@ nautilus_icon_canvas_item_destroy (GtkObject *object) EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object)); } +/* handle translate calls by moving the annotation, too, if it's showing */ +static void +nautilus_icon_canvas_item_translate (GnomeCanvasItem *item, double dx, double dy) +{ + NautilusIconCanvasItem *icon_item; + + g_message ("in translate, x %f y %f", dx, dy); + + EEL_CALL_PARENT (GNOME_CANVAS_ITEM_CLASS, translate, (item, dx, dy)); + + icon_item = NAUTILUS_ICON_CANVAS_ITEM (item); + if (icon_item->details->annotation) { + gnome_canvas_item_move (icon_item->details->annotation, dx, dy); + } +} + /* Currently we require pixbufs in this format (for hit testing). * Perhaps gdk-pixbuf will be changed so it can do the hit testing * and we won't have this requirement any more. @@ -1977,6 +1999,27 @@ nautilus_icon_canvas_item_set_note_state (NautilusIconCanvasItem *icon_item, int } } +/* handle showing or hiding annotations associated with this emblem, if any */ +void +nautilus_icon_canvas_item_set_show_annotation (NautilusIconCanvasItem *icon_item, gboolean show_flag) +{ + NautilusIcon *icon; + + if ((show_flag && icon_item->details->annotation != NULL) || + (!show_flag && icon_item->details->annotation == NULL)) { + return; + } + + if (show_flag) { + /* we need to calculate the emblem_index, but just use a fixed one for now */ + icon = (NautilusIcon*) icon_item->user_data; + if (nautilus_annotation_get_count (NAUTILUS_FILE (icon->data)) > 0) { + create_annotation (icon_item, 1); + } + } else { + remove_annotation (icon_item); + } +} /* handle events */ @@ -2040,15 +2083,21 @@ nautilus_icon_canvas_item_event (GnomeCanvasItem *item, GdkEvent *event) icon_item->details->is_active = 0; icon_item->details->is_highlighted_for_drop = FALSE; - /* if the item has an annotation and the mouse is in it - * don't reset the note_state + /* if we're in "show all annotations" mode, don't respond to + * entering or leaving */ - gdk_window_get_pointer (GTK_WIDGET (item->canvas)->window, &x, &y, NULL); - gnome_canvas_window_to_world (item->canvas, x, y, &world_x, &world_y); - mouse_over_item = gnome_canvas_get_item_at (item->canvas, world_x, world_y); + if (!nautilus_icon_container_is_showing_all_annotations (NAUTILUS_ICON_CONTAINER (item->canvas))) { + + /* if the item has an annotation and the mouse is in it + * don't reset the note_state + */ + gdk_window_get_pointer (GTK_WIDGET (item->canvas)->window, &x, &y, NULL); + gnome_canvas_window_to_world (item->canvas, x, y, &world_x, &world_y); + mouse_over_item = gnome_canvas_get_item_at (item->canvas, world_x, world_y); - if (mouse_over_item == NULL || mouse_over_item != icon_item->details->annotation) { - nautilus_icon_canvas_item_set_note_state (icon_item, 0); + if (mouse_over_item == NULL || mouse_over_item != icon_item->details->annotation) { + nautilus_icon_canvas_item_set_note_state (icon_item, 0); + } } gnome_canvas_item_request_update (item); @@ -2058,18 +2107,20 @@ nautilus_icon_canvas_item_event (GnomeCanvasItem *item, GdkEvent *event) case GDK_MOTION_NOTIFY: motion_event = (GdkEventMotion*) event; - world_rect.x0 = motion_event->x; - world_rect.y0 = motion_event->y; - world_rect.x1 = world_rect.x0 + 1.0; - world_rect.y1 = world_rect.y0 + 1.0; + if (!nautilus_icon_container_is_showing_all_annotations (NAUTILUS_ICON_CONTAINER (item->canvas))) { + world_rect.x0 = motion_event->x; + world_rect.y0 = motion_event->y; + world_rect.x1 = world_rect.x0 + 1.0; + world_rect.y1 = world_rect.y0 + 1.0; - eel_gnome_canvas_world_to_canvas_rectangle - (GNOME_CANVAS_ITEM (item)->canvas, &world_rect, &hit_rect); + eel_gnome_canvas_world_to_canvas_rectangle + (GNOME_CANVAS_ITEM (item)->canvas, &world_rect, &hit_rect); - /* hit-test so we can handle tooltips for emblems */ - nautilus_icon_canvas_item_hit_test_full (icon_item, &hit_rect, &hit_type, &hit_index); - emblem_state = hit_type == EMBLEM_HIT ? hit_index : 0; - nautilus_icon_canvas_item_set_note_state (icon_item, emblem_state); + /* hit-test so we can handle tooltips for emblems */ + nautilus_icon_canvas_item_hit_test_full (icon_item, &hit_rect, &hit_type, &hit_index); + emblem_state = hit_type == EMBLEM_HIT ? hit_index : 0; + nautilus_icon_canvas_item_set_note_state (icon_item, emblem_state); + } return TRUE; default: diff --git a/libnautilus-private/nautilus-icon-canvas-item.h b/libnautilus-private/nautilus-icon-canvas-item.h index b56c9aefd..08a76b5fc 100644 --- a/libnautilus-private/nautilus-icon-canvas-item.h +++ b/libnautilus-private/nautilus-icon-canvas-item.h @@ -107,8 +107,10 @@ void nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasI void nautilus_icon_canvas_item_get_icon_rectangle (NautilusIconCanvasItem *item, ArtDRect *world_rectangle); void nautilus_icon_canvas_item_update_bounds (NautilusIconCanvasItem *item); -void nautilus_icon_canvas_item_set_note_state (NautilusIconCanvasItem *icon_item, int new_state); - +void nautilus_icon_canvas_item_set_note_state (NautilusIconCanvasItem *icon_item, + int new_state); +void nautilus_icon_canvas_item_set_show_annotation (NautilusIconCanvasItem *icon_item, + gboolean show_flag); void nautilus_icon_canvas_item_set_smooth_font (NautilusIconCanvasItem *item, EelScalableFont *font); void nautilus_icon_canvas_item_set_smooth_font_size (NautilusIconCanvasItem *item, diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index 3a88d75e9..2e1de1c60 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -5179,6 +5179,31 @@ nautilus_icon_container_get_note_text (NautilusIconContainer *container, return note_text; } +/* return the state of the show all annotations flag */ +gboolean +nautilus_icon_container_is_showing_all_annotations (NautilusIconContainer *container) +{ + return container->details->show_all_annotations; +} + +/* set the state of the show all annotations flag */ +void +nautilus_icon_container_set_show_all_annotations (NautilusIconContainer *container, + gboolean show_flag) +{ + GList *p; + NautilusIcon *icon; + + if (container->details->show_all_annotations != show_flag) { + container->details->show_all_annotations = show_flag; + + for (p = container->details->icons; p != NULL; p = p->next) { + icon = p->data; + nautilus_icon_canvas_item_set_show_annotation (icon->item, show_flag); + } + } +} + /* Return if the icon container is a fixed size */ gboolean nautilus_icon_container_get_is_fixed_size (NautilusIconContainer *container) diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h index 4510110ec..e6cbd02f0 100644 --- a/libnautilus-private/nautilus-icon-container.h +++ b/libnautilus-private/nautilus-icon-container.h @@ -183,6 +183,9 @@ gboolean nautilus_icon_container_is_empty (Nautilu gboolean nautilus_icon_container_is_auto_layout (NautilusIconContainer *container); void nautilus_icon_container_set_auto_layout (NautilusIconContainer *container, gboolean auto_layout); +gboolean nautilus_icon_container_is_showing_all_annotations (NautilusIconContainer *container); +void nautilus_icon_container_set_show_all_annotations (NautilusIconContainer *container, + gboolean show_flag); gboolean nautilus_icon_container_is_tighter_layout (NautilusIconContainer *container); void nautilus_icon_container_set_tighter_layout (NautilusIconContainer *container, gboolean tighter_layout); diff --git a/libnautilus-private/nautilus-icon-private.h b/libnautilus-private/nautilus-icon-private.h index d31a13265..fb7cc9a64 100644 --- a/libnautilus-private/nautilus-icon-private.h +++ b/libnautilus-private/nautilus-icon-private.h @@ -204,6 +204,9 @@ struct NautilusIconContainerDetails { /* Set to TRUE after first allocation has been done */ gboolean has_been_allocated; + /* flag to control showing all the annotations */ + gboolean show_all_annotations; + /* Is the container fixed or resizable */ gboolean is_fixed_size; diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index cd9691f36..76b76630e 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -91,6 +91,8 @@ #define COMMAND_PREFIX "/commands/" #define COMMAND_RENAME "/commands/Rename" #define COMMAND_ANNOTATE "/commands/Annotate" +#define COMMAND_SHOW_ANNOTATIONS "/commands/Show Annotations" +#define COMMAND_HIDE_ANNOTATIONS "/commands/Hide Annotations" #define COMMAND_STRETCH_ICON "/commands/Stretch" #define COMMAND_UNSTRETCH_ICONS "/commands/Unstretch" #define COMMAND_TIGHTER_LAYOUT "/commands/Tighter Layout" @@ -423,6 +425,39 @@ annotate_callback (BonoboUIComponent *component, gpointer callback_data, const c } static void +update_annotation_menu_items (FMIconView *icon_view) +{ + gboolean is_showing; + + is_showing = nautilus_icon_container_is_showing_all_annotations (get_icon_container (icon_view)); + + nautilus_bonobo_set_hidden + (icon_view->details->ui, COMMAND_SHOW_ANNOTATIONS, is_showing); + nautilus_bonobo_set_hidden + (icon_view->details->ui, COMMAND_HIDE_ANNOTATIONS, !is_showing); +} + +static void +show_annotations_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +{ + NautilusIconContainer *icon_container; + + icon_container = get_icon_container (FM_ICON_VIEW (callback_data)); + nautilus_icon_container_set_show_all_annotations (icon_container, TRUE); + update_annotation_menu_items ( FM_ICON_VIEW (callback_data)); +} + +static void +hide_annotations_callback (BonoboUIComponent *component, gpointer callback_data, const char *verb) +{ + NautilusIconContainer *icon_container; + + icon_container = get_icon_container (FM_ICON_VIEW (callback_data)); + nautilus_icon_container_set_show_all_annotations (icon_container, FALSE); + update_annotation_menu_items ( FM_ICON_VIEW (callback_data)); +} + +static void set_tighter_layout (FMIconView *icon_view, gboolean new_value) { fm_icon_view_set_directory_tighter_layout (icon_view, @@ -1274,6 +1309,8 @@ fm_icon_view_merge_menus (FMDirectoryView *view) BonoboUIVerb verbs [] = { BONOBO_UI_VERB ("Rename", rename_icon_callback), BONOBO_UI_VERB ("Annotate", annotate_callback), + BONOBO_UI_VERB ("Show Annotations", show_annotations_callback), + BONOBO_UI_VERB ("Hide Annotations", hide_annotations_callback), BONOBO_UI_VERB ("Icon Text", customize_icon_text_callback), BONOBO_UI_VERB ("Stretch", show_stretch_handles_callback), BONOBO_UI_VERB ("Unstretch", unstretch_icons_callback), @@ -1312,6 +1349,9 @@ fm_icon_view_merge_menus (FMDirectoryView *view) nautilus_bonobo_set_hidden (icon_view->details->ui, POPUP_PATH_LAY_OUT, TRUE); } + + /* show or hide the global annotation items based on the current state */ + update_annotation_menu_items (icon_view); update_layout_menus (icon_view); @@ -1367,7 +1407,8 @@ fm_icon_view_update_menus (FMDirectoryView *view) nautilus_bonobo_set_sensitive (icon_view->details->ui, COMMAND_ANNOTATE, selection_count == 1); - + + bonobo_ui_component_thaw (icon_view->details->ui, NULL); nautilus_file_list_free (selection); @@ -1490,8 +1531,8 @@ icon_container_activate_callback (NautilusIconContainer *container, if (emblem_index > 0 && file_list != NULL && file_list->next == NULL) { file = NAUTILUS_FILE (file_list->data); keyword = get_keyword_by_index (file, emblem_index); - if (eel_strcmp (keyword, "note") == 0) { - fm_annotation_window_present (file, FM_DIRECTORY_VIEW (icon_view)); + if (eel_strcmp (keyword, "note") == 0) { + fm_annotation_window_present (file, FM_DIRECTORY_VIEW (icon_view)); g_free (keyword); return; } diff --git a/src/file-manager/nautilus-icon-view-ui.xml b/src/file-manager/nautilus-icon-view-ui.xml index 26ac06eb9..88f004f89 100644 --- a/src/file-manager/nautilus-icon-view-ui.xml +++ b/src/file-manager/nautilus-icon-view-ui.xml @@ -6,6 +6,12 @@ <cmd name="Annotate" _label="Add Annotation..." _tip="Add an annotation to this file"/> + <cmd name="Show Annotations" + _label="Show All Annotations" + _tip="Show all of the annotations in this directory"/> + <cmd name="Hide Annotations" + _label="Hide All Annotations" + _tip="Hide all of the annotations in this directory"/> <cmd name="Icon Text" _label="Icon Captions..." _tip="Choose which information appears beneath each icon's name"/> @@ -150,6 +156,8 @@ type="toggle"/> </submenu> <menuitem name="Clean Up" verb="Clean Up"/> + <menuitem name="Show All Annotations" verb="Show Annotations"/> + <menuitem name="Hide All Annotations" verb="Hide Annotations"/> </placeholder> </placeholder> </popup> |