Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5ff3c23

Browse files
authored
Fixing hover disappearance in chat pannel (microsoft#219099)
* adding code* adding code to send the event at the lowest level* adding code* adding some code* polish* fixing hover disappearing too quickly, not looking at delay* polishing the code* cleaning* adding cleaning code* settign timeout to 0
1 parentb97d0a2 commit5ff3c23

File tree

4 files changed

+97
-27
lines changed

4 files changed

+97
-27
lines changed

‎src/vs/editor/browser/controller/mouseHandler.ts

Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableEle
2424

2525
exportinterfaceIPointerHandlerHelper{
2626
viewDomNode:HTMLElement;
27+
overflowWidgetsDomNode:HTMLElement|null;
2728
linesContentDomNode:HTMLElement;
2829
viewLinesDomNode:HTMLElement;
2930

@@ -62,6 +63,8 @@ export class MouseHandler extends ViewEventHandler {
6263
privatelastMouseLeaveTime:number;
6364
private_height:number;
6465
private_mouseLeaveMonitor:IDisposable|null=null;
66+
private_mouseOnOverflowWidgetsDomNode:boolean=false;
67+
private_mouseOnViewDomNode:boolean=false;
6568

6669
constructor(context:ViewContext,viewController:ViewController,viewHelper:IPointerHandlerHelper){
6770
super();
@@ -76,7 +79,7 @@ export class MouseHandler extends ViewEventHandler {
7679
this.viewController,
7780
this.viewHelper,
7881
this.mouseTargetFactory,
79-
(e,testEventTarget)=>this._createMouseTarget(e,testEventTarget),
82+
(e,testEventTarget)=>this._createMouseTargetForView(e,testEventTarget),
8083
(e)=>this._getMouseColumn(e)
8184
));
8285

@@ -88,7 +91,8 @@ export class MouseHandler extends ViewEventHandler {
8891
this._register(mouseEvents.onContextMenu(this.viewHelper.viewDomNode,(e)=>this._onContextMenu(e,true)));
8992

9093
this._register(mouseEvents.onMouseMove(this.viewHelper.viewDomNode,(e)=>{
91-
this._onMouseMove(e);
94+
this._mouseOnViewDomNode=true;
95+
this._onMouseMoveOverView(e);
9296

9397
// See https://github.com/microsoft/vscode/issues/138789
9498
// When moving the mouse really quickly, the browser sometimes forgets to
@@ -101,15 +105,45 @@ export class MouseHandler extends ViewEventHandler {
101105
this._mouseLeaveMonitor=dom.addDisposableListener(this.viewHelper.viewDomNode.ownerDocument,'mousemove',(e)=>{
102106
if(!this.viewHelper.viewDomNode.contains(e.targetasNode|null)){
103107
// went outside the editor!
104-
this._onMouseLeave(newEditorMouseEvent(e,false,this.viewHelper.viewDomNode));
108+
this._mouseOnViewDomNode=false;
109+
setTimeout(()=>{
110+
if(!this._mouseOnOverflowWidgetsDomNode){
111+
this._onMouseLeave(newEditorMouseEvent(e,false,this.viewHelper.viewDomNode));
112+
}
113+
},0);
105114
}
106115
});
107116
}
108117
}));
109118

110119
this._register(mouseEvents.onMouseUp(this.viewHelper.viewDomNode,(e)=>this._onMouseUp(e)));
111120

112-
this._register(mouseEvents.onMouseLeave(this.viewHelper.viewDomNode,(e)=>this._onMouseLeave(e)));
121+
this._register(mouseEvents.onMouseLeave(this.viewHelper.viewDomNode,(e)=>{
122+
this._mouseOnViewDomNode=false;
123+
setTimeout(()=>{
124+
if(!this._mouseOnOverflowWidgetsDomNode){
125+
this._onMouseLeave(e);
126+
}
127+
},0);
128+
}));
129+
130+
constoverflowWidgetsDomNode=this.viewHelper.overflowWidgetsDomNode;
131+
if(overflowWidgetsDomNode){
132+
this._register(mouseEvents.onMouseMove(overflowWidgetsDomNode,(e)=>{
133+
this._mouseOnOverflowWidgetsDomNode=true;
134+
this._mouseLeaveMonitor?.dispose();
135+
this._mouseLeaveMonitor=null;
136+
this._onMouseMoveOverOverflowWidgetsDomNode(e);
137+
}));
138+
this._register(mouseEvents.onMouseLeave(overflowWidgetsDomNode,(e)=>{
139+
this._mouseOnOverflowWidgetsDomNode=false;
140+
setTimeout(()=>{
141+
if(!this._mouseOnViewDomNode){
142+
this._onMouseLeave(e);
143+
}
144+
},0);
145+
}));
146+
}
113147

114148
// `pointerdown` events can't be used to determine if there's a double click, or triple click
115149
// because their `e.detail` is always 0.
@@ -234,10 +268,10 @@ export class MouseHandler extends ViewEventHandler {
234268
}
235269

236270
constrelativePos=createCoordinatesRelativeToEditor(this.viewHelper.viewDomNode,editorPos,pos);
237-
returnthis.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),editorPos,pos,relativePos,null);
271+
returnthis.mouseTargetFactory.createMouseTargetForView(this.viewHelper.getLastRenderData(),editorPos,pos,relativePos,null);
238272
}
239273

240-
protected_createMouseTarget(e:EditorMouseEvent,testEventTarget:boolean):IMouseTarget{
274+
protected_createMouseTargetForView(e:EditorMouseEvent,testEventTarget:boolean):IMouseTarget{
241275
lettarget=e.target;
242276
if(!this.viewHelper.viewDomNode.contains(target)){
243277
constshadowRoot=dom.getShadowRoot(this.viewHelper.viewDomNode);
@@ -247,7 +281,11 @@ export class MouseHandler extends ViewEventHandler {
247281
);
248282
}
249283
}
250-
returnthis.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),e.editorPos,e.pos,e.relativePos,testEventTarget ?target :null);
284+
returnthis.mouseTargetFactory.createMouseTargetForView(this.viewHelper.getLastRenderData(),e.editorPos,e.pos,e.relativePos,testEventTarget ?target :null);
285+
}
286+
287+
private_createMouseTargetForOverflowWidgetsDomNode(e:EditorMouseEvent):IMouseTarget{
288+
returnthis.mouseTargetFactory.createMouseTargetForOverflowWidgetsDomNode(this.viewHelper.getLastRenderData(),e.editorPos,e.pos,e.relativePos,e.target);
251289
}
252290

