Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/core-browser/src/core-preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ export const corePreferenceSchema: PreferenceSchema = {
type: 'boolean',
default: true,
},
'debug.breakpoint.editorHint': {
type: 'boolean',
default: true,
description: '%preference.debug.breakpoint.editorHint%',
},
'debug.toolbar.top': {
type: 'number',
default: 0,
Expand Down Expand Up @@ -299,6 +304,7 @@ export interface CoreConfiguration {
'explorer.confirmMove': boolean;
'explorer.compactFolders': boolean;
'debug.toolbar.float': boolean;
'debug.breakpoint.editorHint': boolean;
'debug.toolbar.top': number;
'debug.toolbar.height': number;
'files.watcherExclude': { [key: string]: boolean };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ describe('Debug Model', () => {

it('debugModel should be init success', () => {
expect(mockEditor.onKeyDown).toBeCalledTimes(1);
expect(mockEditor.getModel).toBeCalledTimes(4);
expect(mockEditor.getModel).toBeCalledTimes(1);
expect(mockBreakpointManager.onDidChange).toBeCalledTimes(1);
});

Expand Down
39 changes: 34 additions & 5 deletions packages/debug/src/browser/debug-style.less
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
@top_stack_frame_line_bg_color: #ffff6673;
@dark_top_stack_frame_line_bg_color: #ffff0033;
@focused_stack_frame_line_bg_color: #cee7ce73;
@dark_focused_stack_frame_line_bg_color: #7abd7a4d;
@dark_exception_line_bg_color: #6c2022;

.sumi-breakpoint-icon-size {
background-size: 16px 16px;
cursor: pointer;
Expand Down Expand Up @@ -73,11 +79,34 @@
}

.monaco-editor .view-overlays .sumi-debug-top-stack-frame-line {
background: #ffff6673;
background-color: @top_stack_frame_line_bg_color;
}

.monaco-editor.vs-dark .view-overlays .sumi-debug-top-stack-frame-line {
background: #ffff0033;
background-color: @dark_top_stack_frame_line_bg_color;
}

@keyframes slide-out {
100% {
background-color: transparent;
}
}

.monaco-editor .view-overlays .sumi-focus-breakpoints-stack-frame-line,
.monaco-editor.vs-dark .view-overlays .sumi-focus-breakpoints-stack-frame-line {
animation: slide-out 0.3s;
animation-iteration-count: 1;
animation-timing-function: ease-in;
animation-fill-mode: forwards;
-webkit-animation-fill-mode: forwards;
}

.monaco-editor .view-overlays .sumi-focus-breakpoints-stack-frame-line {
background-color: @top_stack_frame_line_bg_color;
}

.monaco-editor.vs-dark .view-overlays .sumi-focus-breakpoints-stack-frame-line {
background-color: @dark_top_stack_frame_line_bg_color;
}

.monaco-editor .sumi-debug-focused-stack-frame {
Expand All @@ -91,15 +120,15 @@
}

.monaco-editor .view-overlays .sumi-debug-focused-stack-frame-line {
background: #cee7ce73;
background-color: @focused_stack_frame_line_bg_color;
}

.monaco-editor.vs-dark .view-overlays .sumi-debug-focused-stack-frame-line {
background: #7abd7a4d;
background-color: @dark_focused_stack_frame_line_bg_color;
}

.monaco-editor.vs-dark .view-overlays .sumi-debug-top-stack-frame-exception-line {
background-color: #6c2022;
background-color: @dark_exception_line_bg_color;
}

.inline-breakpoint-widget.codicon {
Expand Down
38 changes: 35 additions & 3 deletions packages/debug/src/browser/editor/debug-model.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import debounce from 'lodash/debounce';

import { Injector, Injectable, Autowired } from '@opensumi/di';
import { DomListener, IContextKeyService, IReporterService } from '@opensumi/ide-core-browser';
import { DomListener, IContextKeyService, IReporterService, PreferenceService } from '@opensumi/ide-core-browser';
import {
ICtxMenuRenderer,
generateMergedCtxMenu,
Expand All @@ -26,6 +26,7 @@ import { BreakpointManager } from '../breakpoint';
import { DebugBreakpoint, isDebugBreakpoint } from '../breakpoint';
import { DebugDecorator } from '../breakpoint/breakpoint-decoration';
import { DebugSessionManager } from '../debug-session-manager';
import { DebugBreakpointsService } from '../view/breakpoints/debug-breakpoints.service';

import { DebugBreakpointWidget } from './debug-breakpoint-widget';
import { DebugHoverWidget } from './debug-hover-widget';
Expand All @@ -47,6 +48,9 @@ export class DebugModel implements IDebugModel {
@Autowired(IDebugSessionManager)
private debugSessionManager: DebugSessionManager;

@Autowired(DebugBreakpointsService)
private debugBreakpointsService: DebugBreakpointsService;

@Autowired(BreakpointManager)
private breakpointManager: BreakpointManager;

Expand All @@ -62,6 +66,9 @@ export class DebugModel implements IDebugModel {
@Autowired(IReporterService)
private readonly reporterService: IReporterService;

@Autowired(PreferenceService)
private readonly preferenceService: PreferenceService;

protected frameDecorations: string[] = [];
protected topFrameRange: monaco.Range | undefined;

Expand Down Expand Up @@ -115,13 +122,38 @@ export class DebugModel implements IDebugModel {

async init() {
const model = this.editor.getModel()!;
let timer: number | undefined;
this._uri = new URI(model.uri.toString());
this.decorator = new DebugDecorator();

this.toDispose.pushAll([
this.breakpointWidget,
this.editor.onKeyDown(() => this.debugHoverWidget.hide({ immediate: false })),
this.editor.onDidChangeModelContent(() => this.renderFrames()),
this.debugSessionManager.onDidChange(() => this.renderFrames()),
this.debugBreakpointsService.onDidFocusedBreakpoints(({ range }) => {
const enableHint = this.preferenceService.getValid('debug.breakpoint.editorHint', true);

if (!enableHint) {
return;
}

this.renderFrames([
{
options: options.FOCUS_BREAKPOINTS_STACK_FRAME_DECORATION,
range,
},
]);

if (timer) {
clearTimeout(timer);
}

timer = window.setTimeout(() => {
this.renderFrames();
clearTimeout(timer);
}, 300);
}),
this.editor.getModel()!.onDidChangeContent(() => this.updateBreakpoints()),
this.editor.onDidChangeModel(() => {
this.closeBreakpointView();
Expand Down Expand Up @@ -156,14 +188,14 @@ export class DebugModel implements IDebugModel {
* @type {*}
* @memberof DebugModel
*/
protected readonly renderFrames: any = debounce(() => {
protected readonly renderFrames: any = debounce((inflowDecorations: monaco.editor.IModelDeltaDecoration[] = []) => {
if (this.toDispose.disposed) {
return;
}
if (this.editor.getModel()?.uri.toString() !== this._uri.toString()) {
return;
}
const decorations = this.createFrameDecorations();
const decorations = this.createFrameDecorations().concat(inflowDecorations);
this.frameDecorations = this.deltaDecorations(this.frameDecorations, decorations);
}, 100);

Expand Down
7 changes: 7 additions & 0 deletions packages/debug/src/browser/editor/debug-styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ export const TOP_STACK_FRAME_DECORATION: monaco.editor.IModelDecorationOptions =
stickiness: STICKINESS,
};

export const FOCUS_BREAKPOINTS_STACK_FRAME_DECORATION: monaco.editor.IModelDecorationOptions = {
description: 'focus-breakpoints-stack-frame-line',
isWholeLine: true,
className: 'sumi-focus-breakpoints-stack-frame-line',
stickiness: STICKINESS,
};

export const TOP_STACK_FRAME_EXCEPTION_DECORATION: monaco.editor.IModelDecorationOptions = {
description: 'debug-top-stack-frame-exception-line',
isWholeLine: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Schemes,
Emitter,
Event,
IRange,
} from '@opensumi/ide-core-browser';
import { LabelService } from '@opensumi/ide-core-browser/lib/services';
import { ICodeEditor, EditorCollectionService, getSimpleEditorOptions } from '@opensumi/ide-editor';
Expand Down Expand Up @@ -66,6 +67,9 @@ export class DebugBreakpointsService extends WithEventBus {
readonly onDidChangeBreakpointsTreeNode: Event<Map<string, BreakpointsTreeNode[]>> =
this._onDidChangeBreakpointsTreeNode.event;

private readonly _onDidFocusedBreakpoints = new Emitter<{ uri: URI; range: IRange }>();
readonly onDidFocusedBreakpoints: Event<{ uri: URI; range: IRange }> = this._onDidFocusedBreakpoints.event;

private _inputEditor: ICodeEditor;

public get inputEditor(): ICodeEditor {
Expand All @@ -87,6 +91,10 @@ export class DebugBreakpointsService extends WithEventBus {
this.init();
}

public launchFocusedBreakpoints(data: { uri: URI; range: IRange }): void {
this._onDidFocusedBreakpoints.fire(data);
}

async init() {
await this.updateRoots();
this.workspaceService.onWorkspaceChanged(async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ import {
ViewState,
Event,
isUndefined,
IRange,
} from '@opensumi/ide-core-browser';
import { IResourceOpenOptions } from '@opensumi/ide-editor';
import { DebugProtocol } from '@opensumi/vscode-debugprotocol/lib/debugProtocol';

import { IDebugBreakpoint, IDebugSessionManager, ISourceBreakpoint } from '../../../common';
Expand Down Expand Up @@ -159,32 +161,39 @@ export const BreakpointItem = ({
setEnabled(!enabled);
};

const handleBreakpointClick = () => {
const handleBreakpointClick = async () => {
if ((data.breakpoint as ISourceBreakpoint).uri) {
const options = {
const options: IResourceOpenOptions = {
preview: true,
focus: true,
};
if (status) {
options['range'] = {
options.range = {
startColumn: status.column || 0,
endColumn: status.column || 0,
startLineNumber: status.line,
endLineNumber: status.line,
};
} else {
options['range'] = {
startColumn: (data.breakpoint as IDebugBreakpoint).raw.column || 0,
endColumn: (data.breakpoint as IDebugBreakpoint).raw.column || 0,
startLineNumber: (data.breakpoint as IDebugBreakpoint).raw.line,
endLineNumber: (data.breakpoint as IDebugBreakpoint).raw.line,
const { raw } = data.breakpoint as IDebugBreakpoint;
options.range = {
startColumn: raw.column || 0,
endColumn: raw.column || 0,
startLineNumber: raw.line,
endLineNumber: raw.line,
};
}
commandService.executeCommand(

await commandService.executeCommand(
EDITOR_COMMANDS.OPEN_RESOURCE.id,
new URI((data.breakpoint as ISourceBreakpoint).uri),
options,
);

debugBreakpointsService.launchFocusedBreakpoints({
uri: new URI((data.breakpoint as ISourceBreakpoint).uri),
range: options.range as IRange,
});
}
};

Expand Down
2 changes: 2 additions & 0 deletions packages/i18n/src/common/en-US.lang.ts
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,8 @@ export const localizationBundle = {
'preference.debug.console.filter.mode.matcher': 'matcher',
'preference.debug.console.wordWrap': 'Controls if the lines should wrap in the debug console.',
'preference.debug.inline.values': 'Show variable values inline in editor while debugging.',
'preference.debug.breakpoint.editorHint':
'After enabling, there will be a background color blinking prompt when clicking on the breakpoint list to jump to the editor.',

// workbench
'preference.workbench.refactoringChanges.showPreviewStrategy':
Expand Down
3 changes: 3 additions & 0 deletions packages/i18n/src/common/zh-CN.lang.ts
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,9 @@ export const localizationBundle = {
'preference.explorer.fileTree.indent.title': '资源管理器:文件树子节点缩进',
'preference.explorer.fileTree.baseIndent.title': '资源管理器:文件树基础缩进',
'preference.debug.toolbar.float.title': '运行与调试:浮层模式',
'preference.debug.breakpoint.editorHint.title': '控制是否开启编辑器断点闪烁提示',
'preference.debug.breakpoint.editorHint': '启用后,点击断点列表跳转到编辑器时,会有背景色闪烁提示',

'preference.debug.console.filter.mode': '调试控制台筛选器模式',
'preference.debug.console.filter.mode.filter': '过滤模式',
'preference.debug.console.filter.mode.matcher': '匹配模式',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -755,6 +755,7 @@ export const defaultSettingSections: {
{ id: 'debug.console.wordWrap', localized: 'preference.debug.console.wordWrap' },
{ id: 'debug.inline.values', localized: 'preference.debug.inline.values' },
{ id: 'debug.toolbar.float', localized: 'preference.debug.toolbar.float.title' },
{ id: 'debug.breakpoint.editorHint', localized: 'preference.debug.breakpoint.editorHint.title' },
],
},
],
Expand Down
3 changes: 2 additions & 1 deletion packages/search/src/browser/search.view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,9 @@ export const Search = memo(({ viewState }: PropsWithChildren<{ viewState: ViewSt

const focusSearchInput = useCallback(
(value: string) => {
searchInputRef.current?.focus();
setSearch(value);
searchInputRef.current?.focus();
searchInputRef.current?.select();
},
[searchInputRef.current, search],
);
Expand Down