Skip to content

Commit 796a969

Browse files
committed
scm: working input
1 parent 63c9503 commit 796a969

5 files changed

Lines changed: 127 additions & 40 deletions

File tree

src/vs/base/browser/ui/list/listWidget.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,22 @@ class TraitSpliceable<T> implements ISpliceable<T> {
225225
}
226226
}
227227

228-
function isInputElement(e: HTMLElement): boolean {
228+
export function isInputElement(e: HTMLElement): boolean {
229229
return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA';
230230
}
231231

232+
export function isMonacoEditor(e: HTMLElement): boolean {
233+
if (DOM.hasClass(e, 'monaco-editor')) {
234+
return true;
235+
}
236+
237+
if (!e.parentElement) {
238+
return false;
239+
}
240+
241+
return isMonacoEditor(e.parentElement);
242+
}
243+
232244
class KeyboardController<T> implements IDisposable {
233245

234246
private readonly disposables = new DisposableStore();
@@ -572,12 +584,20 @@ export class MouseController<T> implements IDisposable {
572584
}
573585

574586
private onMouseDown(e: IListMouseEvent<T> | IListTouchEvent<T>): void {
587+
if (isMonacoEditor(e.browserEvent.target as HTMLElement)) {
588+
return;
589+
}
590+
575591
if (document.activeElement !== e.browserEvent.target) {
576592
this.list.domFocus();
577593
}
578594
}
579595

580596
private onContextMenu(e: IListContextMenuEvent<T>): void {
597+
if (isMonacoEditor(e.browserEvent.target as HTMLElement)) {
598+
return;
599+
}
600+
581601
const focus = typeof e.index === 'undefined' ? [] : [e.index];
582602
this.list.setFocus(focus, e.browserEvent);
583603
}
@@ -587,7 +607,7 @@ export class MouseController<T> implements IDisposable {
587607
return;
588608
}
589609

590-
if (isInputElement(e.browserEvent.target as HTMLElement)) {
610+
if (isInputElement(e.browserEvent.target as HTMLElement) || isMonacoEditor(e.browserEvent.target as HTMLElement)) {
591611
return;
592612
}
593613

@@ -621,7 +641,7 @@ export class MouseController<T> implements IDisposable {
621641
}
622642

623643
protected onDoubleClick(e: IListMouseEvent<T>): void {
624-
if (isInputElement(e.browserEvent.target as HTMLElement)) {
644+
if (isInputElement(e.browserEvent.target as HTMLElement) || isMonacoEditor(e.browserEvent.target as HTMLElement)) {
625645
return;
626646
}
627647

src/vs/base/browser/ui/tree/abstractTree.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import 'vs/css!./media/tree';
77
import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle';
8-
import { IListOptions, List, IListStyles, MouseController, DefaultKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/listWidget';
8+
import { IListOptions, List, IListStyles, MouseController, DefaultKeyboardNavigationDelegate, isInputElement, isMonacoEditor } from 'vs/base/browser/ui/list/listWidget';
99
import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list';
1010
import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass, createStyleSheet, clearNode, addClasses, removeClasses } from 'vs/base/browser/dom';
1111
import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event';
@@ -917,10 +917,6 @@ class TypeFilterController<T, TFilterData> implements IDisposable {
917917
}
918918
}
919919

920-
function isInputElement(e: HTMLElement): boolean {
921-
return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA';
922-
}
923-
924920
function asTreeMouseEvent<T>(event: IListMouseEvent<ITreeNode<T, any>>): ITreeMouseEvent<T> {
925921
let target: TreeMouseEventTarget = TreeMouseEventTarget.Unknown;
926922

@@ -1084,7 +1080,7 @@ class TreeNodeListMouseController<T, TFilterData, TRef> extends MouseController<
10841080
}
10851081

10861082
protected onViewPointer(e: IListMouseEvent<ITreeNode<T, TFilterData>>): void {
1087-
if (isInputElement(e.browserEvent.target as HTMLElement)) {
1083+
if (isInputElement(e.browserEvent.target as HTMLElement) || isMonacoEditor(e.browserEvent.target as HTMLElement)) {
10881084
return;
10891085
}
10901086

src/vs/editor/common/services/editorWorkerServiceImpl.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { regExpFlags } from 'vs/base/common/strings';
2222
import { isNonEmptyArray } from 'vs/base/common/arrays';
2323
import { ILogService } from 'vs/platform/log/common/log';
2424
import { StopWatch } from 'vs/base/common/stopwatch';
25+
import { canceled } from 'vs/base/common/errors';
2526

2627
/**
2728
* Stop syncing a model to the worker if it was not needed for 1 min.
@@ -380,6 +381,7 @@ export class EditorWorkerClient extends Disposable {
380381
private _worker: IWorkerClient<EditorSimpleWorker> | null;
381382
private readonly _workerFactory: DefaultWorkerFactory;
382383
private _modelManager: EditorModelManager | null;
384+
private _disposed = false;
383385

384386
constructor(modelService: IModelService, keepIdleModels: boolean, label: string | undefined) {
385387
super();
@@ -427,6 +429,9 @@ export class EditorWorkerClient extends Disposable {
427429
}
428430

429431
protected _withSyncedResources(resources: URI[]): Promise<EditorSimpleWorker> {
432+
if (this._disposed) {
433+
return Promise.reject(canceled());
434+
}
430435
return this._getProxy().then((proxy) => {
431436
this._getOrCreateModelManager(proxy).ensureSyncedResources(resources);
432437
return proxy;
@@ -495,4 +500,9 @@ export class EditorWorkerClient extends Disposable {
495500
return proxy.navigateValueSet(resource.toString(), range, up, wordDef, wordDefFlags);
496501
});
497502
}
503+
504+
dispose(): void {
505+
super.dispose();
506+
this._disposed = true;
507+
}
498508
}

src/vs/workbench/contrib/scm/browser/media/scm.css

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,36 +32,41 @@
3232

3333
.scm-viewlet .scm-provider {
3434
display: flex;
35-
align-items: center;
35+
flex-direction: column;
3636
height: 100%;
37+
}
38+
39+
.scm-viewlet .scm-provider > .header {
40+
display: flex;
41+
align-items: center;
3742
flex-flow: nowrap;
3843
}
3944

40-
.scm-viewlet .scm-provider > .icon {
45+
.scm-viewlet .scm-provider > .header > .icon {
4146
margin-right: 4px;
4247
}
4348

44-
.scm-viewlet .scm-provider > .label {
49+
.scm-viewlet .scm-provider > .header > .label {
4550
display: flex;
4651
flex-shrink: 1;
4752
overflow: hidden;
4853
}
4954

50-
.scm-viewlet .scm-provider > .label > .name {
55+
.scm-viewlet .scm-provider > .header > .label > .name {
5156
text-decoration: underline;
5257
}
5358

54-
.scm-viewlet .scm-provider > .label > .description {
59+
.scm-viewlet .scm-provider > .header > .label > .description {
5560
opacity: 0.7;
5661
margin-left: 0.5em;
5762
font-size: 0.9em;
5863
}
5964

60-
.scm-viewlet .scm-provider > .monaco-action-bar {
65+
.scm-viewlet .scm-provider > .header > .monaco-action-bar {
6166
flex: 1;
6267
}
6368

64-
.scm-viewlet .scm-provider > .monaco-action-bar .action-item {
69+
.scm-viewlet .scm-provider > .header > .monaco-action-bar .action-item {
6570
margin-left: 4px;
6671
overflow: hidden;
6772
text-overflow: ellipsis;
@@ -70,22 +75,26 @@
7075
min-width: 14px;
7176
}
7277

73-
.scm-viewlet .scm-provider > .monaco-action-bar .action-label {
78+
.scm-viewlet .scm-provider > .header > .monaco-action-bar .action-label {
7479
text-overflow: ellipsis;
7580
overflow: hidden;
7681
min-width: 14px; /* minimum size of icons */
7782
}
7883

79-
.scm-viewlet .scm-provider > .monaco-action-bar .action-label .codicon {
84+
.scm-viewlet .scm-provider > .header > .monaco-action-bar .action-label .codicon {
8085
font-size: 14px;
8186
vertical-align: sub;
8287
display: inline-flex;
8388
}
8489

85-
.scm-viewlet .scm-provider > .monaco-action-bar .action-item:last-of-type {
90+
.scm-viewlet .scm-provider > .header > .monaco-action-bar .action-item:last-of-type {
8691
padding-right: 0;
8792
}
8893

94+
.scm-viewlet .scm-provider > .body {
95+
flex-grow: 1;
96+
}
97+
8998
.scm-viewlet .monaco-list-row {
9099
line-height: 22px;
91100
}
@@ -173,16 +182,21 @@
173182

174183
.scm-viewlet .scm-editor {
175184
box-sizing: border-box;
176-
padding: 5px 12px 5px 16px;
185+
width: 100%;
186+
height: 100%;
187+
display: flex;
188+
flex-direction: column;
189+
justify-content: center;
177190
}
178191

179192
.scm-viewlet .scm-editor.hidden {
180193
display: none;
181194
}
182195

183196
.scm-viewlet .scm-editor-container {
184-
padding: 1px;
185197
position: relative;
198+
box-sizing: border-box;
199+
padding: 1px;
186200
outline-offset: -1px;
187201
}
188202

@@ -205,8 +219,7 @@
205219
position: absolute;
206220
pointer-events: none;
207221
z-index: 1;
208-
margin: 1px;
209-
padding: 3px 4px;
222+
padding: 2px 4px 3px 4px;
210223
box-sizing: border-box;
211224
width: 100%;
212225
overflow: hidden;

0 commit comments

Comments
 (0)