bbadf34db9d67578b26a7d93a7096c046be885a4
kate
  Tue Jan 13 14:06:12 2015 -0800
Set default subtracks on (10 spread across color spectrum, emphasizing ENCODE tier1 and well-known.  Additional support for subtrack color on UI. refs #14353
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 33d651d..56c2453 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3088,34 +3088,40 @@
 //                           Can't use because of dimension dependence
 if (members==NULL)
     return FALSE;
 *value = cloneString(members->groupTitle);
 //subgroupMembersFree(&members);
 return TRUE;
 }
 
 void subgroupFree(char **value)
 // frees subgroup memory
 {
 if (value && *value)
     freez(value);
 }
 
+boolean subgroupRequired(char *value)
+/* Returns whether subgroup much be specified for each track.
+ * Generally true.  Exceptions are specially defined subgroups */
+{
+return differentString(SUBTRACK_COLOR_SUBGROUP, value);
+}
+
 #define SORT_ON_TRACK_NAME "trackName"
 #define SORT_ON_RESTRICTED "dateUnrestricted"
-#define SUBTRACK_COLOR_PATCH "subtrackColor"
-#define SUBTRACK_COLOR_HEADER "Color"
+
 
 sortOrder_t *sortOrderGet(struct cart *cart,struct trackDb *parentTdb)
 // Parses any list sort order instructions for parent of subtracks (from cart or trackDb)
 // Some trickiness here.  sortOrder->sortOrder is from cart (changed by user action),
 // as is sortOrder->order, But columns are in original tdb order (unchanging)!
 // However, if cart is null, all is from trackDb.ra
 {
 int ix;
 char *setting = trackDbSetting(parentTdb, "sortOrder");
 if (setting == NULL) // Must be in trackDb or not a sortable table
     return NULL;
 
 sortOrder_t *sortOrder = needMem(sizeof(sortOrder_t));
 sortOrder->htmlId = needMem(strlen(parentTdb->track)+15);
 safef(sortOrder->htmlId, (strlen(parentTdb->track)+15), "%s.sortOrder", parentTdb->track);
@@ -4354,31 +4360,31 @@
             if (ix >= 0)
                 {
                 char *titleRoot=NULL;
                 if (cvTermIsEmpty(sortOrder->column[sIx],membership->titles[ix]))
                     titleRoot = cloneString("  ");
                 else
                     titleRoot = labelRoot(membership->titles[ix],NULL);
                 // Each sortable column requires hidden goop (in the "abbr" field currently)
                 // which is the actual sort on value
                 printf("<TD id='%s_%s' abbr='%s' align='left'>&nbsp;",
                        subtrack->track,sortOrder->column[sIx],membership->membership[ix]);
                 printf("%s",titleRoot);
                 puts("</TD>");
                 freeMem(titleRoot);
                 }
-            else if (sameString(sortOrder->column[sIx], SUBTRACK_COLOR_PATCH))
+            else if (sameString(sortOrder->column[sIx], SUBTRACK_COLOR_SUBGROUP))
                 {
                 struct rgbColor rgbColor;
                 rgbColor.r = subtrack->colorR;
                 rgbColor.g = subtrack->colorG;
                 rgbColor.b = subtrack->colorB;
                 struct hslColor hslColor = mgRgbToHsl(rgbColor);
                 int hue = hslColor.h * 10;
                 printf("<TD id='%s_%s' abbr='%04d' bgcolor='#%02X%02X%02X'>&nbsp;&nbsp;&nbsp;&nbsp;</TD>",
                     subtrack->track, sortOrder->column[sIx], hue, rgbColor.r, rgbColor.g, rgbColor.b);
                 }
             }
         }
     else  // Non-sortable tables do not have sort by columns but will display a short label
         { // (which may be a configurable link)
         printf("<TD>&nbsp;");
@@ -4554,31 +4560,30 @@
 struct subtrackConfigSettings *subtrackConfig = NULL;
 AllocVar(subtrackConfig);
 
 // Determine whether there is a restricted until date column
 subtrackConfig->restrictions = FALSE;
 for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
     {
     subtrack = subtrackRef->val;
     (void)metadataForTable(db,subtrack,NULL);
     if (NULL != metadataFindValue(subtrack,"dateUnrestricted"))
         {
         subtrackConfig->restrictions = TRUE;
         break;
         }
     }
-//subtrackConfig->colorPatch = trackDbSettingOn(parentTdb, "showSubtrackColorOnUi");
 subtrackConfig->useDragAndDrop = sameOk("subTracks",trackDbSetting(parentTdb, "dragAndDrop"));
 subtrackConfig->sortOrder = sortOrder;
 subtrackConfig->displayAll = displayAll;
 
 printSubtrackTable(parentTdb, subtrackRefList, subtrackConfig, cart);
 
 if (sortOrder == NULL)
     printf("</td></tr></table>");
 
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 sortOrderFree(&sortOrder);
 }
 
 static void compositeUiSubtracksMatchingPrimary(char *db, struct cart *cart,
                                                 struct trackDb *parentTdb,char *primarySubtrack)