blob: 7461c985d902a16c76774bcb6b7f9f875b8e03c5 [file] [log] [blame] [edit]
// Copyright (C) 2024 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {HighPrecisionTimeSpan} from '../base/high_precision_time_span';
import {time} from '../base/time';
import {Setting} from './settings';
export enum TimestampFormat {
Timecode = 'timecode',
TraceNs = 'traceNs',
TraceNsLocale = 'traceNsLocale',
Seconds = 'seconds',
Milliseconds = 'milliseconds',
Microseconds = 'microseconds',
UTC = 'utc',
CustomTimezone = 'customTimezone',
TraceTz = 'traceTz',
}
export enum DurationPrecision {
Full = 'full',
HumanReadable = 'human_readable',
}
export interface PanIntoViewOptions {
// Where to place the timestamp/span in the viewport.
// nearest: pan the minimum amount to make it visible
readonly align?: 'center' | 'nearest' | 'zoom';
// Margin from edge as a fraction of the viewport (0.0 to 1.0)
readonly margin?: number;
// Whether to animate the pan/zoom operation.
readonly animation?: 'ease-in-out' | 'step';
}
export interface PanInstantIntoViewOptions extends PanIntoViewOptions {
// When zooming into an instant which has no inherent width, this value
// defines what the new viewport width should be. If omitted, zoom is the same
// as center for instants.
readonly zoomWidth?: number;
}
export interface Timeline {
/**
* Pan the viewport by a specified amount of time.
*
* The viewport moves by the delta amount while maintaining the current zoom
* level (duration). The result is clamped to trace boundaries.
*
* @param delta - The amount to pan in nanoseconds. Positive values pan
* forward (right), negative values pan backward (left).
*
* @example
* // Pan 100 nanoseconds to the right
* timeline.pan(100);
*
* @example
* // Pan 50 nanoseconds to the left
* timeline.pan(-50);
*/
pan(delta: number): void;
/**
* Zoom the viewport by a scaling factor around a center point.
*
* The viewport duration is multiplied by the factor, with the zoom centered
* at the specified point. The result is clamped to minimum duration and trace
* boundaries.
*
* @param factor - The scaling ratio. Values < 1 zoom in (reduce duration),
* values > 1 zoom out (increase duration). E.g., 0.5 zooms in 2x, 2 zooms out
* 2x.
* @param centerPoint - Optional normalized position (0.0 to 1.0) where the
* zoom is centered. 0.0 = left edge, 0.5 = center, 1.0 = right edge. Defaults
* to 0.5 (center).
*
* @example
* // Zoom in 2x around the center
* timeline.zoom(0.5);
*
* @example
* // Zoom out 3x around the left edge
* timeline.zoom(3, 0);
*/
zoom(factor: number, centerPoint?: number): void;
/**
* Pan (and optionally zoom) the viewport to make a timestamp visible.
*
* Depending on alignment mode:
* - 'center': Centers the timestamp in the viewport
* - 'nearest': Pans minimally to bring timestamp into view (default)
* - 'zoom': Centers timestamp and optionally changes zoom level
*
* The viewport is clamped to trace boundaries while preserving duration unless
* zooming.
*
* @param ts - The timestamp to bring into view.
* @param options - Optional configuration:
* - align: How to position the timestamp ('center' | 'nearest' | 'zoom')
* - margin: Safe zone as fraction of viewport (e.g., 0.1 = 10% margin)
* - zoomWidth: For 'zoom' mode, the new viewport duration in nanoseconds
*
* @example
* // Center timestamp 1500 in viewport
* timeline.panIntoView(Time.fromRaw(1500n), {align: 'center'});
*
* @example
* // Bring timestamp into view with 10% margin
* timeline.panIntoView(Time.fromRaw(1500n), {
* align: 'nearest',
* margin: 0.1
* });
*
* @example
* // Zoom to 100ns viewport centered on timestamp
* timeline.panIntoView(Time.fromRaw(1500n), {
* align: 'zoom',
* zoomWidth: 100
* });
*/
panIntoView(ts: time, options?: PanInstantIntoViewOptions): void;
/**
* Pan (and optionally zoom) the viewport to make a time span visible.
*
* Depending on alignment mode:
* - 'center': Centers the span's midpoint in the viewport
* - 'nearest': Pans minimally to bring entire span into view (default)
* - 'zoom': Adjusts viewport to exactly fit the span (with optional margin)
*
* For 'center' and 'nearest' modes, the viewport duration is preserved and the
* result is clamped to trace boundaries. For 'zoom' mode, the viewport is
* resized to fit the span.
*
* @param start - The start of the time span.
* @param end - The end of the time span.
* @param options - Optional configuration:
* - align: How to position the span ('center' | 'nearest' | 'zoom')
* - margin: Safe zone as fraction of viewport (e.g., 0.1 = 10% margin)
*
* @example
* // Center span [1200, 1400) in viewport
* timeline.panSpanIntoView(Time.fromRaw(1200n), Time.fromRaw(1400n), {
* align: 'center'
* });
*
* @example
* // Bring span into view with minimal panning
* timeline.panSpanIntoView(Time.fromRaw(1200n), Time.fromRaw(1400n), {
* align: 'nearest',
* margin: 0.05
* });
*
* @example
* // Zoom to exactly fit span with 10% margin on each side
* timeline.panSpanIntoView(Time.fromRaw(1200n), Time.fromRaw(1400n), {
* align: 'zoom',
* margin: 0.1
* });
*/
panSpanIntoView(start: time, end: time, options?: PanIntoViewOptions): void;
/**
* Directly set the visible viewport to a specific time span.
*
* The provided span is automatically clamped to:
* - Minimum duration (to prevent excessive zoom)
* - Trace boundaries (to keep viewport within valid trace time range)
*
* Use this for precise control over the viewport. For user-facing navigation,
* prefer pan(), zoom(), panIntoView(), or panSpanIntoView().
*
* @param span - The new viewport as a high-precision time span.
*
* @example
* // Set viewport to [1000, 1500)
* timeline.setVisibleWindow(
* HighPrecisionTimeSpan.fromTime(
* Time.fromRaw(1000n),
* Time.fromRaw(1500n)
* )
* );
*/
setVisibleWindow(span: HighPrecisionTimeSpan): void;
// A span representing the current viewport location.
readonly visibleWindow: HighPrecisionTimeSpan;
// Render a vertical line on the timeline at this timestamp.
hoverCursorTimestamp: time | undefined;
hoveredNoteTimestamp: time | undefined;
highlightedSliceId: number | undefined;
hoveredUtid: number | undefined;
hoveredPid: bigint | undefined;
// This value defines the time of the origin of the time axis in trace time.
// Depending on the timestamp format setting, this value can change:
// E.g.
// - Raw - origin = 0
// - Seconds - origin = trace.start.
// - Realtime - origin = midnight before trace.start.
getTimeAxisOrigin(): time;
// Get a time in the current domain as specified by timestampOffset.
toDomainTime(ts: time): time;
// These control how timestamps and durations are formatted throughout the UI
timestampFormat: TimestampFormat;
durationPrecision: DurationPrecision;
customTimezoneOffset: number;
timezoneOverride: Setting<string>;
}