@deephaven/grid 0.90.0 → 0.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,6 @@
1
1
  /// <reference types="memoizee" />
2
2
  import CellRenderer from './CellRenderer';
3
3
  import { ModelIndex, VisibleIndex, VisibleToModelMap } from './GridMetrics';
4
- import { Oklab } from './GridColorUtils';
5
4
  import { GridRenderState } from './GridRendererTypes';
6
5
  import GridModel from './GridModel';
7
6
  interface DataBarRenderMetrics {
@@ -25,11 +24,10 @@ interface DataBarRenderMetrics {
25
24
  markerXs: number[];
26
25
  }
27
26
  declare class DataBarCellRenderer extends CellRenderer {
28
- private heightOfDigits?;
27
+ static getGradient: ((width: number, colors: string[]) => CanvasGradient) & import("@types/memoizee").Memoized<(width: number, colors: string[]) => CanvasGradient>;
29
28
  drawCellContent(context: CanvasRenderingContext2D, state: GridRenderState, column: VisibleIndex, row: VisibleIndex): void;
30
29
  getDataBarRenderMetrics(context: CanvasRenderingContext2D, state: GridRenderState, column: VisibleIndex, row: VisibleIndex): DataBarRenderMetrics;
31
- drawGradient(context: CanvasRenderingContext2D, leftColor: Oklab, rightColor: Oklab, x: number, y: number, width: number, height: number): void;
32
- drawGradientPart(context: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, color: string): void;
30
+ getCachedWidth: ((context: CanvasRenderingContext2D, text: string) => number) & import("@types/memoizee").Memoized<(context: CanvasRenderingContext2D, text: string) => number>;
33
31
  /**
34
32
  * Returns the width of the widest value in pixels
35
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"DataBarCellRenderer.d.ts","sourceRoot":"","sources":["../src/DataBarCellRenderer.ts"],"names":[],"mappings":";AAEA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAuB,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,UAAU,oBAAoB;IAC5B,kHAAkH;IAClH,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,CAAC,EAAE,MAAM,CAAC;IACV,4CAA4C;IAC5C,CAAC,EAAE,MAAM,CAAC;IACV,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AACD,cAAM,mBAAoB,SAAQ,YAAY;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAS;IAEhC,eAAe,CACb,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,YAAY,GAChB,IAAI;IAkQP,uBAAuB,CACrB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,YAAY,GAChB,oBAAoB;IAwOvB,YAAY,CACV,OAAO,EAAE,wBAAwB,EACjC,SAAS,EAAE,KAAK,EAChB,UAAU,EAAE,KAAK,EACjB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI;IAqBP,gBAAgB,CACd,OAAO,EAAE,wBAAwB,EACjC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,IAAI;IAKP;;OAEG;IACH,6BAA6B,aAEhB,wBAAwB,eACpB,SAAS,YAAY,EAAE,uCAE7B,SAAS,UACR,UAAU,KACjB,MAAM,iDALE,wBAAwB,eACpB,SAAS,YAAY,EAAE,uCAE7B,SAAS,UACR,UAAU,KACjB,MAAM,EAYT;CACH;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"DataBarCellRenderer.d.ts","sourceRoot":"","sources":["../src/DataBarCellRenderer.ts"],"names":[],"mappings":";AAEA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAI5E,OAAO,EAAsB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,UAAU,oBAAoB;IAC5B,kHAAkH;IAClH,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,CAAC,EAAE,MAAM,CAAC;IACV,4CAA4C;IAC5C,CAAC,EAAE,MAAM,CAAC;IACV,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AACD,cAAM,mBAAoB,SAAQ,YAAY;IAC5C,MAAM,CAAC,WAAW,WACR,MAAM,UAAU,MAAM,EAAE,KAAG,cAAc,+CAAzC,MAAM,UAAU,MAAM,EAAE,KAAG,cAAc,EAiCjD;IAEF,eAAe,CACb,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,YAAY,GAChB,IAAI;IAwMP,uBAAuB,CACrB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,YAAY,GAChB,oBAAoB;IAwOvB,cAAc,aACF,wBAAwB,QAAQ,MAAM,KAAG,MAAM,iDAA/C,wBAAwB,QAAQ,MAAM,KAAG,MAAM,EAGzD;IAEF;;OAEG;IACH,6BAA6B,aAEhB,wBAAwB,eACpB,SAAS,YAAY,EAAE,uCAE7B,SAAS,UACR,UAAU,KACjB,MAAM,iDALE,wBAAwB,eACpB,SAAS,YAAY,EAAE,uCAE7B,SAAS,UACR,UAAU,KACjB,MAAM,EAYT;CACH;AAED,eAAe,mBAAmB,CAAC"}
@@ -13,14 +13,16 @@ import { DEFAULT_FONT_WIDTH } from "./GridRendererTypes.js";
13
13
  class DataBarCellRenderer extends CellRenderer {
14
14
  constructor() {
15
15
  super(...arguments);
16
- _defineProperty(this, "heightOfDigits", void 0);
16
+ _defineProperty(this, "getCachedWidth", memoizeClear((context, text) => context.measureText(text).width, {
17
+ max: 10000
18
+ }));
17
19
  _defineProperty(this, "getCachedWidestValueForColumn", memoizeClear((context, visibleRows, modelRows, model, column) => {
18
20
  var widestValue = 0;
19
21
  for (var i = 0; i < visibleRows.length; i += 1) {
20
22
  var row = visibleRows[i];
21
23
  var modelRow = getOrThrow(modelRows, row);
22
24
  var text = model.textForCell(column, modelRow);
23
- widestValue = Math.max(widestValue, context.measureText(text).width);
25
+ widestValue = Math.max(widestValue, this.getCachedWidth(context, text));
24
26
  }
25
27
  return widestValue;
26
28
  }, {
@@ -54,6 +56,7 @@ class DataBarCellRenderer extends CellRenderer {
54
56
  var text = model.textForCell(modelColumn, modelRow);
55
57
  var {
56
58
  x: textX,
59
+ y: textY,
57
60
  width: textWidth
58
61
  } = GridUtils.getTextRenderMetrics(state, column, row);
59
62
  var fontWidth = (_fontWidths$get = fontWidths === null || fontWidths === void 0 ? void 0 : fontWidths.get(context.font)) !== null && _fontWidths$get !== void 0 ? _fontWidths$get : DEFAULT_FONT_WIDTH;
@@ -70,7 +73,7 @@ class DataBarCellRenderer extends CellRenderer {
70
73
  direction,
71
74
  value
72
75
  } = model.dataBarOptionsForCell(modelColumn, modelRow, theme);
73
- var hasGradient = Array.isArray(dataBarColor);
76
+ var hasGradient = Array.isArray(dataBarColor) && dataBarColor.length > 1;
74
77
  if (columnMin == null || columnMax == null) {
75
78
  return;
76
79
  }
@@ -84,101 +87,86 @@ class DataBarCellRenderer extends CellRenderer {
84
87
  totalValueRange,
85
88
  dataBarWidth
86
89
  } = this.getDataBarRenderMetrics(context, state, column, row);
87
- if (this.heightOfDigits === undefined) {
88
- var {
89
- actualBoundingBoxAscent,
90
- actualBoundingBoxDescent
91
- } = context.measureText('1234567890');
92
- this.heightOfDigits = actualBoundingBoxAscent + actualBoundingBoxDescent;
93
- }
94
90
  context.save();
95
91
  context.textAlign = textAlign;
96
92
  if (hasGradient) {
97
93
  var color = value >= 0 ? dataBarColor[dataBarColor.length - 1] : dataBarColor[0];
98
94
  context.fillStyle = color;
99
95
  } else {
100
- context.fillStyle = dataBarColor;
96
+ context.fillStyle = Array.isArray(dataBarColor) ? dataBarColor[0] : dataBarColor;
101
97
  }
102
- context.textBaseline = 'top';
98
+ context.textBaseline = 'middle';
103
99
  context.font = theme.font;
104
100
  if (valuePlacement !== 'hide') {
105
- context.fillText(truncatedText, textX, rowY + (rowHeight - this.heightOfDigits) / 2);
101
+ context.fillText(truncatedText, textX, textY);
106
102
  }
103
+ var hasRowDividers = theme.gridRowColor != null;
104
+ var yOffset = hasRowDividers ? 2 : 1;
105
+ context.save();
106
+ context.beginPath();
107
+ context.roundRect(dataBarX, rowY + yOffset,
108
+ // yOffset includes 1px for top padding
109
+ dataBarWidth, rowHeight - 1 - yOffset,
110
+ // 1px for bottom padding
111
+ 1);
112
+ context.clip();
113
+ context.globalAlpha = opacity;
107
114
 
108
115
  // Draw bar
109
116
  if (hasGradient) {
110
117
  // Draw gradient bar
111
118
 
112
- var dataBarColorsOklab = dataBarColor.map(color => GridColorUtils.linearSRGBToOklab(GridColorUtils.hexToRgb(color)));
119
+ var gradientWidth = 0;
120
+ var gradientX = 0;
113
121
  context.save();
114
- context.beginPath();
115
- context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight - 2, 1);
116
- context.clip();
122
+
123
+ // Translate the context so its origin is at the start of the gradient
124
+ // and increasing x value moves towards the end of the gradient.
125
+ // For RTL, scale x by -1 to flip across the x-axis
117
126
  if (value < 0) {
118
127
  if (direction === 'LTR') {
119
- var totalGradientWidth = Math.round(Math.abs(columnMin) / totalValueRange * maxWidth);
120
- var partGradientWidth = totalGradientWidth / (dataBarColor.length - 1);
121
- var gradientX = Math.round(leftmostPosition);
122
- for (var i = 0; i < dataBarColor.length - 1; i += 1) {
123
- var leftColor = dataBarColorsOklab[i];
124
- var rightColor = dataBarColorsOklab[i + 1];
125
- this.drawGradient(context, leftColor, rightColor, gradientX, rowY + 1, partGradientWidth, rowHeight);
126
- gradientX += partGradientWidth;
127
- }
128
+ gradientWidth = Math.round(Math.abs(columnMin) / totalValueRange * maxWidth);
129
+ gradientX = Math.round(leftmostPosition);
130
+ context.translate(gradientX, 0);
128
131
  } else if (direction === 'RTL') {
129
- var _totalGradientWidth = Math.round(maxWidth - Math.abs(columnMax) / totalValueRange * maxWidth);
130
- var _partGradientWidth = _totalGradientWidth / (dataBarColor.length - 1);
131
- var _gradientX = Math.round(zeroPosition);
132
- for (var _i = dataBarColor.length - 1; _i > 0; _i -= 1) {
133
- var _leftColor = dataBarColorsOklab[_i];
134
- var _rightColor = dataBarColorsOklab[_i - 1];
135
- this.drawGradient(context, _leftColor, _rightColor, _gradientX, rowY + 1, _partGradientWidth, rowHeight);
136
- _gradientX += _partGradientWidth;
137
- }
132
+ gradientWidth = Math.round(maxWidth - Math.abs(columnMax) / totalValueRange * maxWidth);
133
+ gradientX = Math.round(zeroPosition);
134
+ context.translate(gradientX + gradientWidth, 0);
135
+ context.scale(-1, 1);
138
136
  }
139
137
  } else if (direction === 'LTR') {
140
138
  // Value is greater than or equal to 0
141
- var _totalGradientWidth2 = Math.round(maxWidth - Math.abs(columnMin) / totalValueRange * maxWidth) - 1;
142
- var _partGradientWidth2 = _totalGradientWidth2 / (dataBarColor.length - 1);
143
- var _gradientX2 = Math.round(zeroPosition);
144
- for (var _i2 = 0; _i2 < dataBarColor.length - 1; _i2 += 1) {
145
- var _leftColor2 = dataBarColorsOklab[_i2];
146
- var _rightColor2 = dataBarColorsOklab[_i2 + 1];
147
- this.drawGradient(context, _leftColor2, _rightColor2, _gradientX2, rowY + 1, _partGradientWidth2, rowHeight - 2);
148
- _gradientX2 += _partGradientWidth2;
149
- }
139
+ gradientWidth = Math.round(maxWidth - Math.abs(columnMin) / totalValueRange * maxWidth) - 1;
140
+ gradientX = Math.round(zeroPosition);
141
+ context.translate(gradientX, 0);
150
142
  } else if (direction === 'RTL') {
151
143
  // Value is greater than or equal to 0
152
- var _totalGradientWidth3 = Math.round(Math.abs(columnMax) / totalValueRange * maxWidth);
153
- var _partGradientWidth3 = _totalGradientWidth3 / (dataBarColor.length - 1);
154
- var _gradientX3 = Math.round(leftmostPosition);
155
- for (var _i3 = dataBarColor.length - 1; _i3 > 0; _i3 -= 1) {
156
- var _leftColor3 = dataBarColorsOklab[_i3];
157
- var _rightColor3 = dataBarColorsOklab[_i3 - 1];
158
- this.drawGradient(context, _leftColor3, _rightColor3, _gradientX3, rowY + 1, _partGradientWidth3, rowHeight - 2);
159
- _gradientX3 += _partGradientWidth3;
160
- }
144
+ gradientWidth = Math.round(Math.abs(columnMax) / totalValueRange * maxWidth);
145
+ gradientX = Math.round(leftmostPosition);
146
+ context.translate(gradientX + gradientWidth, 0);
147
+ context.scale(-1, 1);
161
148
  }
162
-
163
- // restore clip
164
- context.restore();
149
+ var gradient = DataBarCellRenderer.getGradient(gradientWidth, dataBarColor);
150
+ context.fillStyle = gradient;
151
+ context.fillRect(0, dataBarY, gradientWidth, rowHeight);
152
+ context.restore(); // Restore gradient translate/scale
165
153
  } else {
166
154
  // Draw normal bar
167
- context.save();
168
- context.globalAlpha = opacity;
169
155
  context.beginPath();
170
- context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight - 2, 1);
156
+ context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight, 1);
171
157
  context.fill();
172
- context.restore();
173
158
  }
174
159
 
175
160
  // Draw markers
176
161
  if (maxWidth > 0) {
177
162
  markerXs.forEach((markerX, index) => {
178
163
  context.fillStyle = markers[index].color;
179
- context.fillRect(markerX, dataBarY, 1, rowHeight - 2);
164
+ context.fillRect(markerX, dataBarY, 1, rowHeight);
180
165
  });
181
166
  }
167
+
168
+ // restore clip
169
+ context.restore();
182
170
  var shouldRenderDashedLine = !(axis === 'directional' && (valuePlacement === 'beside' && textAlign === 'right' && direction === 'LTR' || valuePlacement === 'beside' && textAlign === 'left' && direction === 'RTL' || valuePlacement !== 'beside'));
183
171
 
184
172
  // Draw dashed line
@@ -368,7 +356,7 @@ class DataBarCellRenderer extends CellRenderer {
368
356
  return {
369
357
  maxWidth,
370
358
  x: dataBarX,
371
- y: y + 1.5,
359
+ y,
372
360
  zeroPosition,
373
361
  leftmostPosition,
374
362
  rightmostPosition,
@@ -377,23 +365,34 @@ class DataBarCellRenderer extends CellRenderer {
377
365
  markerXs
378
366
  };
379
367
  }
380
- drawGradient(context, leftColor, rightColor, x, y, width, height) {
381
- var currentColor = leftColor;
382
- // Increase by 0.5 because half-pixel will render weird on different zooms
383
- for (var currentX = x; currentX <= x + width; currentX += 0.5) {
384
- this.drawGradientPart(context, currentX, y, 1, height, GridColorUtils.rgbToHex(GridColorUtils.OklabToLinearSRGB(currentColor)));
385
- currentColor = GridColorUtils.lerpColor(leftColor, rightColor, (currentX - x) / width);
386
- }
387
- }
388
- drawGradientPart(context, x, y, width, height, color) {
389
- context.fillStyle = color;
390
- context.fillRect(x, y, width, height);
391
- }
392
368
 
393
369
  /**
394
370
  * Returns the width of the widest value in pixels
395
371
  */
396
372
  }
373
+ _defineProperty(DataBarCellRenderer, "getGradient", memoizeClear((width, colors) => {
374
+ var canvas = document.createElement('canvas');
375
+ var ctx = canvas.getContext('2d');
376
+ if (ctx == null) {
377
+ throw new Error('Failed to create canvas context');
378
+ }
379
+ if (Number.isNaN(width)) {
380
+ return ctx.createLinearGradient(0, 0, 0, 0);
381
+ }
382
+ var gradient = ctx.createLinearGradient(0, 0, width, 0);
383
+ var oklabColors = colors.map(color => GridColorUtils.linearSRGBToOklab(GridColorUtils.hexToRgb(color)));
384
+ for (var i = 0; i < width; i += 1) {
385
+ var colorStop = i / width;
386
+ var colorChangeInterval = 1 / (colors.length - 1);
387
+ var leftColorIndex = Math.floor(colorStop / colorChangeInterval);
388
+ var color = GridColorUtils.lerpColor(oklabColors[leftColorIndex], oklabColors[leftColorIndex + 1], colorStop % colorChangeInterval / colorChangeInterval);
389
+ gradient.addColorStop(i / width, GridColorUtils.rgbToHex(GridColorUtils.OklabToLinearSRGB(color)));
390
+ }
391
+ return gradient;
392
+ }, {
393
+ max: 1000,
394
+ primitive: true // Stringify the arguments for memoization. Lets the color arrays be different arrays in memory, but still cache hit
395
+ }));
397
396
 
398
397
  export default DataBarCellRenderer;
399
398
  //# sourceMappingURL=DataBarCellRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataBarCellRenderer.js","names":["getOrThrow","CellRenderer","isExpandableGridModel","isDataBarGridModel","GridColorUtils","GridUtils","memoizeClear","DEFAULT_FONT_WIDTH","DataBarCellRenderer","constructor","arguments","_defineProperty","context","visibleRows","modelRows","model","column","widestValue","i","length","row","modelRow","text","textForCell","Math","max","measureText","width","drawCellContent","state","_fontWidths$get","metrics","theme","modelColumns","allRowHeights","allRowYs","firstColumn","fontWidths","isFirstColumn","rowHeight","modelColumn","rowY","textAlign","textAlignForCell","x","textX","textWidth","getTextRenderMetrics","fontWidth","get","font","truncationChar","truncationCharForCell","truncatedText","getCachedTruncatedString","columnMin","columnMax","axis","color","dataBarColor","valuePlacement","opacity","markers","direction","value","dataBarOptionsForCell","hasGradient","Array","isArray","maxWidth","dataBarX","y","dataBarY","zeroPosition","leftmostPosition","markerXs","totalValueRange","dataBarWidth","getDataBarRenderMetrics","heightOfDigits","undefined","actualBoundingBoxAscent","actualBoundingBoxDescent","save","fillStyle","textBaseline","fillText","dataBarColorsOklab","map","linearSRGBToOklab","hexToRgb","beginPath","roundRect","clip","totalGradientWidth","round","abs","partGradientWidth","gradientX","leftColor","rightColor","drawGradient","restore","globalAlpha","fill","forEach","markerX","index","fillRect","shouldRenderDashedLine","strokeStyle","zeroLineColor","setLineDash","moveTo","lineTo","stroke","hasExpandableRows","drawCellRowTreeMarker","Error","allColumnXs","allColumnWidths","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","columnWidth","treeIndent","depthForRow","longestValueWidth","getCachedWidestValueForColumn","leftPadding","rightPadding","columnLongest","marker","markerValue","offset","rightmostPosition","height","currentColor","currentX","drawGradientPart","rgbToHex","OklabToLinearSRGB","lerpColor"],"sources":["../src/DataBarCellRenderer.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { getOrThrow } from '@deephaven/utils';\nimport CellRenderer from './CellRenderer';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { isDataBarGridModel } from './DataBarGridModel';\nimport { ModelIndex, VisibleIndex, VisibleToModelMap } from './GridMetrics';\nimport GridColorUtils, { Oklab } from './GridColorUtils';\nimport GridUtils from './GridUtils';\nimport memoizeClear from './memoizeClear';\nimport { DEFAULT_FONT_WIDTH, GridRenderState } from './GridRendererTypes';\nimport GridModel from './GridModel';\n\ninterface DataBarRenderMetrics {\n /** The total width the entire bar from the min to max value can take up (rightmostPosition - leftmostPosition) */\n maxWidth: number;\n /** The x coordinate of the bar (the left) */\n x: number;\n /** The y coordinate of the bar (the top) */\n y: number;\n /** The position of the zero line */\n zeroPosition: number;\n /** The position of the leftmost point */\n leftmostPosition: number;\n /** The position of the rightmost point */\n rightmostPosition: number;\n /** The range of values (e.g. max of 100 and min of -50 means range of 150) */\n totalValueRange: number;\n /** The width of the databar */\n dataBarWidth: number;\n /** The x coordinates of the markers (the left) */\n markerXs: number[];\n}\nclass DataBarCellRenderer extends CellRenderer {\n private heightOfDigits?: number;\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n if (!isDataBarGridModel(model)) {\n return;\n }\n const {\n modelColumns,\n modelRows,\n allRowHeights,\n allRowYs,\n firstColumn,\n fontWidths,\n } = metrics;\n\n const isFirstColumn = column === firstColumn;\n const rowHeight = getOrThrow(allRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const rowY = getOrThrow(allRowYs, row);\n const textAlign = model.textAlignForCell(modelColumn, modelRow);\n const text = model.textForCell(modelColumn, modelRow);\n const { x: textX, width: textWidth } = GridUtils.getTextRenderMetrics(\n state,\n column,\n row\n );\n\n const fontWidth = fontWidths?.get(context.font) ?? DEFAULT_FONT_WIDTH;\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n\n const {\n columnMin,\n columnMax,\n axis,\n color: dataBarColor,\n valuePlacement,\n opacity,\n markers,\n direction,\n value,\n } = model.dataBarOptionsForCell(modelColumn, modelRow, theme);\n\n const hasGradient = Array.isArray(dataBarColor);\n if (columnMin == null || columnMax == null) {\n return;\n }\n\n const {\n maxWidth,\n x: dataBarX,\n y: dataBarY,\n zeroPosition,\n leftmostPosition,\n markerXs,\n totalValueRange,\n dataBarWidth,\n } = this.getDataBarRenderMetrics(context, state, column, row);\n\n if (this.heightOfDigits === undefined) {\n const { actualBoundingBoxAscent, actualBoundingBoxDescent } =\n context.measureText('1234567890');\n this.heightOfDigits = actualBoundingBoxAscent + actualBoundingBoxDescent;\n }\n\n context.save();\n context.textAlign = textAlign;\n if (hasGradient) {\n const color =\n value >= 0 ? dataBarColor[dataBarColor.length - 1] : dataBarColor[0];\n context.fillStyle = color;\n } else {\n context.fillStyle = dataBarColor;\n }\n context.textBaseline = 'top';\n context.font = theme.font;\n\n if (valuePlacement !== 'hide') {\n context.fillText(\n truncatedText,\n textX,\n rowY + (rowHeight - this.heightOfDigits) / 2\n );\n }\n\n // Draw bar\n if (hasGradient) {\n // Draw gradient bar\n\n const dataBarColorsOklab: Oklab[] = dataBarColor.map(color =>\n GridColorUtils.linearSRGBToOklab(GridColorUtils.hexToRgb(color))\n );\n\n context.save();\n\n context.beginPath();\n\n context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight - 2, 1);\n context.clip();\n\n if (value < 0) {\n if (direction === 'LTR') {\n const totalGradientWidth = Math.round(\n (Math.abs(columnMin) / totalValueRange) * maxWidth\n );\n const partGradientWidth =\n totalGradientWidth / (dataBarColor.length - 1);\n let gradientX = Math.round(leftmostPosition);\n for (let i = 0; i < dataBarColor.length - 1; i += 1) {\n const leftColor = dataBarColorsOklab[i];\n const rightColor = dataBarColorsOklab[i + 1];\n this.drawGradient(\n context,\n leftColor,\n rightColor,\n gradientX,\n rowY + 1,\n partGradientWidth,\n rowHeight\n );\n\n gradientX += partGradientWidth;\n }\n } else if (direction === 'RTL') {\n const totalGradientWidth = Math.round(\n maxWidth - (Math.abs(columnMax) / totalValueRange) * maxWidth\n );\n const partGradientWidth =\n totalGradientWidth / (dataBarColor.length - 1);\n let gradientX = Math.round(zeroPosition);\n for (let i = dataBarColor.length - 1; i > 0; i -= 1) {\n const leftColor = dataBarColorsOklab[i];\n const rightColor = dataBarColorsOklab[i - 1];\n this.drawGradient(\n context,\n leftColor,\n rightColor,\n gradientX,\n rowY + 1,\n partGradientWidth,\n rowHeight\n );\n\n gradientX += partGradientWidth;\n }\n }\n } else if (direction === 'LTR') {\n // Value is greater than or equal to 0\n const totalGradientWidth =\n Math.round(\n maxWidth - (Math.abs(columnMin) / totalValueRange) * maxWidth\n ) - 1;\n const partGradientWidth =\n totalGradientWidth / (dataBarColor.length - 1);\n let gradientX = Math.round(zeroPosition);\n\n for (let i = 0; i < dataBarColor.length - 1; i += 1) {\n const leftColor = dataBarColorsOklab[i];\n const rightColor = dataBarColorsOklab[i + 1];\n this.drawGradient(\n context,\n leftColor,\n rightColor,\n gradientX,\n rowY + 1,\n partGradientWidth,\n rowHeight - 2\n );\n\n gradientX += partGradientWidth;\n }\n } else if (direction === 'RTL') {\n // Value is greater than or equal to 0\n const totalGradientWidth = Math.round(\n (Math.abs(columnMax) / totalValueRange) * maxWidth\n );\n const partGradientWidth =\n totalGradientWidth / (dataBarColor.length - 1);\n let gradientX = Math.round(leftmostPosition);\n\n for (let i = dataBarColor.length - 1; i > 0; i -= 1) {\n const leftColor = dataBarColorsOklab[i];\n const rightColor = dataBarColorsOklab[i - 1];\n this.drawGradient(\n context,\n leftColor,\n rightColor,\n gradientX,\n rowY + 1,\n partGradientWidth,\n rowHeight - 2\n );\n\n gradientX += partGradientWidth;\n }\n }\n\n // restore clip\n context.restore();\n } else {\n // Draw normal bar\n context.save();\n\n context.globalAlpha = opacity;\n context.beginPath();\n context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight - 2, 1);\n context.fill();\n\n context.restore();\n }\n\n // Draw markers\n if (maxWidth > 0) {\n markerXs.forEach((markerX, index) => {\n context.fillStyle = markers[index].color;\n context.fillRect(markerX, dataBarY, 1, rowHeight - 2);\n });\n }\n\n const shouldRenderDashedLine = !(\n axis === 'directional' &&\n ((valuePlacement === 'beside' &&\n textAlign === 'right' &&\n direction === 'LTR') ||\n (valuePlacement === 'beside' &&\n textAlign === 'left' &&\n direction === 'RTL') ||\n valuePlacement !== 'beside')\n );\n\n // Draw dashed line\n if (shouldRenderDashedLine) {\n context.strokeStyle = theme.zeroLineColor;\n context.beginPath();\n context.setLineDash([2, 1]);\n context.moveTo(zeroPosition, rowY);\n context.lineTo(zeroPosition, rowY + rowHeight);\n context.stroke();\n }\n\n context.restore();\n\n // Draw tree marker\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n getDataBarRenderMetrics(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): DataBarRenderMetrics {\n const { metrics, model, theme } = state;\n if (!isDataBarGridModel(model)) {\n throw new Error('Grid model is not a data bar grid model');\n }\n const {\n firstColumn,\n allColumnXs,\n allColumnWidths,\n allRowYs,\n modelColumns,\n modelRows,\n visibleRows,\n } = metrics;\n const { cellHorizontalPadding, treeDepthIndent, treeHorizontalPadding } =\n theme;\n\n const modelColumn = getOrThrow(modelColumns, column);\n const modelRow = getOrThrow(modelRows, row);\n const x = getOrThrow(allColumnXs, column);\n const y = getOrThrow(allRowYs, row);\n const columnWidth = getOrThrow(allColumnWidths, column);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n\n const textAlign = model.textAlignForCell(modelColumn, modelRow);\n const {\n columnMin,\n columnMax,\n axis,\n valuePlacement,\n markers,\n direction,\n value,\n } = model.dataBarOptionsForCell(modelColumn, modelRow, theme);\n const longestValueWidth = this.getCachedWidestValueForColumn(\n context,\n visibleRows,\n modelRows,\n model,\n modelColumn\n );\n\n const leftPadding = 2;\n const rightPadding =\n valuePlacement === 'beside' && textAlign === 'right' ? 2 : 1;\n\n // The value of the total range (e.g. max - column)\n let totalValueRange = columnMax - columnMin;\n // If min and max are both positive or min and max are equal, the max length is columnMax\n if ((columnMax >= 0 && columnMin >= 0) || columnMin === columnMax) {\n totalValueRange = columnMax;\n } else if (columnMax <= 0 && columnMin <= 0) {\n // If min and max are both negative, the max length is the absolute value of columnMin\n totalValueRange = Math.abs(columnMin);\n }\n\n let maxWidth = columnWidth - treeIndent - rightPadding - leftPadding;\n if (valuePlacement === 'beside') {\n maxWidth = maxWidth - cellHorizontalPadding - longestValueWidth;\n }\n\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n\n const columnLongest = Math.max(Math.abs(columnMin), Math.abs(columnMax));\n // If axis is proportional, totalValueRange is proportional to maxWidth\n let dataBarWidth = (Math.abs(value) / totalValueRange) * maxWidth;\n\n if (maxWidth === 0) {\n dataBarWidth = 0;\n } else if (axis === 'middle') {\n // The longest bar is proportional to half of the maxWidth\n dataBarWidth = (Math.abs(value) / columnLongest) * (maxWidth / 2);\n } else if (axis === 'directional') {\n // The longest bar is proportional to the maxWidth\n dataBarWidth = (Math.abs(value) / columnLongest) * maxWidth;\n }\n\n // Default: proportional, beside, LTR, right text align\n // All positions are assuming the left side is 0 and the right side is maxWidth\n let zeroPosition =\n columnMin >= 0 ? 0 : (Math.abs(columnMin) / totalValueRange) * maxWidth;\n let dataBarX =\n value >= 0\n ? zeroPosition\n : zeroPosition - (Math.abs(value) / totalValueRange) * maxWidth;\n let markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n const offset = (Math.abs(markerValue) / totalValueRange) * maxWidth;\n return markerValue >= 0 ? zeroPosition + offset : zeroPosition - offset;\n });\n let leftmostPosition =\n valuePlacement === 'beside' && textAlign === 'left'\n ? cellHorizontalPadding + longestValueWidth + leftPadding\n : leftPadding;\n let rightmostPosition =\n valuePlacement === 'beside' && textAlign === 'right'\n ? columnWidth - cellHorizontalPadding - longestValueWidth - rightPadding\n : rightPadding;\n\n // Proportional, RTL\n if (direction === 'RTL') {\n zeroPosition =\n columnMin >= 0\n ? columnWidth\n : columnWidth - (Math.abs(columnMin) / totalValueRange) * maxWidth;\n dataBarX =\n value >= 0\n ? zeroPosition - (value / totalValueRange) * maxWidth\n : zeroPosition;\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n return markerValue >= 0\n ? zeroPosition - (Math.abs(markerValue) / totalValueRange) * maxWidth\n : zeroPosition + (Math.abs(markerValue) / totalValueRange) * maxWidth;\n });\n }\n\n if (axis === 'middle') {\n zeroPosition = maxWidth / 2;\n if (direction === 'LTR') {\n // Middle, LTR\n dataBarX =\n value >= 0\n ? zeroPosition\n : zeroPosition - (Math.abs(value) / columnLongest) * (maxWidth / 2);\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return markerValue >= 0\n ? zeroPosition +\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2)\n : zeroPosition -\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2);\n });\n } else if (direction === 'RTL') {\n // Middle, RTL\n dataBarX =\n value <= 0\n ? zeroPosition\n : zeroPosition - (Math.abs(value) / columnLongest) * (maxWidth / 2);\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return markerValue <= 0\n ? zeroPosition +\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2)\n : zeroPosition -\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2);\n });\n }\n } else if (axis === 'directional') {\n if (direction === 'LTR') {\n // Directional, LTR\n zeroPosition = 0;\n dataBarX = zeroPosition;\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return (\n zeroPosition + (Math.abs(markerValue) / columnLongest) * maxWidth\n );\n });\n } else if (direction === 'RTL') {\n // Directional, RTL\n zeroPosition = columnWidth;\n dataBarX = zeroPosition - (Math.abs(value) / columnLongest) * maxWidth;\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return (\n zeroPosition - (Math.abs(markerValue) / columnLongest) * maxWidth\n );\n });\n }\n }\n\n // Offset all values by the actual x value and padding\n if (direction === 'LTR') {\n zeroPosition += x + leftPadding + treeIndent;\n dataBarX += x + leftPadding + treeIndent;\n markerXs = markerXs.map(\n markerX => markerX + x + leftPadding + treeIndent\n );\n\n if (valuePlacement === 'beside' && textAlign === 'left') {\n zeroPosition += longestValueWidth + cellHorizontalPadding;\n dataBarX += longestValueWidth + cellHorizontalPadding;\n markerXs = markerXs.map(\n markerX => markerX + longestValueWidth + cellHorizontalPadding\n );\n }\n } else if (direction === 'RTL') {\n zeroPosition = zeroPosition + x - rightPadding;\n dataBarX = dataBarX + x - rightPadding;\n markerXs = markerXs.map(markerX => markerX + x - rightPadding);\n\n if (valuePlacement === 'beside' && textAlign === 'right') {\n zeroPosition = zeroPosition - cellHorizontalPadding - longestValueWidth;\n dataBarX = dataBarX - cellHorizontalPadding - longestValueWidth;\n markerXs = markerXs.map(\n markerX => markerX - cellHorizontalPadding - longestValueWidth\n );\n }\n }\n\n leftmostPosition += x + treeIndent;\n rightmostPosition += x;\n\n return {\n maxWidth,\n x: dataBarX,\n y: y + 1.5,\n zeroPosition,\n leftmostPosition,\n rightmostPosition,\n totalValueRange,\n dataBarWidth,\n markerXs,\n };\n }\n\n drawGradient(\n context: CanvasRenderingContext2D,\n leftColor: Oklab,\n rightColor: Oklab,\n x: number,\n y: number,\n width: number,\n height: number\n ): void {\n let currentColor = leftColor;\n // Increase by 0.5 because half-pixel will render weird on different zooms\n for (let currentX = x; currentX <= x + width; currentX += 0.5) {\n this.drawGradientPart(\n context,\n currentX,\n y,\n 1,\n height,\n GridColorUtils.rgbToHex(GridColorUtils.OklabToLinearSRGB(currentColor))\n );\n\n currentColor = GridColorUtils.lerpColor(\n leftColor,\n rightColor,\n (currentX - x) / width\n );\n }\n }\n\n drawGradientPart(\n context: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string\n ): void {\n context.fillStyle = color;\n context.fillRect(x, y, width, height);\n }\n\n /**\n * Returns the width of the widest value in pixels\n */\n getCachedWidestValueForColumn = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n visibleRows: readonly VisibleIndex[],\n modelRows: VisibleToModelMap,\n model: GridModel,\n column: ModelIndex\n ): number => {\n let widestValue = 0;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const modelRow = getOrThrow(modelRows, row);\n const text = model.textForCell(column, modelRow);\n widestValue = Math.max(widestValue, context.measureText(text).width);\n }\n\n return widestValue;\n },\n { max: 1000 }\n );\n}\n\nexport default DataBarCellRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataBarCellRenderer.js","names":["getOrThrow","CellRenderer","isExpandableGridModel","isDataBarGridModel","GridColorUtils","GridUtils","memoizeClear","DEFAULT_FONT_WIDTH","DataBarCellRenderer","constructor","arguments","_defineProperty","context","text","measureText","width","max","visibleRows","modelRows","model","column","widestValue","i","length","row","modelRow","textForCell","Math","getCachedWidth","drawCellContent","state","_fontWidths$get","metrics","theme","modelColumns","allRowHeights","allRowYs","firstColumn","fontWidths","isFirstColumn","rowHeight","modelColumn","rowY","textAlign","textAlignForCell","x","textX","y","textY","textWidth","getTextRenderMetrics","fontWidth","get","font","truncationChar","truncationCharForCell","truncatedText","getCachedTruncatedString","columnMin","columnMax","axis","color","dataBarColor","valuePlacement","opacity","markers","direction","value","dataBarOptionsForCell","hasGradient","Array","isArray","maxWidth","dataBarX","dataBarY","zeroPosition","leftmostPosition","markerXs","totalValueRange","dataBarWidth","getDataBarRenderMetrics","save","fillStyle","textBaseline","fillText","hasRowDividers","gridRowColor","yOffset","beginPath","roundRect","clip","globalAlpha","gradientWidth","gradientX","round","abs","translate","scale","gradient","getGradient","fillRect","restore","fill","forEach","markerX","index","shouldRenderDashedLine","strokeStyle","zeroLineColor","setLineDash","moveTo","lineTo","stroke","hasExpandableRows","drawCellRowTreeMarker","Error","allColumnXs","allColumnWidths","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","columnWidth","treeIndent","depthForRow","longestValueWidth","getCachedWidestValueForColumn","leftPadding","rightPadding","columnLongest","map","marker","markerValue","offset","rightmostPosition","colors","canvas","document","createElement","ctx","getContext","Number","isNaN","createLinearGradient","oklabColors","linearSRGBToOklab","hexToRgb","colorStop","colorChangeInterval","leftColorIndex","floor","lerpColor","addColorStop","rgbToHex","OklabToLinearSRGB","primitive"],"sources":["../src/DataBarCellRenderer.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { getOrThrow } from '@deephaven/utils';\nimport CellRenderer from './CellRenderer';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { isDataBarGridModel } from './DataBarGridModel';\nimport { ModelIndex, VisibleIndex, VisibleToModelMap } from './GridMetrics';\nimport GridColorUtils from './GridColorUtils';\nimport GridUtils from './GridUtils';\nimport memoizeClear from './memoizeClear';\nimport { DEFAULT_FONT_WIDTH, GridRenderState } from './GridRendererTypes';\nimport GridModel from './GridModel';\n\ninterface DataBarRenderMetrics {\n /** The total width the entire bar from the min to max value can take up (rightmostPosition - leftmostPosition) */\n maxWidth: number;\n /** The x coordinate of the bar (the left) */\n x: number;\n /** The y coordinate of the bar (the top) */\n y: number;\n /** The position of the zero line */\n zeroPosition: number;\n /** The position of the leftmost point */\n leftmostPosition: number;\n /** The position of the rightmost point */\n rightmostPosition: number;\n /** The range of values (e.g. max of 100 and min of -50 means range of 150) */\n totalValueRange: number;\n /** The width of the databar */\n dataBarWidth: number;\n /** The x coordinates of the markers (the left) */\n markerXs: number[];\n}\nclass DataBarCellRenderer extends CellRenderer {\n static getGradient = memoizeClear(\n (width: number, colors: string[]): CanvasGradient => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx == null) {\n throw new Error('Failed to create canvas context');\n }\n if (Number.isNaN(width)) {\n return ctx.createLinearGradient(0, 0, 0, 0);\n }\n const gradient = ctx.createLinearGradient(0, 0, width, 0);\n const oklabColors = colors.map(color =>\n GridColorUtils.linearSRGBToOklab(GridColorUtils.hexToRgb(color))\n );\n for (let i = 0; i < width; i += 1) {\n const colorStop = i / width;\n const colorChangeInterval = 1 / (colors.length - 1);\n const leftColorIndex = Math.floor(colorStop / colorChangeInterval);\n const color = GridColorUtils.lerpColor(\n oklabColors[leftColorIndex],\n oklabColors[leftColorIndex + 1],\n (colorStop % colorChangeInterval) / colorChangeInterval\n );\n gradient.addColorStop(\n i / width,\n GridColorUtils.rgbToHex(GridColorUtils.OklabToLinearSRGB(color))\n );\n }\n return gradient;\n },\n {\n max: 1000,\n primitive: true, // Stringify the arguments for memoization. Lets the color arrays be different arrays in memory, but still cache hit\n }\n );\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n if (!isDataBarGridModel(model)) {\n return;\n }\n const {\n modelColumns,\n modelRows,\n allRowHeights,\n allRowYs,\n firstColumn,\n fontWidths,\n } = metrics;\n\n const isFirstColumn = column === firstColumn;\n const rowHeight = getOrThrow(allRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const rowY = getOrThrow(allRowYs, row);\n const textAlign = model.textAlignForCell(modelColumn, modelRow);\n const text = model.textForCell(modelColumn, modelRow);\n const {\n x: textX,\n y: textY,\n width: textWidth,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const fontWidth = fontWidths?.get(context.font) ?? DEFAULT_FONT_WIDTH;\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n\n const {\n columnMin,\n columnMax,\n axis,\n color: dataBarColor,\n valuePlacement,\n opacity,\n markers,\n direction,\n value,\n } = model.dataBarOptionsForCell(modelColumn, modelRow, theme);\n\n const hasGradient = Array.isArray(dataBarColor) && dataBarColor.length > 1;\n if (columnMin == null || columnMax == null) {\n return;\n }\n\n const {\n maxWidth,\n x: dataBarX,\n y: dataBarY,\n zeroPosition,\n leftmostPosition,\n markerXs,\n totalValueRange,\n dataBarWidth,\n } = this.getDataBarRenderMetrics(context, state, column, row);\n\n context.save();\n context.textAlign = textAlign;\n if (hasGradient) {\n const color =\n value >= 0 ? dataBarColor[dataBarColor.length - 1] : dataBarColor[0];\n context.fillStyle = color;\n } else {\n context.fillStyle = Array.isArray(dataBarColor)\n ? dataBarColor[0]\n : dataBarColor;\n }\n context.textBaseline = 'middle';\n context.font = theme.font;\n\n if (valuePlacement !== 'hide') {\n context.fillText(truncatedText, textX, textY);\n }\n\n const hasRowDividers = theme.gridRowColor != null;\n const yOffset = hasRowDividers ? 2 : 1;\n\n context.save();\n context.beginPath();\n context.roundRect(\n dataBarX,\n rowY + yOffset, // yOffset includes 1px for top padding\n dataBarWidth,\n rowHeight - 1 - yOffset, // 1px for bottom padding\n 1\n );\n context.clip();\n context.globalAlpha = opacity;\n\n // Draw bar\n if (hasGradient) {\n // Draw gradient bar\n\n let gradientWidth = 0;\n let gradientX = 0;\n context.save();\n\n // Translate the context so its origin is at the start of the gradient\n // and increasing x value moves towards the end of the gradient.\n // For RTL, scale x by -1 to flip across the x-axis\n if (value < 0) {\n if (direction === 'LTR') {\n gradientWidth = Math.round(\n (Math.abs(columnMin) / totalValueRange) * maxWidth\n );\n gradientX = Math.round(leftmostPosition);\n context.translate(gradientX, 0);\n } else if (direction === 'RTL') {\n gradientWidth = Math.round(\n maxWidth - (Math.abs(columnMax) / totalValueRange) * maxWidth\n );\n gradientX = Math.round(zeroPosition);\n context.translate(gradientX + gradientWidth, 0);\n context.scale(-1, 1);\n }\n } else if (direction === 'LTR') {\n // Value is greater than or equal to 0\n gradientWidth =\n Math.round(\n maxWidth - (Math.abs(columnMin) / totalValueRange) * maxWidth\n ) - 1;\n gradientX = Math.round(zeroPosition);\n context.translate(gradientX, 0);\n } else if (direction === 'RTL') {\n // Value is greater than or equal to 0\n gradientWidth = Math.round(\n (Math.abs(columnMax) / totalValueRange) * maxWidth\n );\n gradientX = Math.round(leftmostPosition);\n context.translate(gradientX + gradientWidth, 0);\n context.scale(-1, 1);\n }\n\n const gradient = DataBarCellRenderer.getGradient(\n gradientWidth,\n dataBarColor\n );\n context.fillStyle = gradient;\n context.fillRect(0, dataBarY, gradientWidth, rowHeight);\n context.restore(); // Restore gradient translate/scale\n } else {\n // Draw normal bar\n context.beginPath();\n context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight, 1);\n context.fill();\n }\n\n // Draw markers\n if (maxWidth > 0) {\n markerXs.forEach((markerX, index) => {\n context.fillStyle = markers[index].color;\n context.fillRect(markerX, dataBarY, 1, rowHeight);\n });\n }\n\n // restore clip\n context.restore();\n\n const shouldRenderDashedLine = !(\n axis === 'directional' &&\n ((valuePlacement === 'beside' &&\n textAlign === 'right' &&\n direction === 'LTR') ||\n (valuePlacement === 'beside' &&\n textAlign === 'left' &&\n direction === 'RTL') ||\n valuePlacement !== 'beside')\n );\n\n // Draw dashed line\n if (shouldRenderDashedLine) {\n context.strokeStyle = theme.zeroLineColor;\n context.beginPath();\n context.setLineDash([2, 1]);\n context.moveTo(zeroPosition, rowY);\n context.lineTo(zeroPosition, rowY + rowHeight);\n context.stroke();\n }\n\n context.restore();\n\n // Draw tree marker\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n getDataBarRenderMetrics(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): DataBarRenderMetrics {\n const { metrics, model, theme } = state;\n if (!isDataBarGridModel(model)) {\n throw new Error('Grid model is not a data bar grid model');\n }\n const {\n firstColumn,\n allColumnXs,\n allColumnWidths,\n allRowYs,\n modelColumns,\n modelRows,\n visibleRows,\n } = metrics;\n const { cellHorizontalPadding, treeDepthIndent, treeHorizontalPadding } =\n theme;\n\n const modelColumn = getOrThrow(modelColumns, column);\n const modelRow = getOrThrow(modelRows, row);\n const x = getOrThrow(allColumnXs, column);\n const y = getOrThrow(allRowYs, row);\n const columnWidth = getOrThrow(allColumnWidths, column);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n\n const textAlign = model.textAlignForCell(modelColumn, modelRow);\n const {\n columnMin,\n columnMax,\n axis,\n valuePlacement,\n markers,\n direction,\n value,\n } = model.dataBarOptionsForCell(modelColumn, modelRow, theme);\n const longestValueWidth = this.getCachedWidestValueForColumn(\n context,\n visibleRows,\n modelRows,\n model,\n modelColumn\n );\n\n const leftPadding = 2;\n const rightPadding =\n valuePlacement === 'beside' && textAlign === 'right' ? 2 : 1;\n\n // The value of the total range (e.g. max - column)\n let totalValueRange = columnMax - columnMin;\n // If min and max are both positive or min and max are equal, the max length is columnMax\n if ((columnMax >= 0 && columnMin >= 0) || columnMin === columnMax) {\n totalValueRange = columnMax;\n } else if (columnMax <= 0 && columnMin <= 0) {\n // If min and max are both negative, the max length is the absolute value of columnMin\n totalValueRange = Math.abs(columnMin);\n }\n\n let maxWidth = columnWidth - treeIndent - rightPadding - leftPadding;\n if (valuePlacement === 'beside') {\n maxWidth = maxWidth - cellHorizontalPadding - longestValueWidth;\n }\n\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n\n const columnLongest = Math.max(Math.abs(columnMin), Math.abs(columnMax));\n // If axis is proportional, totalValueRange is proportional to maxWidth\n let dataBarWidth = (Math.abs(value) / totalValueRange) * maxWidth;\n\n if (maxWidth === 0) {\n dataBarWidth = 0;\n } else if (axis === 'middle') {\n // The longest bar is proportional to half of the maxWidth\n dataBarWidth = (Math.abs(value) / columnLongest) * (maxWidth / 2);\n } else if (axis === 'directional') {\n // The longest bar is proportional to the maxWidth\n dataBarWidth = (Math.abs(value) / columnLongest) * maxWidth;\n }\n\n // Default: proportional, beside, LTR, right text align\n // All positions are assuming the left side is 0 and the right side is maxWidth\n let zeroPosition =\n columnMin >= 0 ? 0 : (Math.abs(columnMin) / totalValueRange) * maxWidth;\n let dataBarX =\n value >= 0\n ? zeroPosition\n : zeroPosition - (Math.abs(value) / totalValueRange) * maxWidth;\n let markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n const offset = (Math.abs(markerValue) / totalValueRange) * maxWidth;\n return markerValue >= 0 ? zeroPosition + offset : zeroPosition - offset;\n });\n let leftmostPosition =\n valuePlacement === 'beside' && textAlign === 'left'\n ? cellHorizontalPadding + longestValueWidth + leftPadding\n : leftPadding;\n let rightmostPosition =\n valuePlacement === 'beside' && textAlign === 'right'\n ? columnWidth - cellHorizontalPadding - longestValueWidth - rightPadding\n : rightPadding;\n\n // Proportional, RTL\n if (direction === 'RTL') {\n zeroPosition =\n columnMin >= 0\n ? columnWidth\n : columnWidth - (Math.abs(columnMin) / totalValueRange) * maxWidth;\n dataBarX =\n value >= 0\n ? zeroPosition - (value / totalValueRange) * maxWidth\n : zeroPosition;\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n return markerValue >= 0\n ? zeroPosition - (Math.abs(markerValue) / totalValueRange) * maxWidth\n : zeroPosition + (Math.abs(markerValue) / totalValueRange) * maxWidth;\n });\n }\n\n if (axis === 'middle') {\n zeroPosition = maxWidth / 2;\n if (direction === 'LTR') {\n // Middle, LTR\n dataBarX =\n value >= 0\n ? zeroPosition\n : zeroPosition - (Math.abs(value) / columnLongest) * (maxWidth / 2);\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return markerValue >= 0\n ? zeroPosition +\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2)\n : zeroPosition -\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2);\n });\n } else if (direction === 'RTL') {\n // Middle, RTL\n dataBarX =\n value <= 0\n ? zeroPosition\n : zeroPosition - (Math.abs(value) / columnLongest) * (maxWidth / 2);\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return markerValue <= 0\n ? zeroPosition +\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2)\n : zeroPosition -\n (Math.abs(markerValue) / columnLongest) * (maxWidth / 2);\n });\n }\n } else if (axis === 'directional') {\n if (direction === 'LTR') {\n // Directional, LTR\n zeroPosition = 0;\n dataBarX = zeroPosition;\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return (\n zeroPosition + (Math.abs(markerValue) / columnLongest) * maxWidth\n );\n });\n } else if (direction === 'RTL') {\n // Directional, RTL\n zeroPosition = columnWidth;\n dataBarX = zeroPosition - (Math.abs(value) / columnLongest) * maxWidth;\n markerXs = markers.map(marker => {\n const { value: markerValue } = marker;\n\n return (\n zeroPosition - (Math.abs(markerValue) / columnLongest) * maxWidth\n );\n });\n }\n }\n\n // Offset all values by the actual x value and padding\n if (direction === 'LTR') {\n zeroPosition += x + leftPadding + treeIndent;\n dataBarX += x + leftPadding + treeIndent;\n markerXs = markerXs.map(\n markerX => markerX + x + leftPadding + treeIndent\n );\n\n if (valuePlacement === 'beside' && textAlign === 'left') {\n zeroPosition += longestValueWidth + cellHorizontalPadding;\n dataBarX += longestValueWidth + cellHorizontalPadding;\n markerXs = markerXs.map(\n markerX => markerX + longestValueWidth + cellHorizontalPadding\n );\n }\n } else if (direction === 'RTL') {\n zeroPosition = zeroPosition + x - rightPadding;\n dataBarX = dataBarX + x - rightPadding;\n markerXs = markerXs.map(markerX => markerX + x - rightPadding);\n\n if (valuePlacement === 'beside' && textAlign === 'right') {\n zeroPosition = zeroPosition - cellHorizontalPadding - longestValueWidth;\n dataBarX = dataBarX - cellHorizontalPadding - longestValueWidth;\n markerXs = markerXs.map(\n markerX => markerX - cellHorizontalPadding - longestValueWidth\n );\n }\n }\n\n leftmostPosition += x + treeIndent;\n rightmostPosition += x;\n\n return {\n maxWidth,\n x: dataBarX,\n y,\n zeroPosition,\n leftmostPosition,\n rightmostPosition,\n totalValueRange,\n dataBarWidth,\n markerXs,\n };\n }\n\n getCachedWidth = memoizeClear(\n (context: CanvasRenderingContext2D, text: string): number =>\n context.measureText(text).width,\n { max: 10000 }\n );\n\n /**\n * Returns the width of the widest value in pixels\n */\n getCachedWidestValueForColumn = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n visibleRows: readonly VisibleIndex[],\n modelRows: VisibleToModelMap,\n model: GridModel,\n column: ModelIndex\n ): number => {\n let widestValue = 0;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const modelRow = getOrThrow(modelRows, row);\n const text = model.textForCell(column, modelRow);\n widestValue = Math.max(widestValue, this.getCachedWidth(context, text));\n }\n\n return widestValue;\n },\n { max: 1000 }\n );\n}\n\nexport default DataBarCellRenderer;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/grid",
3
- "version": "0.90.0",
3
+ "version": "0.91.0",
4
4
  "description": "Deephaven React grid component",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -31,7 +31,7 @@
31
31
  "*.css"
32
32
  ],
33
33
  "dependencies": {
34
- "@deephaven/utils": "^0.90.0",
34
+ "@deephaven/utils": "^0.91.0",
35
35
  "classnames": "^2.3.1",
36
36
  "color-convert": "^2.0.1",
37
37
  "event-target-shim": "^6.0.2",
@@ -44,5 +44,5 @@
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "34befe2ebf043a9f5cfe127eb48874893d88eaa2"
47
+ "gitHead": "336e1f353a51f4bcf1f4f7ad6195fd1301acb462"
48
48
  }