Skip to content

Commit

Permalink
feat: add instance api setMaxOffsetLeftDistance and `setMaxOffsetRi…
Browse files Browse the repository at this point in the history
…ghtDistance`
  • Loading branch information
liihuu committed Dec 11, 2023
1 parent de198fa commit 535dd1d
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 16 deletions.
38 changes: 28 additions & 10 deletions src/Chart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,10 @@ export interface Chart {
getPriceVolumePrecision: () => Precision
setTimezone: (timezone: string) => void
getTimezone: () => string
setOffsetRightDistance: (space: number) => void
setOffsetRightDistance: (distance: number) => void
getOffsetRightDistance: () => number
setMaxOffsetLeftDistance: (distance: number) => void
setMaxOffsetRightDistance: (distance: number) => void
setLeftMinVisibleBarCount: (barCount: number) => void
setRightMinVisibleBarCount: (barCount: number) => void
setBarSpace: (space: number) => void
Expand Down Expand Up @@ -598,28 +600,44 @@ export default class ChartImp implements Chart {
return this._chartStore.getTimeScaleStore().getTimezone()
}

setOffsetRightDistance (space: number): void {
this._chartStore.getTimeScaleStore().setOffsetRightDistance(space, true)
setOffsetRightDistance (distance: number): void {
this._chartStore.getTimeScaleStore().setOffsetRightDistance(distance, true)
}

getOffsetRightDistance (): number {
return this._chartStore.getTimeScaleStore().getOffsetRightDistance()
}

setMaxOffsetLeftDistance (distance: number): void {
if (distance < 0) {
logWarn('setMaxOffsetLeftDistance', 'distance', 'distance must greater than zero!!!')
return
}
this._chartStore.getTimeScaleStore().setMaxOffsetLeftDistance(distance)
}

setMaxOffsetRightDistance (distance: number): void {
if (distance < 0) {
logWarn('setMaxOffsetRightDistance', 'distance', 'distance must greater than zero!!!')
return
}
this._chartStore.getTimeScaleStore().setMaxOffsetRightDistance(distance)
}

setLeftMinVisibleBarCount (barCount: number): void {
if (barCount > 0) {
this._chartStore.getTimeScaleStore().setLeftMinVisibleBarCount(Math.ceil(barCount))
} else {
if (barCount < 0) {
logWarn('setLeftMinVisibleBarCount', 'barCount', 'barCount must greater than zero!!!')
return
}
this._chartStore.getTimeScaleStore().setLeftMinVisibleBarCount(Math.ceil(barCount))
}

setRightMinVisibleBarCount (barCount: number): void {
if (barCount > 0) {
this._chartStore.getTimeScaleStore().setRightMinVisibleBarCount(Math.ceil(barCount))
} else {
logWarn('setRightMinVisibleBarCount', 'barCount', 'barCount must be a number and greater than zero!!!')
if (barCount < 0) {
logWarn('setRightMinVisibleBarCount', 'barCount', 'barCount must greater than zero!!!')
return
}
this._chartStore.getTimeScaleStore().setRightMinVisibleBarCount(Math.ceil(barCount))
}

setBarSpace (space: number): void {
Expand Down
57 changes: 51 additions & 6 deletions src/store/TimeScaleStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { isNumber, isString } from '../common/utils/typeChecks'

import ChartStore from './ChartStore'

interface MinVisibleBarCount {
interface LeftRightSide {
left: number
right: number
}
Expand All @@ -36,6 +36,11 @@ const BarSpaceLimitConstants = {
MAX: 50
}

const enum ScrollLimitRole {
BarCount,
Distance
}

const DEFAULT_BAR_SPACE = 6

const DEFAULT_OFFSET_RIGHT_DISTANCE = 50
Expand Down Expand Up @@ -106,10 +111,20 @@ export default class TimeScaleStore {
*/
private _startScrollOffsetRightBarCount = 0

/**
* Scroll limit role
*/
private _scrollLimitRole: ScrollLimitRole = ScrollLimitRole.BarCount

/**
* Scroll to the leftmost and rightmost visible bar
*/
private readonly _minVisibleBarCount: MinVisibleBarCount = { left: 2, right: 2 }
private readonly _minVisibleBarCount: LeftRightSide = { left: 2, right: 2 }

/**
* Scroll to the leftmost and rightmost distance
*/
private readonly _maxOffsetDistance: LeftRightSide = { left: 50, right: 50 }

/**
* Start and end points of visible area data index
Expand All @@ -136,15 +151,31 @@ export default class TimeScaleStore {
const dataList = this._chartStore.getDataList()
const dataCount = dataList.length
const barCount = this._totalBarSpace / this._barSpace
const maxRightOffsetBarCount = barCount - Math.min(this._minVisibleBarCount.left, dataCount)

let leftMinVisibleBarCount: number
let rightMinVisibleBarCount: number

if (this._scrollLimitRole === ScrollLimitRole.Distance) {
leftMinVisibleBarCount = (this._totalBarSpace - this._maxOffsetDistance.right) / this._barSpace
rightMinVisibleBarCount = (this._totalBarSpace - this._maxOffsetDistance.left) / this._barSpace
} else {
leftMinVisibleBarCount = this._minVisibleBarCount.left
rightMinVisibleBarCount = this._minVisibleBarCount.right
}

leftMinVisibleBarCount = Math.max(0, leftMinVisibleBarCount)
rightMinVisibleBarCount = Math.max(0, rightMinVisibleBarCount)

const maxRightOffsetBarCount = barCount - Math.min(leftMinVisibleBarCount, dataCount)
if (this._offsetRightBarCount > maxRightOffsetBarCount) {
this._offsetRightBarCount = maxRightOffsetBarCount
}

const minRightOffsetBarCount = -dataCount + Math.min(this._minVisibleBarCount.right, dataCount)
const minRightOffsetBarCount = -dataCount + Math.min(rightMinVisibleBarCount, dataCount)
if (this._offsetRightBarCount < minRightOffsetBarCount) {
this._offsetRightBarCount = minRightOffsetBarCount
}

let to = Math.round(this._offsetRightBarCount + dataCount + 0.5)
if (to > dataCount) {
to = dataCount
Expand Down Expand Up @@ -243,8 +274,8 @@ export default class TimeScaleStore {
}

setOffsetRightDistance (distance: number, isUpdate?: boolean): TimeScaleStore {
this._offsetRightDistance = distance
this._offsetRightBarCount = distance / this._barSpace
this._offsetRightDistance = this._scrollLimitRole === ScrollLimitRole.Distance ? Math.min(this._maxOffsetDistance.right, distance) : distance
this._offsetRightBarCount = this._offsetRightDistance / this._barSpace
if (isUpdate ?? false) {
this.adjustVisibleRange()
this._chartStore.getTooltipStore().recalculateCrosshair(true)
Expand Down Expand Up @@ -274,12 +305,26 @@ export default class TimeScaleStore {
return this
}

setMaxOffsetLeftDistance (distance: number): TimeScaleStore {
this._scrollLimitRole = ScrollLimitRole.Distance
this._maxOffsetDistance.left = distance
return this
}

setMaxOffsetRightDistance (distance: number): TimeScaleStore {
this._scrollLimitRole = ScrollLimitRole.Distance
this._maxOffsetDistance.right = distance
return this
}

setLeftMinVisibleBarCount (barCount: number): TimeScaleStore {
this._scrollLimitRole = ScrollLimitRole.BarCount
this._minVisibleBarCount.left = barCount
return this
}

setRightMinVisibleBarCount (barCount: number): TimeScaleStore {
this._scrollLimitRole = ScrollLimitRole.BarCount
this._minVisibleBarCount.right = barCount
return this
}
Expand Down

0 comments on commit 535dd1d

Please sign in to comment.