scroller: use binary search for moveHoverCursor
parent
ec4a11dae8
commit
7bc8f944a7
|
@ -206,7 +206,7 @@ export default class ScrollerManager extends Mixins(GlobalMixin) {
|
||||||
// Itearte over rows
|
// Itearte over rows
|
||||||
for (const row of this.rows) {
|
for (const row of this.rows) {
|
||||||
if (row.type === IRowType.HEAD) {
|
if (row.type === IRowType.HEAD) {
|
||||||
if (Object.values(this.TagDayID).includes(row.dayId)) {
|
if (this.TagDayIDValueSet.has(row.dayId)) {
|
||||||
// Blank tick
|
// Blank tick
|
||||||
this.ticks.push(getTick(row.dayId));
|
this.ticks.push(getTick(row.dayId));
|
||||||
} else {
|
} else {
|
||||||
|
@ -234,22 +234,20 @@ export default class ScrollerManager extends Mixins(GlobalMixin) {
|
||||||
this.hoverCursorY = y;
|
this.hoverCursorY = y;
|
||||||
|
|
||||||
// Get index of previous tick
|
// Get index of previous tick
|
||||||
let idx = this.ticks.findIndex(t => t.top >= y);
|
let idx = utils.binarySearch(this.ticks, y, 'top');
|
||||||
if (idx === 0) {
|
if (idx === 0) {
|
||||||
// use this tick
|
// use this tick
|
||||||
} else if (idx >= 1) {
|
} else if (idx >= 1 && idx <= this.ticks.length) {
|
||||||
idx = idx - 1;
|
idx = idx - 1;
|
||||||
} else if (idx === -1 && this.ticks.length > 0) {
|
|
||||||
idx = this.ticks.length - 1;
|
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// DayId of current hover
|
// DayId of current hover
|
||||||
const dayId = this.ticks[idx].dayId
|
const dayId = this.ticks[idx]?.dayId
|
||||||
|
|
||||||
// Special days
|
// Special days
|
||||||
if (Object.values(this.TagDayID).includes(dayId)) {
|
if (dayId === undefined || this.TagDayIDValueSet.has(dayId)) {
|
||||||
this.hoverCursorText = "";
|
this.hoverCursorText = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,4 +9,5 @@ export default class GlobalMixin extends Vue {
|
||||||
|
|
||||||
public readonly c = constants.c;
|
public readonly c = constants.c;
|
||||||
public readonly TagDayID = constants.TagDayID;
|
public readonly TagDayID = constants.TagDayID;
|
||||||
|
public readonly TagDayIDValueSet = new Set(Object.values(this.TagDayID));
|
||||||
}
|
}
|
|
@ -43,6 +43,39 @@ export function getLongDateStr(date: Date, skipYear=false, time=false) {
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for elem in a sorted array of objects
|
||||||
|
* If the object is not found, return the index where it should be inserted
|
||||||
|
*
|
||||||
|
* @param arr Array of objects to search
|
||||||
|
* @param elem Element to search for
|
||||||
|
* @param key Key to use for comparison
|
||||||
|
*/
|
||||||
|
export function binarySearch(arr: any, elem: any, key?: string) {
|
||||||
|
let minIndex = 0;
|
||||||
|
let maxIndex = arr.length - 1;
|
||||||
|
let currentIndex: number;
|
||||||
|
let currentElement: any;
|
||||||
|
|
||||||
|
while (minIndex <= maxIndex) {
|
||||||
|
currentIndex = (minIndex + maxIndex) / 2 | 0;
|
||||||
|
currentElement = key ? arr[currentIndex][key] : arr[currentIndex];
|
||||||
|
|
||||||
|
if (currentElement < elem) {
|
||||||
|
minIndex = currentIndex + 1;
|
||||||
|
}
|
||||||
|
else if (currentElement > elem) {
|
||||||
|
maxIndex = currentIndex - 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return currentIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return minIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Global constants */
|
||||||
export const constants = {
|
export const constants = {
|
||||||
c: {
|
c: {
|
||||||
FLAG_PLACEHOLDER: 1 << 0,
|
FLAG_PLACEHOLDER: 1 << 0,
|
||||||
|
|
Loading…
Reference in New Issue