Skip to content

Commit 6648524

Browse files
committed
feat: add contextMenu for activityBar
1 parent b72843e commit 6648524

File tree

6 files changed

+44
-9
lines changed

6 files changed

+44
-9
lines changed

src/components/contextMenu/index.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ export function useContextMenu(props: IContextMenu) {
1515
return;
1616
}
1717

18-
const contextView = useContextView();
18+
const contextView = useContextView({
19+
render
20+
});
1921

2022
const onContextMenu = (e: MouseEvent) => {
2123
e.preventDefault();
@@ -35,5 +37,5 @@ export function useContextMenu(props: IContextMenu) {
3537
anchor.removeEventListener('contextmenu', onContextMenu);
3638
};
3739

38-
return { contextView, dispose };
40+
return { ...contextView, dispose };
3941
}

src/components/contextview/style.scss

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ $name: 'context-view';
88
width: initial;
99
z-index: 2500;
1010

11+
.context-view-content {
12+
box-shadow: rgb(0, 0, 0) 0 2px 4px;
13+
overflow: hidden;
14+
}
15+
1116
.#{$name}-block {
1217
bottom: 0;
1318
height: 100%;

src/model/workbench/activityBar.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'reflect-metadata';
33
import { EventBus } from 'mo/common/event';
44
import { observable } from 'mo/common/observable';
55
import { container, inject, injectable } from 'tsyringe';
6+
import { IMenuItem } from 'mo/components/menu';
67

78
/**
89
* The activity bar event definition
@@ -21,12 +22,13 @@ export enum ActivityBarEvent {
2122
}
2223

2324
export interface IActivityBarItem {
24-
id?: string;
25+
id: string;
2526
name?: string;
2627
data?: any;
2728
iconName?: string;
2829
checked?: boolean;
2930
type?: 'normal' | 'global';
31+
contextMenu?: IMenuItem[];
3032
render?: () => React.ReactNode | JSX.Element;
3133
onClick?: (event: React.MouseEvent, item: IActivityBarItem) => void;
3234
}

src/services/workbench/activityBarService.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ export interface IActivityBarService extends Component<IActivityBar> {
1515
* Add click event listener
1616
* @param callback
1717
*/
18-
onClick(callback: Function);
19-
onSelect(callback: Function);
18+
onClick(callback: (key: React.MouseEvent) => void);
19+
onSelect(callback: (key: React.MouseEvent, item: IActivityBarItem) => void);
2020
}
2121

2222
@singleton()
@@ -60,7 +60,7 @@ export class ActivityBarService
6060
this.subscribe(ActivityBarEvent.OnClick, callback);
6161
}
6262

63-
public onSelect(callback: Function) {
63+
public onSelect(callback: (key: React.MouseEvent, item: IActivityBarItem) => void) {
6464
this.subscribe(ActivityBarEvent.Selected, (args) => {
6565
const key = args[0];
6666
const item: IActivityBarItem = args[1];

src/workbench/activityBar/activityBar.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as React from 'react';
33
import { prefixClaName } from 'mo/common/className';
44
import { ID_ACTIVITY_BAR } from 'mo/common/id';
55
import { IActivityBar, IActivityBarItem } from 'mo/model/workbench/activityBar';
6-
76
import ActivityBarItem from './activityBarItem';
87

98
export function ActivityBar(props: IActivityBar) {
@@ -14,7 +13,6 @@ export function ActivityBar(props: IActivityBar) {
1413
}
1514

1615
const onClickBar = (e: React.MouseEvent, item: IActivityBarItem) => {
17-
console.log('ActivityBar onClick:', e);
1816
if (onClick) onClick(e, item);
1917
if (onSelect) {
2018
onSelect(item.id || '', item);
@@ -31,6 +29,7 @@ export function ActivityBar(props: IActivityBar) {
3129
) || [];
3230

3331
const renderItems = (item: IActivityBarItem, index: number) => {
32+
3433
return (
3534
<ActivityBarItem
3635
key={item.id}

src/workbench/activityBar/activityBarItem.tsx

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import * as React from 'react';
2-
import { memo } from 'react';
2+
import { memo, useEffect } from 'react';
33

44
import { prefixClaName, classNames } from 'mo/common/className';
55
import { ID_ACTIVITY_BAR } from 'mo/common/id';
66
import { IActivityBarItem } from 'mo/model/workbench/activityBar';
7+
import { useContextMenu } from 'mo/components/contextMenu';
8+
import { select } from 'mo/common/dom';
9+
import { Menu } from 'mo/components/menu';
710

811
function ActivityBarItem(props: IActivityBarItem) {
912
const {
@@ -12,21 +15,45 @@ function ActivityBarItem(props: IActivityBarItem) {
1215
data = {},
1316
render,
1417
iconName = '',
18+
id,
1519
onClick,
20+
contextMenu = [],
1621
} = props;
1722
let content: React.ReactNode = '';
1823
if (render) {
1924
content = render();
2025
}
2126

27+
const renderContextMenu = () => <Menu data={contextMenu}/>;
28+
let contextViewMenu;
29+
30+
useEffect(() => {
31+
if (contextMenu.length > 0) {
32+
contextViewMenu = useContextMenu({
33+
anchor: select(`#${id}`),
34+
render: renderContextMenu
35+
});
36+
}
37+
return function cleanup() {
38+
contextViewMenu?.dispose();
39+
};
40+
});
41+
2242
const onClickItem = function (event) {
2343
if (onClick) {
2444
onClick(event, props);
2545
}
46+
if (contextMenu.length > 0 && contextViewMenu) {
47+
contextViewMenu.show({
48+
x: event.clientX,
49+
y: event.clientY,
50+
});
51+
}
2652
};
2753

2854
return (
2955
<li
56+
id={id}
3057
onClick={onClickItem}
3158
className={classNames(
3259
prefixClaName('item', ID_ACTIVITY_BAR),

0 commit comments

Comments
 (0)