File tree 6 files changed +44
-9
lines changed
6 files changed +44
-9
lines changed Original file line number Diff line number Diff line change @@ -15,7 +15,9 @@ export function useContextMenu(props: IContextMenu) {
15
15
return ;
16
16
}
17
17
18
- const contextView = useContextView ( ) ;
18
+ const contextView = useContextView ( {
19
+ render
20
+ } ) ;
19
21
20
22
const onContextMenu = ( e : MouseEvent ) => {
21
23
e . preventDefault ( ) ;
@@ -35,5 +37,5 @@ export function useContextMenu(props: IContextMenu) {
35
37
anchor . removeEventListener ( 'contextmenu' , onContextMenu ) ;
36
38
} ;
37
39
38
- return { contextView, dispose } ;
40
+ return { ... contextView , dispose } ;
39
41
}
Original file line number Diff line number Diff line change @@ -8,6 +8,11 @@ $name: 'context-view';
8
8
width : initial ;
9
9
z-index : 2500 ;
10
10
11
+ .context-view-content {
12
+ box-shadow : rgb (0 , 0 , 0 ) 0 2px 4px ;
13
+ overflow : hidden ;
14
+ }
15
+
11
16
.#{$name } -block {
12
17
bottom : 0 ;
13
18
height : 100% ;
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ import 'reflect-metadata';
3
3
import { EventBus } from 'mo/common/event' ;
4
4
import { observable } from 'mo/common/observable' ;
5
5
import { container , inject , injectable } from 'tsyringe' ;
6
+ import { IMenuItem } from 'mo/components/menu' ;
6
7
7
8
/**
8
9
* The activity bar event definition
@@ -21,12 +22,13 @@ export enum ActivityBarEvent {
21
22
}
22
23
23
24
export interface IActivityBarItem {
24
- id ? : string ;
25
+ id : string ;
25
26
name ?: string ;
26
27
data ?: any ;
27
28
iconName ?: string ;
28
29
checked ?: boolean ;
29
30
type ?: 'normal' | 'global' ;
31
+ contextMenu ?: IMenuItem [ ] ;
30
32
render ?: ( ) => React . ReactNode | JSX . Element ;
31
33
onClick ?: ( event : React . MouseEvent , item : IActivityBarItem ) => void ;
32
34
}
Original file line number Diff line number Diff line change @@ -15,8 +15,8 @@ export interface IActivityBarService extends Component<IActivityBar> {
15
15
* Add click event listener
16
16
* @param callback
17
17
*/
18
- onClick ( callback : Function ) ;
19
- onSelect ( callback : Function ) ;
18
+ onClick ( callback : ( key : React . MouseEvent ) => void ) ;
19
+ onSelect ( callback : ( key : React . MouseEvent , item : IActivityBarItem ) => void ) ;
20
20
}
21
21
22
22
@singleton ( )
@@ -60,7 +60,7 @@ export class ActivityBarService
60
60
this . subscribe ( ActivityBarEvent . OnClick , callback ) ;
61
61
}
62
62
63
- public onSelect ( callback : Function ) {
63
+ public onSelect ( callback : ( key : React . MouseEvent , item : IActivityBarItem ) => void ) {
64
64
this . subscribe ( ActivityBarEvent . Selected , ( args ) => {
65
65
const key = args [ 0 ] ;
66
66
const item : IActivityBarItem = args [ 1 ] ;
Original file line number Diff line number Diff line change @@ -3,7 +3,6 @@ import * as React from 'react';
3
3
import { prefixClaName } from 'mo/common/className' ;
4
4
import { ID_ACTIVITY_BAR } from 'mo/common/id' ;
5
5
import { IActivityBar , IActivityBarItem } from 'mo/model/workbench/activityBar' ;
6
-
7
6
import ActivityBarItem from './activityBarItem' ;
8
7
9
8
export function ActivityBar ( props : IActivityBar ) {
@@ -14,7 +13,6 @@ export function ActivityBar(props: IActivityBar) {
14
13
}
15
14
16
15
const onClickBar = ( e : React . MouseEvent , item : IActivityBarItem ) => {
17
- console . log ( 'ActivityBar onClick:' , e ) ;
18
16
if ( onClick ) onClick ( e , item ) ;
19
17
if ( onSelect ) {
20
18
onSelect ( item . id || '' , item ) ;
@@ -31,6 +29,7 @@ export function ActivityBar(props: IActivityBar) {
31
29
) || [ ] ;
32
30
33
31
const renderItems = ( item : IActivityBarItem , index : number ) => {
32
+
34
33
return (
35
34
< ActivityBarItem
36
35
key = { item . id }
Original file line number Diff line number Diff line change 1
1
import * as React from 'react' ;
2
- import { memo } from 'react' ;
2
+ import { memo , useEffect } from 'react' ;
3
3
4
4
import { prefixClaName , classNames } from 'mo/common/className' ;
5
5
import { ID_ACTIVITY_BAR } from 'mo/common/id' ;
6
6
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' ;
7
10
8
11
function ActivityBarItem ( props : IActivityBarItem ) {
9
12
const {
@@ -12,21 +15,45 @@ function ActivityBarItem(props: IActivityBarItem) {
12
15
data = { } ,
13
16
render,
14
17
iconName = '' ,
18
+ id,
15
19
onClick,
20
+ contextMenu = [ ] ,
16
21
} = props ;
17
22
let content : React . ReactNode = '' ;
18
23
if ( render ) {
19
24
content = render ( ) ;
20
25
}
21
26
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
+
22
42
const onClickItem = function ( event ) {
23
43
if ( onClick ) {
24
44
onClick ( event , props ) ;
25
45
}
46
+ if ( contextMenu . length > 0 && contextViewMenu ) {
47
+ contextViewMenu . show ( {
48
+ x : event . clientX ,
49
+ y : event . clientY ,
50
+ } ) ;
51
+ }
26
52
} ;
27
53
28
54
return (
29
55
< li
56
+ id = { id }
30
57
onClick = { onClickItem }
31
58
className = { classNames (
32
59
prefixClaName ( 'item' , ID_ACTIVITY_BAR ) ,
You can’t perform that action at this time.
0 commit comments