03728506f98789fc4375911a2e3726f1c61d297d kate Sat Oct 8 22:44:12 2016 -0700 Add hover and click handling to bodyMap. Rough cut code for usability review. refs #17369 diff --git src/hg/js/hgGtexTrackSettings.js src/hg/js/hgGtexTrackSettings.js index 94413a2..868eb98 100644 --- src/hg/js/hgGtexTrackSettings.js +++ src/hg/js/hgGtexTrackSettings.js @@ -1,24 +1,26 @@ // Module: gtexTrackSettings var gtexTrackSettings = (function() { // Data // SVG has it's own DOM var _svgDoc; var _svgRoot; + var _htmlDoc; + var _htmlRoot; var tissues = [ 'adiposeSubcut', 'adiposeVisceral', 'adrenalGland', 'arteryAorta', 'arteryCoronary', 'arteryTibial', 'bladder', 'brainAmygdala', 'brainAnCinCortex', 'brainCaudate', 'brainCerebelHemi', 'brainCerebellum', 'brainCortex', 'brainFrontCortex', 'brainHippocampus', 'brainHypothalamus', 'brainNucAccumbens', 'brainPutamen', 'brainSpinalcord', 'brainSubstanNigra', 'breastMamTissue', 'xformedlymphocytes', 'xformedfibroblasts', 'ectocervix', 'endocervix', 'colonSigmoid', 'colonTransverse', 'esophagusJunction', 'esophagusMucosa', 'esophagusMuscular', 'fallopianTube', 'heartAtrialAppend', 'heartLeftVentricl', 'kidneyCortex', 'liver', 'lung', 'minorSalivGland', 'muscleSkeletal', 'nerveTibial', 'ovary', 'pancreas', 'pituitary', 'prostate', 'skinNotExposed', 'skinExposed', 'smallIntestine', 'spleen', 'stomach', 'testis', 'thyroid', 'uterus', 'vagina', 'wholeBlood' ]; @@ -48,48 +50,92 @@ function onClickToggleTissue(tis) { // mark selected in tissue table $(this).toggleClass('tableTissueSelected'); // jQuery addClass doesn't work on SVG elements, using classList // May need a shim so this works on IE9 and Opera mini (as if Dec 2014) // https://martinwolf.org/blog/2014/12/adding-and-removing-classes-from-svg-elements-with-jquery var el = _svgDoc.getElementById(this.id); if (el !== null) { el.classList.toggle('tableTissueSelected'); } } + function onMapClickToggleTissue(ev) { + var tis = ev.target.id; + var el = _htmlDoc.getElementById(tis); + if (el !== null) { + el.classList.toggle('tableTissueSelected'); + } + // below can likely replace 3 lines after + //this.classList.toggle('tableTissueSelected'); + el = _svgDoc.getElementById(tis); + if (el !== null) { + el.classList.toggle('tableTissueSelected'); + } + } + function onClickSetTissue(tis) { // mark selected in tissue table $(tis).addClass('tableTissueSelected'); var el = _svgDoc.getElementById(tis); if (el !== null) { el.classList.add('tableTissueSelected'); } } function onClickClearTissue(tis) { // mark selected in tissue table $(tis).removeClass('tableTissueSelected'); var el = _svgDoc.getElementById(tis); if (el !== null) { el.classList.remove('tableTissueSelected'); } } + function onMapHoverTissue(ev) { + var isOn = false; + var tis = ev.target.id; + var el = _htmlDoc.getElementById(tis); + if (el !== null) { + el.classList.toggle('tissueHovered'); + if (el.classList.contains('tissueHovered')) { + isOn = true; + } + } + + // below can likely replace 3 lines after + //this.classList.toggle('tableTissueSelected'); + el = _svgDoc.getElementById(tis); + if (el !== null) { + el.classList.toggle('tissueHovered'); + if (this.id === "arteryAorta") { + var line = $("#LL_arteryAorta", _svgRoot); + var white = $("#WHITE_arteryAorta", _svgRoot); + if (isOn) { + $(line).show(); + $(white).show(); + } else { + $(white).hide(); + $(line).hide(); + } + } + } + } + function onHoverTissue() { // HTML $(this).toggleClass('tissueHovered'); var isOn = $(this).hasClass('tissueHovered'); // SVG var el = _svgDoc.getElementById(this.id); if (el !== null) { el.classList.toggle('tissueHovered'); if (this.id === "arteryAorta") { var line = $("#LL_arteryAorta", _svgRoot); var white = $("#WHITE_arteryAorta", _svgRoot); if (isOn) { $(line).show(); $(white).show(); @@ -104,30 +150,40 @@ } el = _svgDoc.getElementById("WHITE_arteryAorta"); if (el !== null) { el.classList.toggle('mapTissueHovered'); */ } } } //function animateTissue(tis, i, ignore) { function animateTissue(tis) { //console.log(tis); // add handlers to tissue table $('#' + tis).click(tis, onClickToggleTissue); $('#' + tis).hover(onHoverTissue, onHoverTissue); + + var el = _svgDoc.getElementById(tis); + if (el !== null) { + el.addEventListener("click", onMapClickToggleTissue); + el.addEventListener("mouseenter", onMapHoverTissue); + el.addEventListener("mouseleave", onMapHoverTissue); + // mouseover, mouseout ? + } + + } function animateTissues() { // Add event handlers to tissue table and body map SVG tissues.forEach(animateTissue); $('#setAll').click(onClickSetAll); $('#clearAll').click(onClickClearAll); } // UI event handlers function onClickSetAll() { // set font-weight: bold on table, set text fill: black on svg // NOTE: this shouldn't be needed (needs debugging in onClickSet) @@ -143,30 +199,32 @@ function onClickMapTissue() { this.style.fill = "black"; //document.getElementById("bodyMapSvg").contentDocument.getElementById('endocervix').style.fill = "black"; } // Initialization function init() { // cart.setCgi('gtexTrackSettings'); $(function() { // after page load, tweak layout and initialize event handlers var bodyMapSvg = document.getElementById("bodyMapSvg"); globalSvg = bodyMapSvg; + _htmlDoc = document; + _htmlRoot = document.documentElement; // wait for SVG to load bodyMapSvg.addEventListener("load", function() { var svg = bodyMapSvg.contentDocument.documentElement; _svgRoot = svg; _svgDoc = bodyMapSvg.contentDocument; initBodyMap(svg, bodyMapSvg.contentDocument); animateTissues(); }, false); }); } return {