xref: /aosp_15_r20/external/perfetto/ui/src/components/widgets/slice.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport m from 'mithril';
16*6dbdd20aSAndroid Build Coastguard Workerimport {asSliceSqlId, SliceSqlId} from '../sql_utils/core_types';
17*6dbdd20aSAndroid Build Coastguard Workerimport {Anchor} from '../../widgets/anchor';
18*6dbdd20aSAndroid Build Coastguard Workerimport {Icons} from '../../base/semantic_icons';
19*6dbdd20aSAndroid Build Coastguard Workerimport {getSlice, SliceDetails} from '../sql_utils/slice';
20*6dbdd20aSAndroid Build Coastguard Workerimport {
21*6dbdd20aSAndroid Build Coastguard Worker  createSqlIdRefRenderer,
22*6dbdd20aSAndroid Build Coastguard Worker  sqlIdRegistry,
23*6dbdd20aSAndroid Build Coastguard Worker} from './sql/details/sql_ref_renderer_registry';
24*6dbdd20aSAndroid Build Coastguard Workerimport {AppImpl} from '../../core/app_impl';
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard Workerinterface SliceRefAttrs {
27*6dbdd20aSAndroid Build Coastguard Worker  readonly id: SliceSqlId;
28*6dbdd20aSAndroid Build Coastguard Worker  readonly name: string;
29*6dbdd20aSAndroid Build Coastguard Worker
30*6dbdd20aSAndroid Build Coastguard Worker  // Whether clicking on the reference should change the current tab
31*6dbdd20aSAndroid Build Coastguard Worker  // to "current selection" tab in addition to updating the selection
32*6dbdd20aSAndroid Build Coastguard Worker  // and changing the viewport. True by default.
33*6dbdd20aSAndroid Build Coastguard Worker  readonly switchToCurrentSelectionTab?: boolean;
34*6dbdd20aSAndroid Build Coastguard Worker}
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard Workerexport class SliceRef implements m.ClassComponent<SliceRefAttrs> {
37*6dbdd20aSAndroid Build Coastguard Worker  view(vnode: m.Vnode<SliceRefAttrs>) {
38*6dbdd20aSAndroid Build Coastguard Worker    return m(
39*6dbdd20aSAndroid Build Coastguard Worker      Anchor,
40*6dbdd20aSAndroid Build Coastguard Worker      {
41*6dbdd20aSAndroid Build Coastguard Worker        icon: Icons.UpdateSelection,
42*6dbdd20aSAndroid Build Coastguard Worker        onclick: () => {
43*6dbdd20aSAndroid Build Coastguard Worker          // TODO(primiano): the Trace object should be properly injected here.
44*6dbdd20aSAndroid Build Coastguard Worker          AppImpl.instance.trace?.selection.selectSqlEvent(
45*6dbdd20aSAndroid Build Coastguard Worker            'slice',
46*6dbdd20aSAndroid Build Coastguard Worker            vnode.attrs.id,
47*6dbdd20aSAndroid Build Coastguard Worker            {
48*6dbdd20aSAndroid Build Coastguard Worker              switchToCurrentSelectionTab:
49*6dbdd20aSAndroid Build Coastguard Worker                vnode.attrs.switchToCurrentSelectionTab,
50*6dbdd20aSAndroid Build Coastguard Worker              scrollToSelection: true,
51*6dbdd20aSAndroid Build Coastguard Worker            },
52*6dbdd20aSAndroid Build Coastguard Worker          );
53*6dbdd20aSAndroid Build Coastguard Worker        },
54*6dbdd20aSAndroid Build Coastguard Worker      },
55*6dbdd20aSAndroid Build Coastguard Worker      vnode.attrs.name,
56*6dbdd20aSAndroid Build Coastguard Worker    );
57*6dbdd20aSAndroid Build Coastguard Worker  }
58*6dbdd20aSAndroid Build Coastguard Worker}
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard Workerexport function sliceRef(slice: SliceDetails, name?: string): m.Child {
61*6dbdd20aSAndroid Build Coastguard Worker  return m(SliceRef, {
62*6dbdd20aSAndroid Build Coastguard Worker    id: slice.id,
63*6dbdd20aSAndroid Build Coastguard Worker    name: name ?? slice.name,
64*6dbdd20aSAndroid Build Coastguard Worker  });
65*6dbdd20aSAndroid Build Coastguard Worker}
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard WorkersqlIdRegistry['slice'] = createSqlIdRefRenderer<{
68*6dbdd20aSAndroid Build Coastguard Worker  slice: SliceDetails | undefined;
69*6dbdd20aSAndroid Build Coastguard Worker  id: bigint;
70*6dbdd20aSAndroid Build Coastguard Worker}>(
71*6dbdd20aSAndroid Build Coastguard Worker  async (engine, id) => {
72*6dbdd20aSAndroid Build Coastguard Worker    return {
73*6dbdd20aSAndroid Build Coastguard Worker      id,
74*6dbdd20aSAndroid Build Coastguard Worker      slice: await getSlice(engine, asSliceSqlId(Number(id))),
75*6dbdd20aSAndroid Build Coastguard Worker    };
76*6dbdd20aSAndroid Build Coastguard Worker  },
77*6dbdd20aSAndroid Build Coastguard Worker  ({id, slice}) => ({
78*6dbdd20aSAndroid Build Coastguard Worker    value: slice !== undefined ? sliceRef(slice) : `Unknown slice ${id}`,
79*6dbdd20aSAndroid Build Coastguard Worker  }),
80*6dbdd20aSAndroid Build Coastguard Worker);
81