Skip to content

Commit cd31e15

Browse files
committed
feat: add global items in actiitybar
1 parent 82c0a4e commit cd31e15

File tree

10 files changed

+100
-28
lines changed

10 files changed

+100
-28
lines changed

src/core/workbench/activityBar.ts

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface IActivityBarItem {
2323
data?: any;
2424
iconName?: string;
2525
checked?: boolean;
26+
type?: 'normal' | 'global';
2627
render?: () => React.ReactNode | JSX.Element;
2728
onClick?: (event: React.MouseEvent, item: IActivityBarItem) => void;
2829
}
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "activitybar",
3+
"displayName": "Test extension",
4+
"description": "This is a test ",
5+
"version": "1.0.0",
6+
"publisher": "vscode",
7+
"license": "MIT",
8+
"engines": {
9+
"vscode": "*"
10+
},
11+
"kindOf": ["ui"],
12+
"main": "./src/index"
13+
}
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { activityBar } from 'mo/index';
2+
import { ActivityBarEvent, IActivityBarItem } from 'mo/core/workbench/activityBar';
3+
import { ExtensionService } from 'mo/services/extensionService';
4+
5+
function initActivityBar(extensionCtx: ExtensionService) {
6+
const globalSettings: IActivityBarItem = {
7+
id: 'global-settings',
8+
name: 'Settings',
9+
iconName: 'codicon-settings-gear',
10+
type: 'global',
11+
onClick: function(e, options) {
12+
13+
},
14+
};
15+
16+
const globalUserAccount: IActivityBarItem = {
17+
id: 'global-Account',
18+
name: 'Account',
19+
iconName: 'codicon-account',
20+
type: 'global',
21+
onClick: function(e, options) {
22+
23+
},
24+
};
25+
26+
activityBar.push([globalUserAccount, globalSettings]);
27+
28+
activityBar.subscribe(ActivityBarEvent.OnClick, (data) => {
29+
console.log('Explore activityBar subscribe onClick:', data);
30+
});
31+
}
32+
33+
export function activate(extensionCtx: ExtensionService) {
34+
initActivityBar(extensionCtx);
35+
}

src/extensions/explore/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "activitybar",
2+
"name": "explore",
33
"displayName": "Test extension",
44
"description": "This is a test ",
55
"version": "1.0.0",

src/extensions/explore/src/index.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ function initActivityBar(extensionCtx: ExtensionService) {
1414

1515
},
1616
};
17-
1817
activityBar.push([folderFeat]);
1918

