From b353fb9e489ed88def0b1e2f6ab9785c73607278 Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sun, 5 Aug 2018 06:18:09 -0400 Subject: [PATCH 1/2] Don't apply relayout operations to the view that originated the event This fixes a zoom stutter that occurred on scroll zoom of 3d plots --- js/src/Figure.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/src/Figure.js b/js/src/Figure.js index c85097c6e62..f3906dfe3bb 100644 --- a/js/src/Figure.js +++ b/js/src/Figure.js @@ -1248,10 +1248,11 @@ var FigureView = widgets.DOMWidgetView.extend({ /** @type {Py2JsRelayoutMsg} */ var msgData = this.model.get("_py2js_relayout"); if (msgData !== null) { - - var relayoutData = msgData.relayout_data; + if (msgData.source_view_id !== this.viewID) { + var relayoutData = msgData.relayout_data; relayoutData["_doNotReportToPy"] = true; Plotly.relayout(this.el, msgData.relayout_data); + } // ### Send layout delta ### var layout_edit_id = msgData.layout_edit_id; From 1386eb5c2e4d33674f47e5b5f56a2769bba1d8e3 Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sun, 5 Aug 2018 07:03:07 -0400 Subject: [PATCH 2/2] When computing overlapping properties to remove, don't leave empty objects. Before, while scroll zooming on scatter3d trace with multiple views we'd sometimes end up with a _props state of: {'up': {'x': -0.4, 'y': -0.4, 'z': 0.8}, 'center': {'x': 0, 'y': 0, 'z': 0}, 'eye': {}} When this happened, accessing a sub-property of eye would always return none, even though values existed in the _prop_defaults dict. e.g. fig.layout.scene.camera.eye.x would return None because the eye dict in _props was empty. Now we just remove the eye property as well if all of it's own properties have been removed: {'up': {'x': -0.4, 'y': -0.4, 'z': 0.8}, 'center': {'x': 0, 'y': 0, 'z': 0}} --- plotly/basewidget.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plotly/basewidget.py b/plotly/basewidget.py index f9354c16351..8e822eb6cc8 100644 --- a/plotly/basewidget.py +++ b/plotly/basewidget.py @@ -814,6 +814,12 @@ def _remove_overlapping_props(input_data, delta_data, prop_path=()): input_val, delta_val, recur_prop_path)) removed.extend(recur_removed) + # Check whether the last property in input_val + # has been removed. If so, remove it entirely + if not input_val: + input_data.pop(p) + removed.append(recur_prop_path) + elif p in input_data and p != 'uid': # ### Remove property ### input_data.pop(p)