@deephaven/grid 0.41.0 → 0.41.2-beta.10

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.
Files changed (72) hide show
  1. package/dist/CellRenderer.d.ts +13 -0
  2. package/dist/CellRenderer.d.ts.map +1 -0
  3. package/dist/CellRenderer.js +64 -0
  4. package/dist/CellRenderer.js.map +1 -0
  5. package/dist/DataBarCellRenderer.d.ts +39 -0
  6. package/dist/DataBarCellRenderer.d.ts.map +1 -0
  7. package/dist/DataBarCellRenderer.js +404 -0
  8. package/dist/DataBarCellRenderer.js.map +1 -0
  9. package/dist/DataBarGridModel.d.ts +47 -0
  10. package/dist/DataBarGridModel.d.ts.map +1 -0
  11. package/dist/DataBarGridModel.js +27 -0
  12. package/dist/DataBarGridModel.js.map +1 -0
  13. package/dist/Grid.d.ts +5 -1
  14. package/dist/Grid.d.ts.map +1 -1
  15. package/dist/Grid.js +1 -1
  16. package/dist/Grid.js.map +1 -1
  17. package/dist/GridColorUtils.d.ts +15 -0
  18. package/dist/GridColorUtils.d.ts.map +1 -1
  19. package/dist/GridColorUtils.js +117 -1
  20. package/dist/GridColorUtils.js.map +1 -1
  21. package/dist/GridMetricCalculator.d.ts.map +1 -1
  22. package/dist/GridMetricCalculator.js +9 -2
  23. package/dist/GridMetricCalculator.js.map +1 -1
  24. package/dist/GridModel.d.ts +3 -0
  25. package/dist/GridModel.d.ts.map +1 -1
  26. package/dist/GridModel.js +3 -0
  27. package/dist/GridModel.js.map +1 -1
  28. package/dist/GridMouseHandler.d.ts +1 -0
  29. package/dist/GridMouseHandler.d.ts.map +1 -1
  30. package/dist/GridRenderer.d.ts +9 -34
  31. package/dist/GridRenderer.d.ts.map +1 -1
  32. package/dist/GridRenderer.js +29 -294
  33. package/dist/GridRenderer.js.map +1 -1
  34. package/dist/GridRendererTypes.d.ts +1 -0
  35. package/dist/GridRendererTypes.d.ts.map +1 -1
  36. package/dist/GridRendererTypes.js +2 -1
  37. package/dist/GridRendererTypes.js.map +1 -1
  38. package/dist/GridTestUtils.d.ts +2 -2
  39. package/dist/GridTestUtils.d.ts.map +1 -1
  40. package/dist/GridTestUtils.js.map +1 -1
  41. package/dist/GridTheme.d.ts +4 -0
  42. package/dist/GridTheme.d.ts.map +1 -1
  43. package/dist/GridTheme.js +6 -1
  44. package/dist/GridTheme.js.map +1 -1
  45. package/dist/GridUtils.d.ts +16 -0
  46. package/dist/GridUtils.d.ts.map +1 -1
  47. package/dist/GridUtils.js +60 -1
  48. package/dist/GridUtils.js.map +1 -1
  49. package/dist/MockDataBarGridModel.d.ts +29 -0
  50. package/dist/MockDataBarGridModel.d.ts.map +1 -0
  51. package/dist/MockDataBarGridModel.js +119 -0
  52. package/dist/MockDataBarGridModel.js.map +1 -0
  53. package/dist/MockTreeGridModel.d.ts +1 -0
  54. package/dist/MockTreeGridModel.d.ts.map +1 -1
  55. package/dist/TextCellRenderer.d.ts +24 -0
  56. package/dist/TextCellRenderer.d.ts.map +1 -0
  57. package/dist/TextCellRenderer.js +210 -0
  58. package/dist/TextCellRenderer.js.map +1 -0
  59. package/dist/TokenBoxCellRenderer.d.ts +10 -0
  60. package/dist/TokenBoxCellRenderer.d.ts.map +1 -0
  61. package/dist/TokenBoxCellRenderer.js +4 -0
  62. package/dist/TokenBoxCellRenderer.js.map +1 -0
  63. package/dist/index.d.ts +5 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +4 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/mouse-handlers/GridRowTreeMouseHandler.d.ts +1 -0
  68. package/dist/mouse-handlers/GridRowTreeMouseHandler.d.ts.map +1 -1
  69. package/dist/mouse-handlers/GridTokenMouseHandler.d.ts.map +1 -1
  70. package/dist/mouse-handlers/GridTokenMouseHandler.js +20 -2
  71. package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -1
  72. package/package.json +3 -6
