cf4ff9e5e58ef209a24d110e3f4daf120f0ccf8a braney Mon Jan 23 17:35:01 2012 -0800 always step up through the ancestors when looking for track handlers (#6499) diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index 67f5991..d89ecb9 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -12538,72 +12538,56 @@ struct track *subtrack = NULL; TrackHandler handler; boolean smart = FALSE; /* ignore if no subtracks */ if (!subCount) return; char *compositeTrack = trackDbLocalSetting(tdb, "compositeTrack"); /* look out for tracks that manage their own subtracks */ if (startsWith("wig", tdb->type) || startsWith("bedGraph", tdb->type) || (compositeTrack != NULL && rStringIn("smart", compositeTrack))) smart = TRUE; /* setup function handlers for composite track */ -handler = lookupTrackHandler(tdb->table); +handler = lookupTrackHandlerClosestToHome(tdb); if (smart && handler != NULL) /* handles it's own load and height */ handler(track); else { track->loadItems = compositeLoad; track->totalHeight = compositeTotalHeight; } if (altColors && (finalR || finalG || finalB)) { /* not black -- make a color gradient for the subtracks, from black, to the specified color */ deltaR = (finalR - altR) / altColors; deltaG = (finalG - altG) / altColors; deltaB = (finalB - altB) / altColors; } /* fill in subtracks of composite track */ for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next) { subTdb = tdbRef->val; - /* Initialize from composite track settings */ - if (trackDbSettingClosestToHome(subTdb, "noInherit") == NULL) - { - /* install parent's track handler */ - /* TODO JK - rework. The gencode tracks currently depend on this, wgEncodeGencode in particular, - * but it seems very dangerous in general. What if the subtracks already have their own handler? - * Waiting to fix until after viewInTheMiddle branch merge since preferred fix involves - * edits to trackDb.ra files - that is putting in an explicit setting when you want - * this behavior rather than relying on absence of an overloaded setting. */ - subtrack = trackFromTrackDb(tdb); - subtrack->tdb = subTdb; - handler = lookupTrackHandler(tdb->table); - } - else - { subtrack = trackFromTrackDb(subTdb); - handler = lookupTrackHandler(subTdb->table); - } + handler = lookupTrackHandlerClosestToHome(subTdb); if (handler != NULL) handler(subtrack); /* Add subtrack settings (table, colors, labels, vis & pri). This is only * needed in the "not noInherit" case that hopefully will go away soon. */ subtrack->track = subTdb->track; subtrack->table = subTdb->table; subtrack->shortLabel = subTdb->shortLabel; subtrack->longLabel = subTdb->longLabel; subtrack->priority = subTdb->priority; subtrack->parent = track; /* Add color gradient. */ if (finalR || finalG || finalB) { @@ -12737,38 +12721,54 @@ handlerHash = newHash(6); if (hashLookup(handlerHash, name)) warn("handler duplicated for track %s", name); else hashAdd(handlerHash, name, handler); } #define registerTrackHandlerOnFamily(name, handler) registerTrackHandler(name, handler) // Marker to show that are actually registering subtracks as well. I'd like to redo // this system a little. It seems dangerous now. There's no way to know in the .ra // file that there is a handler, and as composite tracks start to allow multiple types // of subtracks, the handler of the parent will still override _all_ of the children. // If parents and children put in different handlers, there's no way to know which one // the child will get. -TrackHandler lookupTrackHandler(char *name) +static TrackHandler lookupTrackHandler(char *name) /* Lookup handler for track of give name. Return NULL if none. */ { if (handlerHash == NULL) return NULL; return hashFindVal(handlerHash, name); } +TrackHandler lookupTrackHandlerClosestToHome(struct trackDb *tdb) +/* Lookup handler for track of give name. Try parents if + * subtrack has a NULL handler. Return NULL if none. */ +{ +TrackHandler handler = lookupTrackHandler(tdb->table); + +// while handler is NULL and we have a parent, use the parent's handler +for( ; (handler == NULL) && (tdb->parent != NULL); ) + { + tdb = tdb->parent; + handler = lookupTrackHandler(tdb->table); + } + +return handler; +} + void registerTrackHandlers() /* Register tracks that include some non-standard methods. */ { #ifndef GBROWSE registerTrackHandler("rgdGene", rgdGeneMethods); registerTrackHandler("cgapSage", cgapSageMethods); registerTrackHandler("cytoBand", cytoBandMethods); registerTrackHandler("cytoBandIdeo", cytoBandIdeoMethods); registerTrackHandler("bacEndPairs", bacEndPairsMethods); registerTrackHandler("bacEndPairsBad", bacEndPairsBadMethods); registerTrackHandler("bacEndPairsLong", bacEndPairsLongMethods); registerTrackHandler("bacEndSingles", bacEndSinglesMethods); registerTrackHandler("fosEndPairs", fosEndPairsMethods); registerTrackHandler("fosEndPairsBad", fosEndPairsBadMethods); registerTrackHandler("fosEndPairsLong", fosEndPairsLongMethods);