d1888ad963399b669cc9d20316e995f89d02eb7f
kate
  Mon Jan 12 18:07:19 2015 -0800
Simplify color sorting code, and make trackDb settings more consistent. refs #14353
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index a344d4e..33d651d 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3103,37 +3103,30 @@
 #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;
-if (trackDbSetting(parentTdb, "showSubtrackColorOnUi"))
-    {
-    // insert color sort indicator as first column
-    struct dyString *ds = newDyString(0);
-    dyStringPrintf(ds, "%s=+ %s", SUBTRACK_COLOR_PATCH, setting);
-    setting = dyStringCannibalize(&ds);
-    }
 
 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);
 char *cartSetting = NULL;
 if (cart != NULL)
     cartSetting = cartCgiUsualString(cart, sortOrder->htmlId, setting);
 // If setting is bigger than cartSetting, then it may be due to a trackDb change
 if (cart != NULL && strlen(cartSetting) > strlen(setting))
     sortOrder->sortOrder = cloneString(cartSetting);  // cart order
 else
     sortOrder->sortOrder = cloneString(setting);      // old cart value is abandoned!
 
 /* parse setting into sortOrder */
 sortOrder->setting = cloneString(setting);
@@ -3194,34 +3187,30 @@
         for (;*pos2 && pos2 < pos;pos2++)
             {
             if (*pos2 == '=') // Discovering sort order in cart
                 ord++;
             }
         sortOrder->forward[ix] = (pos[strlen(sortOrder->column[ix]) + 1] == '+');
         sortOrder->order[ix] = ord;
         }
     else  // give up on cartSetting
         {
         sortOrder->forward[ix] = TRUE;
         sortOrder->order[ix] = ix+1;
         }
     if (ix < foundColumns)
         {
-        // Subtrack color column requires special handling
-        if (ix == 0 && sameString(SUBTRACK_COLOR_PATCH, sortOrder->column[ix]))
-            sortOrder->title[ix] = SUBTRACK_COLOR_HEADER;
-        else
         subgroupFindTitle(parentTdb,sortOrder->column[ix],&(sortOrder->title[ix]));
         }
     }
 return sortOrder;  // NOTE cloneString:words[0]==*sortOrder->column[0]
 }                  // and will be freed when sortOrder is freed
 
 void sortOrderFree(sortOrder_t **sortOrder)
 // frees any previously obtained sortOrder settings
 {
 if (sortOrder && *sortOrder)
     {
     int ix;
     for (ix=0;ix<(*sortOrder)->count;ix++) { subgroupFree(&((*sortOrder)->title[ix])); }
     freeMem((*sortOrder)->sortOrder);
     freeMem((*sortOrder)->htmlId);
@@ -4001,31 +3990,31 @@
         date = strSwapChar(date, ' ', 0);   // Truncate time (not expected, but just in case)
 
     if (excludePast && !isEmpty(date) && dateIsOld(date, MDB_ENCODE_DATE_FORMAT))
         freez(&date);
     }
 return date;
 }
 
 /* Subtrack configuration settings */
 
 struct subtrackConfigSettings 
     {
     sortOrder_t *sortOrder; /* from trackDb setting */
     boolean useDragAndDrop; /* from trackDb setting */
     boolean restrictions;   /* from metadata ? */
-    boolean colorPatch;     /* from trackDb setting */
+    //boolean colorPatch;     /* from trackDb setting */
     boolean displayAll;     /* from radiobutton */
     int bgColorIx;          /* from logic over other settings */
     int columnCount;        /* determined from trackDb settings */
     };
 #define LARGE_COMPOSITE_CUTOFF 30
 
 static void printSubtrackTableHeader(struct trackDb *parentTdb, struct slRef *subtrackRefList,
                                     struct subtrackConfigSettings *settings)
 /* Print header of subtrack table, including classes describing display appearance and behavior.
    Return number of columns */
 {
 char buffer[SMALLBUF];
 boolean useDragAndDrop = settings->useDragAndDrop;
 sortOrder_t *sortOrder = settings->sortOrder;
 if (sortOrder != NULL)
@@ -4365,31 +4354,31 @@
             if (ix >= 0)
                 {
                 char *titleRoot=NULL;
                 if (cvTermIsEmpty(sortOrder->column[sIx],membership->titles[ix]))
                     titleRoot = cloneString(" &nbsp;");
                 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 (settings->colorPatch && sIx == 0)
+            else if (sameString(sortOrder->column[sIx], SUBTRACK_COLOR_PATCH))
                 {
                 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;");
@@ -4565,31 +4554,31 @@
 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->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)