@@ -0,0 +1,13 @@
1
+ /// <reference types="memoizee" />
2
+ import { VisibleIndex, Coordinate, BoxCoordinates } from './GridMetrics';
3
+ import { GridRenderState } from './GridRendererTypes';
4
+ import { GridColor } from './GridTheme';
5
+ export type CellRenderType = 'text' | 'dataBar';
6
+ declare abstract class CellRenderer {
7
+ abstract drawCellContent(context: CanvasRenderingContext2D, state: GridRenderState, column: VisibleIndex, row: VisibleIndex): void;
8
+ drawCellRowTreeMarker(context: CanvasRenderingContext2D, state: GridRenderState, row: VisibleIndex): void;
9
+ drawTreeMarker(context: CanvasRenderingContext2D, state: GridRenderState, columnX: Coordinate, rowY: Coordinate, treeBox: BoxCoordinates, color: GridColor, isExpanded: boolean): void;
10
+ getCachedTruncatedString: ((context: CanvasRenderingContext2D, text: string, width: number, fontWidth: number, truncationChar?: string) => string) & import("@types/memoizee").Memoized<(context: CanvasRenderingContext2D, text: string, width: number, fontWidth: number, truncationChar?: string) => string>;
11
+ }
12
+ export default CellRenderer;
13
+ //# sourceMappingURL=CellRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CellRenderer.d.ts","sourceRoot":"","sources":["../src/CellRenderer.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhD,uBAAe,YAAY;IACzB,QAAQ,CAAC,eAAe,CACtB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,YAAY,GAChB,IAAI;IAEP,qBAAqB,CACnB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,YAAY,GAChB,IAAI;IA2CP,cAAc,CACZ,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,OAAO,GAClB,IAAI;IAUP,wBAAwB,aAEX,wBAAwB,QAC3B,MAAM,SACL,MAAM,aACF,MAAM,mBACA,MAAM,KACtB,MAAM,iDALE,wBAAwB,QAC3B,MAAM,SACL,MAAM,aACF,MAAM,mBACA,MAAM,KACtB,MAAM,EAST;CACH;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,64 @@
1
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
+ /* eslint-disable class-methods-use-this */
5
+ import { getOrThrow } from '@deephaven/utils';
6
+ import { isExpandableGridModel } from "./ExpandableGridModel.js";
7
+ import GridRenderer from "./GridRenderer.js";
8
+ import memoizeClear from "./memoizeClear.js";
9
+ class CellRenderer {
10
+ constructor() {
11
+ _defineProperty(this, "getCachedTruncatedString", memoizeClear((context, text, width, fontWidth, truncationChar) => GridRenderer.truncateToWidth(context, text, width, fontWidth, truncationChar), {
12
+ max: 10000
13
+ }));
14
+ }
15
+ drawCellRowTreeMarker(context, state, row) {
16
+ var {
17
+ metrics,
18
+ model,
19
+ mouseX,
20
+ mouseY,
21
+ theme
22
+ } = state;
23
+ var {
24
+ firstColumn,
25
+ gridX,
26
+ gridY,
27
+ allColumnXs,
28
+ allColumnWidths,
29
+ allRowYs,
30
+ allRowHeights,
31
+ visibleRowTreeBoxes
32
+ } = metrics;
33
+ var {
34
+ treeMarkerColor,
35
+ treeMarkerHoverColor
36
+ } = theme;
37
+ var columnX = getOrThrow(allColumnXs, firstColumn);
38
+ var columnWidth = getOrThrow(allColumnWidths, firstColumn);
39
+ var rowY = getOrThrow(allRowYs, row);
40
+ var rowHeight = getOrThrow(allRowHeights, row);
41
+ if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {
42
+ return;
43
+ }
44
+ var treeBox = getOrThrow(visibleRowTreeBoxes, row);
45
+ var color = mouseX != null && mouseY != null && mouseX >= gridX + columnX && mouseX <= gridX + columnX + columnWidth && mouseY >= gridY + rowY && mouseY <= gridY + rowY + rowHeight ? treeMarkerHoverColor : treeMarkerColor;
46
+ this.drawTreeMarker(context, state, columnX, rowY, treeBox, color, model.isRowExpanded(row));
47
+ }
48
+ drawTreeMarker(context, state, columnX, rowY, treeBox, color, isExpanded) {
49
+ var {
50
+ x1,
51
+ y1,
52
+ x2,
53
+ y2
54
+ } = treeBox;
55
+ var markerText = isExpanded ? '⊟' : '⊞';
56
+ var textX = columnX + (x1 + x2) * 0.5 + 0.5;
57
+ var textY = rowY + (y1 + y2) * 0.5 + 0.5;
58
+ context.fillStyle = color;
59
+ context.textAlign = 'center';
60
+ context.fillText(markerText, textX, textY);
61
+ }
62
+ }
63
+ export default CellRenderer;
64
+ //# sourceMappingURL=CellRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CellRenderer.js","names":["getOrThrow","isExpandableGridModel","GridRenderer","memoizeClear","CellRenderer","context","text","width","fontWidth","truncationChar","truncateToWidth","max","drawCellRowTreeMarker","state","row","metrics","model","mouseX","mouseY","theme","firstColumn","gridX","gridY","allColumnXs","allColumnWidths","allRowYs","allRowHeights","visibleRowTreeBoxes","treeMarkerColor","treeMarkerHoverColor","columnX","columnWidth","rowY","rowHeight","isRowExpandable","treeBox","color","drawTreeMarker","isRowExpanded","isExpanded","x1","y1","x2","y2","markerText","textX","textY","fillStyle","textAlign","fillText"],"sources":["../src/CellRenderer.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { getOrThrow } from '@deephaven/utils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { VisibleIndex, Coordinate, BoxCoordinates } from './GridMetrics';\nimport GridRenderer from './GridRenderer';\nimport { GridRenderState } from './GridRendererTypes';\nimport { GridColor } from './GridTheme';\nimport memoizeClear from './memoizeClear';\n\nexport type CellRenderType = 'text' | 'dataBar';\n\nabstract class CellRenderer {\n abstract drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void;\n\n drawCellRowTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, model, mouseX, mouseY, theme } = state;\n const {\n firstColumn,\n gridX,\n gridY,\n allColumnXs,\n allColumnWidths,\n allRowYs,\n allRowHeights,\n visibleRowTreeBoxes,\n } = metrics;\n const { treeMarkerColor, treeMarkerHoverColor } = theme;\n const columnX = getOrThrow(allColumnXs, firstColumn);\n const columnWidth = getOrThrow(allColumnWidths, firstColumn);\n const rowY = getOrThrow(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, row);\n if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {\n return;\n }\n\n const treeBox = getOrThrow(visibleRowTreeBoxes, row);\n const color =\n mouseX != null &&\n mouseY != null &&\n mouseX >= gridX + columnX &&\n mouseX <= gridX + columnX + columnWidth &&\n mouseY >= gridY + rowY &&\n mouseY <= gridY + rowY + rowHeight\n ? treeMarkerHoverColor\n : treeMarkerColor;\n\n this.drawTreeMarker(\n context,\n state,\n columnX,\n rowY,\n treeBox,\n color,\n model.isRowExpanded(row)\n );\n }\n\n drawTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnX: Coordinate,\n rowY: Coordinate,\n treeBox: BoxCoordinates,\n color: GridColor,\n isExpanded: boolean\n ): void {\n const { x1, y1, x2, y2 } = treeBox;\n const markerText = isExpanded ? '⊟' : '⊞';\n const textX = columnX + (x1 + x2) * 0.5 + 0.5;\n const textY = rowY + (y1 + y2) * 0.5 + 0.5;\n context.fillStyle = color;\n context.textAlign = 'center';\n context.fillText(markerText, textX, textY);\n }\n\n getCachedTruncatedString = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n fontWidth: number,\n truncationChar?: string\n ): string =>\n GridRenderer.truncateToWidth(\n context,\n text,\n width,\n fontWidth,\n truncationChar\n ),\n { max: 10000 }\n );\n}\n\nexport default CellRenderer;\n"],"mappings":";;;AAAA;AACA,SAASA,UAAU,QAAQ,kBAAkB;AAAC,SACrCC,qBAAqB;AAAA,OAEvBC,YAAY;AAAA,OAGZC,YAAY;AAInB,MAAeC,YAAY,CAAC;EAAA;IAAA,kDAyECD,YAAY,CACrC,CACEE,OAAiC,EACjCC,IAAY,EACZC,KAAa,EACbC,SAAiB,EACjBC,cAAuB,KAEvBP,YAAY,CAACQ,eAAe,CAC1BL,OAAO,EACPC,IAAI,EACJC,KAAK,EACLC,SAAS,EACTC,cAAc,CACf,EACH;MAAEE,GAAG,EAAE;IAAM,CAAC,CACf;EAAA;EAjFDC,qBAAqB,CACnBP,OAAiC,EACjCQ,KAAsB,EACtBC,GAAiB,EACX;IACN,IAAM;MAAEC,OAAO;MAAEC,KAAK;MAAEC,MAAM;MAAEC,MAAM;MAAEC;IAAM,CAAC,GAAGN,KAAK;IACvD,IAAM;MACJO,WAAW;MACXC,KAAK;MACLC,KAAK;MACLC,WAAW;MACXC,eAAe;MACfC,QAAQ;MACRC,aAAa;MACbC;IACF,CAAC,GAAGZ,OAAO;IACX,IAAM;MAAEa,eAAe;MAAEC;IAAqB,CAAC,GAAGV,KAAK;IACvD,IAAMW,OAAO,GAAG9B,UAAU,CAACuB,WAAW,EAAEH,WAAW,CAAC;IACpD,IAAMW,WAAW,GAAG/B,UAAU,CAACwB,eAAe,EAAEJ,WAAW,CAAC;IAC5D,IAAMY,IAAI,GAAGhC,UAAU,CAACyB,QAAQ,EAAEX,GAAG,CAAC;IACtC,IAAMmB,SAAS,GAAGjC,UAAU,CAAC0B,aAAa,EAAEZ,GAAG,CAAC;IAChD,IAAI,CAACb,qBAAqB,CAACe,KAAK,CAAC,IAAI,CAACA,KAAK,CAACkB,eAAe,CAACpB,GAAG,CAAC,EAAE;MAChE;IACF;IAEA,IAAMqB,OAAO,GAAGnC,UAAU,CAAC2B,mBAAmB,EAAEb,GAAG,CAAC;IACpD,IAAMsB,KAAK,GACTnB,MAAM,IAAI,IAAI,IACdC,MAAM,IAAI,IAAI,IACdD,MAAM,IAAII,KAAK,GAAGS,OAAO,IACzBb,MAAM,IAAII,KAAK,GAAGS,OAAO,GAAGC,WAAW,IACvCb,MAAM,IAAII,KAAK,GAAGU,IAAI,IACtBd,MAAM,IAAII,KAAK,GAAGU,IAAI,GAAGC,SAAS,GAC9BJ,oBAAoB,GACpBD,eAAe;IAErB,IAAI,CAACS,cAAc,CACjBhC,OAAO,EACPQ,KAAK,EACLiB,OAAO,EACPE,IAAI,EACJG,OAAO,EACPC,KAAK,EACLpB,KAAK,CAACsB,aAAa,CAACxB,GAAG,CAAC,CACzB;EACH;EAEAuB,cAAc,CACZhC,OAAiC,EACjCQ,KAAsB,EACtBiB,OAAmB,EACnBE,IAAgB,EAChBG,OAAuB,EACvBC,KAAgB,EAChBG,UAAmB,EACb;IACN,IAAM;MAAEC,EAAE;MAAEC,EAAE;MAAEC,EAAE;MAAEC;IAAG,CAAC,GAAGR,OAAO;IAClC,IAAMS,UAAU,GAAGL,UAAU,GAAG,GAAG,GAAG,GAAG;IACzC,IAAMM,KAAK,GAAGf,OAAO,GAAG,CAACU,EAAE,GAAGE,EAAE,IAAI,GAAG,GAAG,GAAG;IAC7C,IAAMI,KAAK,GAAGd,IAAI,GAAG,CAACS,EAAE,GAAGE,EAAE,IAAI,GAAG,GAAG,GAAG;IAC1CtC,OAAO,CAAC0C,SAAS,GAAGX,KAAK;IACzB/B,OAAO,CAAC2C,SAAS,GAAG,QAAQ;IAC5B3C,OAAO,CAAC4C,QAAQ,CAACL,UAAU,EAAEC,KAAK,EAAEC,KAAK,CAAC;EAC5C;AAmBF;AAEA,eAAe1C,YAAY"}
@@ -0,0 +1,39 @@
1
+ /// <reference types="memoizee" />
2
+ import CellRenderer from './CellRenderer';
3
+ import { ModelIndex, VisibleIndex, VisibleToModelMap } from './GridMetrics';
4
+ import { Oklab } from './GridColorUtils';
5
+ import { GridRenderState } from './GridRendererTypes';
6
+ import GridModel from './GridModel';
7
+ interface DataBarRenderMetrics {
8
+ /** The total width the entire bar from the min to max value can take up (rightmostPosition - leftmostPosition) */
9
+ maxWidth: number;
10
+ /** The x coordinate of the bar (the left) */
11
+ x: number;
12
+ /** The y coordinate of the bar (the top) */
13
+ y: number;
14
+ /** The position of the zero line */
15
+ zeroPosition: number;
16
+ /** The position of the leftmost point */
17
+ leftmostPosition: number;
18
+ /** The position of the rightmost point */
19
+ rightmostPosition: number;
20
+ /** The range of values (e.g. max of 100 and min of -50 means range of 150) */
21
+ totalValueRange: number;
22
+ /** The width of the databar */
23
+ dataBarWidth: number;
24
+ /** The x coordinates of the markers (the left) */
25
+ markerXs: number[];
26
+ }
27
+ declare class DataBarCellRenderer extends CellRenderer {
28
+ private heightOfDigits?;
29
+ drawCellContent(context: CanvasRenderingContext2D, state: GridRenderState, column: VisibleIndex, row: VisibleIndex): void;
30
+ 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;
33
+ /**
34
+ * Returns the width of the widest value in pixels
35
+ */
36
+ getCachedWidestValueForColumn: ((context: CanvasRenderingContext2D, visibleRows: readonly VisibleIndex[], modelRows: VisibleToModelMap, model: GridModel, column: ModelIndex) => number) & import("@types/memoizee").Memoized<(context: CanvasRenderingContext2D, visibleRows: readonly VisibleIndex[], modelRows: VisibleToModelMap, model: GridModel, column: ModelIndex) => number>;
37
+ }
38
+ export default DataBarCellRenderer;
39
+ //# sourceMappingURL=DataBarCellRenderer.d.ts.map
@@ -0,0 +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;IAqQnB,uBAAuB,CACrB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,YAAY,GAChB,oBAAoB;IA8OvB,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;IAsBhB,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;IAMf;;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"}
@@ -0,0 +1,404 @@
1
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
+ /* eslint-disable class-methods-use-this */
5
+ import { getOrThrow } from '@deephaven/utils';
6
+ import CellRenderer from "./CellRenderer.js";
7
+ import { isExpandableGridModel } from "./ExpandableGridModel.js";
8
+ import { isDataBarGridModel } from "./DataBarGridModel.js";
9
+ import GridColorUtils from "./GridColorUtils.js";
10
+ import GridUtils from "./GridUtils.js";
11
+ import memoizeClear from "./memoizeClear.js";
12
+ import { DEFAULT_FONT_WIDTH } from "./GridRendererTypes.js";
13
+ class DataBarCellRenderer extends CellRenderer {
14
+ constructor() {
15
+ super(...arguments);
16
+ _defineProperty(this, "heightOfDigits", void 0);
17
+ _defineProperty(this, "getCachedWidestValueForColumn", memoizeClear((context, visibleRows, modelRows, model, column) => {
18
+ var widestValue = 0;
19
+ for (var i = 0; i < visibleRows.length; i += 1) {
20
+ var row = visibleRows[i];
21
+ var modelRow = getOrThrow(modelRows, row);
22
+ var text = model.textForCell(column, modelRow);
23
+ widestValue = Math.max(widestValue, context.measureText(text).width);
24
+ }
25
+ return widestValue;
26
+ }, {
27
+ max: 1000
28
+ }));
29
+ }
30
+ drawCellContent(context, state, column, row) {
31
+ var _fontWidths$get;
32
+ var {
33
+ metrics,
34
+ model,
35
+ theme
36
+ } = state;
37
+ if (!isDataBarGridModel(model)) {
38
+ return;
39
+ }
40
+ var {
41
+ modelColumns,
42
+ modelRows,
43
+ allRowHeights,
44
+ allRowYs,
45
+ firstColumn,
46
+ fontWidths
47
+ } = metrics;
48
+ var isFirstColumn = column === firstColumn;
49
+ var rowHeight = getOrThrow(allRowHeights, row);
50
+ var modelRow = getOrThrow(modelRows, row);
51
+ var modelColumn = getOrThrow(modelColumns, column);
52
+ var rowY = getOrThrow(allRowYs, row);
53
+ var textAlign = model.textAlignForCell(modelColumn, modelRow);
54
+ var text = model.textForCell(modelColumn, modelRow);
55
+ var {
56
+ x: textX,
57
+ width: textWidth
58
+ } = GridUtils.getTextRenderMetrics(state, column, row);
59
+ 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;
60
+ var truncationChar = model.truncationCharForCell(modelColumn, modelRow);
61
+ var truncatedText = this.getCachedTruncatedString(context, text, textWidth, fontWidth, truncationChar);
62
+ var {
63
+ columnMin,
64
+ columnMax,
65
+ axis,
66
+ color: dataBarColor,
67
+ valuePlacement,
68
+ opacity,
69
+ markers,
70
+ direction,
71
+ value
72
+ } = model.dataBarOptionsForCell(modelColumn, modelRow);
73
+ var hasGradient = Array.isArray(dataBarColor);
74
+ if (columnMin == null || columnMax == null) {
75
+ return;
76
+ }
77
+ var {
78
+ maxWidth,
79
+ x: dataBarX,
80
+ y: dataBarY,
81
+ zeroPosition,
82
+ leftmostPosition,
83
+ markerXs,
84
+ totalValueRange,
85
+ dataBarWidth
86
+ } = 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
+ context.save();
95
+ context.textAlign = textAlign;
96
+ if (hasGradient) {
97
+ var color = value >= 0 ? dataBarColor[dataBarColor.length - 1] : dataBarColor[0];
98
+ context.fillStyle = color;
99
+ } else {
100
+ context.fillStyle = dataBarColor;
101
+ }
102
+ context.textBaseline = 'top';
103
+ context.font = theme.font;
104
+ if (valuePlacement !== 'hide') {
105
+ context.fillText(truncatedText, textX, rowY + (rowHeight - this.heightOfDigits) / 2);
106
+ }
107
+
108
+ // Draw bar
109
+ if (hasGradient) {
110
+ // Draw gradient bar
111
+
112
+ var dataBarColorsOklab = dataBarColor.map(color => GridColorUtils.linearSRGBToOklab(GridColorUtils.hexToRgb(color)));
113
+ context.save();
114
+ context.beginPath();
115
+ context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight - 2, 1);
116
+ context.clip();
117
+ if (value < 0) {
118
+ 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
+ } 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
+ }
138
+ }
139
+ } else if (direction === 'LTR') {
140
+ // 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
+ }
150
+ } else if (direction === 'RTL') {
151
+ // 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
+ }
161
+ }
162
+
163
+ // restore clip
164
+ context.restore();
165
+ } else {
166
+ // Draw normal bar
167
+ context.save();
168
+ context.globalAlpha = opacity;
169
+ context.beginPath();
170
+ context.roundRect(dataBarX, dataBarY, dataBarWidth, rowHeight - 2, 1);
171
+ context.fill();
172
+ context.restore();
173
+ }
174
+
175
+ // Draw markers
176
+ if (maxWidth > 0) {
177
+ markerXs.forEach((markerX, index) => {
178
+ context.fillStyle = markers[index].color;
179
+ context.fillRect(markerX, dataBarY, 1, rowHeight - 2);
180
+ });
181
+ }
182
+ var shouldRenderDashedLine = !(axis === 'directional' && (valuePlacement === 'beside' && textAlign === 'right' && direction === 'LTR' || valuePlacement === 'beside' && textAlign === 'left' && direction === 'RTL' || valuePlacement !== 'beside'));
183
+
184
+ // Draw dashed line
185
+ if (shouldRenderDashedLine) {
186
+ context.strokeStyle = theme.zeroLineColor;
187
+ context.beginPath();
188
+ context.setLineDash([2, 1]);
189
+ context.moveTo(zeroPosition, rowY);
190
+ context.lineTo(zeroPosition, rowY + rowHeight);
191
+ context.stroke();
192
+ }
193
+ context.restore();
194
+
195
+ // Draw tree marker
196
+ if (isFirstColumn && isExpandableGridModel(model) && model.hasExpandableRows) {
197
+ this.drawCellRowTreeMarker(context, state, row);
198
+ }
199
+ }
200
+ getDataBarRenderMetrics(context, state, column, row) {
201
+ var {
202
+ metrics,
203
+ model,
204
+ theme
205
+ } = state;
206
+ if (!isDataBarGridModel(model)) {
207
+ throw new Error('Grid model is not a data bar grid model');
208
+ }
209
+ var {
210
+ firstColumn,
211
+ allColumnXs,
212
+ allColumnWidths,
213
+ allRowYs,
214
+ modelColumns,
215
+ modelRows,
216
+ visibleRows
217
+ } = metrics;
218
+ var {
219
+ cellHorizontalPadding,
220
+ treeDepthIndent,
221
+ treeHorizontalPadding
222
+ } = theme;
223
+ var modelColumn = getOrThrow(modelColumns, column);
224
+ var modelRow = getOrThrow(modelRows, row);
225
+ var x = getOrThrow(allColumnXs, column);
226
+ var y = getOrThrow(allRowYs, row);
227
+ var columnWidth = getOrThrow(allColumnWidths, column);
228
+ var isFirstColumn = column === firstColumn;
229
+ var treeIndent = 0;
230
+ if (isExpandableGridModel(model) && model.hasExpandableRows && isFirstColumn) {
231
+ treeIndent = treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;
232
+ }
233
+ var textAlign = model.textAlignForCell(modelColumn, modelRow);
234
+ var {
235
+ columnMin,
236
+ columnMax,
237
+ axis,
238
+ valuePlacement,
239
+ markers,
240
+ direction,
241
+ value
242
+ } = model.dataBarOptionsForCell(modelColumn, modelRow);
243
+ var longestValueWidth = this.getCachedWidestValueForColumn(context, visibleRows, modelRows, model, modelColumn);
244
+ var leftPadding = 2;
245
+ var rightPadding = valuePlacement === 'beside' && textAlign === 'right' ? 2 : 1;
246
+
247
+ // The value of the total range (e.g. max - column)
248
+ var totalValueRange = columnMax - columnMin;
249
+ // If min and max are both positive or min and max are equal, the max length is columnMax
250
+ if (columnMax >= 0 && columnMin >= 0 || columnMin === columnMax) {
251
+ totalValueRange = columnMax;
252
+ } else if (columnMax <= 0 && columnMin <= 0) {
253
+ // If min and max are both negative, the max length is the absolute value of columnMin
254
+ totalValueRange = Math.abs(columnMin);
255
+ }
256
+ var maxWidth = columnWidth - treeIndent - rightPadding - leftPadding;
257
+ if (valuePlacement === 'beside') {
258
+ maxWidth = maxWidth - cellHorizontalPadding - longestValueWidth;
259
+ }
260
+ if (maxWidth < 0) {
261
+ maxWidth = 0;
262
+ }
263
+ var columnLongest = Math.max(Math.abs(columnMin), Math.abs(columnMax));
264
+ // If axis is proportional, totalValueRange is proportional to maxWidth
265
+ var dataBarWidth = Math.abs(value) / totalValueRange * maxWidth;
266
+ if (maxWidth === 0) {
267
+ dataBarWidth = 0;
268
+ } else if (axis === 'middle') {
269
+ // The longest bar is proportional to half of the maxWidth
270
+ dataBarWidth = Math.abs(value) / columnLongest * (maxWidth / 2);
271
+ } else if (axis === 'directional') {
272
+ // The longest bar is proportional to the maxWidth
273
+ dataBarWidth = Math.abs(value) / columnLongest * maxWidth;
274
+ }
275
+
276
+ // Default: proportional, beside, LTR, right text align
277
+ // All positions are assuming the left side is 0 and the right side is maxWidth
278
+ var zeroPosition = columnMin >= 0 ? 0 : Math.abs(columnMin) / totalValueRange * maxWidth;
279
+ var dataBarX = value >= 0 ? zeroPosition : zeroPosition - Math.abs(value) / totalValueRange * maxWidth;
280
+ var markerXs = markers.map(marker => {
281
+ var {
282
+ column: markerColumn
283
+ } = marker;
284
+ var markerValue = Number(model.textForCell(markerColumn, modelRow));
285
+ return markerValue >= 0 ? zeroPosition + Math.abs(markerValue) / totalValueRange * maxWidth : zeroPosition - Math.abs(markerValue) / totalValueRange * maxWidth;
286
+ });
287
+ var leftmostPosition = valuePlacement === 'beside' && textAlign === 'left' ? cellHorizontalPadding + longestValueWidth + leftPadding : leftPadding;
288
+ var rightmostPosition = valuePlacement === 'beside' && textAlign === 'right' ? columnWidth - cellHorizontalPadding - longestValueWidth - rightPadding : rightPadding;
289
+
290
+ // Proportional, RTL
291
+ if (direction === 'RTL') {
292
+ zeroPosition = columnMin >= 0 ? columnWidth : columnWidth - Math.abs(columnMin) / totalValueRange * maxWidth;
293
+ dataBarX = value >= 0 ? zeroPosition - value / totalValueRange * maxWidth : zeroPosition;
294
+ markerXs = markers.map(marker => {
295
+ var {
296
+ column: markerColumn
297
+ } = marker;
298
+ var markerValue = Number(model.textForCell(markerColumn, modelRow));
299
+ return markerValue >= 0 ? zeroPosition - Math.abs(markerValue) / totalValueRange * maxWidth : zeroPosition + Math.abs(markerValue) / totalValueRange * maxWidth;
300
+ });
301
+ }
302
+ if (axis === 'middle') {
303
+ zeroPosition = maxWidth / 2;
304
+ if (direction === 'LTR') {
305
+ // Middle, LTR
306
+ dataBarX = value >= 0 ? zeroPosition : zeroPosition - Math.abs(value) / columnLongest * (maxWidth / 2);
307
+ markerXs = markers.map(marker => {
308
+ var {
309
+ column: markerColumn
310
+ } = marker;
311
+ var markerValue = Number(model.textForCell(markerColumn, modelRow));
312
+ return markerValue >= 0 ? zeroPosition + Math.abs(markerValue) / columnLongest * (maxWidth / 2) : zeroPosition - Math.abs(markerValue) / columnLongest * (maxWidth / 2);
313
+ });
314
+ } else if (direction === 'RTL') {
315
+ // Middle, RTL
316
+ dataBarX = value <= 0 ? zeroPosition : zeroPosition - Math.abs(value) / columnLongest * (maxWidth / 2);
317
+ markerXs = markers.map(marker => {
318
+ var {
319
+ column: markerColumn
320
+ } = marker;
321
+ var markerValue = Number(model.textForCell(markerColumn, modelRow));
322
+ return markerValue <= 0 ? zeroPosition + Math.abs(markerValue) / columnLongest * (maxWidth / 2) : zeroPosition - Math.abs(markerValue) / columnLongest * (maxWidth / 2);
323
+ });
324
+ }
325
+ } else if (axis === 'directional') {
326
+ if (direction === 'LTR') {
327
+ // Directional, LTR
328
+ zeroPosition = 0;
329
+ dataBarX = zeroPosition;
330
+ markerXs = markers.map(marker => {
331
+ var {
332
+ column: markerColumn
333
+ } = marker;
334
+ var markerValue = Number(model.textForCell(markerColumn, modelRow));
335
+ return zeroPosition + Math.abs(markerValue) / columnLongest * maxWidth;
336
+ });
337
+ } else if (direction === 'RTL') {
338
+ // Directional, RTL
339
+ zeroPosition = columnWidth;
340
+ dataBarX = zeroPosition - Math.abs(value) / columnLongest * maxWidth;
341
+ markerXs = markers.map(marker => {
342
+ var {
343
+ column: markerColumn
344
+ } = marker;
345
+ var markerValue = Number(model.textForCell(markerColumn, modelRow));
346
+ return zeroPosition - Math.abs(markerValue) / columnLongest * maxWidth;
347
+ });
348
+ }
349
+ }
350
+
351
+ // Offset all values by the actual x value and padding
352
+ if (direction === 'LTR') {
353
+ zeroPosition += x + leftPadding + treeIndent;
354
+ dataBarX += x + leftPadding + treeIndent;
355
+ markerXs = markerXs.map(markerX => markerX + x + leftPadding + treeIndent);
356
+ if (valuePlacement === 'beside' && textAlign === 'left') {
357
+ zeroPosition += longestValueWidth + cellHorizontalPadding;
358
+ dataBarX += longestValueWidth + cellHorizontalPadding;
359
+ markerXs = markerXs.map(markerX => markerX + longestValueWidth + cellHorizontalPadding);
360
+ }
361
+ } else if (direction === 'RTL') {
362
+ zeroPosition = zeroPosition + x - rightPadding;
363
+ dataBarX = dataBarX + x - rightPadding;
364
+ markerXs = markerXs.map(markerX => markerX + x - rightPadding);
365
+ if (valuePlacement === 'beside' && textAlign === 'right') {
366
+ zeroPosition = zeroPosition - cellHorizontalPadding - longestValueWidth;
367
+ dataBarX = dataBarX - cellHorizontalPadding - longestValueWidth;
368
+ markerXs = markerXs.map(markerX => markerX - cellHorizontalPadding - longestValueWidth);
369
+ }
370
+ }
371
+ leftmostPosition += x + treeIndent;
372
+ rightmostPosition += x;
373
+ return {
374
+ maxWidth,
375
+ x: dataBarX,
376
+ y: y + 1.5,
377
+ zeroPosition,
378
+ leftmostPosition,
379
+ rightmostPosition,
380
+ totalValueRange,
381
+ dataBarWidth,
382
+ markerXs
383
+ };
384
+ }
385
+ drawGradient(context, leftColor, rightColor, x, y, width, height) {
386
+ var currentColor = leftColor;
387
+ // Increase by 0.5 because half-pixel will render weird on different zooms
388
+ for (var currentX = x; currentX <= x + width; currentX += 0.5) {
389
+ this.drawGradientPart(context, currentX, y, 1, height, GridColorUtils.rgbToHex(GridColorUtils.OklabToLinearSRGB(currentColor)));
390
+ currentColor = GridColorUtils.lerpColor(leftColor, rightColor, (currentX - x) / width);
391
+ }
392
+ }
393
+ drawGradientPart(context, x, y, width, height, color) {
394
+ context.fillStyle = color;
395
+ context.fillRect(x, y, width, height);
396
+ }
397
+
398
+ /**
399
+ * Returns the width of the widest value in pixels
400
+ */
401
+ }
402
+
403
+ export default DataBarCellRenderer;
404
+ //# sourceMappingURL=DataBarCellRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataBarCellRenderer.js","names":["getOrThrow","CellRenderer","isExpandableGridModel","isDataBarGridModel","GridColorUtils","GridUtils","memoizeClear","DEFAULT_FONT_WIDTH","DataBarCellRenderer","context","visibleRows","modelRows","model","column","widestValue","i","length","row","modelRow","text","textForCell","Math","max","measureText","width","drawCellContent","state","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","markerColumn","markerValue","Number","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 ) {\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);\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 {\n actualBoundingBoxAscent,\n 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 {\n cellHorizontalPadding,\n treeDepthIndent,\n 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);\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 { column: markerColumn } = marker;\n const markerValue = Number(model.textForCell(markerColumn, modelRow));\n return markerValue >= 0\n ? zeroPosition + (Math.abs(markerValue) / totalValueRange) * maxWidth\n : zeroPosition - (Math.abs(markerValue) / totalValueRange) * maxWidth;\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 { column: markerColumn } = marker;\n const markerValue = Number(model.textForCell(markerColumn, modelRow));\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 { column: markerColumn } = marker;\n const markerValue = Number(model.textForCell(markerColumn, modelRow));\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 { column: markerColumn } = marker;\n const markerValue = Number(model.textForCell(markerColumn, modelRow));\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 { column: markerColumn } = marker;\n const markerValue = Number(model.textForCell(markerColumn, modelRow));\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 { column: markerColumn } = marker;\n const markerValue = Number(model.textForCell(markerColumn, modelRow));\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 ) {\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 ) {\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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"}