From a30fc9fc73e1f5d83c0e7df1185fee07da1ca411 Mon Sep 17 00:00:00 2001 From: edgrif <edgrif> Date: Thu, 14 Jan 2010 09:02:59 +0000 Subject: [PATCH] fix highlighting for shift-click to just highlight a single exon. --- src/zmapWindow/zmapWindow.c | 22 ++++++++++---- src/zmapWindow/zmapWindowFeature.c | 35 +++++++++++++-------- src/zmapWindow/zmapWindowItem.c | 49 +++++++++++++++++++----------- 3 files changed, 69 insertions(+), 37 deletions(-) diff --git a/src/zmapWindow/zmapWindow.c b/src/zmapWindow/zmapWindow.c index 366bf1b9b..a30116706 100755 --- a/src/zmapWindow/zmapWindow.c +++ b/src/zmapWindow/zmapWindow.c @@ -26,9 +26,9 @@ * * Exported functions: See ZMap/zmapWindow.h * HISTORY: - * Last edited: Jan 12 10:03 2010 (edgrif) + * Last edited: Jan 13 15:59 2010 (edgrif) * Created: Thu Jul 24 14:36:27 2003 (edgrif) - * CVS info: $Id: zmapWindow.c,v 1.299 2010-01-12 10:53:06 edgrif Exp $ + * CVS info: $Id: zmapWindow.c,v 1.300 2010-01-14 09:02:59 edgrif Exp $ *------------------------------------------------------------------- */ @@ -4648,17 +4648,24 @@ static char *makePrimarySelectionText(ZMapWindow window, FooCanvasItem *highligh { GString *text ; FooCanvasItem *item; + ZMapWindowCanvasItem canvas_item; ZMapFeature item_feature ; gint i = 0 ; int selected_start, selected_end, selected_length, dummy ; ZMapFeatureSubpartType item_type_int ; text = g_string_sized_new(512) ; + item = FOO_CANVAS_ITEM(selected->data) ; - item_feature = zmapWindowItemGetFeature(item) ; + if (ZMAP_IS_CANVAS_ITEM(item)) + canvas_item = item ; + else + canvas_item = zMapWindowCanvasItemIntervalGetTopLevelObject(item) ; + item_feature = zmapWindowItemGetFeature(canvas_item) ; /* Processing is different if there is only one item highlighted and it's a transcript. */ - if (length == 1 && item_feature->type == ZMAPSTYLE_MODE_TRANSCRIPT && item_feature->feature.transcript.exons) + if (ZMAP_IS_CANVAS_ITEM(item) && length == 1 + && item_feature->type == ZMAPSTYLE_MODE_TRANSCRIPT && item_feature->feature.transcript.exons) { /* For a transcript feature with exons put all the exons in the paste buffer. */ ZMapSpan span ; @@ -4684,7 +4691,11 @@ static char *makePrimarySelectionText(ZMapWindow window, FooCanvasItem *highligh while (selected) { item = FOO_CANVAS_ITEM(selected->data) ; - item_feature = zmapWindowItemGetFeature(item) ; + if (ZMAP_IS_CANVAS_ITEM(item)) + canvas_item = item ; + else + canvas_item = zMapWindowCanvasItemIntervalGetTopLevelObject(item) ; + item_feature = zmapWindowItemGetFeature(canvas_item) ; if ((sub_feature = zMapWindowCanvasItemIntervalGetData(item))) { @@ -4734,7 +4745,6 @@ static gboolean possiblyPopulateWithChildData(ZMapWindow window, { gboolean populated = FALSE; ZMapFeatureSubPartSpan item_data; - ZMapFeatureSubPartSpan sub_feature; int fstart, fend, flength; int sstart, send, slength; gboolean ignore_this_restriction = TRUE; diff --git a/src/zmapWindow/zmapWindowFeature.c b/src/zmapWindow/zmapWindowFeature.c index 1be4b0321..ef6abe350 100755 --- a/src/zmapWindow/zmapWindowFeature.c +++ b/src/zmapWindow/zmapWindowFeature.c @@ -28,9 +28,9 @@ * * Exported functions: See zmapWindow_P.h * HISTORY: - * Last edited: Dec 17 10:40 2009 (edgrif) + * Last edited: Jan 13 13:49 2010 (edgrif) * Created: Mon Jan 9 10:25:40 2006 (edgrif) - * CVS info: $Id: zmapWindowFeature.c,v 1.169 2009-12-17 14:47:57 edgrif Exp $ + * CVS info: $Id: zmapWindowFeature.c,v 1.170 2010-01-14 09:04:25 edgrif Exp $ *------------------------------------------------------------------- */ @@ -800,6 +800,8 @@ static void featureCopySelectedItem(ZMapFeature feature_in, +/* SORT OUT HIGHLIGHTING BUG....... */ + static gboolean canvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer data) { gboolean event_handled = FALSE ; @@ -813,14 +815,17 @@ static gboolean canvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer case GDK_2BUTTON_PRESS: { GdkEventButton *but_event = (GdkEventButton *)event ; - ZMapFeatureSubPartSpan sub_feature; - ZMapWindowCanvasItem canvas_item; - FooCanvasItem *sub_item = NULL ; - FooCanvasItem *highlight_item = NULL ; + ZMapFeatureSubPartSpan sub_feature ; + ZMapWindowCanvasItem canvas_item ; + FooCanvasItem *sub_item = NULL, *highlight_item = NULL ; - if(!ZMAP_IS_CANVAS_ITEM(item)) + if (!ZMAP_IS_CANVAS_ITEM(item)) { + +#ifdef ED_G_NEVER_INCLUDE_THIS_CODE g_warning("Not a ZMapWindowCanvasItem."); +#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */ + return FALSE; } @@ -874,28 +879,32 @@ static gboolean canvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer /* Only highlight the single item user clicked on. */ highlight_same_names = FALSE ; - /* Annotators say they don't want subparts sub selections + multiple selections */ + /* Annotators say they don't want subparts sub selections + multiple + * selections for alignments. */ if (feature->type == ZMAPSTYLE_MODE_ALIGNMENT) { highlight_item = item; } else - highlight_item = sub_item ; + { + highlight_item = sub_item ; + } /* monkey around to get feature_copy to be the right correct data */ - featureCopySelectedItem(feature, &feature_copy, - highlight_item); + featureCopySelectedItem(feature, &feature_copy, highlight_item); if (zmapWindowFocusIsItemInHotColumn(window->focus, highlight_item) && window->multi_select) { replace_highlight = FALSE ; - externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy), "multiple_select", highlight_item); + externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy), + "multiple_select", highlight_item); } else { - externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy), "single_select", highlight_item); + externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy), + "single_select", highlight_item); window->multi_select = TRUE ; } } diff --git a/src/zmapWindow/zmapWindowItem.c b/src/zmapWindow/zmapWindowItem.c index 750b31ee0..5f79b9efd 100755 --- a/src/zmapWindow/zmapWindowItem.c +++ b/src/zmapWindow/zmapWindowItem.c @@ -26,9 +26,9 @@ * * Exported functions: See zmapWindow_P.h * HISTORY: - * Last edited: Nov 6 16:47 2009 (edgrif) + * Last edited: Jan 13 13:49 2010 (edgrif) * Created: Thu Sep 8 10:37:24 2005 (edgrif) - * CVS info: $Id: zmapWindowItem.c,v 1.120 2009-12-15 13:49:11 mh17 Exp $ + * CVS info: $Id: zmapWindowItem.c,v 1.121 2010-01-14 09:05:10 edgrif Exp $ *------------------------------------------------------------------- */ @@ -53,7 +53,7 @@ typedef struct { int start, end; FooCanvasItem *item; -}StartEndTextHighlightStruct, *StartEndTextHighlight; +} StartEndTextHighlightStruct, *StartEndTextHighlight; typedef struct { @@ -76,7 +76,7 @@ typedef struct gboolean multiple_select; gint highlighted; gint feature_count; -}HighlightContextStruct, *HighlightContext; +} HighlightContextStruct, *HighlightContext; @@ -115,6 +115,7 @@ static gboolean foo_canvas_items_get_intersect(FooCanvasItem *i1, FooCanvasItem static gboolean foo_canvas_items_intersect(FooCanvasItem *i1, FooCanvasItem *i2, double threshold); #endif + /* This looks like something we will want to do often.... */ GList *zmapWindowItemSortByPostion(GList *feature_item_list) { @@ -318,12 +319,17 @@ void zMapWindowHighlightObjects(ZMapWindow window, ZMapFeatureContext context, g void zmapWindowHighlightObject(ZMapWindow window, FooCanvasItem *item, gboolean replace_highlight_item, gboolean highlight_same_names) { + ZMapWindowCanvasItem canvas_item ; ZMapFeature feature ; GList *set_items ; FooCanvasItem *framed_3ft; + canvas_item = zMapWindowCanvasItemIntervalGetObject(item) ; + zMapAssert(ZMAP_IS_CANVAS_ITEM(canvas_item)) ; + + /* Retrieve the feature item info from the canvas item. */ - feature = zmapWindowItemGetFeature(item); + feature = zmapWindowItemGetFeature(canvas_item); zMapAssert(feature) ; @@ -376,7 +382,8 @@ void zmapWindowHighlightObject(ZMapWindow window, FooCanvasItem *item, int frame_itr; for(frame_itr = ZMAPFRAME_0; frame_itr < ZMAPFRAME_2 + 1; frame_itr++) { - if((framed_3ft = zmapWindowItemGetTranslationItemFromItemFrame(window, item, frame_itr))) + if((framed_3ft = zmapWindowItemGetTranslationItemFromItemFrame(window, + FOO_CANVAS_ITEM(canvas_item), frame_itr))) { FooCanvasGroup *container; @@ -935,6 +942,7 @@ FooCanvasItem *zMapWindowFindFeatureItemByItem(ZMapWindow window, FooCanvasItem ZMapFeature feature ; ZMapWindowContainerFeatureSet container; ZMapWindowCanvasItem canvas_item; + ZMapFeatureSubPartSpan item_subfeature_data ; /* Retrieve the feature item info from the canvas item. */ canvas_item = zMapWindowCanvasItemIntervalGetObject(item); @@ -944,22 +952,21 @@ FooCanvasItem *zMapWindowFindFeatureItemByItem(ZMapWindow window, FooCanvasItem container = (ZMapWindowContainerFeatureSet)zmapWindowContainerCanvasItemGetContainer(item) ; - matching_item = zmapWindowFToIFindFeatureItem(window->context_to_item, - container->strand, container->frame, - feature) ; - if(FALSE) + if ((item_subfeature_data = (ZMapFeatureSubPartSpan)g_object_get_data(G_OBJECT(item), + ITEM_SUBFEATURE_DATA))) { - ZMapFeatureSubPartSpan item_subfeature_data ; - - item_subfeature_data = (ZMapFeatureSubPartSpan)g_object_get_data(G_OBJECT(item), - ITEM_SUBFEATURE_DATA) ; - matching_item = zmapWindowFToIFindItemChild(window->context_to_item, container->strand, container->frame, feature, item_subfeature_data->start, item_subfeature_data->end) ; } + else + { + matching_item = zmapWindowFToIFindFeatureItem(window->context_to_item, + container->strand, container->frame, + feature) ; + } return matching_item ; } @@ -1157,6 +1164,12 @@ void zmapWindowItemCentreOnItemSubPart(ZMapWindow window, FooCanvasItem *item, if (zmapWindowItemIsShown(item)) { + + /* THERE'S SOMETHING WRONG WITH THE GROUP TEST NOW.... */ + + foo_canvas_item_get_bounds(item, &ix1, &iy1, &ix2, &iy2) ; + + /* If the item is a group then we need to use its background to check in long items as the * group itself is not a long item. */ if (FOO_IS_CANVAS_GROUP(item) && zmapWindowContainerUtilsIsValid(FOO_CANVAS_GROUP(item))) @@ -1891,13 +1904,13 @@ static void highlightItem(ZMapWindow window, FooCanvasItem *item, gboolean highl if(highlight) { if(window->highlights_set.item) - zMapWindowCanvasItemSetIntervalColours(ZMAP_CANVAS_ITEM(item), ZMAPSTYLE_COLOURTYPE_SELECTED, + zMapWindowCanvasItemSetIntervalColours(item, ZMAPSTYLE_COLOURTYPE_SELECTED, &(window->colour_item_highlight)); else - zMapWindowCanvasItemSetIntervalColours(ZMAP_CANVAS_ITEM(item), ZMAPSTYLE_COLOURTYPE_SELECTED, NULL); + zMapWindowCanvasItemSetIntervalColours(item, ZMAPSTYLE_COLOURTYPE_SELECTED, NULL); } else - zMapWindowCanvasItemSetIntervalColours(ZMAP_CANVAS_ITEM(item), ZMAPSTYLE_COLOURTYPE_NORMAL, NULL); + zMapWindowCanvasItemSetIntervalColours(item, ZMAPSTYLE_COLOURTYPE_NORMAL, NULL); return ; } -- GitLab