Skip to content

Commit aac1093

Browse files
committed
Correctly cleanup frame painter from TCanvas/RCanvas drawings
In RCanvas ROOT6 frame painter has to be deleted In TCanvas if frame painter cleaned up, one need to recreate basic elements
1 parent e9ab780 commit aac1093

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

scripts/JSRoot.core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105

106106
/** @summary JSROOT version date
107107
* @desc Release date in format day/month/year like "6/01/2021"*/
108-
JSROOT.version_date = "8/01/2021";
108+
JSROOT.version_date = "11/01/2021";
109109

110110
/** @summary JSROOT version id and date
111111
* @desc Produced by concatenation of {@link JSROOT.version_id} and {@link JSROOT.version_date}

scripts/JSRoot.gpad.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,10 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
934934
/** @summary Returns frame painter - object itself */
935935
TFramePainter.prototype.getFramePainter = function() { return this; }
936936

937+
/** @summary Returns true if it is ROOT6 frame
938+
* @private */
939+
TFramePainter.prototype.is_root6 = function() { return true; }
940+
937941
/** @summary Returns frame or sub-objects, used in GED editor */
938942
TFramePainter.prototype.getObject = function(place) {
939943
if (place === "xaxis") return this.xaxis;
@@ -1539,6 +1543,10 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
15391543
delete this._dblclick_handler;
15401544
delete this.enabledKeys;
15411545

1546+
let pp = this.getPadPainter();
1547+
if (pp && (pp.frame_painter_ref === this))
1548+
delete pp.frame_painter_ref;
1549+
15421550
JSROOT.ObjectPainter.prototype.cleanup.call(this);
15431551
}
15441552

@@ -3106,6 +3114,7 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
31063114
}
31073115

31083116
if (!isanyfound) {
3117+
// TODO: maybe just remove frame painter?
31093118
let fp = this.getFramePainter();
31103119
for (let k=0;k<this.painters.length;++k)
31113120
if (fp !== this.painters[k])
@@ -3115,6 +3124,7 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
31153124
if (fp) {
31163125
this.painters.push(fp);
31173126
fp.cleanFrameDrawings();
3127+
fp.redraw();
31183128
}
31193129
if (this.removePadButtons) this.removePadButtons();
31203130
this.addPadButtons(true);

scripts/JSRoot.painter.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2434,6 +2434,7 @@ JSROOT.define(['d3'], (d3) => {
24342434
* @protected */
24352435
ObjectPainter.prototype.scaleTextDrawing = function(factor, draw_g) {
24362436
if (!draw_g) draw_g = this.draw_g;
2437+
if (!draw_g || draw_g.empty()) return;
24372438
if (factor && (factor > draw_g.property('text_factor')))
24382439
draw_g.property('text_factor', factor);
24392440
}
@@ -2594,6 +2595,7 @@ JSROOT.define(['d3'], (d3) => {
25942595
if (!arg.text) arg.text = "";
25952596

25962597
arg.draw_g = arg.draw_g || this.draw_g;
2598+
if (!arg.draw_g || arg.draw_g.empty()) return;
25972599

25982600
let font = arg.draw_g.property('text_font');
25992601
arg.font = font; // use in latex conversion
@@ -2711,6 +2713,9 @@ JSROOT.define(['d3'], (d3) => {
27112713
* @protected */
27122714
ObjectPainter.prototype.finishTextDrawing = function(draw_g) {
27132715
if (!draw_g) draw_g = this.draw_g;
2716+
if (!draw_g || draw_g.empty())
2717+
return Promise.resolve(false);
2718+
27142719
draw_g.property('draw_text_completed', true); // mark that text drawing is completed
27152720

27162721
return new Promise(resolveFunc => {

scripts/JSRoot.v7gpad.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,8 +1462,13 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
14621462

14631463
RFramePainter.prototype = Object.create(JSROOT.ObjectPainter.prototype);
14641464

1465+
/** @summary Returns frame painter - object itself */
14651466
RFramePainter.prototype.getFramePainter = function() { return this; }
14661467

1468+
/** @summary Returns true if it is ROOT6 frame
1469+
* @private */
1470+
RFramePainter.prototype.is_root6 = function() { return false; }
1471+
14671472
/** @summary Set active flag for frame - can block some events
14681473
* @private */
14691474
RFramePainter.prototype.setFrameActive = function(on) {
@@ -1894,6 +1899,10 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
18941899
delete this._click_handler;
18951900
delete this._dblclick_handler;
18961901

1902+
let pp = this.getPadPainter();
1903+
if (pp && (pp.frame_painter_ref === this))
1904+
delete pp.frame_painter_ref;
1905+
18971906
JSROOT.ObjectPainter.prototype.cleanup.call(this);
18981907
}
18991908

@@ -3262,8 +3271,11 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
32623271
let sub = this.painters[k];
32633272
if (sub.snapid===undefined) continue; // look only for painters with snapid
32643273

3265-
for (let i=0;i<snap.fPrimitives.length;++i)
3266-
if (snap.fPrimitives[i].fObjectID === sub.snapid) { sub = null; isanyfound = true; break; }
3274+
snap.fPrimitives.forEach(prim => {
3275+
if (sub && (prim.fObjectID === sub.snapid)) {
3276+
sub = null; isanyfound = true;
3277+
}
3278+
});
32673279

32683280
if (sub) {
32693281
// remove painter which does not found in the list of snaps
@@ -3279,14 +3291,17 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
32793291

32803292
if (!isanyfound) {
32813293
let fp = this.getFramePainter();
3294+
// cannot preserve ROOT6 frame - it must be recreated
3295+
if (fp && fp.is_root6()) fp = null;
32823296
for (let k = 0; k < this.painters.length; ++k)
3283-
if (fp !== this.painters[k])
3297+
if (fp !== this.painters[k])
32843298
this.painters[k].cleanup();
32853299
this.painters = [];
32863300
delete this.main_painter_ref;
32873301
if (fp) {
32883302
this.painters.push(fp);
32893303
fp.cleanFrameDrawings();
3304+
fp.redraw(); // need to create all layers again
32903305
}
32913306
if (this.removePadButtons) this.removePadButtons();
32923307
this.addPadButtons(true);
@@ -3953,13 +3968,14 @@ JSROOT.define(['d3', 'painter'], (d3, jsrp) => {
39533968
/** @summary Hanler for websocket close event
39543969
* @private */
39553970
RCanvasPainter.prototype.onWebsocketClosed = function(/*handle*/) {
3971+
console.log('WebSocket closed!!');
39563972
jsrp.closeCurrentWindow();
39573973
}
39583974

39593975
/** @summary Hanler for websocket message
39603976
* @private */
39613977
RCanvasPainter.prototype.onWebsocketMsg = function(handle, msg) {
3962-
console.log("GET MSG " + msg.substr(0,30));
3978+
console.log("GET_MSG " + msg.substr(0,30));
39633979

39643980
if (msg == "CLOSE") {
39653981
this.onWebsocketClosed();

0 commit comments

Comments
 (0)