3977a0035febcc3af4ef51f12fd75548a7cc7062 tdreszer Wed Dec 14 16:44:17 2011 -0800 Minor cleanup to hui.c Fix edge case bug in hgTracks.js where right click is lost. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 14638ba..0bdceb6 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -2182,35 +2182,34 @@ 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); setting = cartOptionalString(cart, objName); if (setting != NULL) { - if (sameWord("on",setting)) // ouch! atoi was interpreting "on" as 0, which was a bad bug! + if (sameWord("on",setting)) // ouch! cartUsualInt 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); @@ -2279,31 +2278,31 @@ static void dimensionsFree(dimensions_t **dimensions) /* frees any previously obtained dividers setting */ { if(dimensions && *dimensions) { freeMem((*dimensions)->setting); freeMem((*dimensions)->names); freeMem((*dimensions)->subgroups); freez(dimensions); } } static char *firstCharNoDigit(char *name) // Turns out css classes cannot begin with a number. So prepend 'A' -// If this wee more widely used, could move to common. +// If this were more widely used, could move to common. { if (!isdigit(*name)) return name; char *newName = needMem(strlen(name)+1); *newName = 'A'; strcpy(newName+1,name); return newName; } #define SUBGROUP_MAX 9 #define FILTER_COMPOSITE_ONLYONE #ifdef FILTER_COMPOSITE_ONLYONE // FIXME: do we even support anything but multi??? If not, this is a boolean @@ -2350,31 +2349,31 @@ char * subgroupSettingByTagOrName(struct trackDb *parentTdb, char *groupNameOrTag) /* look for a subGroup by name (ie subGroup1) or tag (ie view) and return an unallocated char* */ { struct trackDb *ancestor; for (ancestor = parentTdb; ancestor != NULL; ancestor = ancestor->parent) { int ix; char *setting = NULL; if(startsWith("subGroup",groupNameOrTag)) { setting = trackDbSetting(ancestor, groupNameOrTag); if(setting != NULL) return setting; } - for(ix=1;ix<=SUBGROUP_MAX;ix++) // How many do we support? + for(ix=1;ix<=SUBGROUP_MAX;ix++) { char subGrp[16]; safef(subGrp, ArraySize(subGrp), "subGroup%d",ix); setting = trackDbSetting(ancestor, subGrp); if(setting != NULL) // Doesn't require consecutive subgroups { if(startsWithWord(groupNameOrTag,setting)) return setting; } } } return NULL; } boolean subgroupingExists(struct trackDb *parentTdb, char *groupNameOrTag) @@ -2676,38 +2675,40 @@ { membersForAll->members[dimX]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]); membersForAll->letters[dimX]=letter; } else { membersForAll->members[dimY]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]); membersForAll->letters[dimY]=letter; } } } else // No 'dimensions" setting: treat any subGroups as abc dimensions { char letter = 'A'; // walk through numbered subgroups - for (ix=1;ixmembers[dimV] && sameWord(tag,"view")) + continue; // View should have already been handled. NOTE: extremely unlikely case membersForAll->members[membersForAll->dimMax]=subgroupMembersGet(parentTdb, tag); membersForAll->letters[membersForAll->dimMax]=letter; if(cart != NULL) membersForAll->checkedTags[membersForAll->dimMax] = abcMembersChecked(parentTdb,cart,membersForAll->members[membersForAll->dimMax],letter); membersForAll->dimMax++; letter++; } } } membersForAll->abcCount = membersForAll->dimMax - dimA; membersForAll = membersForAllSubGroupsWeedOutEmpties(parentTdb, membersForAll, cart); // NOTE: Dimensions must be defined for filterComposite. Filter dimensioms are all and only ABCs. Use dimensionAchecked to define selected char *filtering = trackDbSettingOrDefault(parentTdb,"filterComposite",NULL); @@ -2848,31 +2849,31 @@ if(cnt <= 0) { freeMem(membership->setting); freeMem(membership); return NULL; } membership->subgroups = needMem(cnt*sizeof(char*)); membership->membership = needMem(cnt*sizeof(char*)); membership->titles = needMem(cnt*sizeof(char*)); for (ix = 0,membership->count=0; ix < cnt; ix++) { char *name,*value; if (parseAssignment(words[ix], &name, &value)) { membership->subgroups[membership->count] = name; - membership->membership[membership->count] = firstCharNoDigit(value);//strSwapChar(value,'_',' '); + membership->membership[membership->count] = firstCharNoDigit(value); // tags will be used as classes by js members_t* members = subgroupMembersGet(childTdb->parent, name); membership->titles[membership->count] = NULL; // default if(members != NULL) { int ix2 = stringArrayIx(membership->membership[membership->count],members->tags,members->count); if(ix2 != -1) membership->titles[membership->count] = strSwapChar(cloneString(members->titles[ix2]),'_',' '); subgroupMembersFree(&members); } membership->count++; } } tdbExtrasMembershipSet(childTdb,membership); return membership; } @@ -4062,62 +4063,61 @@ int ix; // Determine whether subtrack is checked, visible, configurable, has group membership, etc. int fourState = subtrackFourStateChecked(subtrack,cart); boolean checkedCB = fourStateChecked(fourState); boolean enabledCB = fourStateEnabled(fourState); boolean visibleCB = fourStateVisible(fourState); membership_t *membership = subgroupMembershipGet(subtrack); eCfgType cType = cfgNone; if (!tdbIsMultiTrack(parentTdb)) // MultiTracks never have configurable subtracks! cType = cfgTypeFromTdb(subtrack,FALSE); if (cType != cfgNone) { #ifdef SUBTRACK_CFG // Turn off configuring for certain track type or if explicitly turned off - int cfgSubterack = configurableByAjax(subtrack,cType); - if (cfgSubterack <= cfgNone) + int cfgSubtrack = configurableByAjax(subtrack,cType); + if (cfgSubtrack <= cfgNone) cType = cfgNone; else if (membersForAll->members[dimV]) // subtrack only configurable if more than one subtrack in view { // find "view" in subgroup membership: e.g. "signal" if (-1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count))) { int ix2; // find "signal" in set of all views if (-1 != (ix2 = stringArrayIx(membership->membership[ix], membersForAll->members[dimV]->tags, membersForAll->members[dimV]->count))) { if (membersForAll->members[dimV]->subtrackCount[ix2] < 2) cType = cfgNone; } } } else if (slCount(subtrackRefList) < 2 && cfgTypeFromTdb(parentTdb,FALSE) != cfgNone) cType = cfgNone; // don't bother if there is a single subtrack but the composite is configurable. #else///ifndef SUBTRACK_CFG if (trackDbSettingClosestToHomeOn(subtrack, "configurable") == FALSE) cType = cfgNone; #endif///ndef SUBTRACK_CFG } if (sortOrder == NULL && !useDragAndDrop) { if ( divisionIfNeeded(lastDivide,dividers,membership) ) colorIx = (colorIx == COLOR_BG_DEFAULT_IX ? COLOR_BG_ALTDEFAULT_IX : COLOR_BG_DEFAULT_IX); } // Start the TR which must have an id that is directly related to the checkBox id char *id = checkBoxIdMakeForTrack(subtrack,membersForAll->members,membersForAll->dimMax,membership); // view is known tag - printf("\n",id,(!visibleCB && !displayAll?" style='display:none'":"")); // Now the TD that holds the checkbox printf("", (enabledCB?"":" title='view is hidden'"), (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 if (membersForAll->dimensions) { for(di=dimX;didimMax;di++) {