11import * as React from 'react' ;
2- import { useCallback , useEffect } from 'react' ;
3- import { useContextMenu } from 'mo/components/contextMenu' ;
4- import { select } from 'mo/common/dom' ;
2+ import { useCallback } from 'react' ;
53import { IMenuItemProps , Menu } from 'mo/components/menu' ;
64import { ID_ACTIVITY_BAR } from 'mo/common/id' ;
75import { IActivityBar , IActivityBarItem } from 'mo/model/workbench/activityBar' ;
@@ -14,8 +12,10 @@ import {
1412 containerClassName ,
1513 defaultClassName ,
1614 globalItemsClassName ,
15+ itemClassName ,
1716 normalItemsClassName ,
1817} from './base' ;
18+ import { useContextView } from 'mo/components' ;
1919
2020export function ActivityBar ( props : IActivityBar & IActivityBarController ) {
2121 const {
@@ -37,14 +37,12 @@ export function ActivityBar(props: IActivityBar & IActivityBarController) {
3737 }
3838 } ;
3939
40- const normalBarItems =
41- data ?. filter (
42- ( item : IActivityBarItem ) => ! item . type || item . type === 'normal'
43- ) || [ ] ;
44- const globalBarItems =
45- data ?. filter (
46- ( item : IActivityBarItem ) => item . type && item . type === 'global'
47- ) || [ ] ;
40+ const normalBarItems = data . filter (
41+ ( item ) => item . type !== 'global' && ! item . hidden
42+ ) ;
43+ const globalBarItems = data . filter (
44+ ( item ) => item . type === 'global' && ! item . hidden
45+ ) ;
4846
4947 const renderItems = ( item : IActivityBarItem , index : number ) => {
5048 return (
@@ -59,32 +57,66 @@ export function ActivityBar(props: IActivityBar & IActivityBarController) {
5957 ) ;
6058 } ;
6159
62- let contextViewMenu ;
60+ const renderContextMenu = ( ) => (
61+ < Menu onClick = { onClickMenuItem } data = { contextMenu } />
62+ ) ;
63+
64+ const contextView = useContextView ( {
65+ render : renderContextMenu ,
66+ } ) ;
67+
6368 const onClickMenuItem = useCallback (
6469 ( e : React . MouseEvent , item : IMenuItemProps | undefined ) => {
6570 onContextMenuClick ?.( e , item ) ;
66- contextViewMenu ?. dispose ( ) ;
71+ contextView ?. hide ( ) ;
6772 } ,
6873 [ contextMenu ]
6974 ) ;
70- const renderContextMenu = ( ) => (
71- < Menu onClick = { onClickMenuItem } data = { contextMenu } />
72- ) ;
7375
74- useEffect ( ( ) => {
75- if ( contextMenu . length > 0 ) {
76- contextViewMenu = useContextMenu ( {
77- anchor : select ( `#${ ID_ACTIVITY_BAR } ` ) ,
78- render : renderContextMenu ,
79- } ) ;
76+ const handleRightClick = ( e ) => {
77+ e . preventDefault ( ) ;
78+ e . stopPropagation ( ) ;
79+ const doms = document . elementsFromPoint ( e . pageX , e . pageY ) ;
80+ const itemDom = doms . find ( ( dom ) =>
81+ dom . classList . contains ( itemClassName )
82+ ) ;
83+ if ( itemDom ) {
84+ const rect = itemDom . getBoundingClientRect ( ) ;
85+ const extraContextMenu = contextMenu . concat ( ) ;
86+ const targetContextMenu = contextMenu . find (
87+ ( menu ) => menu . id === itemDom ?. id
88+ ) ;
89+ targetContextMenu &&
90+ extraContextMenu . unshift (
91+ ...( [
92+ {
93+ id : itemDom . id ,
94+ icon : 'check' ,
95+ name : targetContextMenu . name ,
96+ } ,
97+ {
98+ type : 'divider' ,
99+ } ,
100+ ] as IMenuItemProps [ ] )
101+ ) ;
102+ contextView . show (
103+ {
104+ x : rect . x + rect . width / 2 ,
105+ y : rect . y + rect . height ,
106+ } ,
107+ ( ) => < Menu onClick = { onClickMenuItem } data = { extraContextMenu } />
108+ ) ;
109+ } else {
110+ contextView . show ( { x : e . pageX , y : e . pageY } ) ;
80111 }
81- return function cleanup ( ) {
82- contextViewMenu ?. dispose ( ) ;
83- } ;
84- } ) ;
112+ } ;
85113
86114 return (
87- < div className = { defaultClassName } id = { ID_ACTIVITY_BAR } >
115+ < div
116+ className = { defaultClassName }
117+ onContextMenu = { handleRightClick }
118+ id = { ID_ACTIVITY_BAR }
119+ >
88120 < div className = { containerClassName } >
89121 < Scrollable className = { normalItemsClassName } >
90122 < ul > { normalBarItems . map ( renderItems ) } </ ul >
0 commit comments