253291
private_getMouseColumn(e:EditorMouseEvent):number{
@@ -257,30 +295,45 @@ export class MouseHandler extends ViewEventHandler {
257295
protected_onContextMenu(e:EditorMouseEvent,testEventTarget:boolean):void{
258296
this.viewController.emitContextMenu({
259297
event:e,
260-
target:this._createMouseTarget(e,testEventTarget)
298+
target:this._createMouseTargetForView(e,testEventTarget)
299+
});
300+
}
301+
302+
protected_onMouseMoveOverView(e:EditorMouseEvent):void{
303+
this._onMouseMove(e,this._createMouseTargetForView(e,true));
304+
}
305+
306+
private_onMouseMoveOverOverflowWidgetsDomNode(e:EditorMouseEvent):void{
307+
this._onMouseMove(e,this._createMouseTargetForOverflowWidgetsDomNode(e));
308+
}
309+
310+
private_onMouseMove(e:EditorMouseEvent,target:IMouseTarget):void{
311+
constshouldIgnoreMouseMoveEvent=this._shouldIgnoreMouseMoveEvent(e);
312+
if(shouldIgnoreMouseMoveEvent){
313+
returnundefined;
314+
}
315+
this.viewController.emitMouseMove({
316+
event:e,
317+
target
261318
});
262319
}
263320

264-
protected_onMouseMove(e:EditorMouseEvent):void{
321+
private_shouldIgnoreMouseMoveEvent(e:EditorMouseEvent):boolean{
265322
consttargetIsWidget=this.mouseTargetFactory.mouseTargetIsWidget(e);
266323
if(!targetIsWidget){
267324
e.preventDefault();
268325
}
269326

270327
if(this._mouseDownOperation.isActive()){
271328
// In selection/drag operation
272-
return;
329+
returntrue;
273330
}
274331
constactualMouseMoveTime=e.timestamp;
275332
if(actualMouseMoveTime<this.lastMouseLeaveTime){
276333
// Due to throttling, this event occurred before the mouse left the editor, therefore ignore it.
277-
return;
334+
returntrue;
278335
}
279-
280-
this.viewController.emitMouseMove({
281-
event:e,
282-
target:this._createMouseTarget(e,true)
283-
});
336+
returnfalse;
284337
}
285338

286339
protected_onMouseLeave(e:EditorMouseEvent):void{
@@ -298,12 +351,12 @@ export class MouseHandler extends ViewEventHandler {
298351
protected_onMouseUp(e:EditorMouseEvent):void{
299352
this.viewController.emitMouseUp({
300353
event:e,
301-
target:this._createMouseTarget(e,true)
354+
target:this._createMouseTargetForView(e,true)
302355
});
303356
}
304357

305358
protected_onMouseDown(e:EditorMouseEvent,pointerId:number):void{
306-
constt=this._createMouseTarget(e,true);
359+
constt=this._createMouseTargetForView(e,true);
307360

308361
consttargetIsContent=(t.type===MouseTargetType.CONTENT_TEXT||t.type===MouseTargetType.CONTENT_EMPTY);
309362
consttargetIsGutter=(t.type===MouseTargetType.GUTTER_GLYPH_MARGIN||t.type===MouseTargetType.GUTTER_LINE_NUMBERS||t.type===MouseTargetType.GUTTER_LINE_DECORATIONS);
@@ -742,7 +795,7 @@ class TopBottomDragScrollingOperation extends Disposable {
742795
consthorizontalScrollbarHeight=this._context.configuration.options.get(EditorOption.layoutInfo).horizontalScrollbarHeight;
743796
constpos=newPageCoordinates(this._mouseEvent.pos.x,editorPos.y+editorPos.height-horizontalScrollbarHeight-0.1);
744797
constrelativePos=createCoordinatesRelativeToEditor(this._viewHelper.viewDomNode,editorPos,pos);
745-
mouseTarget=this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(),editorPos,pos,relativePos,null);
798+
mouseTarget=this._mouseTargetFactory.createMouseTargetForView(this._viewHelper.getLastRenderData(),editorPos,pos,relativePos,null);
746799
}
747800
if(!mouseTarget.position||mouseTarget.position.lineNumber!==edgeLineNumber){
748801
if(this._position.outsidePosition==='above'){

‎src/vs/editor/browser/controller/mouseTarget.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ export class HitTestContext {
238238
publicreadonlyviewModel:IViewModel;
239239
publicreadonlylayoutInfo:EditorLayoutInfo;
240240
publicreadonlyviewDomNode:HTMLElement;
241+
publicreadonlyoverflowWidgetsDomNode:HTMLElement|null;
241242
publicreadonlylineHeight:number;
242243
publicreadonlystickyTabStops:boolean;
243244
publicreadonlytypicalHalfwidthCharacterWidth:number;
@@ -251,6 +252,7 @@ export class HitTestContext {
251252
constoptions=context.configuration.options;
252253
this.layoutInfo=options.get(EditorOption.layoutInfo);
253254
this.viewDomNode=viewHelper.viewDomNode;
255+
this.overflowWidgetsDomNode=viewHelper.overflowWidgetsDomNode??null;
254256
this.lineHeight=options.get(EditorOption.lineHeight);
255257
this.stickyTabStops=options.get(EditorOption.stickyTabStops);
256258
this.typicalHalfwidthCharacterWidth=options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;
@@ -413,6 +415,7 @@ class HitTestRequest extends BareHitTestRequest {
413415
private_useHitTestTarget:boolean;
414416
private_targetPathCacheElement:HTMLElement|null=null;
415417
private_targetPathCacheValue:Uint8Array=newUint8Array(0);
418+
private_targetElement:HTMLElement|null=null;
416419

417420
publicgettarget():HTMLElement|null{
418421
if(this._useHitTestTarget){
@@ -422,17 +425,18 @@ class HitTestRequest extends BareHitTestRequest {
422425
}
423426

424427
publicgettargetPath():Uint8Array{
425-
if(this._targetPathCacheElement!==this.target){
428+
if(this._targetPathCacheElement!==this.target&&this._targetElement){
426429
this._targetPathCacheElement=this.target;
427-
this._targetPathCacheValue=PartFingerprints.collect(this.target,this._ctx.viewDomNode);
430+
this._targetPathCacheValue=PartFingerprints.collect(this.target,this._targetElement);
428431
}
429432
returnthis._targetPathCacheValue;
430433
}
431434

432-
constructor(ctx:HitTestContext,editorPos:EditorPagePosition,pos:PageCoordinates,relativePos:CoordinatesRelativeToEditor,eventTarget:HTMLElement|null){
435+
constructor(ctx:HitTestContext,editorPos:EditorPagePosition,pos:PageCoordinates,relativePos:CoordinatesRelativeToEditor,eventTarget:HTMLElement|null,targetElement:HTMLElement|null=null){
433436
super(ctx,editorPos,pos,relativePos);
434437
this._ctx=ctx;
435438
this._eventTarget=eventTarget;
439+
this._targetElement=targetElement;
436440

437441
// If no event target is passed in, we will use the hit test target
438442
consthasEventTarget=Boolean(this._eventTarget);
@@ -532,9 +536,9 @@ export class MouseTargetFactory {
532536
returnfalse;
533537
}
534538

535-
publiccreateMouseTarget(lastRenderData:PointerHandlerLastRenderData,editorPos:EditorPagePosition,pos:PageCoordinates,relativePos:CoordinatesRelativeToEditor,target:HTMLElement|null):IMouseTarget{
539+
publiccreateMouseTargetForView(lastRenderData:PointerHandlerLastRenderData,editorPos:EditorPagePosition,pos:PageCoordinates,relativePos:CoordinatesRelativeToEditor,target:HTMLElement|null):IMouseTarget{
536540
constctx=newHitTestContext(this._context,this._viewHelper,lastRenderData);
537-
constrequest=newHitTestRequest(ctx,editorPos,pos,relativePos,target);
541+
constrequest=newHitTestRequest(ctx,editorPos,pos,relativePos,target,ctx.viewDomNode);
538542
try{
539543
constr=MouseTargetFactory._createMouseTarget(ctx,request);
540544

@@ -555,6 +559,16 @@ export class MouseTargetFactory {
555559
}
556560
}
557561

562+
publiccreateMouseTargetForOverflowWidgetsDomNode(lastRenderData:PointerHandlerLastRenderData,editorPos:EditorPagePosition,pos:PageCoordinates,relativePos:CoordinatesRelativeToEditor,target:HTMLElement|null){
563+
constctx=newHitTestContext(this._context,this._viewHelper,lastRenderData);
564+
constrequest=newHitTestRequest(ctx,editorPos,pos,relativePos,target,ctx.overflowWidgetsDomNode);
565+
try{
566+
returnMouseTargetFactory._createMouseTarget(ctx,request);
567+
}catch(err){
568+
returnrequest.fulfillUnknown();
569+
}
570+
}
571+
558572
privatestatic_createMouseTarget(ctx:HitTestContext,request:HitTestRequest):IMouseTarget{
559573

560574
// console.log(`${domHitTestExecuted ? '=>' : ''}CAME IN REQUEST: ${request}`);

‎src/vs/editor/browser/controller/pointerHandler.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class PointerEventHandler extends MouseHandler {
4747
// PonterEvents
4848
constpointerEvents=newEditorPointerEventFactory(this.viewHelper.viewDomNode);
4949

50-
this._register(pointerEvents.onPointerMove(this.viewHelper.viewDomNode,(e)=>this._onMouseMove(e)));
50+
this._register(pointerEvents.onPointerMove(this.viewHelper.viewDomNode,(e)=>this._onMouseMoveOverView(e)));
5151
this._register(pointerEvents.onPointerUp(this.viewHelper.viewDomNode,(e)=>this._onMouseUp(e)));
5252
this._register(pointerEvents.onPointerLeave(this.viewHelper.viewDomNode,(e)=>this._onMouseLeave(e)));
5353
this._register(pointerEvents.onPointerDown(this.viewHelper.viewDomNode,(e,pointerId)=>this._onMouseDown(e,pointerId)));
@@ -73,7 +73,7 @@ export class PointerEventHandler extends MouseHandler {
7373
}
7474

7575
private_dispatchGesture(event:GestureEvent,inSelectionMode:boolean):void{
76-
consttarget=this._createMouseTarget(newEditorMouseEvent(event,false,this.viewHelper.viewDomNode),false);
76+
consttarget=this._createMouseTargetForView(newEditorMouseEvent(event,false,this.viewHelper.viewDomNode),false);
7777
if(target.position){
7878
this.viewController.dispatchMouse({
7979
position:target.position,
@@ -119,7 +119,7 @@ class TouchHandler extends MouseHandler {
119119

120120
this.viewHelper.focusTextArea();
121121

122-
consttarget=this._createMouseTarget(newEditorMouseEvent(event,false,this.viewHelper.viewDomNode),false);
122+
consttarget=this._createMouseTargetForView(newEditorMouseEvent(event,false,this.viewHelper.viewDomNode),false);
123123

124124
if(target.position){
125125
// Send the tap event also to the <textarea> (for input purposes)

‎src/vs/editor/browser/view.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export class View extends ViewEventHandler {
9797
privatereadonly_linesContent:FastDomNode<HTMLElement>;
9898
publicreadonlydomNode:FastDomNode<HTMLElement>;
9999
privatereadonly_overflowGuardContainer:FastDomNode<HTMLElement>;
100+
privatereadonly_overflowWidgetsDomNode:HTMLElement|null;
100101

101102
// Actual mutable state
102103
private_shouldRecomputeGlyphMarginLanes:boolean=false;
@@ -114,6 +115,7 @@ export class View extends ViewEventHandler {
114115
super();
115116
this._selections=[newSelection(1,1,1,1)];
116117
this._renderAnimationFrame=null;
118+
this._overflowWidgetsDomNode=overflowWidgetsDomNode??null;
117119

118120
constviewController=newViewController(configuration,model,userInputEvents,commandDelegate);
119121

@@ -278,6 +280,7 @@ export class View extends ViewEventHandler {
278280
private_createPointerHandlerHelper():IPointerHandlerHelper{
279281
return{
280282
viewDomNode:this.domNode.domNode,
283+
overflowWidgetsDomNode:this._overflowWidgetsDomNode,
281284
linesContentDomNode:this._linesContent.domNode,
282285
viewLinesDomNode:this._viewLines.getDomNode().domNode,
283286

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp