d1bc57639309864bb2665bd46eddfe75863f76e4 braney Tue Apr 23 16:42:54 2024 -0700 rearrange how we're doing hub groups. diff --git src/hg/hgTracks/config.c src/hg/hgTracks/config.c index c0a30f2..3e5d585 100644 --- src/hg/hgTracks/config.c +++ src/hg/hgTracks/config.c @@ -1,1066 +1,1066 @@ /* config - put up track and display configuration page. */ /* Copyright (C) 2014 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "dystring.h" #include "cheapcgi.h" #include "htmshell.h" #include "hdb.h" #include "hCommon.h" #include "cart.h" #include "web.h" #include "customTrack.h" #include "hgTracks.h" #include "hgConfig.h" #include "jsHelper.h" #include "imageV2.h" #include "search.h" #include "hubConnect.h" #include "fileUi.h" #include "trackHub.h" static void themeDropDown(struct cart* cart) /* Create drop down for UI themes. * specfied in hg.conf like this * browser.theme.modern=background.png,HGStyle * */ { struct slName* themes = cfgNamesWithPrefix("browser.theme."); if (themes==NULL) return; slNameSort(&themes); hPrintf("website style:"); hPrintf(""); // create labels for drop down box by removing prefix from hg.conf keys char *labels[50]; struct slName* el; int i = 0; el = themes; for (el = themes; el != NULL && i<50; el = el->next) { char* name = el->name; name = chopPrefix(name); // chop off first three words name = chopPrefix(name); name = chopPrefix(name); replaceChar(name, '_', ' '); labels[i] = name; i++; } char* currentTheme = cartOptionalString(cart, "theme"); hDropList("theme", labels, i, currentTheme); slFreeList(themes); hPrintf(""); } char *freeTypeFontNames[] = { "AvantGarde-Book", "AvantGarde-Demi", "AvantGarde-BookOblique", "AvantGarde-DemiOblique", "Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique", "Helvetica-Narrow", "Helvetica-Narrow-Bold", "Helvetica-Narrow-Oblique", "Helvetica-Narrow-BoldOblique", "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "ZapfChancery-MediumItalic", }; char *freeTypeFontFiles[] = { "a010013l.pfb", "a010015l.pfb", "a010033l.pfb", "a010035l.pfb", "n019003l.pfb", "n019004l.pfb", "n019023l.pfb", "n019024l.pfb", "n019043l.pfb", "n019044l.pfb", "n019063l.pfb", "n019064l.pfb", "n021003l.pfb", "n021004l.pfb", "n021023l.pfb", "n021024l.pfb", "n022003l.pfb", "n022004l.pfb", "n022023l.pfb", "n022024l.pfb", "z003034l.pfb", }; char *emptyStyles[] = { "Normal" }; static boolean freeTypeOn() { #ifdef USE_FREETYPE char *defaultState = "on"; #else // USE_FREETYPE char *defaultState = "off"; #endif // USE_FREETYPE return sameString(cfgOptionDefault("freeType", defaultState), "on"); } void maybeNewFonts(struct hvGfx *hvg) /* Check to see if we want to use the alternate font engine (FreeType2). */ { if (!freeTypeOn()) return; if (sameString(tl.textFont, "Bitmap")) return; char *fontDir = cfgOptionDefault("freeTypeDir", "../htdocs/urw-fonts"); char buffer[4096]; int ii; for(ii=0; ii < ArraySize(freeTypeFontNames); ii++) if (sameString(freeTypeFontNames[ii], tl.textFont)) break; char *fontFile = freeTypeFontFiles[ii]; char *fontName = freeTypeFontNames[ii]; safef(buffer, sizeof buffer, "%s/%s", fontDir, fontFile); hvGfxSetFontMethod(hvg, FONT_METHOD_FREETYPE, fontName, buffer ); } static void textFontDropDown() /* Create drop down for font size. */ { /* get current values for font and style */ char *currentFontName = cloneString(tl.textFont); char *currentStyle = strchr(currentFontName, '-'); if (currentStyle) *currentStyle++ = 0; else currentStyle = "Normal"; char *faceNames[sizeof(freeTypeFontNames)]; int ii; int numFonts = 0; struct dyString *dy = dyStringNew(1024); dyStringPrintf(dy, " fontStyles = [];\n"); int numStyle = 0; char *lastName = NULL; faceNames[numFonts++] = "Bitmap"; dyStringPrintf(dy, " fontStyles['Bitmap'] = ['Normal'];"); for (ii=0; ii < ArraySize(freeTypeFontNames); ii++) { char *fontName = cloneString(freeTypeFontNames[ii]); char *style = strchr(fontName, '-'); if (style) *style++ = 0; if ((lastName == NULL) || differentString(lastName, fontName)) { faceNames[numFonts] = fontName; if (lastName != NULL) dyStringPrintf(dy, " ];\n"); dyStringPrintf(dy, " fontStyles['%s'] = [", fontName); numStyle = 0; numFonts++; } if (style == NULL) style = cloneString("Normal"); if (numStyle) dyStringPrintf(dy, ","); dyStringPrintf(dy, "'%s'", style); numStyle++; lastName = fontName; } dyStringPrintf(dy, " ];\n"); dyStringPrintf(dy, "$(\"[name='%s']\").change(function()\n", textFontVar); dyStringPrintf(dy, "{\n"); dyStringPrintf(dy, " $(\"[name='textStyle']\").empty();"); dyStringPrintf(dy, " val= $(this).find(':selected').val(); \n"); dyStringPrintf(dy, " if (fontStyles[val].length == 1) {\n"); dyStringPrintf(dy, " $(\"[id='textStyleDrop']\").hide();$(\"[id='textStyleName']\").hide();\n"); dyStringPrintf(dy, " $(\"[name='textStyle']\").val('Normal');\n"); dyStringPrintf(dy, " } else {\n"); dyStringPrintf(dy, " $(\"[id='textStyleDrop']\").show();$(\"[id='textStyleName']\").show();\n"); dyStringPrintf(dy, " }\n"); dyStringPrintf(dy, " for(ii=0; ii < fontStyles[val].length; ii++) { $(\"[name='textStyle']\").append( new Option(fontStyles[val][ii],fontStyles[val][ii],))};\n"); dyStringPrintf(dy, "});\n"); dyStringPrintf(dy, "$(\"[name='textFont']\").change();\n"); dyStringPrintf(dy, "$(\"[name='textStyle']\").val('%s');\n", currentStyle); jsInline(dy->string); hDropList(textFontVar, faceNames, numFonts, currentFontName); jsInline("$('[name=\"textFont\"]')[0].style.width='15em';\n"); // hDropList has no 'style' nor 'id' argument <-> no opt args in C } static void textStyleDropDown() /* Create drop down for font size. */ { hDropList(textStyleVar, emptyStyles, ArraySize(emptyStyles), emptyStyles[0]); } static void textSizeDropDown() /* Create drop down for font size. */ { static char *sizes[] = {"6", "8", "10", "12", "14", "18", "24", "34"}; hDropList(textSizeVar, sizes, ArraySize(sizes), tl.textSize); } static void trackConfig(struct track *trackList, struct group *groupList, char *groupTarget, int changeVis) /* Put up track configurations. If groupTarget is * NULL then set visibility for tracks in all groups. Otherwise, * just set it for the given group. If vis is -2, then visibility is * unchanged. If -1 then set visibility to default, otherwise it should * be tvHide, tvDense, etc. */ { struct group *group; boolean showedRuler = FALSE; setRulerMode(); changeTrackVis(groupList, groupTarget, changeVis); /* Set up ruler mode according to changeVis. */ #ifdef BOB_DOESNT_LIKE if (changeVis != -2) { if (groupTarget == NULL || (groupList != NULL && sameString(groupTarget, groupList->name))) { if (changeVis == -1) rulerMode = tvFull; else rulerMode = changeVis; } } #endif /* BOB_DOESNT_LIKE */ jsInit(); cgiMakeHiddenVar(configGroupTarget, "none"); // Now all groups are in a single table, divided by an empty borderless row hPrintf("\n"); struct hash *superHash = hashNew(8); for (group = groupList; group != NULL; group = group->next) { struct trackRef *tr; if (group->trackList == NULL) continue; /* check if group section should be displayed */ char *otherState; char *indicator; char *indicatorImg; boolean isOpen = !isCollapsedGroup(group); collapseGroupGoodies(isOpen, FALSE, &indicatorImg, &indicator, &otherState); - hPrintf(""); + hPrintf(""); hPrintf("\n"); /* First non-CT, non-hub group gets ruler. */ if (!showedRuler && !isHubTrack(group->name) && differentString(group->name, "user")) { showedRuler = TRUE; hPrintf("",(isOpen ? "" : "style='display: none'"), group->name); hPrintf("\n"); } /* Scan track list to determine which supertracks have visible member * tracks, and to insert a track in the list for the supertrack. * Sort tracks and supertracks together by priority */ makeGlobalTrackHash(trackList); groupTrackListAddSuper(cart, group, superHash); if (!withPriorityOverride) { /* sort hierarchically by priority, considering supertracks */ struct trackRef *refList = NULL, *ref; for (tr = group->trackList; tr != NULL; tr = tr->next) { struct track *track = tr->track; if (tdbIsSuperTrackChild(track->tdb)) /* ignore supertrack member tracks till supertrack is found */ continue; AllocVar(ref); ref->track = track; slAddTail(&refList, ref); if (tdbIsSuper(track->tdb)) { struct slRef *child = track->tdb->children; for (; child != NULL; child=child->next) { struct trackDb *childTdb = child->val; struct track *childTrack = hashFindVal(trackHash, childTdb->track); // Try adding downloadsOnly track if (childTrack == NULL && tdbIsDownloadsOnly(childTdb)) { AllocVar(childTrack); // Fake a track! childTrack->tdb = childTdb; childTrack->hasUi = FALSE; } if (childTrack != NULL) { AllocVar(ref); ref->track = childTrack; slAddTail(&refList, ref); } } } } group->trackList = refList; } /* Loop through this group and display */ int rowCount=1; for (tr = group->trackList; tr != NULL; tr = tr->next) { struct track *track = tr->track; struct trackDb *tdb = track->tdb; hPrintf("",(isOpen ? "" : "style='display: none;'"), group->name, rowCount++); hPrintf("\n"); } hPrintf("\n"); } hashFree(&superHash); hPrintf("
"); hPrintf("
"); hPrintf("\n",group->name); hPrintf("", collapseGroupVar(group->name),collapseGroupVar(group->name), (isOpen?0:1)); char idText[256]; safef(idText, sizeof idText, "%s_button", group->name); hPrintf("%s  ", idText, indicatorImg, indicator,isOpen?"Collapse":"Expand"); // TODO XSS filter group->name jsOnEventByIdF("click", idText, "return vis.toggleForGroup(this,'%s');", group->name); hPrintf(" %s ", group->label); hPrintf("   "); hPrintf("\n"); safef(idText, sizeof idText, "%s_hideAllBut", group->name); hPrintf("", configHideAll, idText, "hide all"); // TODO XSS filter configGroupTarget char jsText[256]; // used several times safef(jsText, sizeof jsText, "document.mainForm.%s.value='%s'; %s", configGroupTarget, group->name, jsSetVerticalPosition("mainForm")); jsOnEventById("click", idText, jsText); hPrintf(" "); safef(idText, sizeof idText, "%s_showAllBut", group->name); hPrintf("", configShowAll, idText, "show all"); jsOnEventById("click", idText, jsText); hPrintf(" "); safef(idText, sizeof idText, "%s_defaultBut", group->name); hPrintf("", configDefaultAll, idText, "default"); jsOnEventById("click", idText, jsText); hPrintf(" "); /* do not want all the submit buttons named the same. It is * confusing to the javascript submit() function. */ char submitName[256]; safef(submitName, sizeof(submitName), "%sSubmit", group->name); cgiMakeButtonWithMsg(submitName, "submit","Submit your selections and view them in the browser"); hPrintf("
\n"); hPrintf("
"); hPrintf("", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chromName, RULER_TRACK_NAME); hPrintf("%s", RULER_TRACK_LABEL); hPrintf(""); hTvDropDownClass("ruler", rulerMode, FALSE, rulerMode ? "normalText trackVis" : "hiddenText trackVis"); hPrintf(""); hPrintf("Chromosome position in bases. (Clicks here zoom in 3x)"); hPrintf("
"); if (tdbIsSuperTrackChild(tdb)) /* indent members of a supertrack */ hPrintf("    "); hPrintIcons(tdb); if (track->hasUi) hPrintf("", tdb->parent ? "Part of super track: " : "Configure ", tdb->parent ? tdb->parent->shortLabel : tdb->shortLabel, hTrackUiForTrack(tdb->track), cartSessionVarName(), cartSessionId(cart), track->track); hPrintf(" %s", tdb->shortLabel); if (track->hasUi) hPrintf(""); hPrintf(""); if (tdbIsSuperTrackChild(tdb)) /* indent members of a supertrack */ hPrintf("    "); /* If track is not on this chrom print an informational message for the user. */ if (tdbIsDownloadsOnly(tdb)) // No vis display for downloadsOnly hPrintf("Downloads", hgFileUiName(),cartSessionVarName(), cartSessionId(cart), tdb->track); else if (hTrackOnChrom(track->tdb, chromName)) { if (tdbIsSuper(track->tdb)) { /* supertrack dropdown is hide/show */ superTrackDropDown(cart, track->tdb, 1); } else { /* check for option of limiting visibility to one mode */ hTvDropDownClassVisOnly(track->track, track->visibility, rTdbTreeCanPack(track->tdb), (track->visibility == tvHide) ? "hiddenText trackVis" : "normalText trackVis", trackDbSetting(track->tdb, "onlyVisibility")); } } else hPrintf("[No data-%s]", chromName); hPrintf(""); hPrintf("%s", tdb->longLabel); hPrintf("
"); cgiDown(0.9); hPrintf("
\n"); jsInline("$(document).ready( cfgPageAddListeners )"); } 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); 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; } void configInitTrackList( int vis, char **pGroupTarget, struct track **pTrackList, struct track **pIdeoTrack, struct group **pGroupList ) { 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); if (trackHash == NULL) trackHash = makeGlobalTrackHash(trackList); // Subtrack settings must be removed when composite/view settings are updated parentChildCartCleanup(trackList,cart,oldVars); addDownloadOnlyTracks(database,&groupList,&trackList); /* 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); *pGroupTarget = groupTarget; *pTrackList = trackList; *pIdeoTrack = ideoTrack; *pGroupList = groupList; } 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. */ { char *groupTarget; struct track *trackList; struct track *ideoTrack; struct group *groupList; configInitTrackList(vis, &groupTarget, &trackList, &ideoTrack, &groupList); struct dyString *title = dyStringNew(0); dyStringPrintf(title, "Configure Image"); hPrintf("
\n", hgTracksName(), cartUsualString(cart, "formMethod", "POST")); webStartWrapperDetailedNoArgs(cart, database, "", title->string, FALSE, FALSE, FALSE, FALSE); cartSaveSession(cart); hPrintf(""); /* do not want all the submit buttons named the same thing, this one is: */ cgiMakeButton("topSubmit", "submit"); // 3 column table hPrintf("\n"); hPrintf(""); hPrintf(""); hPrintf(""); if (trackLayoutInclFontExtras()) { hPrintf(""); } hPrintf(""); if (freeTypeOn()) { hPrintf(""); hPrintf(""); hPrintf(""); } if (cfgOptionBooleanDefault("showMouseovers", FALSE)) { /* I predict most people will want the browser text size as the tooltip text size * but just in case, users can change the value and it will remain independent * of the font size by saving to localStorage. */ hPrintf(""); hPrintf(""); hPrintf(""); jsInlineF("" "function updateSelectedTooltipSize(newSize) {\n" " let options = document.getElementsByName('tooltipTextSize')[0];\n" " let i = 0;\n" " for (i; i < options.length; i++) {\n" " if (options[i].value === newSize) {\n" " options[i].selected = true;\n" " localStorage.setItem('tooltipTextSize', options[i].value);\n" " } else {\n" " options[i].selected = false;\n" " }\n" " }\n" "}\n" "\n" "// set the tooltip text size based on localStorage values\n" "let currTooltipSize = localStorage.getItem('tooltipTextSize');\n" "let browserTextSize = document.getElementsByName('textSize')[0];\n" "if (currTooltipSize === null) {\n" " localStorage.setItem('tooltipTextSize', browserTextSize.value);\n" "} else {\n" " updateSelectedTooltipSize(currTooltipSize);\n" "}" "document.getElementsByName('tooltipTextSize')[0].addEventListener('change', function(e) {\n" " updateSelectedTooltipSize(document.getElementsByName('tooltipTextSize')[0].selectedOptions[0].value);\n" "});\n" ); } themeDropDown(cart); hTableStart(); if (ideoTrack != NULL) { hPrintf("\n"); } hPrintf("\n"); hPrintf("\n"); hPrintf("\n"); hPrintf("\n"); hPrintf("\n"); hPrintf("\n"); hPrintf("\n"); hPrintf("\n"); hTableEnd(); cgiDown(0.9); char buf[256]; char *freeze = hFreezeFromDb(database); if (freeze == NULL) safef(buf, sizeof buf, "Configure Tracks on %s %s: %s", organization, browserName, trackHubSkipHubName(organism)); else if (stringIn(database, freeze)) safef(buf, sizeof buf, "Configure Tracks on %s %s: %s %s", organization, browserName, trackHubSkipHubName(organism), freeze); else safef(buf, sizeof buf, "Configure Tracks on %s %s: %s %s (%s)", organization, browserName, trackHubSkipHubName(organism), freeze, trackHubSkipHubName(database)); webNewSection("%s",buf); hPrintf("Tracks: "); if (isSearchTracksSupported(database,cart)) { cgiMakeButtonWithMsg(TRACK_SEARCH, TRACK_SEARCH_BUTTON,TRACK_SEARCH_HINT); hPrintf(" "); } cgiMakeButtonWithMsg(configHideAll, "hide all","Hide all tracks in this genome assembly"); hPrintf(" "); cgiMakeButtonWithMsg(configShowAll, "show all","Show all tracks in this genome assembly"); hPrintf(" "); cgiMakeButtonWithMsg(configDefaultAll, "default","Display only default tracks"); hPrintf("   Groups: "); hButtonWithOnClick("hgt.collapseGroups", "collapse all", "Collapse all track groups", "return vis.expandAllGroups(false)"); hPrintf(" "); hButtonWithOnClick("hgt.expandGroups", "expand all", "Expand all track groups", "return vis.expandAllGroups(true)"); hPrintf("
Control track and group visibility " "more selectively below.
"); trackConfig(trackList, groupList, groupTarget, vis); dyStringFree(&title); freez(&groupTarget); webEndSectionTables(); hPrintf(""); } void configPage() /* Put up configuration page. */ { configPageSetTrackVis(-2); } // TODO GALT there is duplication still between config and configMultiRegionPageSetTrackVis // that could maybe be addressed by pulling the code that initializes the tracklist, // and the code that draws the multi-region options, into 2 functions to be called by each. void configMultiRegionPage() /* Do multi-region 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. */ { char *groupTarget; struct track *trackList; struct track *ideoTrack; struct group *groupList; int vis = -2; configInitTrackList(vis, &groupTarget, &trackList, &ideoTrack, &groupList); hPrintf("\n", hgTracksName(), cartUsualString(cart, "formMethod", "POST")); webStartWrapperDetailedNoArgs(cart, database, "", "", FALSE, FALSE, FALSE, FALSE); cartSaveSession(cart); hPrintf("" "Multi-region display" " 'slices' the genome to allow viewing discontinuous regions" " together in the browser window.   "); // mode-specific message filled in by JS when dialog opened hPrintf(""); hPrintf("

