diff --git a/packages/react-components/src/components/trace-context-component.tsx b/packages/react-components/src/components/trace-context-component.tsx index 6301b1f1f..b1655eedb 100644 --- a/packages/react-components/src/components/trace-context-component.tsx +++ b/packages/react-components/src/components/trace-context-component.tsx @@ -10,7 +10,7 @@ import { TimeGraphUnitController } from 'timeline-chart/lib/time-graph-unit-cont import { OutputDescriptor } from 'tsp-typescript-client/lib/models/output-descriptor'; import { Experiment } from 'tsp-typescript-client/lib/models/experiment'; import { TspClient } from 'tsp-typescript-client/lib/protocol/tsp-client'; -import { TimeRange } from 'traceviewer-base/lib/utils/time-range'; +import { TimeRange, TimeRangeString } from 'traceviewer-base/lib/utils/time-range'; import { TableOutputComponent } from './table-output-component'; import { TimegraphOutputComponent } from './timegraph-output-component'; import { OutputComponentStyle } from './utils/output-component-style'; @@ -42,6 +42,7 @@ interface TraceContextProps { addResizeHandler: (handler: () => void) => void; removeResizeHandler: (handler: () => void) => void; backgroundTheme: string; + persistedState?: PersistedState; } interface TraceContextState { @@ -55,6 +56,16 @@ interface TraceContextState { backgroundTheme: string; } +export interface PersistedState { + outputs: OutputDescriptor[]; + currentRange: TimeRangeString; + currentViewRange: TimeRangeString; + currentTimeSelection?: TimeRangeString; + unitControllerViewRange: { start: string, end: string }; + storedTimescaleLayout: Layout[]; + storedNonTimescaleLayout: Layout[]; +} + export class TraceContextComponent extends React.Component { private readonly INDEXING_RUNNING_STATUS: string = 'RUNNING'; private readonly INDEXING_CLOSED_STATUS: string = 'CLOSED'; @@ -91,18 +102,35 @@ export class TraceContextComponent extends React.Component { this.handleTimeSelectionChange(range); }); this.unitController.onViewRangeChanged(viewRangeParam => { this.handleViewRangeChange(viewRangeParam); }); this.tooltipComponent = React.createRef(); @@ -158,8 +190,13 @@ export class TraceContextComponent extends React.Component; } + get persistedState(): PersistedState { + const { currentRange, currentViewRange, currentTimeSelection } = this.state; + const { _storedNonTimescaleLayout: storedNonTimescaleLayout, _storedTimescaleLayout: storedTimescaleLayout } = this; + const { start: ucStart, end: ucEnd } = this.unitController.viewRange; + return { + outputs: this.props.outputs, + currentRange: currentRange.toString(), + currentViewRange: currentViewRange.toString(), + unitControllerViewRange: { start: ucStart.toString(), end: ucEnd.toString() }, + currentTimeSelection: currentTimeSelection?.toString(), + storedNonTimescaleLayout, + storedTimescaleLayout + }; + } + private renderPlaceHolder() { - this._storedTimescaleLayout = []; - this._storedNonTimescaleLayout = []; + if (this.props.outputs.length === 0) { + this._storedTimescaleLayout = []; + this._storedNonTimescaleLayout = []; + } return
{'Trace loaded successfully.'}
diff --git a/theia-extensions/viewer-prototype/src/browser/trace-viewer/trace-viewer.tsx b/theia-extensions/viewer-prototype/src/browser/trace-viewer/trace-viewer.tsx index b649f9e38..2e850b8e7 100644 --- a/theia-extensions/viewer-prototype/src/browser/trace-viewer/trace-viewer.tsx +++ b/theia-extensions/viewer-prototype/src/browser/trace-viewer/trace-viewer.tsx @@ -8,7 +8,7 @@ import { TspClient } from 'tsp-typescript-client/lib/protocol/tsp-client'; import { TspClientProvider } from '../tsp-client-provider-impl'; import { TraceManager } from 'traceviewer-base/lib/trace-manager'; import { ExperimentManager } from 'traceviewer-base/lib/experiment-manager'; -import { TraceContextComponent } from 'traceviewer-react-components/lib/components/trace-context-component'; +import { TraceContextComponent, PersistedState } from 'traceviewer-react-components/lib/components/trace-context-component'; import { Experiment } from 'tsp-typescript-client/lib/models/experiment'; import { TheiaMessageManager } from '../theia-message-manager'; import { ThemeService } from '@theia/core/lib/browser/theming'; @@ -40,6 +40,8 @@ export class TraceViewerWidget extends ReactWidget implements StatefulWidget { protected traceManager: TraceManager; protected experimentManager: ExperimentManager; protected backgroundTheme: string; + protected traceContextComponent: React.RefObject; + protected persistedState?: PersistedState; protected resizeHandlers: (() => void)[] = []; protected readonly addResizeHandler = (h: () => void): void => { @@ -86,6 +88,7 @@ export class TraceViewerWidget extends ReactWidget implements StatefulWidget { if (!this.options.traceUUID) { this.initialize(); } + this.traceContextComponent = React.createRef(); this.tspClient = this.tspClientProvider.getTspClient(); this.traceManager = this.tspClientProvider.getTraceManager(); this.experimentManager = this.tspClientProvider.getExperimentManager(); @@ -242,20 +245,27 @@ export class TraceViewerWidget extends ReactWidget implements StatefulWidget { }); } - storeState(): OutputDescriptor[] { + storeState(): PersistedState | undefined { /* - TODO - BigInt support for storing state + TODO - BigInt support for storing state in outputs/outputDescriptors JSON.stringify cannot serialize BigInt */ - return this.outputDescriptors; + if (this.traceContextComponent?.current) { + const persistedState = this.traceContextComponent.current.persistedState; + return persistedState; + } + return undefined; } - restoreState(state: OutputDescriptor[]): void { + restoreState(persistedState: PersistedState): void { /* - TODO - BigInt support for restoring state + TODO - BigInt support for restoring state in outputs/outputDescriptors Identify what values need to be BigInt and convert. */ - this.outputDescriptors = state; + if (persistedState.outputs.length > 0) { + this.persistedState = persistedState; + this.outputDescriptors = persistedState.outputs; + } } private async fetchMarkerSets(expUUID: string) { @@ -301,6 +311,7 @@ export class TraceViewerWidget extends ReactWidget implements StatefulWidget { this.onOutputRemoved = this.onOutputRemoved.bind(this); return
{this.openedExperiment ? : 'Trace is loading...'}
; }