088407a7a546834422fe464567672e8b83653ab1
tdreszer
  Wed Mar 16 13:41:19 2011 -0700
Support for downloads only tracks in the config list even when they are not in a supertrack
diff --git src/hg/hgTracks/config.c src/hg/hgTracks/config.c
index cfdf501..0060a14 100644
--- src/hg/hgTracks/config.c
+++ src/hg/hgTracks/config.c
@@ -321,47 +321,112 @@
                     {
                     safef(gname, sizeof(gname), "%s.group",track->track);
                     printGroupListHtml(gname, groupList, track->groupName);
                     }
                 }
             hPrintf("</TD>");
             }
 #endif///def PRIORITY_CHANGES_IN_CONFIG_UI
 	hPrintf("</TR>\n");
 	}
     hTableEnd();
     hPrintf("<BR>");
     }
 }
 
+#ifdef DOWNLOADS_ONLY_TRACKS_INCLUDED
+static int addDownloadOnlyTracks(char *db,struct group **pGroupList,struct track **pTrackList)
+// Download only tracks are not normaly incorporated into the grou and track lists
+{
+int count = 0;
+struct track *track = NULL;
+struct group *group = NULL;
+struct trackDb *tdbList = hTrackDb(db);
+struct trackDb *tdb = tdbList;
+for(;tdb != NULL; tdb = tdb->next)
+    {
+    if (!tdbIsDownloadsOnly(tdb)
+    || tdbIsFolderContent(tdb)
+    || tdbIsCompositeChild(tdb))
+        continue;
+
+    // Must find group
+    if (tdb->grp == NULL)
+        continue;
+
+    for (group = *pGroupList;group != NULL; group = group->next)
+        {
+        if (sameWord(group->name,tdb->grp))
+            break;
+        }
+    if (group == NULL)
+        continue;
+
+    // Make the track
+    track = trackFromTrackDb(tdb);
+    track->group = group;
+    track->groupName = cloneString(group->name);  // Don't even bother looking in cart.  That junk should be thrown out, now that we have dragReorder
+    slAddHead(pTrackList,track);
+    count++;
+    }
+
+if (count > 0)
+    {
+    // Going to have to make all new group->trackLists
+    slSort(pGroupList, gCmpPriority);
+    for (group = *pGroupList;group != NULL; group = group->next)
+        slFreeList(&group->trackList);
+
+    // Sort the tracks anew and add each on into it's group.
+    slSort(pTrackList, tgCmpPriority);
+    for (track = *pTrackList; track != NULL; track = track->next)
+        {
+        struct trackRef *tr;
+        AllocVar(tr);
+        tr->track = track;
+        slAddHead(&track->group->trackList, tr);
+        }
+
+    /* Straighten things out, clean up, and go home. */
+    for (group = *pGroupList;group != NULL; group = group->next)
+        slReverse(&group->trackList);
+    }
+return count;
+}
+#endif///def DOWNLOADS_ONLY_TRACKS_INCLUDED
+
 void configPageSetTrackVis(int vis)
 /* Do config page after setting track visibility. If vis is -2, then visibility
  * is unchanged.  If -1 then set visibility to default, otherwise it should
  * be tvHide, tvDense, etc. */
 {
 struct dyString *title = dyStringNew(0);
 char *groupTarget = NULL;
 struct track *trackList =  NULL;
 struct track *ideoTrack = NULL;
 struct group *groupList = NULL;
 
 withPriorityOverride = cartUsualBoolean(cart, configPriorityOverride, FALSE);
 
 /* Get track list and group them. */
 ctList = customTracksParseCart(database, cart, &browserLines, &ctFileName);
 trackList = getTrackList(&groupList, vis);
 
+#ifdef DOWNLOADS_ONLY_TRACKS_INCLUDED
+addDownloadOnlyTracks(database,&groupList,&trackList);
+#endif///def DOWNLOADS_ONLY_TRACKS_INCLUDED
+
 /* The ideogram for some reason is considered a track.
  * We don't really want to process it as one though, so
  * we see if it's there, and if necessary remove it. */
 ideoTrack = chromIdeoTrack(trackList);
 if (ideoTrack != NULL)
     removeTrackFromGroup(ideoTrack);
 
 /* Fetch group to change on if any from CGI,
  * and remove var so it doesn't get used again. */
 groupTarget = cloneString(cartUsualString(cart, configGroupTarget, ""));
 cartRemove(cart, configGroupTarget);
 if (sameString(groupTarget, "none"))
     freez(&groupTarget);
 
 dyStringPrintf(title, "Configure Image");