"); hTableStart(); virtModeType = cartUsualString(cart, "virtModeType", virtModeType); hPrintf(""); hPrintf("\n"); struct sqlConnection *conn = NULL; if (!trackHubDatabase(database)) // no db conn for assembly hubs conn = hAllocConn(database); // Do we have a gene table for exonMostly? findBestEMGeneTable(trackList); if (emGeneTable) { hPrintf("\n"); } if (emGeneTable) { hPrintf("\n"); } /* obsolete if (conn && sqlTableExists(conn,"knownCanonical")) { hPrintf("\n"); } */ hPrintf("\n"); } /* The AllChroms option will be released in future if (emGeneTable && sqlTableExists(conn, emGeneTable)) { hPrintf("\n"); } */ if (conn) { boolean altLocExists = sqlTableExists(conn, "altLocations"); boolean fixLocExists = sqlTableExists(conn, "fixLocations"); if (altLocExists || fixLocExists) { hPrintf("\n"); } } /* disable demo for now if (sameString(database,"hg19") || sameString(database, "hg38")) { hPrintf("\n"); } */ /* Disabled for now hPrintf("\n"); */ /* The AllChroms option will be released in future if (conn) // requires chromInfo from database. { // TODO allow it to use assembly hubs via trackHubAllChromInfo() ? hPrintf("\n"); } */ /* Disabled for now hPrintf("\n"); */ /* Disabled for now hPrintf("\n"); */ /* Disabled for now hPrintf("\n"); */ hTableEnd(); hPrintf("
\n"); hPrintf("
image width:"); hPrintf(""); hIntVar("pix", tl.picWidth, 4); hPrintf("pixels
label area width:"); hPrintf(""); hIntVar(leftLabelWidthVar, tl.leftLabelWidthChars, 2); hPrintf("characters
text size:"); hPrintf(""); textSizeDropDown(); hPrintf(""); char *defaultStyle = cartUsualString(cart, "fontType", "medium"); cartMakeRadioButton(cart, "fontType", "medium", defaultStyle); hPrintf(" medium "); cartMakeRadioButton(cart, "fontType", "fixed", defaultStyle); hPrintf(" fixed "); cartMakeRadioButton(cart, "fontType", "bold", defaultStyle); hPrintf(" bold "); hPrintf(" "); hPrintf("
font:"); hPrintf(""); textFontDropDown(); hPrintf("
style:"); hPrintf(""); textStyleDropDown(); hPrintf("
tooltip text size:"); static char *sizes[] = {"6", "8", "10", "12", "14", "18", "24", "34"}; int i; hPrintf(""); hPrintf("
"); hCheckBox("ideogram", cartUsualBoolean(cart, "ideogram", TRUE)); hPrintf(""); hPrintf("Display chromosome ideogram above main graphic"); hPrintf("
"); hCheckBox("guidelines", cartUsualBoolean(cart, "guidelines", TRUE)); hPrintf(""); hPrintf("Show light blue vertical guidelines, or light red vertical window separators in multi-region view"); hPrintf("
"); hCheckBox("leftLabels", cartUsualBoolean(cart, "leftLabels", TRUE)); hPrintf(""); hPrintf("Display labels to the left of items in tracks"); hPrintf("
"); hCheckBox("centerLabels", cartUsualBoolean(cart, "centerLabels", TRUE)); hPrintf(""); hPrintf("Display description above each track"); hPrintf("
"); hCheckBox("trackControlsOnMain", cartUsualBoolean(cart, "trackControlsOnMain", TRUE)); hPrintf(""); hPrintf("Show track controls under main graphic"); hPrintf("
"); hCheckBox("nextItemArrows", cartUsualBoolean(cart, "nextItemArrows", FALSE)); hPrintf(""); hPrintf("Next/previous item navigation"); hPrintf("
"); hCheckBox("nextExonArrows", cartUsualBoolean(cart, "nextExonArrows", TRUE)); hPrintf(""); hPrintf("Next/previous exon navigation"); hPrintf("
"); hCheckBox("exonNumbers", cartUsualBoolean(cart, "exonNumbers", TRUE)); hPrintf(""); hPrintf("Show exon numbers"); hPrintf("
"); hCheckBox("enableHighlightingDialog", cartUsualBoolean(cart, "enableHighlightingDialog", TRUE)); hPrintf(""); hPrintf("Enable highlight with drag-and-select " "(if unchecked, drag-and-select always zooms to selection)"); hPrintf("
"); cgiMakeRadioButton("virtModeType", "default", sameWord("default", virtModeType)); hPrintf(""); hPrintf("Exit multi-region mode"); hPrintf("
"); cgiMakeRadioButton("virtModeType", "exonMostly", sameWord("exonMostly", virtModeType)); hPrintf(""); hPrintf("Show exons using %s.    Use padding of: ", emGeneTrack->shortLabel); hIntVar("emPadding", cartUsualInt(cart, "emPadding", emPadding), 3); hPrintf(" bases."); hPrintf("
"); cgiMakeRadioButton("virtModeType", "geneMostly", sameWord("geneMostly", virtModeType)); hPrintf(""); hPrintf("Show genes using %s.    Use padding of: ", emGeneTrack->shortLabel); hIntVar("gmPadding", cartUsualInt(cart, "gmPadding", gmPadding), 3); hPrintf(" bases."); hPrintf("
"); cgiMakeRadioButton("virtModeType", "kcGenes", sameWord("kcGenes", virtModeType)); hPrintf(""); hPrintf("Show gene regions genome-wide."); hPrintf("
"); cgiMakeRadioButton("virtModeType", "customUrl", sameWord("customUrl", virtModeType)); hPrintf(""); hPrintf("Enter custom regions as BED, or a URL to them:
"); multiRegionsBedUrl = cartUsualString(cart, "multiRegionsBedUrl", multiRegionsBedUrl); struct dyString *dyMultiRegionsBedInput = dyStringNew(256); if (strstr(multiRegionsBedUrl,"://")) { dyStringAppend(dyMultiRegionsBedInput, multiRegionsBedUrl); } else { if (fileExists(multiRegionsBedUrl)) { struct lineFile *lf = lineFileMayOpen(multiRegionsBedUrl, TRUE); char *line; int lineSize; while (lineFileNext(lf, &line, &lineSize)) { dyStringPrintf(dyMultiRegionsBedInput, "%s\n", line); } lineFileClose(&lf); } } hPrintf("", dyMultiRegionsBedInput->string); // option to set viewing window to show all regions. This id also known to JS. if (cfgOptionBooleanDefault(MULTI_REGION_CFG_BUTTON_TOP, FALSE)) { boolean isChecked = cartUsualBoolean(cart, MULTI_REGION_BED_WIN_FULL, FALSE); hPrintf("  "); cgiMakeCheckBoxUtil(MULTI_REGION_BED_WIN_FULL, isChecked, "If unchecked, when regions are changed here the view is zoomed in and does not display all regions", MULTI_REGION_BED_WIN_FULL); hPrintf("Show all"); hPrintf("
"); cgiMakeRadioButton("virtModeType", "singleTrans", sameWord("singleTrans", virtModeType)); hPrintf(""); hPrintf("Show only one transcript using an ID from %s : ", emGeneTrack->shortLabel); char *trans = cartUsualString(cart, "singleTransId", singleTransId); char sql[1024]; sqlSafef(sql, sizeof sql, "select name from %s where name='%s'", emGeneTable, trans); char *result = sqlQuickString(conn, sql); if (!result) { sqlSafef(sql, sizeof sql, "select name from %s limit 1", emGeneTable); trans = sqlQuickString(conn, sql); } hTextVar("singleTransId", trans, 20); hPrintf("
"); cgiMakeRadioButton("virtModeType", "singleAltHaplo", sameWord("singleAltHaplo", virtModeType)); hPrintf(""); hPrintf("Show one alternate haplotype"); if (fixLocExists) hPrintf(" or fix patch"); hPrintf(", placed on its chromosome, using ID: "); char *haplo = cartUsualString(cart, "singleAltHaploId", singleAltHaploId); char *foundHaplo = NULL; char sql[1024]; if (altLocExists) { sqlSafef(sql, sizeof sql, "select name from altLocations where name rlike '^%s(:[0-9-]+)?'", haplo); foundHaplo = sqlQuickString(conn, sql); } if (!foundHaplo && fixLocExists) { sqlSafef(sql, sizeof sql, "select name from fixLocations where name rlike '^%s(:[0-9-]+)?'", haplo); foundHaplo = sqlQuickString(conn, sql); } if (!foundHaplo) { if (altLocExists) sqlSafef(sql, sizeof sql, "select name from altLocations limit 1"); else sqlSafef(sql, sizeof sql, "select name from fixLocations limit 1"); haplo = sqlQuickString(conn, sql); chopSuffixAt(haplo, ':'); } hTextVar("singleAltHaploId", haplo, 60); hPrintf("
"); cgiMakeRadioButton("virtModeType", "demo1", sameWord("demo1", virtModeType)); hPrintf(""); hPrintf("demo1 two windows on two chroms (default pos on chr21, and same loc on chr22)"); hPrintf("
"); cgiMakeRadioButton("virtModeType", "demo2", sameWord("demo2", virtModeType)); hPrintf(""); hPrintf("demo2 multiple "); hIntVar("demo2NumWindows", cartUsualInt(cart, "demo2NumWindows", demo2NumWindows), 3); hPrintf(" windows on one chrom chr21 def posn, window size "); hIntVar("demo2WindowSize", cartUsualInt(cart, "demo2WindowSize", demo2WindowSize), 3); hPrintf(" and step size "); hIntVar("demo2StepSize", cartUsualInt(cart, "demo2StepSize", demo2StepSize), 3); hPrintf(" exon-like"); hPrintf("
"); cgiMakeRadioButton("virtModeType", "allChroms", sameWord("allChroms", virtModeType)); hPrintf(""); hPrintf("
Show all chromosomes.
Warning: Turn off all tracks except bigBed, bigWig, and very sparse tracks.
Press Hide All to hide all tracks."); hPrintf("
"); cgiMakeRadioButton("virtModeType", "demo4", sameWord("demo4", virtModeType)); hPrintf(""); hPrintf("demo4 multiple (311) windows showing exons from TITIN gene uc031rqd.1."); hPrintf("
"); cgiMakeRadioButton("virtModeType", "demo5", sameWord("demo5", virtModeType)); hPrintf(""); hPrintf("demo5 alt locus on hg38. Shows alt chrom surrounded by regions of same size from reference genome."); hPrintf("
"); cgiMakeRadioButton("virtModeType", "demo6", sameWord("demo6", virtModeType)); hPrintf(""); hPrintf("demo6 shows zoomed in exon-exon junction from SOD1 gene, between exon1 and exon2."); hPrintf("
\n"); hPrintf("\n"); hPrintf("
"); hCheckBox("emAltHighlight", cartUsualBoolean(cart, "emAltHighlight", FALSE)); hPrintf(""); hPrintf("Highlight alternating regions in multi-region view"); hPrintf("
\n"); hPrintf("
\n"); hPrintf("\n"); hPrintf("\n"); hPrintf("
"); cgiMakeButton("topSubmit", "Submit"); hPrintf("  "); cgiMakeCancelButton("Cancel"); hPrintf("
\n"); hFreeConn(&conn); cgiDown(0.9); freez(&groupTarget); webEndSectionTables(); hPrintf(""); }