summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Hertzfeld <andy@src.gnome.org>2001-04-10 23:33:13 +0000
committerAndy Hertzfeld <andy@src.gnome.org>2001-04-10 23:33:13 +0000
commitd815e27c2b3fb9e74bac1db6aa9d15ec171c0405 (patch)
tree2d3159adaea3c539180dac2b02073efe3b352666
parentc14b9f008801b7d15062b512ea29064ca744cb7d (diff)
downloadnautilus-d815e27c2b3fb9e74bac1db6aa9d15ec171c0405.tar.gz
added a way for custom actions to take place when the user clicks on an
added a way for custom actions to take place when the user clicks on an emblem, and used that to bring up the annotation window when the "note" emblem is clicked on. * libnautilus-extensions/nautilus-icon-canvas-item.c,h: (nautilus_icon_canvas_item_event), (nautilus_icon_canvas_item_hit_test_full), (nautilus_icon_canvas_item_point), (nautilus_icon_canvas_item_hit_test_rectangle): renamed the "hit_test" routine to nautilus_icon_canvas_hit_test_full, and made it public. * libnautilus-extensions/nautilus-icon-container.c: (hit_test_item), (nautilus_icon_container_did_not_drag), (key_press_event), (nautilus_icon_container_initialize_class), (handle_icon_button_press), (activate_selected_items): added an emblem index parameter to the icon canvas's activate signal, and set it up properly by calling the item hit test routine to determine the emblem index. * src/file-manager/fm-icon-view.c: (get_keyword_by_index), (icon_container_activate_callback), (get_icon_annotation_callback): changed the activate callback to bring up the annotation window if the annotation emblem is clicked.
-rw-r--r--ChangeLog27
-rw-r--r--libnautilus-extensions/nautilus-icon-canvas-item.c30
-rw-r--r--libnautilus-extensions/nautilus-icon-canvas-item.h13
-rw-r--r--libnautilus-extensions/nautilus-icon-container.c52
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.c30
-rw-r--r--libnautilus-private/nautilus-icon-canvas-item.h13
-rw-r--r--libnautilus-private/nautilus-icon-container.c52
-rw-r--r--src/file-manager/fm-icon-view.c60
8 files changed, 198 insertions, 79 deletions
diff --git a/ChangeLog b/ChangeLog
index f5935db78..e1bbd3c7a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,32 @@
2001-04-10 Andy Hertzfeld <andy@eazel.com>
+ added a way for custom actions to take place when the user clicks
+ on an emblem, and used that to bring up the annotation window
+ when the "note" emblem is clicked on.
+
+ * libnautilus-extensions/nautilus-icon-canvas-item.c,h:
+ (nautilus_icon_canvas_item_event),
+ (nautilus_icon_canvas_item_hit_test_full),
+ (nautilus_icon_canvas_item_point),
+ (nautilus_icon_canvas_item_hit_test_rectangle):
+ renamed the "hit_test" routine to nautilus_icon_canvas_hit_test_full,
+ and made it public.
+
+ * libnautilus-extensions/nautilus-icon-container.c:
+ (hit_test_item), (nautilus_icon_container_did_not_drag),
+ (key_press_event), (nautilus_icon_container_initialize_class),
+ (handle_icon_button_press), (activate_selected_items):
+ added an emblem index parameter to the icon canvas's activate
+ signal, and set it up properly by calling the item hit test
+ routine to determine the emblem index.
+
+ * src/file-manager/fm-icon-view.c: (get_keyword_by_index),
+ (icon_container_activate_callback), (get_icon_annotation_callback):
+ changed the activate callback to bring up the annotation window
+ if the annotation emblem is clicked.
+
+2001-04-10 Andy Hertzfeld <andy@eazel.com>
+
* libnautilus-extensions/nautilus-canvas-note-item.c:
(nautilus_canvas_note_item_set_note_text),
(nautilus_canvas_note_item_update):
diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.c b/libnautilus-extensions/nautilus-icon-canvas-item.c
index c1d500e15..58b729a95 100644
--- a/libnautilus-extensions/nautilus-icon-canvas-item.c
+++ b/libnautilus-extensions/nautilus-icon-canvas-item.c
@@ -137,14 +137,6 @@ typedef enum {
TOP_SIDE
} RectangleSide;
-typedef enum {
- NO_HIT,
- ICON_HIT,
- LABEL_HIT,
- STRETCH_HANDLE_HIT,
- EMBLEM_HIT
-} HitType;
-
typedef struct {
NautilusIconCanvasItem *icon_item;
ArtIRect icon_rect;
@@ -243,11 +235,6 @@ static gboolean hit_test_stretch_handle (NautilusIconCanvasIt
const ArtIRect *canvas_rect);
static gboolean icon_canvas_item_is_smooth (const NautilusIconCanvasItem *icon_item);
-static gboolean hit_test (NautilusIconCanvasItem *icon_item,
- const ArtIRect *canvas_rect,
- HitType *hit_type,
- int *hit_index);
-
EEL_DEFINE_CLASS_BOILERPLATE (NautilusIconCanvasItem, nautilus_icon_canvas_item, GNOME_TYPE_CANVAS_ITEM)
@@ -2065,7 +2052,7 @@ nautilus_icon_canvas_item_event (GnomeCanvasItem *item, GdkEvent *event)
(GNOME_CANVAS_ITEM (item)->canvas, &world_rect, &hit_rect);
/* hit-test so we can handle tooltips for emblems */
- hit_test (icon_item, &hit_rect, &hit_type, &hit_index);
+ 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;
@@ -2122,8 +2109,11 @@ hit_test_pixbuf (GdkPixbuf *pixbuf, const ArtIRect *pixbuf_location, const ArtIR
return FALSE;
}
-static gboolean
-hit_test (NautilusIconCanvasItem *icon_item, const ArtIRect *canvas_rect, HitType *hit_type, int *hit_index)
+gboolean
+nautilus_icon_canvas_item_hit_test_full (NautilusIconCanvasItem *icon_item,
+ const ArtIRect *canvas_rect,
+ HitType *hit_type,
+ int *hit_index)
{
NautilusIconCanvasItemDetails *details;
ArtIRect icon_rect;
@@ -2213,7 +2203,7 @@ nautilus_icon_canvas_item_point (GnomeCanvasItem *item, double x, double y, int
canvas_rect.y0 = cy;
canvas_rect.x1 = cx + 1;
canvas_rect.y1 = cy + 1;
- if (hit_test (NAUTILUS_ICON_CANVAS_ITEM (item), &canvas_rect, NULL, NULL)) {
+ if (nautilus_icon_canvas_item_hit_test_rectangle (NAUTILUS_ICON_CANVAS_ITEM (item), &canvas_rect)) {
return 0.0;
} else {
/* This value means not hit.
@@ -2449,11 +2439,7 @@ nautilus_icon_canvas_item_hit_test_rectangle (NautilusIconCanvasItem *item, cons
g_return_val_if_fail (NAUTILUS_IS_ICON_CANVAS_ITEM (item), FALSE);
g_return_val_if_fail (canvas_rect != NULL, FALSE);
-/*
- eel_gnome_canvas_world_to_canvas_rectangle
- (GNOME_CANVAS_ITEM (item)->canvas, world_rect, &canvas_rect);
-*/
- return hit_test (item, canvas_rect, NULL, NULL);
+ return nautilus_icon_canvas_item_hit_test_full (item, canvas_rect, NULL, NULL);
}
const char *
diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.h b/libnautilus-extensions/nautilus-icon-canvas-item.h
index 1e65fe084..2f9f90a34 100644
--- a/libnautilus-extensions/nautilus-icon-canvas-item.h
+++ b/libnautilus-extensions/nautilus-icon-canvas-item.h
@@ -44,6 +44,14 @@ BEGIN_GNOME_DECLS
#define NAUTILUS_IS_ICON_CANVAS_ITEM_CLASS(klass) \
(GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_ICON_CANVAS_ITEM))
+typedef enum {
+ NO_HIT,
+ ICON_HIT,
+ LABEL_HIT,
+ STRETCH_HANDLE_HIT,
+ EMBLEM_HIT
+} HitType;
+
typedef struct NautilusIconCanvasItem NautilusIconCanvasItem;
typedef struct NautilusIconCanvasItemClass NautilusIconCanvasItemClass;
typedef struct NautilusIconCanvasItemDetails NautilusIconCanvasItemDetails;
@@ -88,6 +96,11 @@ void nautilus_icon_canvas_item_set_control (NautilusIconCanvasItem
/* geometry and hit testing */
gboolean nautilus_icon_canvas_item_hit_test_rectangle (NautilusIconCanvasItem *item,
const ArtIRect *canvas_rect);
+gboolean nautilus_icon_canvas_item_hit_test_full (NautilusIconCanvasItem *icon_item,
+ const ArtIRect *canvas_rect,
+ HitType *hit_type,
+ int *hit_index);
+
gboolean nautilus_icon_canvas_item_hit_test_stretch_handles (NautilusIconCanvasItem *item,
const ArtPoint *world_point);
void nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasItem *item);
diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c
index d1b3122a8..ec98db60d 100644
--- a/libnautilus-extensions/nautilus-icon-container.c
+++ b/libnautilus-extensions/nautilus-icon-container.c
@@ -119,7 +119,8 @@ enum {
*/
};
-static void activate_selected_items (NautilusIconContainer *container);
+static void activate_selected_items (NautilusIconContainer *container,
+ int select_location);
static void nautilus_icon_container_initialize_class (NautilusIconContainerClass *class);
static void nautilus_icon_container_initialize (NautilusIconContainer *container);
static void nautilus_icon_container_theme_changed (gpointer user_data);
@@ -2536,13 +2537,41 @@ button_press_event (GtkWidget *widget,
return return_value;
}
+/* utility routine to determine which portion of an icon was clicked, and return the
+ * emblem index if an emblem was clicked on
+ */
+static int
+hit_test_item (NautilusIconCanvasItem *icon_item, GdkEventButton *event)
+{
+ ArtDRect world_rect;
+ ArtIRect canvas_rect;
+ HitType hit_type;
+ int emblem_index;
+
+ world_rect.x0 = event->x;
+ world_rect.y0 = 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 (icon_item)->canvas, &world_rect, &canvas_rect);
+
+ if (nautilus_icon_canvas_item_hit_test_full (icon_item, &canvas_rect, &hit_type, &emblem_index)) {
+ if (hit_type == EMBLEM_HIT) {
+ return emblem_index;
+ }
+ }
+ return 0;
+}
+
static void
nautilus_icon_container_did_not_drag (NautilusIconContainer *container,
GdkEventButton *event)
{
+ int click_location;
NautilusIconContainerDetails *details;
+
details = container->details;
-
+
if (!button_event_modifies_selection (event) && !details->drag_icon->is_selected) {
gboolean selection_changed;
@@ -2571,7 +2600,8 @@ nautilus_icon_container_did_not_drag (NautilusIconContainer *container,
* NautilusList goes the other way because its "links" seem
* much more link-like.
*/
- activate_selected_items (container);
+ click_location = hit_test_item (details->drag_icon->item, event);
+ activate_selected_items (container, click_location);
}
}
}
@@ -3003,7 +3033,7 @@ key_press_event (GtkWidget *widget,
break;
case GDK_Return:
case GDK_KP_Enter:
- activate_selected_items (container);
+ activate_selected_items (container, 0);
handled = TRUE;
break;
case GDK_Escape:
@@ -3076,9 +3106,10 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class)
object_class->type,
GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
activate),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_NONE__POINTER_INT,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_INT);
signals[CONTEXT_CLICK_SELECTION]
= gtk_signal_new ("context_click_selection",
GTK_RUN_LAST,
@@ -3549,7 +3580,7 @@ handle_icon_button_press (NautilusIconContainer *container,
details->drag_button = 0;
details->drag_icon = NULL;
- activate_selected_items (container);
+ activate_selected_items (container, 0);
}
return TRUE;
@@ -3704,7 +3735,7 @@ icon_destroy (NautilusIconContainer *container,
/* activate any selected items in the container */
static void
-activate_selected_items (NautilusIconContainer *container)
+activate_selected_items (NautilusIconContainer *container, int select_location)
{
GList *selection;
@@ -3714,7 +3745,8 @@ activate_selected_items (NautilusIconContainer *container)
if (selection != NULL) {
gtk_signal_emit (GTK_OBJECT (container),
signals[ACTIVATE],
- selection);
+ selection,
+ select_location);
}
g_list_free (selection);
}
diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c
index c1d500e15..58b729a95 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.c
+++ b/libnautilus-private/nautilus-icon-canvas-item.c
@@ -137,14 +137,6 @@ typedef enum {
TOP_SIDE
} RectangleSide;
-typedef enum {
- NO_HIT,
- ICON_HIT,
- LABEL_HIT,
- STRETCH_HANDLE_HIT,
- EMBLEM_HIT
-} HitType;
-
typedef struct {
NautilusIconCanvasItem *icon_item;
ArtIRect icon_rect;
@@ -243,11 +235,6 @@ static gboolean hit_test_stretch_handle (NautilusIconCanvasIt
const ArtIRect *canvas_rect);
static gboolean icon_canvas_item_is_smooth (const NautilusIconCanvasItem *icon_item);
-static gboolean hit_test (NautilusIconCanvasItem *icon_item,
- const ArtIRect *canvas_rect,
- HitType *hit_type,
- int *hit_index);
-
EEL_DEFINE_CLASS_BOILERPLATE (NautilusIconCanvasItem, nautilus_icon_canvas_item, GNOME_TYPE_CANVAS_ITEM)
@@ -2065,7 +2052,7 @@ nautilus_icon_canvas_item_event (GnomeCanvasItem *item, GdkEvent *event)
(GNOME_CANVAS_ITEM (item)->canvas, &world_rect, &hit_rect);
/* hit-test so we can handle tooltips for emblems */
- hit_test (icon_item, &hit_rect, &hit_type, &hit_index);
+ 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;
@@ -2122,8 +2109,11 @@ hit_test_pixbuf (GdkPixbuf *pixbuf, const ArtIRect *pixbuf_location, const ArtIR
return FALSE;
}
-static gboolean
-hit_test (NautilusIconCanvasItem *icon_item, const ArtIRect *canvas_rect, HitType *hit_type, int *hit_index)
+gboolean
+nautilus_icon_canvas_item_hit_test_full (NautilusIconCanvasItem *icon_item,
+ const ArtIRect *canvas_rect,
+ HitType *hit_type,
+ int *hit_index)
{
NautilusIconCanvasItemDetails *details;
ArtIRect icon_rect;
@@ -2213,7 +2203,7 @@ nautilus_icon_canvas_item_point (GnomeCanvasItem *item, double x, double y, int
canvas_rect.y0 = cy;
canvas_rect.x1 = cx + 1;
canvas_rect.y1 = cy + 1;
- if (hit_test (NAUTILUS_ICON_CANVAS_ITEM (item), &canvas_rect, NULL, NULL)) {
+ if (nautilus_icon_canvas_item_hit_test_rectangle (NAUTILUS_ICON_CANVAS_ITEM (item), &canvas_rect)) {
return 0.0;
} else {
/* This value means not hit.
@@ -2449,11 +2439,7 @@ nautilus_icon_canvas_item_hit_test_rectangle (NautilusIconCanvasItem *item, cons
g_return_val_if_fail (NAUTILUS_IS_ICON_CANVAS_ITEM (item), FALSE);
g_return_val_if_fail (canvas_rect != NULL, FALSE);
-/*
- eel_gnome_canvas_world_to_canvas_rectangle
- (GNOME_CANVAS_ITEM (item)->canvas, world_rect, &canvas_rect);
-*/
- return hit_test (item, canvas_rect, NULL, NULL);
+ return nautilus_icon_canvas_item_hit_test_full (item, canvas_rect, NULL, NULL);
}
const char *
diff --git a/libnautilus-private/nautilus-icon-canvas-item.h b/libnautilus-private/nautilus-icon-canvas-item.h
index 1e65fe084..2f9f90a34 100644
--- a/libnautilus-private/nautilus-icon-canvas-item.h
+++ b/libnautilus-private/nautilus-icon-canvas-item.h
@@ -44,6 +44,14 @@ BEGIN_GNOME_DECLS
#define NAUTILUS_IS_ICON_CANVAS_ITEM_CLASS(klass) \
(GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_ICON_CANVAS_ITEM))
+typedef enum {
+ NO_HIT,
+ ICON_HIT,
+ LABEL_HIT,
+ STRETCH_HANDLE_HIT,
+ EMBLEM_HIT
+} HitType;
+
typedef struct NautilusIconCanvasItem NautilusIconCanvasItem;
typedef struct NautilusIconCanvasItemClass NautilusIconCanvasItemClass;
typedef struct NautilusIconCanvasItemDetails NautilusIconCanvasItemDetails;
@@ -88,6 +96,11 @@ void nautilus_icon_canvas_item_set_control (NautilusIconCanvasItem
/* geometry and hit testing */
gboolean nautilus_icon_canvas_item_hit_test_rectangle (NautilusIconCanvasItem *item,
const ArtIRect *canvas_rect);
+gboolean nautilus_icon_canvas_item_hit_test_full (NautilusIconCanvasItem *icon_item,
+ const ArtIRect *canvas_rect,
+ HitType *hit_type,
+ int *hit_index);
+
gboolean nautilus_icon_canvas_item_hit_test_stretch_handles (NautilusIconCanvasItem *item,
const ArtPoint *world_point);
void nautilus_icon_canvas_item_invalidate_label_size (NautilusIconCanvasItem *item);
diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c
index d1b3122a8..ec98db60d 100644
--- a/libnautilus-private/nautilus-icon-container.c
+++ b/libnautilus-private/nautilus-icon-container.c
@@ -119,7 +119,8 @@ enum {
*/
};
-static void activate_selected_items (NautilusIconContainer *container);
+static void activate_selected_items (NautilusIconContainer *container,
+ int select_location);
static void nautilus_icon_container_initialize_class (NautilusIconContainerClass *class);
static void nautilus_icon_container_initialize (NautilusIconContainer *container);
static void nautilus_icon_container_theme_changed (gpointer user_data);
@@ -2536,13 +2537,41 @@ button_press_event (GtkWidget *widget,
return return_value;
}
+/* utility routine to determine which portion of an icon was clicked, and return the
+ * emblem index if an emblem was clicked on
+ */
+static int
+hit_test_item (NautilusIconCanvasItem *icon_item, GdkEventButton *event)
+{
+ ArtDRect world_rect;
+ ArtIRect canvas_rect;
+ HitType hit_type;
+ int emblem_index;
+
+ world_rect.x0 = event->x;
+ world_rect.y0 = 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 (icon_item)->canvas, &world_rect, &canvas_rect);
+
+ if (nautilus_icon_canvas_item_hit_test_full (icon_item, &canvas_rect, &hit_type, &emblem_index)) {
+ if (hit_type == EMBLEM_HIT) {
+ return emblem_index;
+ }
+ }
+ return 0;
+}
+
static void
nautilus_icon_container_did_not_drag (NautilusIconContainer *container,
GdkEventButton *event)
{
+ int click_location;
NautilusIconContainerDetails *details;
+
details = container->details;
-
+
if (!button_event_modifies_selection (event) && !details->drag_icon->is_selected) {
gboolean selection_changed;
@@ -2571,7 +2600,8 @@ nautilus_icon_container_did_not_drag (NautilusIconContainer *container,
* NautilusList goes the other way because its "links" seem
* much more link-like.
*/
- activate_selected_items (container);
+ click_location = hit_test_item (details->drag_icon->item, event);
+ activate_selected_items (container, click_location);
}
}
}
@@ -3003,7 +3033,7 @@ key_press_event (GtkWidget *widget,
break;
case GDK_Return:
case GDK_KP_Enter:
- activate_selected_items (container);
+ activate_selected_items (container, 0);
handled = TRUE;
break;
case GDK_Escape:
@@ -3076,9 +3106,10 @@ nautilus_icon_container_initialize_class (NautilusIconContainerClass *class)
object_class->type,
GTK_SIGNAL_OFFSET (NautilusIconContainerClass,
activate),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_NONE__POINTER_INT,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_INT);
signals[CONTEXT_CLICK_SELECTION]
= gtk_signal_new ("context_click_selection",
GTK_RUN_LAST,
@@ -3549,7 +3580,7 @@ handle_icon_button_press (NautilusIconContainer *container,
details->drag_button = 0;
details->drag_icon = NULL;
- activate_selected_items (container);
+ activate_selected_items (container, 0);
}
return TRUE;
@@ -3704,7 +3735,7 @@ icon_destroy (NautilusIconContainer *container,
/* activate any selected items in the container */
static void
-activate_selected_items (NautilusIconContainer *container)
+activate_selected_items (NautilusIconContainer *container, int select_location)
{
GList *selection;
@@ -3714,7 +3745,8 @@ activate_selected_items (NautilusIconContainer *container)
if (selection != NULL) {
gtk_signal_emit (GTK_OBJECT (container),
signals[ACTIVATE],
- selection);
+ selection,
+ select_location);
}
g_list_free (selection);
}
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c
index a2ee0401f..60bfc3812 100644
--- a/src/file-manager/fm-icon-view.c
+++ b/src/file-manager/fm-icon-view.c
@@ -1333,14 +1333,57 @@ fm_icon_view_set_selection (FMDirectoryView *view, GList *selection)
(get_icon_container (FM_ICON_VIEW (view)), selection);
}
+/* utility routine to return the specified keyword, given a file and emblem index */
+static char *
+get_keyword_by_index (NautilusFile *file, int emblem_index)
+{
+ GList *keyword_list, *selected_keyword;
+ char *keyword;
+
+ keyword_list = nautilus_file_get_emblem_names (file);
+ if (keyword_list == NULL) {
+ return NULL;
+ }
+
+ selected_keyword = g_list_nth (keyword_list, emblem_index - 1);
+ if (selected_keyword == NULL) {
+ eel_g_list_free_deep (keyword_list);
+ return NULL;
+ }
+
+ keyword = g_strdup (selected_keyword->data);
+ eel_g_list_free_deep (keyword_list);
+
+ return keyword;
+}
+
static void
icon_container_activate_callback (NautilusIconContainer *container,
GList *file_list,
+ int emblem_index,
FMIconView *icon_view)
{
+ char *keyword;
+ NautilusFile *file;
+
g_assert (FM_IS_ICON_VIEW (icon_view));
g_assert (container == get_icon_container (icon_view));
+ /* if there is a single file to be activated, and the user clicked on an emblem,
+ * implement the emblem-specific action instead of activation. For now,
+ * we just handle annotations.
+ */
+ 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));
+ g_free (keyword);
+ return;
+ }
+ g_free (keyword);
+ }
+
fm_directory_view_activate_files (FM_DIRECTORY_VIEW (icon_view), file_list);
}
@@ -1908,23 +1951,10 @@ get_icon_annotation_callback (NautilusIconContainer *container,
int emblem_index,
FMIconView *icon_view)
{
- GList *keyword_list, *selected_keyword;
char *keyword;
-
- keyword_list = nautilus_file_get_emblem_names (file);
- if (keyword_list == NULL) {
- return NULL;
- }
-
- selected_keyword = g_list_nth (keyword_list, emblem_index - 1);
- if (selected_keyword == NULL) {
- eel_g_list_free_deep (keyword_list);
- return NULL;
- }
-
- keyword = g_strdup (selected_keyword->data);
- eel_g_list_free_deep (keyword_list);
+ keyword = get_keyword_by_index (file, emblem_index);
+
/* if the keyword is "note", return the file annotation instead */
if (eel_strcmp (keyword, "note") == 0) {
g_free (keyword);