blob: 7ad231f40d29dfa3f62d551855eae75d97926105 [file] [edit]
// Copyright (C) 2023 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 './ui_main.scss';
import m from 'mithril';
import {AppImpl} from '../core/app_impl';
import {CookieConsent} from '../core/cookie_consent';
import {featureFlags} from '../core/feature_flags';
import {LinearProgress} from '../widgets/linear_progress';
import {maybeRenderFullscreenModalDialog} from '../widgets/modal';
import {initCssConstants} from './css_constants';
import {Sidebar} from './views/sidebar';
import {SidePanelContainer} from './side_panel';
import {renderStatusBar} from './statusbar';
import {taskTracker} from './task_tracker';
import {Topbar} from './topbar';
const showStatusBarFlag = featureFlags.register({
id: 'Enable status bar',
description: 'Enable status bar at the bottom of the window',
defaultValue: true,
});
// Read the page title set by index.html. This can be overridden at build time
// via --title (e.g. to distinguish multiple dev server instances).
const APP_TITLE = document.title || 'Perfetto UI';
// This components gets destroyed and recreated every time the current trace
// changes. Note that in the beginning the current trace is undefined.
export class UiMain implements m.ClassComponent {
// This function is invoked once per trace.
constructor() {
const app = AppImpl.instance;
const trace = app.trace;
// Update the title bar to reflect the loaded trace's title
if (trace) {
document.title = `${trace.traceInfo.traceTitle || 'Trace'} - ${APP_TITLE}`;
} else {
document.title = APP_TITLE;
}
}
view(): m.Children {
// Update the trace reference on each render so that it's kept up to date.
const app = AppImpl.instance;
const trace = app.trace;
const isSomethingLoading =
app.isLoadingTrace ||
(trace?.engine.numRequestsPending ?? 0) > 0 ||
taskTracker.hasPendingTasks();
return m('main.pf-ui-main', [
m(Sidebar, {app}),
m(Topbar, {trace}),
m(LinearProgress, {
className: 'pf-ui-main__loading',
state: isSomethingLoading ? 'indeterminate' : 'none',
}),
m(
'.pf-ui-main__page-container',
m(SidePanelContainer, {
sidePanelMgr: app.sidePanel,
pageContent: app.pages.renderPageForCurrentRoute(),
}),
),
m(CookieConsent),
maybeRenderFullscreenModalDialog(),
showStatusBarFlag.get() && renderStatusBar(app),
app.perfDebugging.renderPerfStats(),
]);
}
oncreate({dom}: m.VnodeDOM) {
initCssConstants(dom);
}
}