Skip to content

Consistent container update / removal #1086

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Oct 26, 2016
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
relayout: merge all array container update logic into 1 block
- by using manageArrayContainers
  • Loading branch information
etpinard committed Oct 26, 2016
commit 2cafbeb17bc3d1f07e726cf1f60099e609ebc54a
44 changes: 6 additions & 38 deletions src/plot_api/plot_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -1816,8 +1816,7 @@ function _relayout(gd, aobj) {
// trunk nodes (everything except the leaf)
ptrunk = p.parts.slice(0, pend).join('.'),
parentIn = Lib.nestedProperty(gd.layout, ptrunk).get(),
parentFull = Lib.nestedProperty(fullLayout, ptrunk).get(),
diff;
parentFull = Lib.nestedProperty(fullLayout, ptrunk).get();

if(vi === undefined) continue;

Expand Down Expand Up @@ -1951,42 +1950,11 @@ function _relayout(gd, aobj) {
drawOne(gd, objNum, p.parts.slice(2).join('.'), aobj[ai]);
delete aobj[ai];
}
else if(p.parts[0] === 'images') {
var update = Lib.objectFromPath(ai, vi);
Lib.extendDeepAll(gd.layout, update);

Registry.getComponentMethod('images', 'supplyLayoutDefaults')(gd.layout, gd._fullLayout);
Registry.getComponentMethod('images', 'draw')(gd);
}
else if(p.parts[0] === 'mapbox' && p.parts[1] === 'layers') {
Lib.extendDeepAll(gd.layout, Lib.objectFromPath(ai, vi));

// append empty container to mapbox.layers
// so that relinkPrivateKeys does not complain

var fullLayers = (gd._fullLayout.mapbox || {}).layers || [];
diff = (p.parts[2] + 1) - fullLayers.length;

for(i = 0; i < diff; i++) fullLayers.push({});

flags.doplot = true;
}
else if(p.parts[0] === 'updatemenus') {
Lib.extendDeepAll(gd.layout, Lib.objectFromPath(ai, vi));

var menus = gd._fullLayout.updatemenus || [];
diff = (p.parts[2] + 1) - menus.length;

for(i = 0; i < diff; i++) menus.push({});
flags.doplot = true;
}
else if(p.parts[0] === 'sliders') {
Lib.extendDeepAll(gd.layout, Lib.objectFromPath(ai, vi));

var sliders = gd._fullLayout.sliders || [];
diff = (p.parts[2] + 1) - sliders.length;

for(i = 0; i < diff; i++) sliders.push({});
else if(
Plots.layoutArrayContainers.indexOf(p.parts[0]) !== -1 ||
(p.parts[0] === 'mapbox' && p.parts[1] === 'layers')
) {
helpers.manageArrayContainers(p, vi, undoit);
flags.doplot = true;
}
// alter gd.layout
Expand Down
10 changes: 7 additions & 3 deletions test/jasmine/tests/layout_images_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -329,18 +329,22 @@ describe('Layout images', function() {
return Plotly.relayout(gd, 'images[2]', makeImage(pythonLogo, 0.2, 0.5));
}).then(function() {
assertImages(3);
expect(gd.layout.images.length).toEqual(3);

return Plotly.relayout(gd, 'images[2]', 'remove');
return Plotly.relayout(gd, 'images[2]', null);
}).then(function() {
assertImages(2);
expect(gd.layout.images.length).toEqual(2);

return Plotly.relayout(gd, 'images[1]', 'remove');
return Plotly.relayout(gd, 'images[1]', null);
}).then(function() {
assertImages(1);
expect(gd.layout.images.length).toEqual(1);

return Plotly.relayout(gd, 'images[0]', 'remove');
return Plotly.relayout(gd, 'images[0]', null);
}).then(function() {
assertImages(0);
expect(gd.layout.images).toEqual([]);

done();
});
Expand Down
44 changes: 40 additions & 4 deletions test/jasmine/tests/lib_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1561,23 +1561,27 @@ describe('Queue', function() {

Plotly.plot(gd, [{
y: [2, 1, 2]
}]).then(function() {
}])
.then(function() {
expect(gd.undoQueue).toBeUndefined();

return Plotly.restyle(gd, 'marker.color', 'red');
}).then(function() {
})
.then(function() {
expect(gd.undoQueue.index).toEqual(1);
expect(gd.undoQueue.queue[0].undo.args[0][1]['marker.color']).toEqual([undefined]);
expect(gd.undoQueue.queue[0].redo.args[0][1]['marker.color']).toEqual('red');

return Plotly.relayout(gd, 'title', 'A title');
}).then(function() {
})
.then(function() {
expect(gd.undoQueue.index).toEqual(2);
expect(gd.undoQueue.queue[1].undo.args[0][1].title).toEqual(undefined);
expect(gd.undoQueue.queue[1].redo.args[0][1].title).toEqual('A title');

return Plotly.restyle(gd, 'mode', 'markers');
}).then(function() {
})
.then(function() {
expect(gd.undoQueue.index).toEqual(2);
expect(gd.undoQueue.queue[2]).toBeUndefined();

Expand All @@ -1587,6 +1591,38 @@ describe('Queue', function() {
expect(gd.undoQueue.queue[0].undo.args[0][1].title).toEqual(undefined);
expect(gd.undoQueue.queue[0].redo.args[0][1].title).toEqual('A title');

return Plotly.restyle(gd, 'transforms[0]', { type: 'filter' });
})
.then(function() {
expect(gd.undoQueue.queue[1].undo.args[0][1])
.toEqual({ 'transforms[0]': null });
expect(gd.undoQueue.queue[1].redo.args[0][1])
.toEqual({ 'transforms[0]': { type: 'filter' } });

return Plotly.relayout(gd, 'updatemenus[0]', { buttons: [] });
})
.then(function() {
expect(gd.undoQueue.queue[1].undo.args[0][1])
.toEqual({ 'updatemenus[0]': null });
expect(gd.undoQueue.queue[1].redo.args[0][1])
.toEqual({ 'updatemenus[0]': { buttons: [] } });

return Plotly.relayout(gd, 'updatemenus[0]', null);
})
.then(function() {
expect(gd.undoQueue.queue[1].undo.args[0][1])
.toEqual({ 'updatemenus[0]': { buttons: []} });
expect(gd.undoQueue.queue[1].redo.args[0][1])
.toEqual({ 'updatemenus[0]': null });

return Plotly.restyle(gd, 'transforms[0]', null);
})
.then(function() {
expect(gd.undoQueue.queue[1].undo.args[0][1])
.toEqual({ 'transforms[0]': [ { type: 'filter' } ]});
expect(gd.undoQueue.queue[1].redo.args[0][1])
.toEqual({ 'transforms[0]': null });

done();
});
});
Expand Down
45 changes: 33 additions & 12 deletions test/jasmine/tests/mapbox_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -548,56 +548,77 @@ describe('mapbox plots', function() {
expect(countVisibleLayers(gd)).toEqual(0);

Plotly.relayout(gd, 'mapbox.layers[0]', layer0).then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(1);
expect(countVisibleLayers(gd)).toEqual(1);

return Plotly.relayout(gd, 'mapbox.layers[1]', layer1);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(2);
expect(countVisibleLayers(gd)).toEqual(2);

return Plotly.relayout(gd, mapUpdate);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(2);
expect(countVisibleLayers(gd)).toEqual(2);

return Plotly.relayout(gd, styleUpdate0);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(2);
expect(countVisibleLayers(gd)).toEqual(2);

return assertLayerStyle(gd, {
'fill-color': [1, 0, 0, 1],
'fill-outline-color': [0, 0, 1, 1],
'fill-opacity': 0.3
}, 0);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(2);
expect(countVisibleLayers(gd)).toEqual(2);

return Plotly.relayout(gd, styleUpdate1);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(2);
expect(countVisibleLayers(gd)).toEqual(2);

return assertLayerStyle(gd, {
'line-width': 3,
'line-color': [0, 0, 1, 1],
'line-opacity': 0.6
}, 1);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(2);
expect(countVisibleLayers(gd)).toEqual(2);

return Plotly.relayout(gd, 'mapbox.layers[1]', 'remove');
}).then(function() {
return Plotly.relayout(gd, 'mapbox.layers[1]', null);
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(1);
expect(countVisibleLayers(gd)).toEqual(1);

return Plotly.relayout(gd, 'mapbox.layers[0]', 'remove');
}).then(function() {
return Plotly.relayout(gd, 'mapbox.layers[0]', null);
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(0);
expect(countVisibleLayers(gd)).toEqual(0);

return Plotly.relayout(gd, 'mapbox.layers[0]', {});
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers).toEqual([]);
expect(countVisibleLayers(gd)).toEqual(0);

// layer with no source are not drawn

return Plotly.relayout(gd, 'mapbox.layers[0].source', layer0.source);
}).then(function() {
})
.then(function() {
expect(gd.layout.mapbox.layers.length).toEqual(1);
expect(countVisibleLayers(gd)).toEqual(1);

done();
Expand Down
2 changes: 2 additions & 0 deletions test/jasmine/tests/sliders_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -211,13 +211,15 @@ describe('update sliders interactions', function() {
assertNodeCount('.' + constants.groupClassName, 1);
expect(gd._fullLayout._pushmargin['slider-0']).toBeUndefined();
expect(gd._fullLayout._pushmargin['slider-1']).toBeDefined();
expect(gd.layout.sliders.length).toEqual(2);

return Plotly.relayout(gd, 'sliders[1]', null);
})
.then(function() {
assertNodeCount('.' + constants.groupClassName, 0);
expect(gd._fullLayout._pushmargin['slider-0']).toBeUndefined();
expect(gd._fullLayout._pushmargin['slider-1']).toBeUndefined();
expect(gd.layout.sliders.length).toEqual(1);

return Plotly.relayout(gd, {
'sliders[0].visible': true,
Expand Down
31 changes: 24 additions & 7 deletions test/jasmine/tests/updatemenus_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,8 @@ describe('update menus interactions', function() {
expect(gd._fullLayout._pushmargin['updatemenu-1']).toBeDefined();

return Plotly.relayout(gd, 'updatemenus[1]', null);
}).then(function() {
})
.then(function() {
assertNodeCount('.' + constants.containerClassName, 0);
expect(gd._fullLayout._pushmargin['updatemenu-0']).toBeUndefined();
expect(gd._fullLayout._pushmargin['updatemenu-1']).toBeUndefined();
Expand All @@ -269,7 +270,8 @@ describe('update menus interactions', function() {
'updatemenus[0].visible': true,
'updatemenus[1].visible': true
});
}).then(function() {
})
.then(function() {
assertMenus([0, 0]);
expect(gd._fullLayout._pushmargin['updatemenu-0']).toBeDefined();
expect(gd._fullLayout._pushmargin['updatemenu-1']).toBeDefined();
Expand All @@ -278,7 +280,8 @@ describe('update menus interactions', function() {
'updatemenus[0].visible': false,
'updatemenus[1].visible': false
});
}).then(function() {
})
.then(function() {
assertNodeCount('.' + constants.containerClassName, 0);
expect(gd._fullLayout._pushmargin['updatemenu-0']).toBeUndefined();
expect(gd._fullLayout._pushmargin['updatemenu-1']).toBeUndefined();
Expand All @@ -291,21 +294,35 @@ describe('update menus interactions', function() {
}]
}
});
}).then(function() {
})
.then(function() {
assertMenus([0]);
expect(gd._fullLayout._pushmargin['updatemenu-0']).toBeUndefined();
expect(gd._fullLayout._pushmargin['updatemenu-1']).toBeUndefined();
expect(gd._fullLayout._pushmargin['updatemenu-2']).toBeDefined();

return Plotly.relayout(gd, 'updatemenus[0].visible', true);
}).then(function() {
})
.then(function() {
assertMenus([0, 0]);
expect(gd._fullLayout._pushmargin['updatemenu-0']).toBeDefined();
expect(gd._fullLayout._pushmargin['updatemenu-1']).toBeUndefined();
expect(gd._fullLayout._pushmargin['updatemenu-2']).toBeDefined();
expect(gd.layout.updatemenus.length).toEqual(3);

done();
});
return Plotly.relayout(gd, 'updatemenus[0]', null);
})
.then(function() {
assertMenus([0]);
expect(gd.layout.updatemenus.length).toEqual(2);

return Plotly.relayout(gd, 'updatemenus', null);
})
.then(function() {
expect(gd.layout.updatemenus).toBeUndefined();

})
.then(done);
});

it('should drop/fold buttons when clicking on header', function(done) {
Expand Down