Skip to content

Commit ed5c4da

Browse files
committed
Cherry-pick to master: Merge pull request #3440 from cytoscape/copilot/fix-style-selector-grabbed-bug
Refresh `:grabbed` selector styles on every grab/free transition Ref: Style selector ':grabbed' only works once #3415
1 parent 5e46557 commit ed5c4da

3 files changed

Lines changed: 108 additions & 8 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const setGrabState = function( ele, grabbed ){
2+
let ele0 = ele[0];
3+
4+
if( !ele0 || ele0._private.grabbed === grabbed ){
5+
return;
6+
}
7+
8+
ele0._private.grabbed = grabbed;
9+
ele.updateStyle( false );
10+
};
11+
12+
export const setGrabbed = function( ele ){
13+
setGrabState( ele, true );
14+
};
15+
16+
export const setFreed = function( ele ){
17+
setGrabState( ele, false );
18+
};

src/extensions/renderer/base/load-listeners.mjs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as is from '../../../is.mjs';
22
import * as util from '../../../util/index.mjs';
33
import * as math from '../../../math.mjs';
4+
import { setFreed, setGrabbed } from './grab-state.mjs';
45

56
var BRp = {};
67

@@ -151,14 +152,6 @@ BRp.load = function(){
151152
return allowPassthrough;
152153
};
153154

154-
var setGrabbed = function( ele ){
155-
ele[0]._private.grabbed = true;
156-
};
157-
158-
var setFreed = function( ele ){
159-
ele[0]._private.grabbed = false;
160-
};
161-
162155
var setInDragLayer = function( ele ){
163156
ele[0]._private.rscratch.inDragLayer = true;
164157
};

test/grabbed-style.mjs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { expect } from 'chai';
2+
import cytoscape from '../src/test.mjs';
3+
import { setFreed, setGrabbed } from '../src/extensions/renderer/base/grab-state.mjs';
4+
5+
describe('Grabbed style', function(){
6+
7+
let cy;
8+
9+
beforeEach(function(){
10+
cy = cytoscape({
11+
styleEnabled: true,
12+
13+
elements: {
14+
nodes: [
15+
{ data: { id: 'n1' } },
16+
{ data: { id: 'n2' } }
17+
]
18+
},
19+
20+
style: [
21+
{
22+
selector: 'node',
23+
style: {
24+
'border-width': 0
25+
}
26+
},
27+
{
28+
selector: 'node:grabbed',
29+
style: {
30+
'border-width': 3
31+
}
32+
}
33+
]
34+
});
35+
});
36+
37+
afterEach(function(){
38+
cy.destroy();
39+
});
40+
41+
const setGrabbedAll = eles => eles.forEach( setGrabbed );
42+
43+
const setFreedAll = eles => eles.forEach( setFreed );
44+
45+
const expectBorderWidth = ( eles, value ) => {
46+
eles.forEach( ele => expect( ele.style('border-width') ).to.equal( value ) );
47+
};
48+
49+
it('reapplies `:grabbed` style each time the node is grabbed', function(){
50+
const n1 = cy.$('#n1');
51+
52+
expect( n1.style('border-width') ).to.equal('0px');
53+
54+
setGrabbed( n1 );
55+
expect( n1.style('border-width') ).to.equal('3px');
56+
57+
setFreed( n1 );
58+
expect( n1.style('border-width') ).to.equal('0px');
59+
60+
setGrabbed( n1 );
61+
expect( n1.style('border-width') ).to.equal('3px');
62+
});
63+
64+
it('reapplies `:grabbed` style for a selected group when grabbed repeatedly from either node', function(){
65+
const n1 = cy.$('#n1');
66+
const n2 = cy.$('#n2');
67+
const selectedNodes = n1.add( n2 );
68+
69+
n1.select();
70+
n2.select();
71+
72+
expectBorderWidth( selectedNodes, '0px' );
73+
74+
setGrabbedAll( selectedNodes );
75+
expectBorderWidth( selectedNodes, '3px' );
76+
77+
setFreedAll( selectedNodes );
78+
expectBorderWidth( selectedNodes, '0px' );
79+
80+
setGrabbedAll( selectedNodes );
81+
expectBorderWidth( selectedNodes, '3px' );
82+
83+
setFreedAll( selectedNodes );
84+
expectBorderWidth( selectedNodes, '0px' );
85+
86+
setGrabbedAll( n2.add( n1 ) );
87+
expectBorderWidth( selectedNodes, '3px' );
88+
});
89+
});

0 commit comments

Comments
 (0)