\n");
+
+jsInline("if (typeof myVariantsShareInit === 'function') myVariantsShareInit();\n");
+}
+
void specificUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax)
/* Draw track specific parts of UI. */
{
char *track = tdb->track;
char *db = database;
char *liftDb = cloneString(trackDbSetting(tdb, "quickLiftDb"));
if (liftDb != NULL)
db = liftDb;
// Ideally check cfgTypeFromTdb()/cfgByCfgType() first, but with all these special cases already in
// place, lets be cautious at this time.
// NOTE: Developer, please try to use cfgTypeFromTdb()/cfgByCfgType().
boolean boxed = trackDbSettingClosestToHomeOn(tdb, "boxedCfg");
boolean isGencode3 = trackDbSettingOn(tdb, "isGencode3");
// UI precedence:
@@ -3489,30 +3547,37 @@
else if (startsWith("chromGraph", tdb->type))
chromGraphUi(tdb);
else if (startsWith("sample", tdb->type))
genericWiggleUi(tdb,7);
else if (startsWithWord("array",tdb->type)) // not quite the same as "expRatio" (custom tracks)
expRatioCtUi(tdb);
else if (startsWithWord("factorSource",tdb->type))
factorSourceUi(db,tdb);
else if (startsWithWord("bigBed",tdb->type))
labelCfgUi(db, cart, tdb, tdb->track);
}
if (tdbSupportsColorOverride(tdb))
colorTrackOption(cart, tdb->track, tdb);
+/* myVariants own track: render inline share management. Skip shared tracks
+ * (myVariants_shared_*) - you can't re-share someone else's data. */
+if (cfgOptionBooleanDefault("doMyVariants", FALSE)
+ && startsWith("myVariants_", tdb->track)
+ && !startsWith("myVariants_shared_", tdb->track))
+ myVariantsShareUi(tdb);
+
if (!ajax) // ajax asks for a simple cfg dialog for right-click popup or hgTrackUi subtrack cfg
{
// Composites *might* have had their top level controls just printed,
// but almost certainly have additional controls
boolean isLogo = (trackDbSetting(tdb, "logo") != NULL);
// It'd be nice to handle faceted composites as a separate container type, but practically so much
// of the display features we want are identical to composites - it's easier to special case the UI.
if (tdbIsComposite(tdb) && !isLogo) // for the moment generalizing this to include other containers...
if (!sameOk(trackDbLocalSetting(tdb, "compositeTrack"), "faceted")) // but not faceted containers ...
hCompositeUi(db, cart, tdb, NULL, NULL, MAIN_FORM);
// Additional special case navigation links may be added
extraUiLinks(db, tdb, cart);
}
}
@@ -4371,41 +4436,71 @@
}
if (dupTdb != NULL)
slAddHead(&tdbList, dupTdb);
}
}
if (sameWord(track, WIKI_TRACK_TABLE))
tdb = trackDbForWikiTrack();
else if (sameWord(track, RULER_TRACK_NAME))
/* special handling -- it's not a full-fledged track */
tdb = trackDbForRuler();
else if (sameWord(track, OLIGO_MATCH_TRACK_NAME))
tdb = trackDbForOligoMatch();
else if (sameWord(track, CUTTERS_TRACK_NAME))
tdb = trackDbForPseudoTrack(CUTTERS_TRACK_NAME, CUTTERS_TRACK_LABEL, CUTTERS_TRACK_LONGLABEL, tvHide, TRUE);
-else if (isCustomTrack(track))
+else if (isCustomTrack(track)
+ || (cfgOptionBooleanDefault("doMyVariants", FALSE) && startsWith("myVariants_", track)))
{
+ /* myVariants tracks (own and shared) are built dynamically and live in
+ * the CT list rather than the SQL trackDb table, but their names don't
+ * carry the ct_ prefix, so we need to look them up alongside regular
+ * custom tracks. */
ctList = customTracksParseCart(database, cart, NULL, NULL);
for (ct = ctList; ct != NULL; ct = ct->next)
{
if (sameString(track, ct->tdb->track))
{
tdb = ct->tdb;
break;
}
}
+ /* Fallback for direct hgTrackUi navigation without hgTracks: regenerate
+ * the myVariants CT file and re-parse. Normally the CT file was written
+ * during the preceding hgTracks visit, so this branch only fires for
+ * bookmarked URLs or direct links. */
+ if (tdb == NULL && startsWith("myVariants_", track))
+ {
+ char *userName = getUserName();
+ char *ctFile = myVariantsWriteCtFile(userName, database, cart);
+ if (isNotEmpty(ctFile))
+ {
+ char mvVarName[256];
+ safef(mvVarName, sizeof mvVarName, CT_FILE_VAR_PREFIX "%s", database);
+ cartSetString(cart, mvVarName, ctFile);
+ freeMem(ctFile);
+ ctList = customTracksParseCart(database, cart, NULL, NULL);
+ for (ct = ctList; ct != NULL; ct = ct->next)
+ {
+ if (sameString(track, ct->tdb->track))
+ {
+ tdb = ct->tdb;
+ break;
+ }
+ }
+ }
+ }
}
else if (isHubTrack(track))
{
tdb = hubConnectAddHubForTrackAndFindTdb(database, track, &tdbList, trackHash);
}
else if (sameString(track, "hgPcrResult"))
tdb = pcrResultFakeTdb();
else
{
tdb = tdbForTrack(database, track,&tdbList);
}
if (tdb == NULL)
{
errAbort("Can't find %s in track database %s chromosome %s",
track, database, chromosome);