From 8ab764f65cf88500f0357c3f2f72df32819c59e5 Mon Sep 17 00:00:00 2001 From: turner Date: Thu, 30 Nov 2023 13:14:31 -0500 Subject: [PATCH 01/17] multiple popups --- js/trackViewport.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index 025d35746..b4d3e9780 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -702,10 +702,6 @@ class TrackViewport extends Viewport { return } - // Close any currently open popups - $('.igv-popover').hide() - - if (this.browser.dragObject || this.browser.isScrolling) { return } @@ -766,8 +762,10 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { - if (this.popover) this.popover.dispose() - this.popover = new Popover(this.browser.columnContainer) + if (undefined === this.popover) { + this.popover = new Popover(this.browser.columnContainer) + } + this.popover.presentContentWithEvent(event, content) } window.clearTimeout(popupTimerID) @@ -799,10 +797,9 @@ class TrackViewport extends Viewport { } if (str) { - if (this.popover) { - this.popover.dispose() + if (undefined === this.popover) { + this.popover = new Popover(this.browser.columnContainer, (track.name || '')) } - this.popover = new Popover(this.browser.columnContainer, (track.name || '')) this.popover.presentContentWithEvent(event, str) } }) From c3336c0be02c5f611619ca96adb7e838449d4299 Mon Sep 17 00:00:00 2001 From: turner Date: Thu, 30 Nov 2023 14:53:32 -0500 Subject: [PATCH 02/17] Popover - enable draggable --- js/roi/ROIManager.js | 2 +- js/trackViewport.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/roi/ROIManager.js b/js/roi/ROIManager.js index 2109a0546..9519920c1 100644 --- a/js/roi/ROIManager.js +++ b/js/roi/ROIManager.js @@ -220,7 +220,7 @@ class ROIManager { if (this.popover) { this.popover.dispose() } - this.popover = new Popover(columnContainer, roiSet.name) + this.popover = new Popover(columnContainer, true, roiSet.name) this.popover.presentContentWithEvent(event, name) }) } else { diff --git a/js/trackViewport.js b/js/trackViewport.js index b4d3e9780..49858a1cf 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -763,7 +763,7 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { if (undefined === this.popover) { - this.popover = new Popover(this.browser.columnContainer) + this.popover = new Popover(this.browser.columnContainer, true, undefined) } this.popover.presentContentWithEvent(event, content) @@ -798,7 +798,7 @@ class TrackViewport extends Viewport { if (str) { if (undefined === this.popover) { - this.popover = new Popover(this.browser.columnContainer, (track.name || '')) + this.popover = new Popover(this.browser.columnContainer, true, (track.name || '')) } this.popover.presentContentWithEvent(event, str) } From 037eb53ed8302dc9b6fd105f68a74e6779921056 Mon Sep 17 00:00:00 2001 From: turner Date: Fri, 1 Dec 2023 09:32:31 -0500 Subject: [PATCH 03/17] Popover - dismiss when browser layout changes --- js/trackViewport.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/js/trackViewport.js b/js/trackViewport.js index 49858a1cf..b7a117880 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -46,6 +46,12 @@ class TrackViewport extends Viewport { this.stopSpinner() this.addMouseHandlers() + + this.browser.on('trackorderchanged', ignore => { + if (this.popover) { + this.popover.dismiss() + } + }) } setContentHeight(contentHeight) { From 90b1b394336fae3543584066d1540628f2911072 Mon Sep 17 00:00:00 2001 From: turner Date: Fri, 1 Dec 2023 17:27:14 -0500 Subject: [PATCH 04/17] bug fix --- js/roi/ROIManager.js | 4 ++-- js/trackViewport.js | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/js/roi/ROIManager.js b/js/roi/ROIManager.js index 9519920c1..0974dbb74 100644 --- a/js/roi/ROIManager.js +++ b/js/roi/ROIManager.js @@ -1,6 +1,6 @@ import {DOMUtils} from '../../node_modules/igv-ui/dist/igv-ui.js' import ROISet, {screenCoordinates} from './ROISet.js' -import {Popover} from '../../node_modules/igv-ui/dist/igv-ui.js' +import {Popover} from '../../node_modules/igv-ui/src/index.js' class ROIManager { @@ -220,7 +220,7 @@ class ROIManager { if (this.popover) { this.popover.dispose() } - this.popover = new Popover(columnContainer, true, roiSet.name) + this.popover = new Popover(columnContainer, true, roiSet.name, undefined) this.popover.presentContentWithEvent(event, name) }) } else { diff --git a/js/trackViewport.js b/js/trackViewport.js index b7a117880..21a032f19 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -3,7 +3,7 @@ */ import $ from "./vendor/jquery-3.3.1.slim.js" -import {Popover} from '../node_modules/igv-ui/dist/igv-ui.js' +import {Popover} from '../node_modules/igv-ui/src/index.js' import Viewport from "./viewport.js" import {FileUtils} from "../node_modules/igv-utils/src/index.js" import {DOMUtils} from "../node_modules/igv-ui/dist/igv-ui.js" @@ -47,9 +47,15 @@ class TrackViewport extends Viewport { this.stopSpinner() this.addMouseHandlers() + this.popoverList = undefined + this.browser.on('trackorderchanged', ignore => { - if (this.popover) { - this.popover.dismiss() + + if (this.popoverList) { + for (let i = 0; i < this.popoverList.length; i++ ) { + this.popoverList[ i ].dispose() + } + this.popoverList = undefined } }) } @@ -768,11 +774,21 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { - if (undefined === this.popover) { - this.popover = new Popover(this.browser.columnContainer, true, undefined) + + let popover + + if (undefined === this.popoverList) { + this.popoverList = [] } - this.popover.presentContentWithEvent(event, content) + popover = new Popover(this.browser.columnContainer, true, undefined, () => { + popover.dispose() + const index = this.popoverList.indexOf(popover) + this.popoverList[ index ] = undefined + }) + + this.popoverList.push(popover) + popover.presentContentWithEvent(event, content) } window.clearTimeout(popupTimerID) popupTimerID = undefined From f2231472eab407d0c11827e86a224dfa9df20e45 Mon Sep 17 00:00:00 2001 From: turner Date: Fri, 1 Dec 2023 17:59:55 -0500 Subject: [PATCH 05/17] re-parent popover to column --- js/trackViewport.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index 21a032f19..e6b636255 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -781,7 +781,7 @@ class TrackViewport extends Viewport { this.popoverList = [] } - popover = new Popover(this.browser.columnContainer, true, undefined, () => { + popover = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { popover.dispose() const index = this.popoverList.indexOf(popover) this.popoverList[ index ] = undefined From 0bd617d9a6d467c4957b2c06999839b94b104cdb Mon Sep 17 00:00:00 2001 From: turner Date: Mon, 4 Dec 2023 10:52:05 -0500 Subject: [PATCH 06/17] Popover - discard popover on dismissal --- js/roi/ROIManager.js | 2 +- js/trackViewport.js | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/roi/ROIManager.js b/js/roi/ROIManager.js index 0974dbb74..20746247f 100644 --- a/js/roi/ROIManager.js +++ b/js/roi/ROIManager.js @@ -1,6 +1,6 @@ import {DOMUtils} from '../../node_modules/igv-ui/dist/igv-ui.js' import ROISet, {screenCoordinates} from './ROISet.js' -import {Popover} from '../../node_modules/igv-ui/src/index.js' +import {Popover} from '../../node_modules/igv-ui/dist/igv-ui.js' class ROIManager { diff --git a/js/trackViewport.js b/js/trackViewport.js index e6b636255..ae5b6a93b 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -3,7 +3,7 @@ */ import $ from "./vendor/jquery-3.3.1.slim.js" -import {Popover} from '../node_modules/igv-ui/src/index.js' +import {Popover} from '../node_modules/igv-ui/dist/igv-ui.js' import Viewport from "./viewport.js" import {FileUtils} from "../node_modules/igv-utils/src/index.js" import {DOMUtils} from "../node_modules/igv-ui/dist/igv-ui.js" @@ -820,7 +820,7 @@ class TrackViewport extends Viewport { if (str) { if (undefined === this.popover) { - this.popover = new Popover(this.browser.columnContainer, true, (track.name || '')) + this.popover = new Popover(this.browser.columnContainer, true, (track.name || ''), undefined) } this.popover.presentContentWithEvent(event, str) } diff --git a/package.json b/package.json index e198297ba..80e241860 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "circular-view": "github:igvteam/circular-view#v0.2.4", "eslint": "^6.4.0", "hdf5-indexed-reader": "github:jrobinso/hdf5-indexed-reader#v0.5.5", - "igv-ui": "github:igvteam/igv-ui#v1.5.5", + "igv-ui": "github:igvteam/igv-ui#dat_popover_edits", "igv-utils": "github:igvteam/igv-utils#v1.4.8", "mocha": "^10.2.0", "rollup": "^2.66.0", From 0d39e86be648e86e31afb89dcfcb1caac1321533 Mon Sep 17 00:00:00 2001 From: turner Date: Tue, 5 Dec 2023 15:21:52 -0500 Subject: [PATCH 07/17] removal unused code --- js/trackViewport.js | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index ae5b6a93b..76c6dd6a4 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -49,15 +49,15 @@ class TrackViewport extends Viewport { this.popoverList = undefined - this.browser.on('trackorderchanged', ignore => { - - if (this.popoverList) { - for (let i = 0; i < this.popoverList.length; i++ ) { - this.popoverList[ i ].dispose() - } - this.popoverList = undefined - } - }) + // this.browser.on('trackorderchanged', ignore => { + // + // if (this.popoverList) { + // for (let i = 0; i < this.popoverList.length; i++ ) { + // this.popoverList[ i ].dispose() + // } + // this.popoverList = undefined + // } + // }) } setContentHeight(contentHeight) { diff --git a/package.json b/package.json index 80e241860..5cd140d55 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ }, "browserslist": "> 1%, not dead", "devDependencies": { - "html2canvas": "^1.4.1", "@rollup/plugin-strip": "^3.0.1", "@rollup/plugin-terser": "^0.4.0", "@xmldom/xmldom": "^0.7.9", @@ -53,6 +52,7 @@ "circular-view": "github:igvteam/circular-view#v0.2.4", "eslint": "^6.4.0", "hdf5-indexed-reader": "github:jrobinso/hdf5-indexed-reader#v0.5.5", + "html2canvas": "^1.4.1", "igv-ui": "github:igvteam/igv-ui#dat_popover_edits", "igv-utils": "github:igvteam/igv-utils#v1.4.8", "mocha": "^10.2.0", From 122df679e9817ff590e0f75c5b39e18751e2c558 Mon Sep 17 00:00:00 2001 From: turner Date: Wed, 6 Dec 2023 14:58:39 -0500 Subject: [PATCH 08/17] remove dead code --- js/trackViewport.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index 76c6dd6a4..b222d63a9 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -49,15 +49,6 @@ class TrackViewport extends Viewport { this.popoverList = undefined - // this.browser.on('trackorderchanged', ignore => { - // - // if (this.popoverList) { - // for (let i = 0; i < this.popoverList.length; i++ ) { - // this.popoverList[ i ].dispose() - // } - // this.popoverList = undefined - // } - // }) } setContentHeight(contentHeight) { From e320adee761bbc7ab808deeb673c0c1ee3ca2d0c Mon Sep 17 00:00:00 2001 From: turner Date: Wed, 6 Dec 2023 15:46:16 -0500 Subject: [PATCH 09/17] Single click popover. --- js/trackViewport.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index b222d63a9..9aacbee8d 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -17,6 +17,7 @@ let mouseDownCoords let lastClickTime = 0 let lastHoverUpdateTime = 0 let popupTimerID +let popover class TrackViewport extends Viewport { @@ -709,8 +710,8 @@ class TrackViewport extends Viewport { return } - // Treat as a mouse click, its either a single or double click. - // Handle here and stop propogation / default + // Treat as a mouse click, it's either a single or double click. + // Handle here and stop propagation / default event.preventDefault() const mouseX = DOMUtils.translateMouseCoordinates(event, this.$viewport.get(0)).x @@ -766,19 +767,15 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { - let popover - - if (undefined === this.popoverList) { - this.popoverList = [] + if (popover) { + popover.dispose() } + // Use column element as parent to popover popover = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { popover.dispose() - const index = this.popoverList.indexOf(popover) - this.popoverList[ index ] = undefined }) - this.popoverList.push(popover) popover.presentContentWithEvent(event, content) } window.clearTimeout(popupTimerID) From 5d8afa65fa80fb72ff44a9142e5a6b9ffeb181f6 Mon Sep 17 00:00:00 2001 From: turner Date: Wed, 6 Dec 2023 17:04:38 -0500 Subject: [PATCH 10/17] Popover - shift-click to present multiple popovers --- js/trackViewport.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index 9aacbee8d..1a5bef71e 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -17,7 +17,6 @@ let mouseDownCoords let lastClickTime = 0 let lastHoverUpdateTime = 0 let popupTimerID -let popover class TrackViewport extends Viewport { @@ -756,27 +755,34 @@ class TrackViewport extends Viewport { } else { // single-click - if (event.shiftKey && typeof this.trackView.track.shiftClick === "function") { + /*if (event.shiftKey && typeof this.trackView.track.shiftClick === "function") { this.trackView.track.shiftClick(xBP, event) - } else if (typeof this.trackView.track.popupData === "function") { + } else */ + + if (typeof this.trackView.track.popupData === "function") { popupTimerID = setTimeout(() => { const content = this.getPopupContent(event) if (content) { - if (popover) { - popover.dispose() + if (undefined === this.popoverList) { + this.popoverList = [] + } + + if (false === event.shiftKey) { + for (let i = 0; i < this.popoverList.length; i++ ) { + this.popoverList[ i ].dispose() + } + this.popoverList = [] } // Use column element as parent to popover - popover = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { - popover.dispose() - }) + this.popoverList.push(new Popover(this.$viewport.get(0).parentElement, true, undefined, undefined)) + this.popoverList[ this.popoverList.length - 1 ].presentContentWithEvent(event, content) - popover.presentContentWithEvent(event, content) } window.clearTimeout(popupTimerID) popupTimerID = undefined From 72b6b618fd499818e367faf242babd615dbac6a4 Mon Sep 17 00:00:00 2001 From: turner Date: Thu, 7 Dec 2023 11:08:14 -0500 Subject: [PATCH 11/17] Popover - TrackViewport - discard items properly --- js/trackViewport.js | 16 ++++++++++++++++ js/viewport.js | 4 ---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index 1a5bef71e..34afa11ef 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -869,6 +869,22 @@ class TrackViewport extends Viewport { return content } + dispose() { + + if (this.popover) { + this.popover.dispose() + } + + if (this.popoverList) { + for (let i = 0; i < this.popoverList.length; i++ ) { + this.popoverList[ i ].dispose() + } + + this.popoverList = undefined + } + + super.dispose() + } } diff --git a/js/viewport.js b/js/viewport.js index 86b06fab8..ba662406c 100644 --- a/js/viewport.js +++ b/js/viewport.js @@ -192,10 +192,6 @@ class Viewport { */ dispose() { - if (this.popover) { - this.popover.dispose() - } - this.$viewport.get(0).remove() // Null out all properties -- this should not be neccessary, but just in case there is a From 46ba9c40cf1219460948f2fa6aed2ab35c7f529a Mon Sep 17 00:00:00 2001 From: turner Date: Fri, 8 Dec 2023 16:03:29 -0500 Subject: [PATCH 12/17] Popover - default behavior is on Popover at a time. --- js/trackViewport.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/js/trackViewport.js b/js/trackViewport.js index 34afa11ef..b1c97ac64 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -49,6 +49,20 @@ class TrackViewport extends Viewport { this.popoverList = undefined + this.browser.on('willpresentpopover', trackViewport => { + + if (trackViewport !== this && this.popoverList) { + + for (let i = 0; i < this.popoverList.length; i++ ) { + this.popoverList[ i ].dispose() + } + + this.popoverList = undefined + } + + }) + + } setContentHeight(contentHeight) { @@ -768,6 +782,8 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { + this.browser.fireEvent('willpresentpopover', [this]) + if (undefined === this.popoverList) { this.popoverList = [] } From ba122b4b3e0aa21579e9e51b8d88d19e9406617c Mon Sep 17 00:00:00 2001 From: turner Date: Mon, 11 Dec 2023 09:30:59 -0500 Subject: [PATCH 13/17] bug fix --- js/trackViewport.js | 51 ++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index b1c97ac64..4c5c66101 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -17,6 +17,7 @@ let mouseDownCoords let lastClickTime = 0 let lastHoverUpdateTime = 0 let popupTimerID +let globalPopoverList class TrackViewport extends Viewport { @@ -47,20 +48,18 @@ class TrackViewport extends Viewport { this.stopSpinner() this.addMouseHandlers() - this.popoverList = undefined - - this.browser.on('willpresentpopover', trackViewport => { - - if (trackViewport !== this && this.popoverList) { - - for (let i = 0; i < this.popoverList.length; i++ ) { - this.popoverList[ i ].dispose() - } - - this.popoverList = undefined - } - - }) + // this.browser.on('willpresentpopover', trackViewport => { + // + // if (trackViewport !== this && globalPopoverList) { + // + // for (let i = 0; i < globalPopoverList.length; i++ ) { + // globalPopoverList[ i ].dispose() + // } + // + // globalPopoverList = undefined + // } + // + // }) } @@ -782,22 +781,22 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { - this.browser.fireEvent('willpresentpopover', [this]) + // this.browser.fireEvent('willpresentpopover', [this]) - if (undefined === this.popoverList) { - this.popoverList = [] + if (undefined === globalPopoverList) { + globalPopoverList = [] } if (false === event.shiftKey) { - for (let i = 0; i < this.popoverList.length; i++ ) { - this.popoverList[ i ].dispose() + for (let i = 0; i < globalPopoverList.length; i++ ) { + globalPopoverList[ i ].dispose() } - this.popoverList = [] + globalPopoverList = [] } // Use column element as parent to popover - this.popoverList.push(new Popover(this.$viewport.get(0).parentElement, true, undefined, undefined)) - this.popoverList[ this.popoverList.length - 1 ].presentContentWithEvent(event, content) + globalPopoverList.push(new Popover(this.$viewport.get(0).parentElement, true, undefined, undefined)) + globalPopoverList[ globalPopoverList.length - 1 ].presentContentWithEvent(event, content) } window.clearTimeout(popupTimerID) @@ -891,12 +890,12 @@ class TrackViewport extends Viewport { this.popover.dispose() } - if (this.popoverList) { - for (let i = 0; i < this.popoverList.length; i++ ) { - this.popoverList[ i ].dispose() + if (globalPopoverList) { + for (let i = 0; i < globalPopoverList.length; i++ ) { + globalPopoverList[ i ].dispose() } - this.popoverList = undefined + globalPopoverList = undefined } super.dispose() From 60f46da0c730e632838861f8a28a9ee9060f9788 Mon Sep 17 00:00:00 2001 From: turner Date: Tue, 12 Dec 2023 11:50:18 -0500 Subject: [PATCH 14/17] Popover edits --- js/trackViewport.js | 70 +++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/js/trackViewport.js b/js/trackViewport.js index 4c5c66101..fa4fd761e 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -17,7 +17,9 @@ let mouseDownCoords let lastClickTime = 0 let lastHoverUpdateTime = 0 let popupTimerID -let globalPopoverList +let globalPopoverList = [] + +let popover class TrackViewport extends Viewport { @@ -48,20 +50,6 @@ class TrackViewport extends Viewport { this.stopSpinner() this.addMouseHandlers() - // this.browser.on('willpresentpopover', trackViewport => { - // - // if (trackViewport !== this && globalPopoverList) { - // - // for (let i = 0; i < globalPopoverList.length; i++ ) { - // globalPopoverList[ i ].dispose() - // } - // - // globalPopoverList = undefined - // } - // - // }) - - } setContentHeight(contentHeight) { @@ -781,22 +769,36 @@ class TrackViewport extends Viewport { const content = this.getPopupContent(event) if (content) { - // this.browser.fireEvent('willpresentpopover', [this]) + if (false === event.shiftKey) { - if (undefined === globalPopoverList) { - globalPopoverList = [] - } + if (popover) { + popover.dispose() + } - if (false === event.shiftKey) { - for (let i = 0; i < globalPopoverList.length; i++ ) { - globalPopoverList[ i ].dispose() + if (globalPopoverList.length > 0) { + for (const gp of globalPopoverList) { + gp.dispose() + } + globalPopoverList = [] } - globalPopoverList = [] - } - // Use column element as parent to popover - globalPopoverList.push(new Popover(this.$viewport.get(0).parentElement, true, undefined, undefined)) - globalPopoverList[ globalPopoverList.length - 1 ].presentContentWithEvent(event, content) + popover = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { + popover.dispose() + }) + + popover.presentContentWithEvent(event, content) + } else { + + let po = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { + const index = globalPopoverList.indexOf(po) + globalPopoverList.splice(index, 1) + po.dispose() + }) + + globalPopoverList.push( po ) + + po.presentContentWithEvent(event, content) + } } window.clearTimeout(popupTimerID) @@ -890,13 +892,13 @@ class TrackViewport extends Viewport { this.popover.dispose() } - if (globalPopoverList) { - for (let i = 0; i < globalPopoverList.length; i++ ) { - globalPopoverList[ i ].dispose() - } - - globalPopoverList = undefined - } + // if (globalPopoverList) { + // for (let i = 0; i < globalPopoverList.length; i++ ) { + // globalPopoverList[ i ].dispose() + // } + // + // globalPopoverList = undefined + // } super.dispose() } From 98ed7853df36998df486d980bfcf929bbcf708de Mon Sep 17 00:00:00 2001 From: turner Date: Thu, 14 Dec 2023 10:17:13 -0500 Subject: [PATCH 15/17] Add willremovecolumn event to enable discarding Popover instances on multi-locus panel removal --- js/browser.js | 14 ++++++++++++++ js/trackViewport.js | 23 ++++++++++++----------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/js/browser.js b/js/browser.js index f589751c6..4803599f6 100755 --- a/js/browser.js +++ b/js/browser.js @@ -56,6 +56,7 @@ import MultiTrackSelectButton from "./ui/multiTrackSelectButton.js" import MenuUtils from "./ui/menuUtils.js" import Genome from "./genome/genome.js" import {setDefaults} from "./igv-create.js" +import { trackViewportPopoverList } from './trackViewport.js' // css - $igv-scrollbar-outer-width: 14px; const igv_scrollbar_outer_width = 14 @@ -141,6 +142,16 @@ class Browser { } }) + this.on('willremovecolumn', column => { + if (trackViewportPopoverList.length > 0) { + const len = trackViewportPopoverList.length + for (let i = 0; i < len; i++) { + trackViewportPopoverList[ i ].dispose() + } + trackViewportPopoverList.length = 0 + } + }) + this.addMouseHandlers() this.sampleInfo = new SampleInfo(this) @@ -1582,6 +1593,9 @@ class Browser { // find the $column corresponding to this referenceFrame and remove it const index = this.referenceFrameList.indexOf(referenceFrame) const {$viewport} = this.trackViews[0].viewports[index] + + this.fireEvent('willremovecolumn', [ $viewport.parent().get(0) ]); + viewportColumnManager.removeColumnAtIndex(index, $viewport.parent().get(0)) for (let {viewports} of this.trackViews) { diff --git a/js/trackViewport.js b/js/trackViewport.js index fa4fd761e..53a676f6b 100644 --- a/js/trackViewport.js +++ b/js/trackViewport.js @@ -17,7 +17,7 @@ let mouseDownCoords let lastClickTime = 0 let lastHoverUpdateTime = 0 let popupTimerID -let globalPopoverList = [] +let trackViewportPopoverList = [] let popover @@ -775,11 +775,11 @@ class TrackViewport extends Viewport { popover.dispose() } - if (globalPopoverList.length > 0) { - for (const gp of globalPopoverList) { + if (trackViewportPopoverList.length > 0) { + for (const gp of trackViewportPopoverList) { gp.dispose() } - globalPopoverList = [] + trackViewportPopoverList.length = 0 } popover = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { @@ -790,12 +790,12 @@ class TrackViewport extends Viewport { } else { let po = new Popover(this.$viewport.get(0).parentElement, true, undefined, () => { - const index = globalPopoverList.indexOf(po) - globalPopoverList.splice(index, 1) + const index = trackViewportPopoverList.indexOf(po) + trackViewportPopoverList.splice(index, 1) po.dispose() }) - globalPopoverList.push( po ) + trackViewportPopoverList.push( po ) po.presentContentWithEvent(event, content) } @@ -892,12 +892,12 @@ class TrackViewport extends Viewport { this.popover.dispose() } - // if (globalPopoverList) { - // for (let i = 0; i < globalPopoverList.length; i++ ) { - // globalPopoverList[ i ].dispose() + // if (trackViewportPopoverList) { + // for (let i = 0; i < trackViewportPopoverList.length; i++ ) { + // trackViewportPopoverList[ i ].dispose() // } // - // globalPopoverList = undefined + // trackViewportPopoverList = undefined // } super.dispose() @@ -967,4 +967,5 @@ function mergeArrays(a, b) { } +export { trackViewportPopoverList } export default TrackViewport From 67522c05a6a320d7a279925429c93cc08c23fe2b Mon Sep 17 00:00:00 2001 From: turner Date: Mon, 18 Dec 2023 11:05:56 -0500 Subject: [PATCH 16/17] Discard Popovers whenever column count is altered. Prevents zombie Popover objects. --- js/browser.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/js/browser.js b/js/browser.js index 4803599f6..291f0ea22 100755 --- a/js/browser.js +++ b/js/browser.js @@ -142,7 +142,7 @@ class Browser { } }) - this.on('willremovecolumn', column => { + this.on('didchangecolumnlayout', () => { if (trackViewportPopoverList.length > 0) { const len = trackViewportPopoverList.length for (let i = 0; i < len; i++) { @@ -1550,6 +1550,7 @@ class Browser { // TODO -- this is really ugly const {$viewport} = this.trackViews[0].viewports[indexLeft] const viewportColumn = viewportColumnManager.insertAfter($viewport.get(0).parentElement) + this.fireEvent('didchangecolumnlayout') if (indexRight === this.referenceFrameList.length) { this.referenceFrameList.push(newReferenceFrame) @@ -1594,9 +1595,8 @@ class Browser { const index = this.referenceFrameList.indexOf(referenceFrame) const {$viewport} = this.trackViews[0].viewports[index] - this.fireEvent('willremovecolumn', [ $viewport.parent().get(0) ]); - viewportColumnManager.removeColumnAtIndex(index, $viewport.parent().get(0)) + this.fireEvent('didchangecolumnlayout') for (let {viewports} of this.trackViews) { viewports[index].dispose() @@ -1735,6 +1735,7 @@ class Browser { // Insert viewport columns preceding the sample info column viewportColumnManager.insertBefore(this.columnContainer.querySelector('.igv-sample-info-column'), this.referenceFrameList.length) + this.fireEvent('didchangecolumnlayout') this.centerLineList = this.createCenterLineList(this.columnContainer) From f818a66120b34f82e724592c4ad40e00f5ad4002 Mon Sep 17 00:00:00 2001 From: turner Date: Tue, 2 Jan 2024 14:42:24 -0500 Subject: [PATCH 17/17] update igv-ui version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5cd140d55..b8d67f8b7 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "eslint": "^6.4.0", "hdf5-indexed-reader": "github:jrobinso/hdf5-indexed-reader#v0.5.5", "html2canvas": "^1.4.1", - "igv-ui": "github:igvteam/igv-ui#dat_popover_edits", + "igv-ui": "github:igvteam/igv-ui#v1.5.6", "igv-utils": "github:igvteam/igv-utils#v1.4.8", "mocha": "^10.2.0", "rollup": "^2.66.0",