diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/misc/e-canvas.c | 25 | ||||
-rw-r--r-- | widgets/misc/e-canvas.h | 14 |
2 files changed, 29 insertions, 10 deletions
diff --git a/widgets/misc/e-canvas.c b/widgets/misc/e-canvas.c index bbe58efdc3..5b843bf5b8 100644 --- a/widgets/misc/e-canvas.c +++ b/widgets/misc/e-canvas.c @@ -45,11 +45,6 @@ enum { static guint e_canvas_signals [LAST_SIGNAL] = { 0, }; -typedef struct { - GnomeCanvasItem *item; - gpointer id; -} ECanvasSelectionInfo; - GtkType e_canvas_get_type (void) { @@ -113,6 +108,7 @@ static void e_canvas_init (ECanvas *canvas) { canvas->selection = NULL; + canvas->cursor = NULL; } static void @@ -519,6 +515,7 @@ e_canvas_item_set_cursor (GnomeCanvasItem *item, gpointer id) func(item, flags, id); canvas->selection = g_list_prepend(canvas->selection, info); + canvas->cursor = info; } void @@ -538,9 +535,19 @@ e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id) g_return_if_fail(GNOME_IS_CANVAS_ITEM(item)); g_return_if_fail(item->canvas != NULL); g_return_if_fail(E_IS_CANVAS(item->canvas)); + + flags = E_CANVAS_ITEM_SELECTION_SELECT; + canvas = E_CANVAS(item->canvas); + + if (canvas->cursor) { + func = gtk_object_get_data(GTK_OBJECT(canvas->cursor->item), "ECanvasItem::selection_callback"); + if (func) + func(canvas->cursor->item, flags, canvas->cursor->id); + } + + gnome_canvas_item_grab_focus(item); flags = E_CANVAS_ITEM_SELECTION_SELECT | E_CANVAS_ITEM_SELECTION_CURSOR; - canvas = E_CANVAS(item->canvas); info = g_new(ECanvasSelectionInfo, 1); info->item = item; @@ -551,6 +558,7 @@ e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id) func(item, flags, id); canvas->selection = g_list_prepend(canvas->selection, info); + canvas->cursor = info; } void @@ -575,12 +583,17 @@ e_canvas_item_remove_selection (GnomeCanvasItem *item, gpointer id) if (info->item == item) { ECanvasItemSelectionCompareFunc compare_func; compare_func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_compare_callback"); + if (compare_func(info->item, info->id, id, 0) == 0) { ECanvasItemSelectionFunc func; func = gtk_object_get_data(GTK_OBJECT(info->item), "ECanvasItem::selection_callback"); if (func) func(info->item, flags, info->id); canvas->selection = g_list_remove_link(canvas->selection, list); + + if (canvas->cursor == info) + canvas->cursor = NULL; + g_free(info); g_list_free_1(list); break; diff --git a/widgets/misc/e-canvas.h b/widgets/misc/e-canvas.h index 9e572a1179..06e3768e12 100644 --- a/widgets/misc/e-canvas.h +++ b/widgets/misc/e-canvas.h @@ -66,12 +66,18 @@ enum { E_CANVAS_ITEM_SELECTION_DELETE_DATA = 1 << 2, }; +typedef struct { + GnomeCanvasItem *item; + gpointer id; +} ECanvasSelectionInfo; + struct _ECanvas { - GnomeCanvas parent; - - int idle_id; - GList *selection; + GnomeCanvas parent; + + int idle_id; + GList *selection; + ECanvasSelectionInfo *cursor; }; struct _ECanvasClass |