Skip to content

Commit 69947b2

Browse files
committed
Clean up some code
1 parent a8f8381 commit 69947b2

File tree

9 files changed

+235
-64
lines changed

9 files changed

+235
-64
lines changed

src/traces/quiver/attributes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
var baseAttrs = require('../../plots/attributes');
44
var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;
55
var fontAttrs = require('../../plots/font_attributes');
6+
var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;
67
var dash = require('../../components/drawing/attributes').dash;
78

89
var extendFlat = require('../../lib/extend').extendFlat;
@@ -81,6 +82,11 @@ var attrs = {
8182
description: 'Maximum distance (in pixels) to look for nearby arrows on hover.'
8283
},
8384

85+
xhoverformat: axisHoverFormat('x'),
86+
yhoverformat: axisHoverFormat('y'),
87+
uhoverformat: axisHoverFormat('u', 'noDate'),
88+
vhoverformat: axisHoverFormat('v', 'noDate'),
89+
8490
// Arrowhead sizing, consistent with annotations API naming
8591
arrowsize: {
8692
valType: 'number',

src/traces/quiver/defaults.js

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
var Lib = require('../../lib');
44
var attributes = require('./attributes');
5-
var Colorscale = require('../../components/colorscale');
6-
var colorscaleDefaults = Colorscale.handleDefaults;
7-
var hasColorscale = Colorscale.hasColorscale;
5+
var colorscaleDefaults = require('../../components/colorscale/defaults');
86

97
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
10-
// Selection styling - use coerce to set proper defaults
118
function coerce(attr, dflt) {
129
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
1310
}
@@ -17,7 +14,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
1714
var y = coerce('y');
1815
var u = coerce('u');
1916
var v = coerce('v');
20-
17+
2118
// Optional scalar field for colorscale
2219
coerce('c');
2320

@@ -40,46 +37,48 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4037
for(var j = 0; j < len; j++) traceOut.v[j] = 0;
4138
}
4239

43-
// Set basic properties
44-
traceOut.type = 'quiver';
45-
4640
// Sizing API similar to cone
4741
var sizemode = coerce('sizemode');
4842
coerce('sizeref', sizemode === 'raw' ? 1 : 0.5);
4943
coerce('anchor');
5044

51-
// Set default values using coerce
52-
coerce('arrowsize', 1);
53-
// back-compat
54-
coerce('arrow_scale');
55-
coerce('hoverdistance', 20);
45+
// Arrow styling
46+
coerce('arrowsize');
47+
coerce('arrow_scale'); // back-compat alias
48+
coerce('arrowwidth');
49+
coerce('hoverdistance');
50+
51+
// Line styling - use coerce for proper validation
52+
coerce('line.color', defaultColor);
53+
// If arrowwidth is set, use it as line.width default
54+
var arrowwidth = traceOut.arrowwidth;
55+
if(arrowwidth !== undefined) {
56+
coerce('line.width', arrowwidth);
57+
} else {
58+
coerce('line.width');
59+
}
60+
coerce('line.dash');
61+
coerce('line.shape');
62+
coerce('line.smoothing');
63+
coerce('line.simplify');
5664

57-
// Line styling
58-
traceOut.line = {
59-
color: traceIn.line && traceIn.line.color ? traceIn.line.color : defaultColor,
60-
width: (traceIn.arrowwidth !== undefined) ? traceIn.arrowwidth : (traceIn.line && traceIn.line.width ? traceIn.line.width : 1),
61-
dash: traceIn.line && traceIn.line.dash ? traceIn.line.dash : 'solid',
62-
shape: traceIn.line && traceIn.line.shape ? traceIn.line.shape : 'linear',
63-
smoothing: traceIn.line && traceIn.line.smoothing ? traceIn.line.smoothing : 1,
64-
simplify: traceIn.line && traceIn.line.simplify !== undefined ? traceIn.line.simplify : true
65-
};
65+
// Text
66+
coerce('text');
67+
coerce('textposition');
68+
Lib.coerceFont(coerce, 'textfont', layout.font);
6669

67-
// Hover and interaction - let the plots module handle hoverinfo defaults
68-
// traceOut.hoverinfo will be set by Lib.coerceHoverinfo in plots.js
69-
traceOut.hovertemplate = traceIn.hovertemplate;
70+
// Hover
71+
coerce('hovertemplate');
72+
coerce('xhoverformat');
73+
coerce('yhoverformat');
74+
coerce('uhoverformat');
75+
coerce('vhoverformat');
7076

