Skip to content

Commit 0a02a1f

Browse files
committed
Make FilterNavigatorBar scrollable
1 parent 0d72df8 commit 0a02a1f

15 files changed

+2356
-365
lines changed

src/components/app/Details.tsx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,25 @@ type DispatchProps = {
4747

4848
type Props = ConnectedProps<{}, StateProps, DispatchProps>;
4949

50+
type State = {
51+
// The scroll position of the FilterNavigatorBar, shared among
52+
// the call tree, the frame graph, and the stack chart.
53+
readonly filterScrollPos: number;
54+
};
55+
5056
const SMALL_SCREEN_WIDTH = 768;
5157

52-
class ProfileViewerImpl extends PureComponent<Props> {
58+
class ProfileViewerImpl extends PureComponent<Props, State> {
59+
override state = {
60+
filterScrollPos: 0,
61+
};
62+
63+
_setFilterScrollPos = (pos: number) => {
64+
this.setState({
65+
filterScrollPos: pos,
66+
});
67+
};
68+
5369
_onSelectTab = (selectedTab: string) => {
5470
const { changeSelectedTab } = this.props;
5571
const tabSlug = toValidTabSlug(selectedTab);
@@ -75,6 +91,7 @@ class ProfileViewerImpl extends PureComponent<Props> {
7591

7692
override render() {
7793
const { visibleTabs, selectedTab, isSidebarOpen } = this.props;
94+
const { filterScrollPos } = this.state;
7895
const hasSidebar = selectSidebar(selectedTab) !== null;
7996
return (
8097
<div className="Details">
@@ -121,9 +138,24 @@ class ProfileViewerImpl extends PureComponent<Props> {
121138
>
122139
{
123140
{
124-
calltree: <ProfileCallTreeView />,
125-
'flame-graph': <FlameGraph />,
126-
'stack-chart': <StackChart />,
141+
calltree: (
142+
<ProfileCallTreeView
143+
filterScrollPos={filterScrollPos}
144+
setFilterScrollPos={this._setFilterScrollPos}
145+
/>
146+
),
147+
'flame-graph': (
148+
<FlameGraph
149+
filterScrollPos={filterScrollPos}
150+
setFilterScrollPos={this._setFilterScrollPos}
151+
/>
152+
),
153+
'stack-chart': (
154+
<StackChart
155+
filterScrollPos={filterScrollPos}
156+
setFilterScrollPos={this._setFilterScrollPos}
157+
/>
158+
),
127159
'marker-chart': <MarkerChart />,
128160
'marker-table': <MarkerTable />,
129161
'network-chart': <NetworkChart />,

src/components/app/ProfileViewer.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
background: var(--grey-10);
116116
}
117117

118-
.profileViewerSpacer {
118+
.profileViewerTopBar .filterNavigatorBarScrollContainer {
119119
flex: 1;
120120
}
121121

src/components/app/ProfileViewer.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,10 @@ class ProfileViewerImpl extends PureComponent<Props> {
114114
/>
115115
) : null}
116116
<ProfileName />
117-
<ProfileFilterNavigator />
118117
{
119-
// Define a spacer in the middle that will shrink based on the availability
120-
// of space in the top bar. It will shrink away before any of the items
121-
// with actual content in them do.
118+
// TODO: Update the sroll position when other elements are updated.
122119
}
123-
<div className="profileViewerSpacer" />
120+
<ProfileFilterNavigator />
124121
<MenuButtons />
125122
{isUploading ? (
126123
<div

src/components/calltree/ProfileCallTreeView.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,23 @@ import { CallTree } from './CallTree';
66
import { StackSettings } from 'firefox-profiler/components/shared/StackSettings';
77
import { TransformNavigator } from 'firefox-profiler/components/shared/TransformNavigator';
88

9-
export const ProfileCallTreeView = () => (
9+
type Props = {
10+
readonly filterScrollPos?: number;
11+
readonly setFilterScrollPos?: (pos: number) => void;
12+
};
13+
14+
export const ProfileCallTreeView = (props: Props) => (
1015
<div
1116
className="treeAndSidebarWrapper"
1217
id="calltree-tab"
1318
role="tabpanel"
1419
aria-labelledby="calltree-tab-button"
1520
>
1621
<StackSettings />
17-
<TransformNavigator />
22+
<TransformNavigator
23+
filterScrollPos={props.filterScrollPos}
24+
setFilterScrollPos={props.setFilterScrollPos}
25+
/>
1826
<CallTree />
1927
</div>
2028
);

src/components/flame-graph/index.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,23 @@ import { StackSettings } from '../shared/StackSettings';
66
import { TransformNavigator } from '../shared/TransformNavigator';
77
import { MaybeFlameGraph } from './MaybeFlameGraph';
88

9-
const FlameGraphView = () => (
9+
type Props = {
10+
readonly filterScrollPos?: number;
11+
readonly setFilterScrollPos?: (pos: number) => void;
12+
};
13+
14+
const FlameGraphView = (props: Props) => (
1015
<div
1116
className="flameGraph"
1217
id="flame-graph-tab"
1318
role="tabpanel"
1419
aria-labelledby="flame-graph-tab-button"
1520
>
1621
<StackSettings hideInvertCallstack={true} />
17-
<TransformNavigator />
22+
<TransformNavigator
23+
filterScrollPos={props.filterScrollPos}
24+
setFilterScrollPos={props.setFilterScrollPos}
25+
/>
1826
<MaybeFlameGraph />
1927
</div>
2028
);

src/components/shared/FilterNavigatorBar.css

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,63 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5+
.filterNavigatorBarScrollContainer {
6+
position: relative;
7+
height: 24px;
8+
}
9+
10+
.filterNavigatorBarScrollParent {
11+
position: relative;
12+
overflow: hidden;
13+
width: 100%;
14+
height: 24px;
15+
flex: 1;
16+
}
17+
18+
.filterNavigatorBarScrollContent {
19+
position: absolute;
20+
top: 0px;
21+
left: 0px;
22+
padding: 0 24px;
23+
}
24+
25+
.filterNavigatorBarScrollButtonLeft,
26+
.filterNavigatorBarScrollButtonRight {
27+
position: absolute;
28+
z-index: 2;
29+
width: 24px;
30+
height: 24px;
31+
border: none;
32+
border: 1px solid var(--grey-30);
33+
background: var(--grey-10);
34+
color: var(--grey-80);
35+
}
36+
37+
.filterNavigatorBarScrollButtonLeft {
38+
top: 0px;
39+
left: 0px;
40+
}
41+
42+
.filterNavigatorBarScrollButtonRight {
43+
top: 0px;
44+
right: 0px;
45+
}
46+
47+
.filterNavigatorBarScrollButtonLeft.disabled,
48+
.filterNavigatorBarScrollButtonRight.disabled {
49+
color: var(--grey-40);
50+
}
51+
52+
.filterNavigatorBarScrollButtonLeft:not(.disabled):hover,
53+
.filterNavigatorBarScrollButtonRight:not(.disabled):hover {
54+
background: var(--grey-20);
55+
}
56+
57+
.filterNavigatorBarScrollButtonLeft:not(.disabled):active,
58+
.filterNavigatorBarScrollButtonRight:not(.disabled):active {
59+
background: var(--grey-30);
60+
}
61+
562
.filterNavigatorBar {
663
--internal-background-color: transparent;
764
--internal-hover-background-color: rgb(0 0 0 / 0.1);

0 commit comments

Comments
 (0)