public renderControls()

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;
  }