@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.
- package/dist/CellRenderer.d.ts +13 -0
- package/dist/CellRenderer.d.ts.map +1 -0
- package/dist/CellRenderer.js +64 -0
- package/dist/CellRenderer.js.map +1 -0
- package/dist/DataBarCellRenderer.d.ts +39 -0
- package/dist/DataBarCellRenderer.d.ts.map +1 -0
- package/dist/DataBarCellRenderer.js +404 -0
- package/dist/DataBarCellRenderer.js.map +1 -0
- package/dist/DataBarGridModel.d.ts +47 -0
- package/dist/DataBarGridModel.d.ts.map +1 -0
- package/dist/DataBarGridModel.js +27 -0
- package/dist/DataBarGridModel.js.map +1 -0
- package/dist/Grid.d.ts +5 -1
- package/dist/Grid.d.ts.map +1 -1
- package/dist/Grid.js +1 -1
- package/dist/Grid.js.map +1 -1
- package/dist/GridColorUtils.d.ts +15 -0
- package/dist/GridColorUtils.d.ts.map +1 -1
- package/dist/GridColorUtils.js +117 -1
- package/dist/GridColorUtils.js.map +1 -1
- package/dist/GridMetricCalculator.d.ts.map +1 -1
- package/dist/GridMetricCalculator.js +9 -2
- package/dist/GridMetricCalculator.js.map +1 -1
- package/dist/GridModel.d.ts +3 -0
- package/dist/GridModel.d.ts.map +1 -1
- package/dist/GridModel.js +3 -0
- package/dist/GridModel.js.map +1 -1
- package/dist/GridMouseHandler.d.ts +1 -0
- package/dist/GridMouseHandler.d.ts.map +1 -1
- package/dist/GridRenderer.d.ts +9 -34
- package/dist/GridRenderer.d.ts.map +1 -1
- package/dist/GridRenderer.js +29 -294
- package/dist/GridRenderer.js.map +1 -1
- package/dist/GridRendererTypes.d.ts +1 -0
- package/dist/GridRendererTypes.d.ts.map +1 -1
- package/dist/GridRendererTypes.js +2 -1
- package/dist/GridRendererTypes.js.map +1 -1
- package/dist/GridTestUtils.d.ts +2 -2
- package/dist/GridTestUtils.d.ts.map +1 -1
- package/dist/GridTestUtils.js.map +1 -1
- package/dist/GridTheme.d.ts +4 -0
- package/dist/GridTheme.d.ts.map +1 -1
- package/dist/GridTheme.js +6 -1
- package/dist/GridTheme.js.map +1 -1
- package/dist/GridUtils.d.ts +16 -0
- package/dist/GridUtils.d.ts.map +1 -1
- package/dist/GridUtils.js +60 -1
- package/dist/GridUtils.js.map +1 -1
- package/dist/MockDataBarGridModel.d.ts +29 -0
- package/dist/MockDataBarGridModel.d.ts.map +1 -0
- package/dist/MockDataBarGridModel.js +119 -0
- package/dist/MockDataBarGridModel.js.map +1 -0
- package/dist/MockTreeGridModel.d.ts +1 -0
- package/dist/MockTreeGridModel.d.ts.map +1 -1
- package/dist/TextCellRenderer.d.ts +24 -0
- package/dist/TextCellRenderer.d.ts.map +1 -0
- package/dist/TextCellRenderer.js +210 -0
- package/dist/TextCellRenderer.js.map +1 -0
- package/dist/TokenBoxCellRenderer.d.ts +10 -0
- package/dist/TokenBoxCellRenderer.d.ts.map +1 -0
- package/dist/TokenBoxCellRenderer.js +4 -0
- package/dist/TokenBoxCellRenderer.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mouse-handlers/GridRowTreeMouseHandler.d.ts +1 -0
- package/dist/mouse-handlers/GridRowTreeMouseHandler.d.ts.map +1 -1
- package/dist/mouse-handlers/GridTokenMouseHandler.d.ts.map +1 -1
- package/dist/mouse-handlers/GridTokenMouseHandler.js +20 -2
- package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -1
- 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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"}
|