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(" "); 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'> ", 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'> </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> "); @@ -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)