2019
activityBar.subscribe(ActivityBarEvent.OnClick, (data) => {

src/extensions/index.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
/**
2-
* Default extensions
3-
*/
4-
51
import { IExtension, IExtensionEntry } from 'mo/core/extension';
62
import * as ExploreBarPkg from './explore/package.json';
73
import * as SearchBarPkg from './search/package.json';
4+
import * as ActivityBarPkg from './activityBar/package.json';
5+
6+
/**
7+
* Default extensions
8+
*/
89

910
const requireContext = require.context('./');
1011

1112
const ExploreBar: IExtension = ExploreBarPkg as any; // require('./explore/package.json');
1213
ExploreBar.activate = require('./explore/src/index').activate;
1314

15+
const ActivityBar: IExtension = ActivityBarPkg as any; // require('./explore/package.json');
16+
ActivityBar.activate = require('./activityBar/src/index').activate;
1417

1518
const SearchBar: IExtension = SearchBarPkg as any; // require('./search/package.json');
1619
SearchBar.activate = require('./search/src/index').activate;
@@ -21,9 +24,8 @@ export const defaultExtensions: IExtensionEntry = {
2124
location: requireContext,
2225
extensions: [
2326
ExploreBar,
27+
ActivityBar,
2428
SearchBar,
2529
Themes,
26-
// 'theme-defaults',
27-
// 'theme-monokai',
2830
],
2931
};

src/workbench/activityBar/activityBar.tsx

+22-8
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,37 @@ export interface IActivityBarProps {
1010

1111
function ActivityBar(props: IActivityBar) {
1212
const { data, render, selected, onClick } = props;
13-
let content: React.ReactNode = data?.map((item: IActivityBarItem, index: number) => (
14-
<ActivityBarItem key={item.id} {...item} data-index={index} checked={selected === item.id}/>
15-
));
13+
1614
if (render) {
17-
content = render();
15+
return (
16+
<div className={prefixClaName(SYMBOL_ACTIVITY_BAR)}>
17+
{render()}
18+
</div>
19+
);
1820
}
1921

22+
const normalBarItems = data?.filter((item: IActivityBarItem) => !item.type || item.type === 'normal');
23+
const globalBarItems = data?.filter((item: IActivityBarItem) => item.type && item.type === 'global');
24+
25+
const renderItems = (item: IActivityBarItem, index: number) => (
26+
<ActivityBarItem key={item.id} {...item} data-index={index} checked={selected === item.id}/>
27+
);
28+
2029
const click = (e: React.MouseEvent) => {
2130
console.log('ActivityBar onClick:', e);
2231
onClick(e, {} as any );
2332
};
2433

2534
return (
26-
<div className={prefixClaName(SYMBOL_ACTIVITY_BAR)} onClick={click}>
27-
<ul className={prefixClaName('container', SYMBOL_ACTIVITY_BAR)}>
28-
{content}
29-
</ul>
35+
<div className={prefixClaName(SYMBOL_ACTIVITY_BAR)} id={SYMBOL_ACTIVITY_BAR} onClick={click}>
36+
<div className={prefixClaName('container', SYMBOL_ACTIVITY_BAR)}>
37+
<ul className={'normal-items'}>
38+
{normalBarItems.map(renderItems)}
39+
</ul>
40+
<ul className={'global-items'}>
41+
{globalBarItems.map(renderItems)}
42+
</ul>
43+
</div>
3044
</div>
3145
);
3246
};

src/workbench/activityBar/style.scss

+17-7
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,30 @@
88
width: 48px;
99
z-index: 1;
1010

11-
.#{$activityBar}-container {
11+
.active-item-indicator {
1212
height: 100%;
13+
left: 0;
14+
position: absolute;
15+
top: 0;
16+
width: 2px;
17+
}
18+
}
19+
20+
.#{$activityBar}-container {
21+
height: 100%;
22+
position: relative;
23+
width: 100%;
24+
25+
ul {
1326
margin: 0;
1427
padding: 0;
15-
position: relative;
16-
width: 100%;
1728
}
1829

19-
.active-item-indicator {
20-
height: 100%;
30+
.global-items {
31+
bottom: 0;
2132
left: 0;
2233
position: absolute;
23-
top: 0;
24-
width: 2px;
34+
right: 0;
2535
}
2636
}
2737

src/workbench/index.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { SidebarView } from 'mo/workbench/sidebar';
1616
import { MenuBarView } from 'mo/workbench/menuBar';
1717
import { ActivityBarView } from 'mo/workbench/activityBar';
1818
import StatusBar from 'mo/workbench/statusBar';
19-
import SettingsBar from 'mo/workbench/settings';
2019
import Panel from 'mo/workbench/panel';
2120

2221
export interface IWorkbenchProps {
@@ -66,7 +65,6 @@ export function Workbench(props: IWorkbenchProps) {
6665
<ActivityBarProvider>
6766
<ActivityBarView />
6867
</ActivityBarProvider>
69-
<SettingsBar />
7068
<MainBench/>
7169
</div>
7270
<StatusBar />

src/workbench/settings/index.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { memo } from 'react';
44

55
import { prefixClaName } from 'mo/common/className';
66

7-
export function SettingBar() {
7+
export function Settings() {
88
return (
99
<div className={prefixClaName('settings')}>
10-
<a className='settings-action codicon codicon-settings-gear'></a>
10+
Settings
1111
</div>
1212
);
1313
};
1414

15-
export default memo(SettingBar);
15+
export default memo(Settings);

0 commit comments

Comments
 (0)