Skip to content

Commit

Permalink
feat: Add callback for double tap on price/time scale
Browse files Browse the repository at this point in the history
  • Loading branch information
KirillBobkov authored and dxpm committed May 7, 2024
1 parent 3888548 commit 2d253bd
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 6 deletions.
18 changes: 16 additions & 2 deletions src/chart/components/x_axis/x-axis-scale.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ export class XAxisScaleHandler extends ChartBaseElement {
lastXWidth: Unit = 0;
lastXPxWidth: Pixel = 0;

private dblClickCallback: () => void;
private dblTapCallback: () => void;

constructor(
private scale: ScaleModel,
private canvasInputListener: CanvasInputListenerComponent,
Expand All @@ -33,6 +36,9 @@ export class XAxisScaleHandler extends ChartBaseElement {
) {
super();

this.dblClickCallback = () => chartModel.doBasicScale();
this.dblTapCallback = () => chartModel.doBasicScale();

const dragNDropXComponent = new DragNDropXComponent(
this.canvasBoundsContainer.getBoundsHitTest(CanvasElement.X_AXIS),
{
Expand Down Expand Up @@ -63,9 +69,13 @@ export class XAxisScaleHandler extends ChartBaseElement {
this.addRxSubscription(
this.canvasInputListener
.observeDbClick(this.canvasBoundsContainer.getBoundsHitTest(CanvasElement.X_AXIS))
.subscribe(() => this.chartModel.doBasicScale()),
.subscribe(() => this.dblClickCallback()),
);
this.addRxSubscription(
this.canvasInputListener
.observeDbTap(this.canvasBoundsContainer.getBoundsHitTest(CanvasElement.X_AXIS))
.subscribe(() => this.dblTapCallback()),
);

this.addRxSubscription(
this.chartModel.candlesPrependSubject.subscribe(
({ prependedCandlesWidth }) => (this.lastXStart += prependedCandlesWidth),
Expand Down Expand Up @@ -99,4 +109,8 @@ export class XAxisScaleHandler extends ChartBaseElement {
// Continue redrawing hit test
this.hitTestCanvasModel.hitTestDrawersPredicateSubject.next(true);
};

public setDblTapCallback = (cb: () => void) => this.dblTapCallback = cb;

public setDblClickCallback = (cb: () => void) => this.dblClickCallback = cb;
}
14 changes: 14 additions & 0 deletions src/chart/components/x_axis/x-axis.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,5 +199,19 @@ export class XAxisComponent extends ChartBaseElement {
public isVisible(): boolean {
return this.config.components?.xAxis.visible ?? false;
}

/* This function assigns a callback to be executed when a double-click event is detected.
* It accepts one parameter `cb`, which is a callback function.
* When a double-click event occurs, the specified callback function `cb` will be invoked.
* By default it calls basic scale on XAxis
*/
public setDblClickCallback = (cb: () => void) => this.xAxisScaleHandler.setDblClickCallback(cb);

/* This function assigns a callback to be executed when a double-tap event is detected.
* Similar to the dblclick function, it takes one parameter `cb`, which is a callback function.
* This function ensures that the callback `cb` is called whenever a double-tap event is triggered.
* By default it calls basic scale on XAxis
*/
public setDblTapCallback = (cb: () => void) => this.xAxisScaleHandler.setDblTapCallback(cb);
//#endregion
}
22 changes: 19 additions & 3 deletions src/chart/components/y_axis/y-axis-scale.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ export class YAxisScaleHandler extends ChartBaseElement {
lastYHeight: Unit = 0;
lastYPxHeight: Pixel = 0;

private dblClickCallback: () => void;
private dblTapCallback: () => void;

constructor(
private bus: EventBus,
private config: YAxisConfig,
Expand All @@ -39,10 +42,13 @@ export class YAxisScaleHandler extends ChartBaseElement {
private canvasInputListener: CanvasInputListenerComponent,
private bounds: CanvasBoundsContainer,
private hitTest: HitBoundsTest,
private autoScaleCallback: (auto: boolean) => void,
private hitTestCanvasModel: HitTestCanvasModel,
) {
super();

this.dblClickCallback = () => scale.autoScale(true);
this.dblTapCallback = () => scale.autoScale(true);

// drag to Y-scale and double click to auto scale
if (config.customScale) {
const dragNDropYComponent = new DragNDropYComponent(
Expand All @@ -66,7 +72,13 @@ export class YAxisScaleHandler extends ChartBaseElement {
if (this.config.customScaleDblClick) {
this.addRxSubscription(
this.canvasInputListener.observeDbClick(this.hitTest).subscribe(() => {
this.autoScaleCallback(true);
this.dblClickCallback();
this.bus.fireDraw();
}),
);
this.addRxSubscription(
this.canvasInputListener.observeDbTap(this.hitTest).subscribe(() => {
this.dblTapCallback();
this.bus.fireDraw();
}),
);
Expand Down Expand Up @@ -102,7 +114,7 @@ export class YAxisScaleHandler extends ChartBaseElement {
const newYEnd = this.lastYEnd + delta;
if (this.lastYStart !== newYStart || this.lastYEnd !== newYEnd) {
this.scale.setYScale(newYStart, newYEnd);
this.autoScaleCallback(false);
this.scale.state.auto = false;
this.bus.fireDraw();
}
};
Expand All @@ -112,4 +124,8 @@ export class YAxisScaleHandler extends ChartBaseElement {
// Continue redrawing hit test
this.hitTestCanvasModel.hitTestDrawersPredicateSubject.next(true);
};

public setDblTapCallback = (cb: () => void) => this.dblTapCallback = cb;

public setDblClickCallback = (cb: () => void) => this.dblClickCallback = cb;
}
15 changes: 14 additions & 1 deletion src/chart/components/y_axis/y-axis.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ export class YAxisComponent extends ChartBaseElement {
canvasInputListeners,
canvasBoundsContainer,
canvasBoundsContainer.getBoundsHitTest(CanvasElement.PANE_UUID_Y_AXIS(paneUUID, extentIdx)),
auto => scale.autoScale(auto),
hitTestCanvasModel,
);
this.addChildEntity(this.yAxisScaleHandler);
Expand Down Expand Up @@ -333,5 +332,19 @@ export class YAxisComponent extends ChartBaseElement {
// recalculating labels is not needed, so just redraw YAxis
this.canvasModel.fireDraw();
}

/* This function assigns a callback to be executed when a double-click event is detected.
* It accepts one parameter `cb`, which is a callback function.
* When a double-click event occurs, the specified callback function `cb` will be invoked.
* By default it calls auto scale on YAxis
*/
public setDblClickCallback = (cb: () => void) => this.yAxisScaleHandler.setDblClickCallback(cb);

/* This function assigns a callback to be executed when a double-tap event is detected.
* Similar to the dblclick function, it takes one parameter `cb`, which is a callback function.
* This function ensures that the callback `cb` is called whenever a double-tap event is triggered.
* By default it calls auto scale on YAxis
*/
public setDblTapCallback = (cb: () => void) => this.yAxisScaleHandler.setDblTapCallback(cb);
//#endregion
}

0 comments on commit 2d253bd

Please sign in to comment.