49f31ee05d781083f1a9b7fcff2e99b974622c41
braney
  Tue Feb 4 09:06:51 2025 -0800
add custom tracks

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 4e2b08ef161..ba7b18863c7 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1589,40 +1589,35 @@
 if (cartVis != NULL)
     vis =  differentString(cartVis, "hide");
 else if (tdbIsSuperTrack(tdb->parent))
     vis = tdb->parent->isShow;
 else
     vis = tdb->parent->visibility != tvHide;
 
 return vis;
 }
 
 struct dyString *trackDbString(struct trackDb *tdb)
 /* Convert a trackDb entry into a dyString. */
 {
 struct dyString *dy;
 struct hash *existHash = newHash(5);
-struct hashEl *hel;
-
-hel = hashLookup(tdb->settingsHash, "track");
-if (hel == NULL)
-    errAbort("can't find track variable in tdb");
 
-// add a prefix to the track name so the special cased loaders aren't used
+// add a note that the name based handler shouldn't be used on this track
 // add a note that this is a quickLifted track so the browser will accept tracks that aren't big*
 dy = dyStringNew(200);
-dyStringPrintf(dy, "track qlft%s\nquickLifted on\n", trackHubSkipHubName((char *)hel->val));
+dyStringPrintf(dy, "track %s\nquickLifted on\navoidHandler on\n", trackHubSkipHubName(tdb->track));
 hashStore(existHash, "track");
     
 dumpTdbAndParents(dy, tdb, existHash, NULL);
 
 return dy;
 }
 
 static void walkTree(FILE *f, struct cart *cart,  struct trackDb *tdb, struct dyString *visDy)
 /* walk tree looking for visible tracks. */
 {
 for(; tdb; tdb = tdb->next)
     {
     if (tdb->subtracks)
         walkTree(f, cart, tdb->subtracks, visDy);
     else 
@@ -1652,44 +1647,60 @@
             {
             dyStringPrintf(visDy, "&%s=%s", tdb->track,hStringFromTv(tdb->visibility));
             //if (hashLookup(tdb->settingsHash, "customized") == NULL)
                 {
                 hashRemove(tdb->settingsHash, "maxHeightPixels");
                 hashRemove(tdb->settingsHash, "superTrack");
                 hashRemove(tdb->settingsHash, "subGroups");
                 hashRemove(tdb->settingsHash, "polished");
                 hashRemove(tdb->settingsHash, "noInherit");
                 hashRemove(tdb->settingsHash, "group");
                 hashRemove(tdb->settingsHash, "parent");
                 }
 
             //hashReplace(tdb->settingsHash, "customized", "on");
 
+            // is this a custom track?
+            char *tdbType = trackDbSetting(tdb, "tdbType");
+            if (tdbType != NULL)
+                {
+                hashReplace(tdb->settingsHash, "type", tdbType);
+                hashReplace(tdb->settingsHash, "shortLabel", trackDbSetting(tdb, "name"));
+                hashReplace(tdb->settingsHash, "longLabel", trackDbSetting(tdb, "description"));
+                }
+
             struct dyString *dy = trackDbString(tdb);
 
             fprintf(f, "%s\n", dy->string);
             }
         }
     }
 }
 
 char *trackHubBuild(char *db, struct cart *cart, struct dyString *visDy)
 /* Build a track hub using trackDb and the cart. */
 {
-struct trackDb *tdb = hTrackDb(db);
-slSort(&tdb,trackDbCmp);
+struct trackDb *tdbList = hTrackDb(db);
+
+// add custom tracks
+struct customTrack *ctList, *ct;
+ctList = customTracksParseCart(db, cart, NULL, NULL);
+for (ct = ctList; ct != NULL; ct = ct->next)
+    slAddHead(&tdbList, ct->tdb);
+
+slSort(&tdbList,trackDbCmp);
 char *filename = getHubName(cart, db);
 
 FILE *f = mustOpen(filename, "a");
 chmod(filename, 0666);
 
-walkTree(f, cart, tdb, visDy);
+walkTree(f, cart, tdbList, visDy);
 fclose(f);
 
 return cloneString(filename);
 }
 
 struct grp *trackHubGetGrps()
 /* Get the groups defined by attached track hubs. */
 {
 return trackHubGrps;
 }