in src/core/prototypes/plot_segments/region_2d/cartesian.ts [488:630]
public renderControls(
manager: ChartStateManager,
zoom: ZoomInfo
): React.ReactElement<any>[] {
this.chartManager = manager;
const attrs = this.state.attributes;
const props = this.object.properties;
const g = [];
if (
props.xData &&
props.xData.visible &&
props.xData.allowScrolling &&
((props.xData.allCategories &&
props.xData.allCategories.length > props.xData.windowSize) ||
Math.abs(props.xData.dataDomainMax - props.xData.dataDomainMin) >
props.xData.windowSize)
) {
const axisRenderer = new AxisRenderer().setAxisDataBinding(
props.xData,
0,
attrs.x2 - attrs.x1,
false,
false,
this.getDisplayFormat(props.xData, props.xData.tickFormat, manager)
);
g.push(
axisRenderer.renderVirtualScrollBar(
attrs.x1,
(props.xData.side != "default" ? attrs.y2 : attrs.y1) +
(props.xData.barOffset
? (props.xData.side === "default" ? -1 : 1) *
<number>props.xData.barOffset
: 0),
AxisMode.X,
props.xData.scrollPosition ? props.xData.scrollPosition : 0,
(position) => {
if (props.xData.type === AxisDataBindingType.Categorical) {
if (!props.xData.allCategories) {
return;
}
props.xData.scrollPosition = 100 - position;
const start = Math.floor(
((props.xData.allCategories.length - props.xData.windowSize) /
100) *
props.xData.scrollPosition
);
props.xData.categories = props.xData.allCategories.slice(
start,
start + props.xData.windowSize
);
if (props.xData.categories.length === 0) {
props.xData.allCategories.slice(
start - 1,
start + props.xData.windowSize
);
}
} else if (props.xData.type === AxisDataBindingType.Numerical) {
const scale = scaleLinear()
.domain([100, 0])
.range([props.xData.dataDomainMin, props.xData.dataDomainMax]);
props.xData.scrollPosition = position;
const start = scale(position);
props.xData.domainMin = start - props.xData.windowSize;
props.xData.domainMax = start;
}
manager.remapPlotSegmentGlyphs(this.object);
manager.solveConstraints();
},
zoom
)
);
}
if (
props.yData &&
props.yData.visible &&
props.yData.allowScrolling &&
((props.yData.allCategories &&
props.yData.allCategories.length > props.yData.windowSize) ||
Math.abs(props.yData.dataDomainMax - props.yData.dataDomainMin) >
props.yData.windowSize)
) {
const axisRenderer = new AxisRenderer().setAxisDataBinding(
props.yData,
0,
attrs.y2 - attrs.y1,
false,
true,
this.getDisplayFormat(props.yData, props.yData.tickFormat, manager)
);
g.push(
axisRenderer.renderVirtualScrollBar(
(props.yData.side != "default" ? attrs.x2 : attrs.x1) +
(props.yData.barOffset
? (props.yData.side === "default" ? -1 : 1) *
<number>props.yData.barOffset
: 0),
attrs.y1,
AxisMode.Y,
props.yData.scrollPosition ? props.yData.scrollPosition : 0,
(position) => {
if (props.yData?.type === AxisDataBindingType.Categorical) {
if (!props.yData.allCategories) {
return;
}
props.yData.scrollPosition = position;
const start = Math.floor(
((props.yData.allCategories.length - props.yData.windowSize) /
100) *
position
);
props.yData.categories = props.yData.allCategories.slice(
start,
start + props.yData.windowSize
);
if (props.yData.categories.length === 0) {
props.yData.allCategories.slice(
start - 1,
start + props.yData.windowSize
);
}
} else if (props.yData.type === AxisDataBindingType.Numerical) {
const scale = scaleLinear()
.domain([100, 0])
.range([props.yData.dataDomainMin, props.yData.dataDomainMax]);
props.yData.scrollPosition = position;
const start = scale(position);
props.yData.domainMin = start;
props.yData.domainMax = start + props.yData.windowSize;
}
manager.remapPlotSegmentGlyphs(this.object);
manager.solveConstraints();
},
zoom
)
);
}
return g;
}