|  |  | 
|  | // Copyright (C) 2019 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 * as m from 'mithril'; | 
|  |  | 
|  | import {globals} from './globals'; | 
|  | import {hideModel, showModal} from './modal'; | 
|  |  | 
|  | let helpModelOpen = false; | 
|  |  | 
|  | export function toggleHelp() { | 
|  | if (helpModelOpen) { | 
|  | hideHelp(); | 
|  | } else { | 
|  | globals.logging.logEvent('User Actions', 'Show help'); | 
|  | showHelp(); | 
|  | } | 
|  | } | 
|  |  | 
|  | function keycap(key: string) { | 
|  | return m('.keycap', key); | 
|  | } | 
|  |  | 
|  | function showHelp() { | 
|  | helpModelOpen = true; | 
|  | showModal({ | 
|  | title: 'Perfetto Help', | 
|  | content: m( | 
|  | '.help', | 
|  | m('h2', 'Navigation'), | 
|  | m( | 
|  | 'table', | 
|  | m( | 
|  | 'tr', | 
|  | m('td', keycap('w'), '/', keycap('s')), | 
|  | m('td', 'Zoom in/out'), | 
|  | ), | 
|  | m( | 
|  | 'tr', | 
|  | m('td', keycap('a'), '/', keycap('d')), | 
|  | m('td', 'Pan left/right'), | 
|  | ), | 
|  | ), | 
|  | m('h2', 'Mouse Controls'), | 
|  | m('table', | 
|  | m('tr', m('td', 'Click'), m('td', 'Select event')), | 
|  | m('tr', m('td', 'Ctrl + Scroll wheel'), m('td', 'Zoom in/out')), | 
|  | m('tr', m('td', 'Click + Drag'), m('td', 'Select area')), | 
|  | m('tr', m('td', 'Shift + Click + Drag'), m('td', 'Pan left/right'))), | 
|  | m('h2', 'Other'), | 
|  | m( | 
|  | 'table', | 
|  | m('tr', | 
|  | m('td', keycap('f'), ' (with event selected)'), | 
|  | m('td', 'Scroll + zoom to current selection')), | 
|  | m('tr', | 
|  | m('td', keycap('['), '/', keycap(']'), ' (with event selected)'), | 
|  | m('td', | 
|  | 'Select next/previous slice that is connected by a flow.', | 
|  | m('br'), | 
|  | 'If there are multiple flows,' + | 
|  | 'the one that is in focus (bold) is selected')), | 
|  | m('tr', | 
|  | m('td', | 
|  | keycap('Ctrl'), | 
|  | ' + ', | 
|  | keycap('['), | 
|  | '/', | 
|  | keycap(']'), | 
|  | ' (with event selected)'), | 
|  | m('td', 'Switch focus to another flow')), | 
|  | m('tr', | 
|  | m('td', keycap('m'), ' (with event or area selected)'), | 
|  | m('td', 'Mark the area (temporarily)')), | 
|  | m('tr', | 
|  | m('td', | 
|  | keycap('Shift'), | 
|  | ' + ', | 
|  | keycap('m'), | 
|  | ' (with event or area selected)'), | 
|  | m('td', 'Mark the area (persistently)')), | 
|  | m('tr', m('td', keycap('?')), m('td', 'Show help')), | 
|  | )), | 
|  | buttons: [], | 
|  | }).finally(() => { | 
|  | helpModelOpen = false; | 
|  | }); | 
|  | } | 
|  |  | 
|  | function hideHelp() { | 
|  | if (helpModelOpen) { | 
|  | hideModel(); | 
|  | } | 
|  | } |