d247275d8266bad8d22c108df1b40a8665e109bf tdreszer Fri Sep 23 16:16:24 2011 -0700 Another load of subCfg module (scm). Heavy work getting subCbs, matCbs and views all playing nice. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index fdde31f..005d72d 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -2181,31 +2181,39 @@ fourState = FOUR_STATE_CHECKED; } // Now check visibility enum trackVisibility vis = tdbLocalVisibility(cart, subtrack, NULL); if (vis == tvHide) { if(tdbIsCompositeView(subtrack->parent)) { if(tdbLocalVisibility(cart, subtrack->parent, NULL) == tvHide) FOUR_STATE_DISABLE(fourState); } } safef(objName, sizeof(objName), "%s_sel", subtrack->track); -fourState = cartUsualInt(cart, objName, fourState); +//fourState = cartUsualInt(cart, objName, fourState); +setting = cartOptionalString(cart, objName); +if (setting != NULL) + { + if (sameWord("on",setting)) // ouch! atoi was interpreting "on" as 0, which was a bad bug! + fourState = 1; + else + fourState = atoi(setting); + } tdbExtrasFourStateSet(subtrack,fourState); return fourState; } void subtrackFourStateCheckedSet(struct trackDb *subtrack, struct cart *cart,boolean checked, boolean enabled) /* Sets the fourState Checked in the cart and updates cached state */ { int fourState = ( checked ? FOUR_STATE_CHECKED : FOUR_STATE_UNCHECKED ); if (!enabled) FOUR_STATE_DISABLE(fourState); char objName[SMALLBUF]; char objVal[5]; safef(objName, sizeof(objName), "%s_sel", subtrack->track); safef(objVal, sizeof(objVal), "%d", fourState); @@ -3481,51 +3489,45 @@ if(filterBySet == NULL) return; #define FILTERBY_HELP_LINK "help" int count = slCount(filterBySet); if(count == 1) puts(""); else printf("Filter items by: (select multiple categories and items - %s)
\n",FILTERBY_HELP_LINK); filterBy_t *filterBy = NULL; if(cartOptionalString(cart, "ajax") == NULL) { webIncludeResourceFile("ui.dropdownchecklist.css"); jsIncludeFile("ui.dropdownchecklist.js",NULL); -#ifdef NEW_JQUERY jsIncludeFile("ddcl.js",NULL); -#endif///def NEW_JQUERY } int ix=0; for(filterBy = filterBySet;filterBy != NULL; filterBy = filterBy->next) { puts("
"); if(count == 1) printf("Filter by %s (select multiple items - %s)",filterBy->title,FILTERBY_HELP_LINK); else printf("%s",filterBy->title); printf("
\n"); // TODO: columnCount (Number of filterBoxes per row) should be configurable through tdb setting - #ifdef NEW_JQUERY #define FILTER_BY_FORMAT "
\n" - #endif///ndef NEW_JQUERY printf(FILTER_BY_FORMAT,ix,tdb->track,filterBy->column); ix++; printf("All\n",(filterBy->slChoices == NULL || slNameInList(filterBy->slChoices,"All")?" SELECTED":"")); struct slName *slValue; int ix=1; for(slValue=filterBy->slValues;slValue!=NULL;slValue=slValue->next,ix++) { char varName[32]; char *label = NULL; char *name = NULL; if (filterBy->useIndex) { safef(varName, sizeof(varName), "%d",ix); name = varName; @@ -3545,34 +3547,30 @@ { char *styler = label + strlen(label)+1; if (*styler != '\0') { if (*styler == '#') // Legacy: just the color that follows printf(" style='color: %s;'",styler); else printf(" style='%s'",styler); } } printf(">%s\n",label); } } printf("\n"); -#ifndef NEW_JQUERY - // The following is needed to make msie scroll to selected option. - printf("\n",tdb->track); -#endif///ndef NEW_JQUERY puts("
"); return; } #define COLOR_BG_DEFAULT_IX 0 #define COLOR_BG_ALTDEFAULT_IX 1 #define DIVIDING_LINE "
\n" #define DIVIDER_PRINT(color) printf(DIVIDING_LINE,COLOR_BG_DEFAULT,(color)) static char *checkBoxIdMakeForTrack(struct trackDb *tdb,members_t** dims,int dimMax,membership_t *membership) /* Creates an 'id' string for subtrack checkbox in style that matrix understand: "cb_dimX_dimY_view_cb" */ { #ifdef SUBTRACK_CFG int len = strlen(tdb->track) + 10; @@ -4047,50 +4045,58 @@ (useDragAndDrop?" class='dragHandle' title='Drag to reorder'":"")); // The checkbox has identifying classes including subCB and the tag for each dimension (e.g. class='subCB GM12878 CTCF Peak') dyStringClear(dyHtml); dyStringAppend(dyHtml, "subCB"); // always first for(di=dimX;didimMax;di++) { if (membersForAll->members[di] && -1 != (ix = stringArrayIx(membersForAll->members[di]->groupTag, membership->subgroups, membership->count))) dyStringPrintf(dyHtml," %s",membership->membership[ix]); } if (membersForAll->members[dimV] && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count))) dyStringPrintf(dyHtml, " %s",membership->membership[ix]); // Saved view for last // And finally the checkBox is made! safef(buffer, sizeof(buffer), "%s_sel", subtrack->track); +#ifdef SUBTRACK_CFG + if (!enabledCB) + { + dyStringAppend(dyHtml, " disabled"); + cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),"onclick='matSubCbClick(this);' style='cursor:pointer' title='view is hidden'"); + } + else +#endif///def SUBTRACK_CFG cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),"onclick='matSubCbClick(this);' style='cursor:pointer'"); if (useDragAndDrop) printf(" "); #ifdef SUBTRACK_CFG enum trackVisibility vis = tdbVisLimitedByAncestors(cart,subtrack,FALSE,FALSE); char *view = NULL; if (membersForAll->members[dimV] && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count))) view = membership->membership[ix]; char classList[256]; if (view != NULL) safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD %s",(visibleCB ? "":" disabled"),view); // view should be last! else safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD",(visibleCB ? "":" disabled")); #define SUBTRACK_CFG_VIS "
%s
\n" printf(SUBTRACK_CFG_VIS,subtrack->track,classList,subtrack->track,hStringFromTv(vis)); if (cType != cfgNone) // make a wrench { #define SUBTRACK_CFG_WRENCH "\n" - printf(SUBTRACK_CFG_WRENCH,(visibleCB ? "":" halfVis"),subtrack->track); + printf(SUBTRACK_CFG_WRENCH,(visibleCB ? "":" disabled"),subtrack->track); } #endif///def SUBTRACK_CFG // A hidden field to keep track of subtrack order if it could change if (sortOrder != NULL || useDragAndDrop) { safef(buffer, sizeof(buffer), "%s.priority", subtrack->track); float priority = (float)cartUsualDouble(cart, buffer, subtrack->priority); printf("", buffer, priority); // keeing track of priority } // A color patch which helps distinguish subtracks in some types of composites if (doColorPatch) { printf("    ", @@ -6430,33 +6436,31 @@ dyStringPrintf(dyLink,VOCAB_MULTILINK_END,members->groupTitle,members->groupTitle); freeMem(vocab); return dyStringCannibalize(&dyLink); } static boolean compositeUiByFilter(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName) /* UI for composite tracks: filter subgroups by multiselects to select subtracks. */ { membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart); if(membersForAll == NULL || membersForAll->filters == FALSE) // Not Matrix or filters return FALSE; if(cartOptionalString(cart, "ajax") == NULL) { webIncludeResourceFile("ui.dropdownchecklist.css"); jsIncludeFile("ui.dropdownchecklist.js",NULL); -#ifdef NEW_JQUERY jsIncludeFile("ddcl.js",NULL); -#endif///def NEW_JQUERY } cgiDown(0.7); printf("Filter subtracks %sby: (select multiple %sitems - %s)
\n", (membersForAll->members[dimX] != NULL || membersForAll->members[dimY] != NULL ? "further ":""), (membersForAll->dimMax == dimA?"":"categories and "),FILTERBY_HELP_LINK); printf("\n"); // Do All [+][-] buttons if(membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) // No matrix { #define PM_BUTTON_FILTER_COMP "" printf(""); } else { if(ttlX && ttlY) printf("\n",ttlX,ttlY); else printf("\n",(ttlX ? ttlX : ttlY)); //puts(""); } } } if(dimensionX && cntX>MATRIX_RIGHT_BUTTONS_AFTER) matrixYheadings(db,parentTdb, membersForAll,ixY,FALSE); @@ -6898,37 +6896,34 @@ * var with that name so it looks like it was pressed. */ { bool hasSubgroups = (trackDbSetting(tdb, "subGroup1") != NULL); boolean isMatrix = dimensionsExist(tdb); boolean viewsOnly = FALSE; if (primarySubtrack == NULL && !cartVarExists(cart, "ajax")) { if(trackDbSetting(tdb, "dragAndDrop") != NULL) jsIncludeFile("jquery.tablednd.js", NULL); jsIncludeFile("ajax.js",NULL); #ifdef TABLE_SCROLL jsIncludeFile("jquery.fixedtable.js",NULL); #endif//def TABLE_SCROLL jsIncludeFile("hui.js",NULL); - } - #ifdef SUBTRACK_CFG - jsonHashAddBoolean(NULL, "subCfg", TRUE); -#else///ifndef SUBTRACK_CFG - jsonHashAddBoolean(NULL, "subCfg", FALSE); + jsIncludeFile("subCfg.js",NULL); #endif///ndef SUBTRACK_CFG + } cgiDown(0.7); if (trackDbCountDescendantLeaves(tdb) < MANY_SUBTRACKS && !hasSubgroups) { if(primarySubtrack) compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack); else compositeUiSubtracks(db, cart, tdb, trackHash); return; } if (fakeSubmit) cgiMakeHiddenVar(fakeSubmit, "submit"); if(primarySubtrack == NULL) {
All:
"); printf(PM_BUTTON_FILTER_COMP,"true", "plus_fc",'+'); printf(PM_BUTTON_FILTER_COMP,"false","minus_fc",'-'); @@ -6469,35 +6473,31 @@ // Now make a filterComp box for each ABC dimension int dimIx=dimA; for(dimIx=dimA;dimIxdimMax;dimIx++) { //printf("
%s:\n",labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx])); printf("%s:
\n",labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx])); #ifdef FILTER_COMPOSITE_OPEN_SIZE int fullSize = membersForAll->members[dimIx]->count; #ifdef FILTER_COMPOSITE_ONLYONE if(membersForAll->members[dimIx]->fcType != fctOneOnly) #endif///def FILTER_COMPOSITE_ONLYONE fullSize++; // Room for "All" #endif///def FILTER_COMPOSITE_OPEN_SIZE -#ifdef NEW_JQUERY #define FILTER_COMPOSITE_FORMAT "
\n" -#endif///ndef NEW_JQUERY printf(FILTER_COMPOSITE_FORMAT,dimIx,parentTdb->track,membersForAll->members[dimIx]->groupTag,"multiple"); #ifdef FILTER_COMPOSITE_ONLYONE // DO we support anything besides multi? (membersForAll->members[dimIx]->fcType == fctMulti?"multiple ":"")); if(membersForAll->members[dimIx]->fcType != fctOneOnly) #endif///def FILTER_COMPOSITE_ONLYONE printf("All\n",(sameWord("All",membersForAll->checkedTags[dimIx])?" SELECTED":"") ); int ix=0; for(ix=0;ixmembers[dimIx]->count; ix++) { boolean alreadySet = membersForAll->members[dimIx]->selected[ix]; printf("%s\n",(alreadySet?" SELECTED":""), membersForAll->members[dimIx]->tags[ix],membersForAll->members[dimIx]->titles[ix]); } @@ -6664,43 +6664,41 @@ if(dimensionX && dimensionY) { safef(objName, sizeof(objName), "mat_%s_%s_cb", dimensionX->tags[ixX],dimensionY->tags[ixY]); } else { safef(objName, sizeof(objName), "mat_%s_cb", (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY])); } //printf("
\n",cells[ixX][ixY],chked[ixX][ixY],enabd[ixX][ixY]); if(ttlX && ttlY) printf("\n",ttlX,ttlY); else printf("\n",(ttlX ? ttlX : ttlY)); dyStringPrintf(dyJS, " class=\"matCB"); if(halfChecked) - dyStringPrintf(dyJS, " halfVis"); // needed for later js identification! + dyStringPrintf(dyJS, " disabled"); // appears disabled but still clickable! if(dimensionX) dyStringPrintf(dyJS, " %s",dimensionX->tags[ixX]); if(dimensionY) dyStringPrintf(dyJS, " %s",dimensionY->tags[ixY]); dyStringAppendC(dyJS,'"'); if(chked[ixX][ixY] > 0) dyStringAppend(dyJS," CHECKED"); if(halfChecked) - { - //dyStringAppend(dyJS," style='filter:alpha(opacity=50)'"); // Doesn't get set overkill with class=halfVis but IE doesn't cooperate! - dyStringAppend(dyJS," title='Not all associated subtracks have been selected'"); // overkill with class=halfVis but IE doesn't cooperate! - } + dyStringAppend(dyJS," title='Not all associated subtracks have been selected'"); + MAT_CB(objName,dyStringCannibalize(&dyJS)); // X&Y are set by javascript page load puts("