Skip to content

Commit 8c5bece

Browse files
committed
feat: add contextView and actionBar examples
1 parent 0c35c3b commit 8c5bece

File tree

8 files changed

+57
-38
lines changed

8 files changed

+57
-38
lines changed

src/model/workbench/sidebar.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@ import { observable } from 'mo/common/observable';
22
import { container, inject, injectable } from 'tsyringe';
33

44
export interface ISidebarPane {
5-
id?: string;
6-
name?: string;
7-
render?: () => React.ReactElement | undefined;
5+
id: string;
6+
title?: string;
7+
render?: () => React.ReactNode;
88
}
99

1010
export interface ISidebar {
11-
selected: string;
12-
panes: ISidebarPane[];
11+
current: string;
12+
panes?: ISidebarPane[];
1313
render?: () => React.ReactNode;
1414
}
1515

1616
@observable()
1717
@injectable()
1818
export class SidebarModel implements ISidebar {
19-
public selected: string;
19+
public current: string;
2020
public panes: ISidebarPane[];
2121

2222
constructor(
2323
@inject('SidebarPane') panes: ISidebarPane[] = [],
2424
@inject('Selected') selected: string = ''
2525
) {
2626
this.panes = panes;
27-
this.selected = selected;
27+
this.current = selected;
2828
}
2929

3030
public render!: () => React.ReactNode;

src/services/workbench/sidebarService.ts

+4-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Component } from 'mo/react';
22
import { singleton, container } from 'tsyringe';
3-
import { emit } from '../../common/event';
43
import {
54
ISidebar,
65
ISidebarPane,
@@ -22,7 +21,7 @@ export enum SideBarEvent {
2221
}
2322

2423
export interface ISidebarService extends Component<ISidebar> {
25-
push(data: ISidebarPane | ISidebarPane[]): void;
24+
push(data: ISidebarPane): void;
2625
}
2726

2827
@singleton()
@@ -36,14 +35,8 @@ export class SidebarService
3635
this.state = container.resolve(SidebarModel);
3736
}
3837

39-
@emit(SideBarEvent.DataChanged)
40-
public push(data: ISidebarPane | ISidebarPane[]) {
41-
let original = this.state.panes;
42-
if (Array.isArray(data)) {
43-
// The concat will lost proxy object info
44-
original = original.concat(data);
45-
} else {
46-
original.push(data);
47-
}
38+
public push(data: ISidebarPane) {
39+
const original = this.state.panes;
40+
original?.push(data);
4841
}
4942
}

src/style/main.scss

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
right: 0;
1515
top: 0;
1616
user-select: none;
17-
user-select: none;
1817
width: 100%;
1918
}
2019

src/style/theme.scss

+5
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,8 @@
6565

6666
// .monaco-workbench .codicon {
6767
// }
68+
69+
#{prefix('action-bar')} {
70+
background-color: rgb(37, 37, 38);
71+
color: rgb(204, 204, 204);
72+
}

src/workbench/sidebar/index.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import 'mo/workbench/menuBar/style.scss';
2-
import Sidebar from './sidebar';
2+
export * from './sidebar';
3+
import { Sidebar } from './sidebar';
34
import { sidebarService } from 'mo/services';
45
import { mapState } from 'mo/react';
56

6-
const SidebarView = mapState(Sidebar, sidebarService.getState());
7-
8-
export { Sidebar, SidebarView };
7+
export const SidebarView = mapState(Sidebar, sidebarService.getState());

src/workbench/sidebar/sidebar.tsx

+32-14
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,47 @@
11
import 'mo/workbench/sidebar/style.scss';
22
import * as React from 'react';
3+
import { memo } from 'react';
34
import { prefixClaName } from 'mo/common/className';
45
import { ISidebar, ISidebarPane } from 'mo/model/workbench/sidebar';
56

6-
function Sidebar(props: ISidebar) {
7-
const { panes = [], render } = props;
7+
export interface IHeaderProps {
8+
title: string;
9+
toolbar: React.ReactNode;
10+
}
11+
12+
export const Header = memo<IHeaderProps>(function Header(props: IHeaderProps) {
13+
return (
14+
<header className={'pane-header'}>
15+
<div className={'pane-title'}>
16+
<h2>{props.title}</h2>
17+
</div>
18+
<div className={'pane-toolbar'}>
19+
{ props.toolbar || null }
20+
</div>
21+
</header>
22+
)
23+
});
24+
25+
export function Content(props: React.ComponentProps<any>) {
26+
return (
27+
<div className="pane-content">
28+
{props.children}
29+
</div>
30+
)
31+
}
32+
33+
export function Sidebar(props: ISidebar) {
34+
const { panes = [], render, current } = props;
835

936
let sidebarPane: React.ReactNode = panes?.map((pane: ISidebarPane) => {
1037
return (
1138
<div
1239
key={pane.id}
1340
data-id={pane.id}
41+
style={{ display: pane.id === current ? 'block' : 'none' }}
1442
className={prefixClaName('pane', 'sidebar')}
1543
>
16-
<header className={'pane-header'}>
17-
<div className={'pane-title'}>
18-
<h2>{pane.name}</h2>
19-
</div>
20-
<div className={'pane-toolbar'}></div>
21-
</header>
22-
<div className="pane-content">
23-
{pane.render ? pane.render() : null}
24-
</div>
44+
{ pane.render ? pane.render() : null }
2545
</div>
2646
);
2747
});
@@ -31,6 +51,4 @@ function Sidebar(props: ISidebar) {
3151
}
3252

3353
return <div className={prefixClaName('sidebar')}>{sidebarPane}</div>;
34-
}
35-
36-
export default Sidebar;
54+
}

src/workbench/sidebar/style.scss

+5
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@
4949
right: 0;
5050
top: 0;
5151
}
52+
53+
.pane-toolbar {
54+
flex: 1;
55+
padding-left: 5px;
56+
}
5257
}

src/workbench/workbench.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export function MainBench(props: IMainBench) {
4545

4646
export function Workbench(props: IWorkbench) {
4747
return (
48-
<div className={classNames(APP_PREFIX, Utils.isMacOs() ? 'mac' : '')}>
48+
<div id="molecule" className={classNames(APP_PREFIX, Utils.isMacOs() ? 'mac' : '')}>
4949
<div className={prefixClaName('workbench')}>
5050
<MenuBarView />
5151
<ActivityBarView />

0 commit comments

Comments
 (0)