58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
export interface QueryEditorViewportRange {
|
|
from: number;
|
|
to: number;
|
|
}
|
|
|
|
export function isQueryEditorPositionVisible(position: number, visibleRanges: readonly QueryEditorViewportRange[] | undefined, viewport: QueryEditorViewportRange): boolean {
|
|
const ranges = visibleRanges && visibleRanges.length > 0 ? visibleRanges : [viewport];
|
|
return ranges.some((range) => position >= range.from && position <= range.to);
|
|
}
|
|
|
|
export function createQueryEditorExecutionViewportOwnership() {
|
|
let nextRequestId = 0;
|
|
let pendingRequestId: number | undefined;
|
|
let acceptedRequestId: number | undefined;
|
|
let executionActive = false;
|
|
let userInteractedDuringExecution = false;
|
|
|
|
return {
|
|
beginRequest(): number {
|
|
nextRequestId += 1;
|
|
pendingRequestId = nextRequestId;
|
|
return nextRequestId;
|
|
},
|
|
cancelPendingRequest(requestId?: number): boolean {
|
|
if (requestId !== undefined && pendingRequestId !== requestId) return false;
|
|
if (pendingRequestId === undefined) return false;
|
|
pendingRequestId = undefined;
|
|
return true;
|
|
},
|
|
acceptRequest(requestId: number): boolean {
|
|
if (pendingRequestId !== requestId) return false;
|
|
pendingRequestId = undefined;
|
|
acceptedRequestId = requestId;
|
|
return true;
|
|
},
|
|
beginExecution() {
|
|
executionActive = true;
|
|
userInteractedDuringExecution = false;
|
|
},
|
|
recordUserInteraction() {
|
|
if (executionActive) userInteractedDuringExecution = true;
|
|
},
|
|
consumeCompletionPreservation(): boolean {
|
|
const preserveViewport = acceptedRequestId !== undefined || userInteractedDuringExecution;
|
|
acceptedRequestId = undefined;
|
|
executionActive = false;
|
|
userInteractedDuringExecution = false;
|
|
return preserveViewport;
|
|
},
|
|
reset() {
|
|
pendingRequestId = undefined;
|
|
acceptedRequestId = undefined;
|
|
executionActive = false;
|
|
userInteractedDuringExecution = false;
|
|
},
|
|
};
|
|
}
|