Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
3ec72784
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
3ec72784
编写于
4月 20, 2020
作者:
R
Rob Lourens
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Notebook cell DND with nicer drag image
上级
49dd6569
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
172 addition
and
112 deletion
+172
-112
src/vs/workbench/contrib/notebook/browser/media/notebook.css
src/vs/workbench/contrib/notebook/browser/media/notebook.css
+24
-8
src/vs/workbench/contrib/notebook/browser/notebookEditor.ts
src/vs/workbench/contrib/notebook/browser/notebookEditor.ts
+7
-31
src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts
...ntrib/notebook/browser/view/renderers/backLayerWebView.ts
+0
-8
src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts
...h/contrib/notebook/browser/view/renderers/cellRenderer.ts
+136
-64
src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts
...h/contrib/notebook/browser/viewModel/notebookViewModel.ts
+1
-1
src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts
src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts
+4
-0
未找到文件。
src/vs/workbench/contrib/notebook/browser/media/notebook.css
浏览文件 @
3ec72784
...
...
@@ -35,11 +35,6 @@
top
:
0
;
}
/* .monaco-workbench .part.editor > .content .notebook-editor > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-dragover,
.monaco-workbench .part.editor > .content .notebook-editor > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-dragover .cell-bottom-toolbar-container {
background-color: green;
} */
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
{
cursor
:
default
;
overflow
:
visible
!important
;
...
...
@@ -49,6 +44,7 @@
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
.cell-drag-handle
{
position
:
absolute
;
visibility
:
hidden
;
left
:
1px
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.markdown-cell-row
.cell-drag-handle
{
...
...
@@ -59,15 +55,28 @@
top
:
21px
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.selected
.cell-drag-handle
,
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.focused
.cell-drag-handle
,
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
:hover
.cell-drag-handle
{
visibility
:
visible
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
.cell-drag-image
{
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.cell-drag-image
{
position
:
absolute
;
top
:
-500px
;
z-index
:
1000
;
padding-bottom
:
16px
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.cell-drag-image
>
.monaco-toolbar
{
display
:
none
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.cell-drag-image
.cell-statusbar-container
{
display
:
none
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.cell-drag-image
.cell-editor-part
{
width
:
100%
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
.cell
{
...
...
@@ -291,7 +300,6 @@
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
.monaco-list
.monaco-list-row
:hover
.notebook-cell-focus-indicator
,
.monaco-workbench
.part.editor
>
.content
.notebook-editor
.monaco-list
.monaco-list-row.selected
.notebook-cell-focus-indicator
,
.monaco-workbench
.part.editor
>
.content
.notebook-editor
.monaco-list
.monaco-list-row.focused
.notebook-cell-focus-indicator
{
visibility
:
visible
;
}
...
...
@@ -300,6 +308,10 @@
opacity
:
1
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
.monaco-list
.monaco-list-row.cell-dragging
{
opacity
:
0.5
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
.monaco-list
.monaco-list-row
.notebook-cell-insertion-indicator-top
{
opacity
:
0
;
transition
:
opacity
0.2s
ease-in-out
;
...
...
@@ -316,6 +328,10 @@
cursor
:
auto
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row.cell-drag-image
.cell-bottom-toolbar-container
{
display
:
none
;
}
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
.cell-bottom-toolbar-container
:focus-within
,
.monaco-workbench
.part.editor
>
.content
.notebook-editor
>
.cell-list-container
>
.monaco-list
>
.monaco-scrollable-element
>
.monaco-list-rows
>
.monaco-list-row
.cell-bottom-toolbar-container
:hover
{
opacity
:
1
;
...
...
src/vs/workbench/contrib/notebook/browser/notebookEditor.ts
浏览文件 @
3ec72784
...
...
@@ -28,7 +28,7 @@ import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/com
import
{
BaseEditor
}
from
'
vs/workbench/browser/parts/editor/baseEditor
'
;
import
{
IEditorGroupView
}
from
'
vs/workbench/browser/parts/editor/editor
'
;
import
{
EditorOptions
,
IEditorCloseEvent
,
IEditorMemento
}
from
'
vs/workbench/common/editor
'
;
import
{
CELL_MARGIN
,
CELL_RUN_GUTTER
,
EDITOR_TOP_MARGIN
}
from
'
vs/workbench/contrib/notebook/browser/constants
'
;
import
{
CELL_MARGIN
,
CELL_RUN_GUTTER
,
EDITOR_TOP_MARGIN
,
EDITOR_TOP_PADDING
,
EDITOR_BOTTOM_PADDING
}
from
'
vs/workbench/contrib/notebook/browser/constants
'
;
import
{
FoldingController
}
from
'
vs/workbench/contrib/notebook/browser/contrib/fold/folding
'
;
import
{
NotebookFindWidget
}
from
'
vs/workbench/contrib/notebook/browser/contrib/notebookFindWidget
'
;
import
{
CellEditState
,
CellFocusMode
,
ICellRange
,
ICellViewModel
,
INotebookCellList
,
INotebookEditor
,
INotebookEditorMouseEvent
,
NotebookLayoutInfo
,
NOTEBOOK_EDITOR_EDITABLE
,
NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK
,
NOTEBOOK_EDITOR_FOCUSED
}
from
'
vs/workbench/contrib/notebook/browser/notebookBrowser
'
;
...
...
@@ -45,8 +45,6 @@ import { CellKind, CellUri, IOutput } from 'vs/workbench/contrib/notebook/common
import
{
Webview
}
from
'
vs/workbench/contrib/webview/browser/webview
'
;
import
{
getExtraColor
}
from
'
vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils
'
;
import
{
IEditorGroup
,
IEditorGroupsService
}
from
'
vs/workbench/services/editor/common/editorGroupsService
'
;
import
{
domEvent
}
from
'
vs/base/browser/event
'
;
import
{
throttle
}
from
'
vs/base/common/decorators
'
;
const
$
=
DOM
.
$
;
const
NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY
=
'
NotebookEditorViewState
'
;
...
...
@@ -150,11 +148,6 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
return
true
;
}
@
throttle
(
500
,
(
_
,
r
)
=>
r
)
private
log
(
msg
:
string
)
{
console
.
log
(
msg
);
}
protected
createEditor
(
parent
:
HTMLElement
):
void
{
this
.
rootElement
=
DOM
.
append
(
parent
,
$
(
'
.notebook-editor
'
));
this
.
createBody
(
this
.
rootElement
);
...
...
@@ -237,14 +230,6 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
},
);
domEvent
(
this
.
body
,
'
dragover
'
)(
e
=>
{
// this.log('list dragover');
});
domEvent
(
this
.
body
,
'
mousemove
'
)(
e
=>
{
// this.log('list mousemove');
});
this
.
control
=
new
NotebookCodeEditors
(
this
.
list
,
this
.
renderedEditors
);
this
.
webview
=
this
.
instantiationService
.
createInstance
(
BackLayerWebView
,
this
);
this
.
_register
(
this
.
webview
.
onMessage
(
message
=>
{
...
...
@@ -253,22 +238,12 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
}
}));
this
.
list
.
rowsContainer
.
appendChild
(
this
.
webview
.
element
);
// document.body.querySelector('.monaco-workbench')!.appendChild(this.webview!.element);
this
.
_register
(
this
.
list
);
// transparent cover
this
.
webviewTransparentCover
=
DOM
.
append
(
this
.
list
.
rowsContainer
,
$
(
'
.webview-cover
'
));
domEvent
(
this
.
webviewTransparentCover
,
'
dragover
'
)(
e
=>
{
this
.
log
(
`cover dragover`
);
});
domEvent
(
this
.
webviewTransparentCover
,
'
dragover
'
)(
e
=>
{
this
.
log
(
`cover dragover`
);
});
domEvent
(
this
.
webviewTransparentCover
,
'
mousemove
'
)(
e
=>
{
// this.log(`cover mousemove`);
});
// this.webviewTransparentCover.style.display = 'none';
this
.
webviewTransparentCover
.
style
.
display
=
'
none
'
;
this
.
_register
(
DOM
.
addStandardDisposableGenericMouseDownListner
(
this
.
rootElement
,
(
e
:
StandardMouseEvent
)
=>
{
if
(
DOM
.
hasClass
(
e
.
target
,
'
slider
'
)
&&
this
.
webviewTransparentCover
)
{
...
...
@@ -279,7 +254,7 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
this
.
_register
(
DOM
.
addStandardDisposableGenericMouseUpListner
(
this
.
rootElement
,
(
e
:
StandardMouseEvent
)
=>
{
if
(
this
.
webviewTransparentCover
)
{
// no matter when
//
this.webviewTransparentCover.style.display = 'none';
this
.
webviewTransparentCover
.
style
.
display
=
'
none
'
;
}
}));
...
...
@@ -672,7 +647,7 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
}
private
async
moveCellToIndex
(
index
:
number
,
newIdx
:
number
):
Promise
<
void
>
{
console
.
log
(
`Move
${
index
}
to
${
newIdx
}
`
);
//
console.log(`Move ${index} to ${newIdx}`);
if
(
!
this
.
notebookViewModel
!
.
moveCellToIdx
(
index
,
newIdx
,
true
))
{
return
;
}
...
...
@@ -892,6 +867,7 @@ registerThemingParticipant((theme, collector) => {
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell .monaco-editor-background,
.monaco-workbench .part.editor > .content .notebook-editor .cell .margin-view-overlays,
.monaco-workbench .part.editor > .content .notebook-editor .cell .cell-statusbar-container { background:
${
color
}
; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell-drag-image .cell-editor-container > div { background:
${
color
}
!important; }`
);
}
const
link
=
theme
.
getColor
(
textLinkForeground
);
if
(
link
)
{
...
...
@@ -943,7 +919,7 @@ registerThemingParticipant((theme, collector) => {
const
focusedCellIndicatorColor
=
theme
.
getColor
(
focusedCellIndicator
);
if
(
focusedCellIndicatorColor
)
{
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list-row.focused .notebook-cell-focus-indicator { border-color:
${
focusedCellIndicatorColor
}
; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list-row
.selected
.notebook-cell-focus-indicator { border-color:
${
focusedCellIndicatorColor
}
; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list-row .notebook-cell-focus-indicator { border-color:
${
focusedCellIndicatorColor
}
; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list-row .notebook-cell-insertion-indicator-top { background-color:
${
focusedCellIndicatorColor
}
; }`
);
}
...
...
@@ -953,9 +929,9 @@ registerThemingParticipant((theme, collector) => {
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .output { margin: 0px
${
CELL_MARGIN
}
px 0px
${
CELL_MARGIN
+
CELL_RUN_GUTTER
}
px }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell-bottom-toolbar-container { width: calc(100% -
${
CELL_MARGIN
*
2
+
CELL_RUN_GUTTER
}
px); margin: 0px
${
CELL_MARGIN
}
px 0px
${
CELL_MARGIN
+
CELL_RUN_GUTTER
}
px }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell .cell-editor-container { width: calc(100% -
${
CELL_RUN_GUTTER
}
px); }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell .markdown-editor-container { margin-left:
${
CELL_RUN_GUTTER
}
px; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > div.cell.markdown { padding-left:
${
CELL_RUN_GUTTER
}
px; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell .run-button-container { width:
${
CELL_RUN_GUTTER
}
px; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list .monaco-list-row .notebook-cell-insertion-indicator-top { left:
${
CELL_MARGIN
+
CELL_RUN_GUTTER
}
px; right:
${
CELL_MARGIN
}
px; }`
);
collector
.
addRule
(
`.monaco-workbench .part.editor > .content .notebook-editor .cell-drag-image .cell-editor-container > div { padding:
${
EDITOR_TOP_PADDING
}
px 16px
${
EDITOR_BOTTOM_PADDING
}
px 16px; }`
);
});
src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts
浏览文件 @
3ec72784
...
...
@@ -108,14 +108,6 @@ export class BackLayerWebView extends Disposable {
this
.
element
.
style
.
position
=
'
absolute
'
;
this
.
element
.
style
.
margin
=
`0px 0 0px
${
CELL_MARGIN
}
px`
;
DOM
.
addDisposableListener
(
this
.
element
,
DOM
.
EventType
.
DRAG_ENTER
,
e
=>
{
console
.
log
(
'
webview dragenter
'
);
});
DOM
.
addDisposableListener
(
this
.
element
,
DOM
.
EventType
.
DRAG_OVER
,
e
=>
{
console
.
log
(
'
webview dragover
'
);
});
const
pathsPath
=
getPathFromAmdModule
(
require
,
'
vs/loader.js
'
);
const
loader
=
URI
.
file
(
pathsPath
).
with
({
scheme
:
WebviewResourceScheme
});
...
...
src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts
浏览文件 @
3ec72784
...
...
@@ -11,13 +11,17 @@ import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/lis
import
{
ProgressBar
}
from
'
vs/base/browser/ui/progressbar/progressbar
'
;
import
{
ToolBar
}
from
'
vs/base/browser/ui/toolbar/toolbar
'
;
import
{
IAction
,
ActionRunner
}
from
'
vs/base/common/actions
'
;
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
import
{
escape
}
from
'
vs/base/common/strings
'
;
import
{
DisposableStore
}
from
'
vs/base/common/lifecycle
'
;
import
*
as
modes
from
'
vs/editor/common/modes
'
;
import
*
as
platform
from
'
vs/base/common/platform
'
;
import
{
Color
}
from
'
vs/base/common/color
'
;
import
{
deepClone
}
from
'
vs/base/common/objects
'
;
import
{
ICodeEditor
}
from
'
vs/editor/browser/editorBrowser
'
;
import
*
as
nls
from
'
vs/nls
'
;
import
{
CodeEditorWidget
}
from
'
vs/editor/browser/widget/codeEditorWidget
'
;
import
{
IEditorOptions
}
from
'
vs/editor/common/config/editorOptions
'
;
import
{
IEditorOptions
,
EditorOption
,
EDITOR_FONT_DEFAULTS
}
from
'
vs/editor/common/config/editorOptions
'
;
import
{
BareFontInfo
}
from
'
vs/editor/common/config/fontInfo
'
;
import
{
ContextAwareMenuEntryActionViewItem
}
from
'
vs/platform/actions/browser/menuEntryActionViewItem
'
;
import
{
IMenu
,
MenuItemAction
}
from
'
vs/platform/actions/common/actions
'
;
...
...
@@ -41,7 +45,8 @@ import { renderCodicons } from 'vs/base/common/codicons';
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
import
{
KeyCode
}
from
'
vs/base/common/keyCodes
'
;
import
{
domEvent
}
from
'
vs/base/browser/event
'
;
import
{
throttle
}
from
'
vs/base/common/decorators
'
;
import
{
tokenizeLineToHTML
}
from
'
vs/editor/common/modes/textToHtmlTokenizer
'
;
import
{
ITextModel
}
from
'
vs/editor/common/model
'
;
const
$
=
DOM
.
$
;
...
...
@@ -309,10 +314,17 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR
bottomCellContainer
,
toJSON
:
()
=>
{
return
{};
}
};
this
.
dndController
.
addListeners
(
templateData
);
this
.
dndController
.
addListeners
(
templateData
,
()
=>
this
.
getDragImage
(
templateData
)
);
return
templateData
;
}
private
getDragImage
(
templateData
:
MarkdownCellRenderTemplate
):
HTMLElement
{
const
dragImageContainer
=
DOM
.
$
(
'
.cell-drag-image.monaco-list-row.focused.markdown-cell-row
'
);
dragImageContainer
.
innerHTML
=
templateData
.
container
.
innerHTML
;
return
dragImageContainer
;
}
renderElement
(
element
:
MarkdownCellViewModel
,
index
:
number
,
templateData
:
MarkdownCellRenderTemplate
,
height
:
number
|
undefined
):
void
{
templateData
.
currentRenderedCell
=
element
;
templateData
.
editingContainer
!
.
style
.
display
=
'
none
'
;
...
...
@@ -381,6 +393,8 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR
}
}
type
DragImageProvider
=
()
=>
HTMLElement
;
export
class
CellDragAndDropController
{
// TODO roblou - should probably use dataTransfer here, but any dataTransfer set makes the editor think I am dropping a file, need
// to figure out how to prevent that
...
...
@@ -390,83 +404,158 @@ export class CellDragAndDropController {
private
readonly
notebookEditor
:
INotebookEditor
)
{
}
addListeners
(
templateData
:
BaseCellRenderTemplate
):
void
{
addListeners
(
templateData
:
BaseCellRenderTemplate
,
dragImageProvider
:
DragImageProvider
):
void
{
const
container
=
templateData
.
container
;
const
dragHandle
=
templateData
.
dragHandle
;
const
that
=
this
;
templateData
.
disposables
.
add
(
domEvent
(
dragHandle
,
'
dragend
'
)(
event
=>
{
templateData
.
disposables
.
add
(
domEvent
(
dragHandle
,
DOM
.
EventType
.
DRAG_END
)(()
=>
{
// TODO
(
this
.
notebookEditor
.
getInnerWebview
()
as
any
)
!
.
element
.
style
[
'
pointer-events
'
]
=
''
;
}));
templateData
.
disposables
.
add
(
domEvent
(
dragHandle
,
'
drag
'
)(
event
=>
{
// this.log(`drag`);
}));
templateData
.
disposables
.
add
(
domEvent
(
dragHandle
,
'
dragstart
'
)(
event
=>
{
templateData
.
disposables
.
add
(
domEvent
(
dragHandle
,
DOM
.
EventType
.
DRAG_START
)(
event
=>
{
(
this
.
notebookEditor
.
getInnerWebview
()
as
any
)
!
.
element
.
style
[
'
pointer-events
'
]
=
'
none
'
;
if
(
!
event
.
dataTransfer
)
{
console
.
log
(
`no datatransfer`
);
return
;
}
console
.
log
(
`onDragStart `
+
!!
templateData
.
currentRenderedCell
);
that
.
currentDraggedCell
=
templateData
.
currentRenderedCell
;
// event.dataTransfer.setData('text/plain', 'test');
// let dragImage = document.body.querySelector('.cell-drag-image');
// if (!dragImage) {
// dragImage = DOM.$('.cell-drag-image.monaco-list-row');
// dragImage.innerHTML = container.innerHTML;
// dragImage.style.top = container.style.top;
// dragImage.style.left = '50px';
// container.parentElement!.appendChild(dragImage);
// }
const
dragImage
=
DOM
.
$
(
'
.cell-drag-image.monaco-list-row
'
);
dragImage
.
innerHTML
=
container
.
innerHTML
;
// Yikes
dragImage
.
style
.
top
=
container
.
style
.
top
;
dragImage
.
style
.
left
=
'
50px
'
;
this
.
currentDraggedCell
=
templateData
.
currentRenderedCell
;
const
dragImage
=
dragImageProvider
();
container
.
parentElement
!
.
appendChild
(
dragImage
);
event
.
dataTransfer
.
setDragImage
(
dragImage
,
0
,
0
);
setTimeout
(()
=>
container
.
parentElement
!
.
removeChild
(
dragImage
),
0
);
setTimeout
(()
=>
container
.
parentElement
!
.
removeChild
(
dragImage
!
),
0
);
// Comment this out to debug drag image layout
container
.
classList
.
add
(
'
cell-dragover
'
);
container
.
classList
.
add
(
'
cell-dragging
'
);
}));
templateData
.
disposables
.
add
(
domEvent
(
container
,
'
dragover
'
)(
event
=>
{
event
.
preventDefault
(
);
// console.log(`dragover`
);
templateData
.
disposables
.
add
(
domEvent
(
dragHandle
,
DOM
.
EventType
.
DRAG_END
)(
event
=>
{
container
.
classList
.
remove
(
'
cell-dragging
'
);
})
);
// this.log(event);
// this.log(`offsetY: ${event.offsetY}, clientY: ${event.clientY}, y: ${event.y}`
);
templateData
.
disposables
.
add
(
domEvent
(
container
,
DOM
.
EventType
.
DRAG_OVER
)(
event
=>
{
event
.
preventDefault
(
);
}));
templateData
.
disposables
.
add
(
domEvent
(
container
,
'
drop
'
)(
event
=>
{
templateData
.
disposables
.
add
(
domEvent
(
container
,
DOM
.
EventType
.
DROP
)(
event
=>
{
event
.
preventDefault
();
console
.
log
(
`drop`
);
this
.
notebookEditor
.
moveCell
(
that
.
currentDraggedCell
!
,
templateData
.
currentRenderedCell
!
,
'
above
'
);
this
.
notebookEditor
.
moveCell
(
this
.
currentDraggedCell
!
,
templateData
.
currentRenderedCell
!
,
'
above
'
);
container
.
classList
.
remove
(
'
cell-dragover
'
);
}));
templateData
.
disposables
.
add
(
domEvent
(
container
,
'
dragenter
'
)(
event
=>
{
templateData
.
disposables
.
add
(
domEvent
(
container
,
DOM
.
EventType
.
DRAG_ENTER
)(
event
=>
{
event
.
preventDefault
();
// this.log('dragenter');
container
.
classList
.
add
(
'
cell-dragover
'
);
}));
templateData
.
disposables
.
add
(
domEvent
(
container
,
'
dragleave
'
)(
event
=>
{
if
(
event
.
relatedTarget
&&
!
DOM
.
isAncestor
(
event
.
relatedTarget
as
HTMLElement
,
container
))
{
templateData
.
disposables
.
add
(
domEvent
(
container
,
DOM
.
EventType
.
DRAG_LEAVE
)(
event
=>
{
if
(
!
event
.
relatedTarget
||
!
DOM
.
isAncestor
(
event
.
relatedTarget
as
HTMLElement
,
container
))
{
container
.
classList
.
remove
(
'
cell-dragover
'
);
}
}));
}
}
class
EditorTextRenderer
{
getRichText
(
editor
:
ICodeEditor
,
modelRange
:
Range
):
string
|
null
{
const
model
=
editor
.
getModel
();
if
(
!
model
)
{
return
null
;
}
const
colorMap
=
this
.
_getDefaultColorMap
();
const
fontInfo
=
editor
.
getOptions
().
get
(
EditorOption
.
fontInfo
);
const
fontFamily
=
fontInfo
.
fontFamily
===
EDITOR_FONT_DEFAULTS
.
fontFamily
?
fontInfo
.
fontFamily
:
`'
${
fontInfo
.
fontFamily
}
',
${
EDITOR_FONT_DEFAULTS
.
fontFamily
}
`
;
return
`<div style="`
+
`color:
${
colorMap
[
modes
.
ColorId
.
DefaultForeground
]}
;`
+
`background-color:
${
colorMap
[
modes
.
ColorId
.
DefaultBackground
]}
;`
+
`font-family:
${
fontFamily
}
;`
+
`font-weight:
${
fontInfo
.
fontWeight
}
;`
+
`font-size:
${
fontInfo
.
fontSize
}
px;`
+
`line-height:
${
fontInfo
.
lineHeight
}
px;`
+
`white-space: pre;`
+
`">`
+
this
.
_getRichTextLines
(
model
,
modelRange
,
colorMap
)
+
'
</div>
'
;
}
private
_getRichTextLines
(
model
:
ITextModel
,
modelRange
:
Range
,
colorMap
:
string
[]):
string
{
const
startLineNumber
=
modelRange
.
startLineNumber
;
const
startColumn
=
modelRange
.
startColumn
;
const
endLineNumber
=
modelRange
.
endLineNumber
;
const
endColumn
=
modelRange
.
endColumn
;
const
tabSize
=
model
.
getOptions
().
tabSize
;
let
result
=
''
;
for
(
let
lineNumber
=
startLineNumber
;
lineNumber
<=
endLineNumber
;
lineNumber
++
)
{
const
lineTokens
=
model
.
getLineTokens
(
lineNumber
);
const
lineContent
=
lineTokens
.
getLineContent
();
const
startOffset
=
(
lineNumber
===
startLineNumber
?
startColumn
-
1
:
0
);
const
endOffset
=
(
lineNumber
===
endLineNumber
?
endColumn
-
1
:
lineContent
.
length
);
if
(
lineContent
===
''
)
{
result
+=
'
<br>
'
;
}
else
{
result
+=
tokenizeLineToHTML
(
lineContent
,
lineTokens
.
inflate
(),
colorMap
,
startOffset
,
endOffset
,
tabSize
,
platform
.
isWindows
);
}
}
return
result
;
}
private
_getDefaultColorMap
():
string
[]
{
let
colorMap
=
modes
.
TokenizationRegistry
.
getColorMap
();
let
result
:
string
[]
=
[
'
#000000
'
];
if
(
colorMap
)
{
for
(
let
i
=
1
,
len
=
colorMap
.
length
;
i
<
len
;
i
++
)
{
result
[
i
]
=
Color
.
Format
.
CSS
.
formatHex
(
colorMap
[
i
]);
}
}
return
result
;
}
}
@
throttle
(
100
,
(
_
,
r
)
=>
r
)
private
log
(
msg
:
any
)
{
console
.
log
(
msg
);
class
CodeCellDragImageRenderer
{
getDragImage
(
templateData
:
CodeCellRenderTemplate
):
HTMLElement
{
let
dragImage
=
this
.
_getDragImage
(
templateData
);
if
(
!
dragImage
)
{
// TODO I don't think this can happen
dragImage
=
document
.
createElement
(
'
div
'
);
dragImage
.
textContent
=
'
1 cell
'
;
}
return
dragImage
;
}
private
_getDragImage
(
templateData
:
CodeCellRenderTemplate
):
HTMLElement
|
null
{
const
dragImageContainer
=
DOM
.
$
(
'
.cell-drag-image.monaco-list-row.focused.code-cell-row
'
);
dragImageContainer
.
innerHTML
=
templateData
.
container
.
innerHTML
;
const
editorContainer
=
dragImageContainer
.
querySelector
(
'
.cell-editor-container
'
);
if
(
!
editorContainer
)
{
return
null
;
}
const
focusIndicator
=
dragImageContainer
.
querySelector
(
'
.notebook-cell-focus-indicator
'
)
as
HTMLElement
;
if
(
focusIndicator
)
{
focusIndicator
.
style
.
height
=
'
40px
'
;
}
const
richEditorText
=
new
EditorTextRenderer
().
getRichText
(
templateData
.
editor
,
new
Range
(
1
,
1
,
1
,
1000
));
if
(
!
richEditorText
)
{
return
null
;
}
editorContainer
.
innerHTML
=
richEditorText
;
return
dragImageContainer
;
}
}
...
...
@@ -532,23 +621,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
const
outputContainer
=
DOM
.
append
(
container
,
$
(
'
.output
'
));
const
bottomCellContainer
=
DOM
.
append
(
container
,
$
(
'
.cell-bottom-toolbar-container
'
));
// domEvent(editor.getDomNode()!, 'dragover')(event => {
// event.preventDefault();
// console.log(`dragover editor`);
// });
domEvent
(
editorContainer
,
'
dragover
'
)(
event
=>
{
event
.
preventDefault
();
// console.log(`dragover editor container`);
});
domEvent
(
outputContainer
,
'
dragover
'
)(
event
=>
{
event
.
preventDefault
();
// console.log(`dragover output`);
});
const
templateData
:
CodeCellRenderTemplate
=
{
insertionIndicatorTop
,
dragHandle
,
...
...
@@ -571,7 +643,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
toJSON
:
()
=>
{
return
{};
}
};
this
.
dndController
.
addListeners
(
templateData
);
this
.
dndController
.
addListeners
(
templateData
,
()
=>
new
CodeCellDragImageRenderer
().
getDragImage
(
templateData
)
);
return
templateData
;
}
...
...
src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts
浏览文件 @
3ec72784
...
...
@@ -539,7 +539,7 @@ export class NotebookViewModel extends Disposable implements FoldingRegionDelega
}
moveCellToIdx
(
index
:
number
,
newIdx
:
number
,
synchronous
:
boolean
,
pushedToUndoStack
:
boolean
=
true
):
boolean
{
// TODO roblou - works differently if index > or < newIdx, write tests
// TODO roblou - works differently if index > or < newIdx,
fix,
write tests
const
viewCell
=
this
.
viewCells
[
index
]
as
CellViewModel
;
if
(
!
viewCell
)
{
...
...
src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts
浏览文件 @
3ec72784
...
...
@@ -103,6 +103,10 @@ export class TestNotebookEditor implements INotebookEditor {
throw
new
Error
(
'
Method not implemented.
'
);
}
moveCell
(
cell
:
ICellViewModel
,
relativeToCell
:
ICellViewModel
,
direction
:
'
above
'
|
'
below
'
):
Promise
<
void
>
{
throw
new
Error
(
'
Method not implemented.
'
);
}
setSelection
(
cell
:
CellViewModel
,
selection
:
Range
):
void
{
throw
new
Error
(
'
Method not implemented.
'
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录