Skip to content
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

Add doubleclick events #255

Merged
merged 15 commits into from
Feb 24, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions src/plots/cartesian/graph_interact.js
Original file line number Diff line number Diff line change
Expand Up @@ -1822,6 +1822,7 @@ function dragBox(gd, plotinfo, x, y, w, h, ns, ew) {
}
}

gd.emit('plotly_doubleclick', null);
Plotly.relayout(gd, attrs);
}

Expand Down
2 changes: 2 additions & 0 deletions src/plots/cartesian/select.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) {
searchInfo = searchTraces[i];
searchInfo.selectPoints(searchInfo, false);
}

gd.emit('plotly_deselect', null);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}
else {
dragOptions.gd.emit('plotly_selected', eventData);
Expand Down
77 changes: 56 additions & 21 deletions test/jasmine/tests/click_test.js
Original file line number Diff line number Diff line change
@@ -1,44 +1,62 @@
var Plotly = require('@lib/index');
var Lib = require('@src/lib');
var DBLCLICKDELAY = require('@src/plots/cartesian/constants').DBLCLICKDELAY;

var createGraphDiv = require('../assets/create_graph_div');
var destroyGraphDiv = require('../assets/destroy_graph_div');
var mouseEvent = require('../assets/mouse_event');


describe('click event', function() {
var mock = require('@mocks/14.json');
describe('click interactions', function() {
var mock = require('@mocks/14.json'),
mockCopy = Lib.extendDeep({}, mock),
gd;

describe('event data', function() {
var mockCopy = Lib.extendDeep({}, mock),
clientX = 351,
clientY = 223,
gd;
var pointPos = [351, 223],
blankPos = [70, 363];

function click() {
mouseEvent('mousemove', clientX, clientY);
mouseEvent('mousedown', clientX, clientY);
mouseEvent('mouseup', clientX, clientY);
}
afterEach(destroyGraphDiv);

beforeEach(function(done) {
gd = createGraphDiv();
// cartesian click events events use the hover data
// from the mousemove events and then simulate
// a click event on mouseup
function click(x, y) {
mouseEvent('mousemove', x, y);
mouseEvent('mousedown', x, y);
mouseEvent('mouseup', x, y);
}

Plotly.plot(gd, mockCopy.data, mockCopy.layout)
.then(done);
});
function doubleClick(x, y, cb) {
click(x, y);
setTimeout(function() {
click(x, y);
cb();
}, DBLCLICKDELAY / 2);
}

afterEach(destroyGraphDiv);
beforeEach(function(done) {
gd = createGraphDiv();

it('should contain the correct fields', function() {
var futureData;
Plotly.plot(gd, mockCopy.data, mockCopy.layout)
.then(done);
});

describe('click events', function() {
var futureData;

beforeEach(function() {
gd.on('plotly_click', function(data) {
futureData = data;
});
});

click();
it('should not be trigged when not on data points', function() {
click(blankPos[0], blankPos[1]);
expect(futureData).toBe(undefined);
});

it('should contain the correct fields', function() {
click(pointPos[0], pointPos[1]);
expect(futureData.points.length).toEqual(1);

var pt = futureData.points[0];
Expand All @@ -52,4 +70,21 @@ describe('click event', function() {
expect(pt.y).toEqual(2.125);
});
});

describe('double click events', function() {
var futureData;

beforeEach(function() {
gd.on('plotly_doubleclick', function(data) {
futureData = data;
});
});

it('should return null', function(done) {
doubleClick(pointPos[0], pointPos[1], function() {
expect(futureData).toBe(null);
done();
});
});
});
});
20 changes: 3 additions & 17 deletions test/jasmine/tests/plot_promise_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ var Events = require('@src/lib/events');
var createGraphDiv = require('../assets/create_graph_div');
var destroyGraphDiv = require('../assets/destroy_graph_div');


describe('Plotly.___ methods', function() {
'use strict';

afterEach(destroyGraphDiv);

describe('Plotly.plot promise', function() {
var promise,
promiseGd;
Expand All @@ -20,7 +23,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand Down Expand Up @@ -54,7 +56,6 @@ describe('Plotly.___ methods', function() {
});
});

afterEach(destroyGraphDiv);

it('should be rejected when plotly_beforeplot event handlers return false', function() {
expect(promiseRejected).toBe(true);
Expand All @@ -81,7 +82,6 @@ describe('Plotly.___ methods', function() {
});
});

afterEach(destroyGraphDiv);

it('should reject the promise when graph is being dragged', function() {
expect(promiseRejected).toBe(true);
Expand All @@ -105,7 +105,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -129,7 +128,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -156,7 +154,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -183,7 +180,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -210,7 +206,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -237,7 +232,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -264,7 +258,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand Down Expand Up @@ -294,7 +287,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -321,7 +313,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -348,7 +339,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be rejected when the attribute is missing', function() {
expect(promiseRejected).toBe(true);
Expand All @@ -373,7 +363,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand Down Expand Up @@ -401,7 +390,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div as an argument', function() {
expect(promiseGd).toBeDefined();
Expand Down Expand Up @@ -430,7 +418,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be returned with the graph div unchanged when the framework is polar', function() {
expect(promiseGd).toBeDefined();
Expand All @@ -457,7 +444,6 @@ describe('Plotly.___ methods', function() {
done();
});
});
afterEach(destroyGraphDiv);

it('should be rejected when the attribute is missing', function() {
expect(promiseRejected).toBe(true);
Expand Down
21 changes: 21 additions & 0 deletions test/jasmine/tests/register_test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,27 @@
var Plotly = require('@lib/index');

describe('the register function', function() {
'use strict';

var Plots = Plotly.Plots;

beforeEach(function() {
this.modulesKeys = Object.keys(Plots.modules);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we avoid using this here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

You're not a fan of the jasmine this ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually on second look, I'm ok with that. Didn't know that it was jasmine convention and that the this is cleared between specs.

this.allTypesKeys = Object.keys(Plots.allTypes);
this.allCategoriesKeys = Object.keys(Plots.allCategories);
});

afterEach(function() {
function revertObj(obj, initialKeys) {
Object.keys(obj).forEach(function(k) {
if(initialKeys.indexOf(k) === -1) delete obj[k];
});
}

revertObj(Plots.modules, this.modulesKeys);
revertObj(Plots.allTypes, this.allTypesKeys);
revertObj(Plots.allCategories, this.allCategoriesKeys);
});

it('should throw an error when no argument is given', function() {
expect(function() {
Expand Down
Loading