7177
// Colorscale defaults (adds colorscale, showscale, colorbar, etc.)
72-
// Keep colorscale enabled by default for quiver
73-
traceOut._hasColorscale = hasColorscale(traceIn) || true;
78+
traceOut._hasColorscale = true;
7479
colorscaleDefaults(traceIn, traceOut, layout, coerce, { prefix: '', cLetter: 'c' });
7580

76-
// Text
77-
traceOut.text = traceIn.text;
78-
traceOut.textposition = traceIn.textposition || 'middle center';
79-
80-
// Use Lib.coerceFont to set textfont properly
81-
Lib.coerceFont(coerce, 'textfont', layout.font);
82-
81+
// Selection styling
8382
coerce('selected.line.color');
8483
coerce('selected.line.width');
8584
coerce('selected.textfont.color');

src/traces/quiver/format_labels.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
'use strict';
22

33
var Axes = require('../../plots/cartesian/axes');
4+
var Lib = require('../../lib');
45

56
module.exports = function formatLabels(cdi, trace, fullLayout) {
67
var labels = {};
78

8-
var xa = Axes.getFromId({ _fullLayout: fullLayout }, trace.xaxis || 'x');
9-
var ya = Axes.getFromId({ _fullLayout: fullLayout }, trace.yaxis || 'y');
9+
var mockGd = {_fullLayout: fullLayout};
10+
var xa = Axes.getFromTrace(mockGd, trace, 'x');
11+
var ya = Axes.getFromTrace(mockGd, trace, 'y');
1012

1113
var x = cdi.x;
1214
var y = cdi.y;
@@ -17,9 +19,12 @@ module.exports = function formatLabels(cdi, trace, fullLayout) {
1719
var u = trace.u ? trace.u[cdi.i] : 0;
1820
var v = trace.v ? trace.v[cdi.i] : 0;
1921

20-
// Format u and v as plain numbers
21-
labels.uLabel = String(u);
22-
labels.vLabel = String(v);
22+
// Format u and v using hoverformat if provided
23+
var uhoverformat = trace.uhoverformat;
24+
var vhoverformat = trace.vhoverformat;
25+
26+
labels.uLabel = uhoverformat ? Lib.numberFormat(uhoverformat)(u) : String(u);
27+
labels.vLabel = vhoverformat ? Lib.numberFormat(vhoverformat)(v) : String(v);
2328

2429
return labels;
2530
};

src/traces/quiver/hover.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
1515
var distfn = function(di) {
1616
var x = xa.c2p(di.x) - xpx;
1717
var y = ya.c2p(di.y) - ypx;
18-
return Math.max(Math.sqrt(x * x + y * y), 1 - 3 / Math.max(3, di.mrc || 0));
18+
return Math.sqrt(x * x + y * y);
1919
};
2020

2121
Fx.getClosest(cd, distfn, pointData);

src/traces/quiver/plot.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
var d3 = require('@plotly/d3');
44

5-
var Registry = require('../../registry');
65
var Lib = require('../../lib');
76
var Drawing = require('../../components/drawing');
87
var Colorscale = require('../../components/colorscale');
@@ -61,7 +60,6 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
6160
var trace = cdscatter[0].trace;
6261
var xa = plotinfo.xaxis;
6362
var ya = plotinfo.yaxis;
64-
var fullLayout = gd._fullLayout;
6563

6664
// Create line group for arrows
6765
var lines = d3.select(element).selectAll('g.lines')
@@ -86,11 +84,11 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
8684
var uArr = trace.u || [];
8785
var vArr = trace.v || [];
8886
var maxNorm = 0;
89-
for (var ni = 0; ni < trace._length; ni++) {
87+
for(var ni = 0; ni < trace._length; ni++) {
9088
var uu = uArr[ni] || 0;
9189
var vv = vArr[ni] || 0;
9290
var nrm = Math.sqrt(uu * uu + vv * vv);
93-
if (nrm > maxNorm) maxNorm = nrm;
91+
if(nrm > maxNorm) maxNorm = nrm;
9492
}
9593
var sizemode = trace.sizemode || 'scaled';
9694
var sizeref = (trace.sizeref !== undefined) ? trace.sizeref : (sizemode === 'raw' ? 1 : 0.5);
@@ -127,7 +125,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
127125
var unitx = norm ? (u / norm) : 0;
128126
var unity = norm ? (v / norm) : 0;
129127
var baseLen;
130-
if (sizemode === 'scaled') {
128+
if(sizemode === 'scaled') {
131129
var n = maxNorm ? (norm / maxNorm) : 0;
132130
baseLen = n * sizeref;
133131
} else {
@@ -146,12 +144,12 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
146144
var ang2 = barbAng - headAngle;
147145

148146
var x0, y0, x1, y1;
149-
if (anchor === 'tip') {
147+
if(anchor === 'tip') {
150148
x1 = cdi.x;
151149
y1 = cdi.y;
152150
x0 = x1 - dx;
153151
y0 = y1 - dy;
154-
} else if (anchor === 'cm' || anchor === 'center' || anchor === 'middle') {
152+
} else if(anchor === 'cm' || anchor === 'center' || anchor === 'middle') {
155153
x0 = cdi.x - dx / 2;
156154
y0 = cdi.y - dy / 2;
157155
x1 = cdi.x + dx / 2;
@@ -186,12 +184,12 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
186184
Drawing.lineGroupStyle(lineSegments, trace.line && trace.line.width, trace.line && trace.line.color, trace.line && trace.line.dash);
187185

188186
// If colorscale present, color arrows by magnitude |(u,v)|
189-
if (trace._hasColorscale) {
187+
if(trace._hasColorscale) {
190188
var colorFunc = Colorscale.makeColorScaleFuncFromTrace(trace);
191189
lineSegments.style('stroke', function(cdi) {
192190
var cArr = trace.c;
193191
var value;
194-
if (Lib.isArrayOrTypedArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) {
192+
if(Lib.isArrayOrTypedArray(cArr) && cArr.length > cdi.i && isFinite(cArr[cdi.i])) {
195193
value = cArr[cdi.i];
196194
} else {
197195
var uVal = (trace.u && trace.u[cdi.i]) || 0;

src/traces/quiver/select_points.js

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ module.exports = function selectPoints(searchInfo, selectionTester) {
55
var xa = searchInfo.xaxis;
66
var ya = searchInfo.yaxis;
77
var selection = [];
8-
var trace = cd[0].trace;
98
var i;
10-
var segment;
9+
var di;
1110
var x;
1211
var y;
1312

@@ -17,20 +16,19 @@ module.exports = function selectPoints(searchInfo, selectionTester) {
1716
}
1817
} else {
1918
for(i = 0; i < cd.length; i++) {
20-
segment = cd[i];
21-
// Use the start point of the arrow for selection testing
22-
x = xa.c2p(segment[0].x);
23-
y = ya.c2p(segment[0].y);
19+
di = cd[i];
20+
x = xa.c2p(di.x);
21+
y = ya.c2p(di.y);
2422

25-
if((segment[0].i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) {
23+
if((di.i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) {
2624
selection.push({
27-
pointNumber: segment[0].i,
28-
x: xa.c2d(segment[0].x),
29-
y: ya.c2d(segment[0].y)
25+
pointNumber: di.i,
26+
x: xa.c2d(di.x),
27+
y: ya.c2d(di.y)
3028
});
31-
segment.selected = 1;
29+
di.selected = 1;
3230
} else {
33-
segment.selected = 0;
31+
di.selected = 0;
3432
}
3533
}
3634
}

src/traces/quiver/style.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
var d3 = require('@plotly/d3');
44

55
var Drawing = require('../../components/drawing');
6-
var Lib = require('../../lib');
76

87
module.exports = function style(gd, calcTrace) {
98
if(!calcTrace || !calcTrace.length || !calcTrace[0]) return;
10-
9+
1110
var trace = calcTrace[0].trace;
1211
var s = d3.select(gd).selectAll('g.trace' + trace.uid);
12+
var line = trace.line || {};
1313

1414
s.selectAll('path.js-line')
15-
.call(Drawing.lineGroupStyle, trace.line || {});
15+
.call(Drawing.lineGroupStyle, line.width, line.color, line.dash);
1616
};

0 commit comments

Comments
 (0)