| // Copyright (C) 2018 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 m from 'mithril'; |
| |
| import {channelChanged, getNextChannel, setChannel} from '../common/channels'; |
| import {Anchor} from '../widgets/anchor'; |
| import {HotkeyGlyphs} from '../widgets/hotkey_glyphs'; |
| |
| import {globals} from './globals'; |
| import {createPage} from './pages'; |
| |
| export class Hints implements m.ClassComponent { |
| view() { |
| return m( |
| '.home-page-hints', |
| m('.tagline', 'New!'), |
| m( |
| 'ul', |
| m( |
| 'li', |
| 'New updated ', |
| m( |
| Anchor, |
| { |
| href: 'https://perfetto.dev/docs/visualization/perfetto-ui#tabs-v2', |
| }, |
| 'tabs', |
| ), |
| ' are extensible and user friendly.', |
| ), |
| m( |
| 'li', |
| 'Use ', |
| m(HotkeyGlyphs, {hotkey: 'W'}), |
| m(HotkeyGlyphs, {hotkey: 'A'}), |
| m(HotkeyGlyphs, {hotkey: 'S'}), |
| m(HotkeyGlyphs, {hotkey: 'D'}), |
| ' to navigate the trace.', |
| ), |
| m( |
| 'li', |
| 'Try the ', |
| m( |
| Anchor, |
| { |
| href: 'https://perfetto.dev/docs/visualization/perfetto-ui#command-palette', |
| }, |
| 'command palette,', |
| ), |
| ' press ', |
| m(HotkeyGlyphs, {hotkey: '!Mod+Shift+P'}), |
| '.', |
| ), |
| ), |
| ); |
| } |
| } |
| |
| export const HomePage = createPage({ |
| view() { |
| return m( |
| '.page.home-page', |
| m( |
| '.home-page-center', |
| m( |
| '.home-page-title', |
| m(`img.logo[src=${globals.root}assets/logo-3d.png]`), |
| 'Perfetto', |
| ), |
| m(Hints), |
| m( |
| '.channel-select', |
| m('', 'Feeling adventurous? Try our bleeding edge Canary version'), |
| m('fieldset', mkChan('stable'), mkChan('canary'), m('.highlight')), |
| m( |
| `.home-page-reload${channelChanged() ? '.show' : ''}`, |
| 'You need to reload the page for the changes to have effect', |
| ), |
| ), |
| ), |
| m( |
| 'a.privacy', |
| {href: 'https://policies.google.com/privacy', target: '_blank'}, |
| 'Privacy policy', |
| ), |
| ); |
| }, |
| }); |
| |
| function mkChan(chan: string) { |
| const checked = getNextChannel() === chan ? '[checked=true]' : ''; |
| return [ |
| m(`input[type=radio][name=chan][id=chan_${chan}]${checked}`, { |
| onchange: () => { |
| setChannel(chan); |
| }, |
| }), |
| m(`label[for=chan_${chan}]`, chan), |
| ]; |
| } |