62abffb9b3bc4dc77214ea9128636037686fb7b7 kate Wed Sep 25 15:08:09 2019 -0700 Minor code refactor to remove duplication before adding new feature. refs #23365 diff --git src/hg/lib/hui.c src/hg/lib/hui.c index c00d0e2..fe37255 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -4374,78 +4374,84 @@ /* 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 displayAll; /* from radiobutton */ int bgColorIx; /* from logic over other settings */ int columnCount; /* determined from trackDb settings */ }; #define LARGE_COMPOSITE_CUTOFF 30 +static void printSubtrackListRadioButtons(char *parentTrack, int subCount, boolean displayAll) +// Print radio buttons for all/select +{ +printf("<B>List subtracks: "); +char javascript[JBUFSIZE]; +safef(javascript, sizeof(javascript), + "showOrHideSelectedSubtracks(true);"); +char buffer[SMALLBUF]; +if (subCount > LARGE_COMPOSITE_CUTOFF) + safef(buffer,SMALLBUF,"%s.displaySubtracks", parentTrack); +else + safecpy(buffer,SMALLBUF,"displaySubtracks"); +cgiMakeOnEventRadioButtonWithClass(buffer, "selected", !displayAll, "allOrOnly", "click", javascript); +puts("only selected/visible "); +safef(javascript, sizeof(javascript), + "showOrHideSelectedSubtracks(false);"); +cgiMakeOnEventRadioButtonWithClass(buffer, "all", displayAll, "allOrOnly", "click", javascript); +printf("all</B>"); +if (subCount > 5) + printf(" (<span class='subCBcount'></span>)"); +} + 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) puts("<THEAD class=sortable>"); else puts("<THEAD>"); int colspan = 3; if (sortOrder != NULL) colspan = sortOrder->count+2; else if (!tdbIsMultiTrack(parentTdb)) // An extra column for subVis/wrench so dragAndDrop works colspan++; if (settings->colorPatch) colspan++; int columnCount = 0; if (sortOrder != NULL) printf("<TR id=\"subtracksHeader\" class='sortable%s'>\n", useDragAndDrop ? " nodrop nodrag" : ""); else { printf("<TR%s>", useDragAndDrop ? " id='noDrag' class='nodrop nodrag'" : ""); // First table row contains the display "selected/visible" or "all" radio buttons // NOTE: list subtrack radio buttons are inside tracklist table header if // there are no sort columns. The reason is to ensure spacing of lines // column headers when the only column header is "Restricted Until" - printf("<TD colspan='%d'><B>List subtracks: ", colspan); - char javascript[JBUFSIZE]; - safef(javascript, sizeof(javascript), - "showOrHideSelectedSubtracks(true);"); + printf("<TD colspan='%d'>", colspan); int subCount = slCount(subtrackRefList); - if (subCount > LARGE_COMPOSITE_CUTOFF) - safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track); - else - safecpy(buffer,SMALLBUF,"displaySubtracks"); - cgiMakeOnEventRadioButtonWithClass(buffer, "selected", !settings->displayAll, "allOrOnly", "click", javascript); - - puts("only selected/visible "); - safef(javascript, sizeof(javascript), - "showOrHideSelectedSubtracks(false);"); - cgiMakeOnEventRadioButtonWithClass(buffer, "all", settings->displayAll, "allOrOnly", "click", javascript); - printf("all</B>"); - if (subCount > 5) - printf(" (<span class='subCBcount'></span>)"); + printSubtrackListRadioButtons(parentTdb->track, subCount, settings->displayAll); puts("</TD>"); columnCount = colspan; } // Add column headers which are sort button links if (sortOrder != NULL) { printf("<TH> <INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder columnCount++; if (!tdbIsMultiTrack(parentTdb)) // An extra column for subVis/wrench so dragAndDrop works { printf("<TH></TH>\n"); columnCount++; } @@ -4946,30 +4952,31 @@ // End of the table puts("</TBODY>"); dyStringFree(&dyHtml) membersForAllSubGroupsFree(parentTdb,&membersForAll); } static boolean membersHaveMatrix(membersForAll_t *membersForAll) /* Check for matrix */ { if (membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) return FALSE; return TRUE; } + static void printSubtrackTable(struct trackDb *parentTdb, struct slRef *subtrackRefList, struct subtrackConfigSettings *settings, struct cart *cart) /* Print table of subtracks */ { // Print table tag printf("\n<TABLE CELLSPACING='2' CELLPADDING='0' border='0'"); struct dyString *dyHtml = newDyString(SMALLBUF); if (settings->sortOrder != NULL) dyStringPrintf(dyHtml, "sortable"); if (settings->useDragAndDrop) { if (dyStringLen(dyHtml) > 0) dyStringAppendC(dyHtml,' '); dyStringPrintf(dyHtml, "tableWithDragAndDrop"); } @@ -5018,46 +5025,31 @@ { displaySubs = cartUsualString(cart, "displaySubtracks", "all"); // browser wide defaults to all } boolean displayAll = sameString(displaySubs, "all"); // Table wraps around entire list so that "Top" link can float to the correct place. cgiDown(0.7); printf("<table><tr><td class='windowSize'>"); printf("<A NAME='DISPLAY_SUBTRACKS'></A>"); if (sortOrder != NULL) { // First table row contains the display "selected/visible" or "all" radio buttons // NOTE: list subtrack radio buttons are inside tracklist table header if // there are no sort columns. The reason is to ensure spacing of lines // column headers when the only column header is "Restricted Until" - printf("<B>List subtracks: "); - char javascript[JBUFSIZE]; - safef(javascript, sizeof(javascript), - "showOrHideSelectedSubtracks(true);"); - if (subCount > LARGE_COMPOSITE_CUTOFF) - safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track); - else - safecpy(buffer,SMALLBUF,"displaySubtracks"); - cgiMakeOnEventRadioButtonWithClass(buffer, "selected", !displayAll, "allOrOnly", "click", javascript); - puts("only selected/visible "); - safef(javascript, sizeof(javascript), - "showOrHideSelectedSubtracks(false);"); - cgiMakeOnEventRadioButtonWithClass(buffer, "all", displayAll, "allOrOnly", "click", javascript); - printf("all</B>"); - if (slCount(subtrackRefList) > 5) - printf(" (<span class='subCBcount'></span>)"); + printSubtrackListRadioButtons(parentTdb->track, subCount, displayAll); if (membersHaveMatrix(membersForAll)) makeTopLink(parentTdb); printf("</td></tr></table>"); } else { if (membersHaveMatrix(membersForAll)) makeTopLink(parentTdb); } // Get info for subtrack list struct subtrackConfigSettings *settings = NULL; AllocVar(settings); // Determine whether there is a restricted until date column