@@ -47,6 +47,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
4747import { domEvent } from 'vs/base/browser/event' ;
4848import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer' ;
4949import { ITextModel } from 'vs/editor/common/model' ;
50+ import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel' ;
5051
5152const $ = DOM . $ ;
5253
@@ -207,7 +208,6 @@ abstract class AbstractCellRenderer {
207208 container . style . position = 'static' ;
208209 container . style . height = '22px' ;
209210 }
210-
211211 }
212212
213213 protected createToolbar ( container : HTMLElement ) : ToolBar {
@@ -257,6 +257,14 @@ abstract class AbstractCellRenderer {
257257 updateActions ( ) ;
258258 } ) ) ;
259259 }
260+
261+ protected commonRenderElement ( element : BaseCellViewModel , index : number , templateData : BaseCellRenderTemplate ) : void {
262+ if ( element . dragging ) {
263+ templateData . container . classList . add ( DRAGGING_CLASS ) ;
264+ } else {
265+ templateData . container . classList . remove ( DRAGGING_CLASS ) ;
266+ }
267+ }
260268}
261269
262270export class MarkdownCellRenderer extends AbstractCellRenderer implements IListRenderer < MarkdownCellViewModel , MarkdownCellRenderTemplate > {
@@ -326,6 +334,8 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR
326334
327335
328336 renderElement ( element : MarkdownCellViewModel , index : number , templateData : MarkdownCellRenderTemplate , height : number | undefined ) : void {
337+ this . commonRenderElement ( element , index , templateData ) ;
338+
329339 templateData . currentRenderedCell = element ;
330340 templateData . editingContainer ! . style . display = 'none' ;
331341 templateData . cellContainer . innerHTML = '' ;
@@ -393,6 +403,9 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR
393403 }
394404}
395405
406+ const DRAGGING_CLASS = 'cell-dragging' ;
407+ const DRAGOVER_CLASS = 'cell-dragover' ;
408+
396409type DragImageProvider = ( ) => HTMLElement ;
397410
398411export class CellDragAndDropController {
@@ -408,9 +421,20 @@ export class CellDragAndDropController {
408421 const container = templateData . container ;
409422 const dragHandle = templateData . dragHandle ;
410423
424+ const dragCleanup = ( ) => {
425+ if ( this . currentDraggedCell ) {
426+ this . currentDraggedCell . dragging = false ;
427+ this . currentDraggedCell = undefined ;
428+ }
429+ } ;
430+
411431 templateData . disposables . add ( domEvent ( dragHandle , DOM . EventType . DRAG_END ) ( ( ) => {
412432 // TODO
413433 ( this . notebookEditor . getInnerWebview ( ) as any ) ! . element . style [ 'pointer-events' ] = '' ;
434+
435+ // Note, templateData may have a different element rendered into it by now
436+ container . classList . remove ( DRAGGING_CLASS ) ;
437+ dragCleanup ( ) ;
414438 } ) ) ;
415439
416440 templateData . disposables . add ( domEvent ( dragHandle , DOM . EventType . DRAG_START ) ( event => {
@@ -420,19 +444,15 @@ export class CellDragAndDropController {
420444 return ;
421445 }
422446
423- this . currentDraggedCell = templateData . currentRenderedCell ;
447+ this . currentDraggedCell = templateData . currentRenderedCell ! ;
448+ this . currentDraggedCell . dragging = true ;
424449
425450 const dragImage = dragImageProvider ( ) ;
426451 container . parentElement ! . appendChild ( dragImage ) ;
427452 event . dataTransfer . setDragImage ( dragImage , 0 , 0 ) ;
428453 setTimeout ( ( ) => container . parentElement ! . removeChild ( dragImage ! ) , 0 ) ; // Comment this out to debug drag image layout
429454
430- container . classList . add ( 'cell-dragover' ) ;
431- container . classList . add ( 'cell-dragging' ) ;
432- } ) ) ;
433-
434- templateData . disposables . add ( domEvent ( dragHandle , DOM . EventType . DRAG_END ) ( event => {
435- container . classList . remove ( 'cell-dragging' ) ;
455+ container . classList . add ( DRAGGING_CLASS ) ;
436456 } ) ) ;
437457
438458 templateData . disposables . add ( domEvent ( container , DOM . EventType . DRAG_OVER ) ( event => {
@@ -442,18 +462,20 @@ export class CellDragAndDropController {
442462 templateData . disposables . add ( domEvent ( container , DOM . EventType . DROP ) ( event => {
443463 event . preventDefault ( ) ;
444464
445- this . notebookEditor . moveCell ( this . currentDraggedCell ! , templateData . currentRenderedCell ! , 'above' ) ;
446- container . classList . remove ( 'cell-dragover' ) ;
465+ const draggedCell = this . currentDraggedCell ! ;
466+ dragCleanup ( ) ;
467+ this . notebookEditor . moveCell ( draggedCell , templateData . currentRenderedCell ! , 'above' ) ;
468+ container . classList . remove ( DRAGOVER_CLASS ) ;
447469 } ) ) ;
448470
449471 templateData . disposables . add ( domEvent ( container , DOM . EventType . DRAG_ENTER ) ( event => {
450472 event . preventDefault ( ) ;
451- container . classList . add ( 'cell-dragover' ) ;
473+ container . classList . add ( DRAGOVER_CLASS ) ;
452474 } ) ) ;
453475
454476 templateData . disposables . add ( domEvent ( container , DOM . EventType . DRAG_LEAVE ) ( event => {
455477 if ( ! event . relatedTarget || ! DOM . isAncestor ( event . relatedTarget as HTMLElement , container ) ) {
456- container . classList . remove ( 'cell-dragover' ) ;
478+ container . classList . remove ( DRAGOVER_CLASS ) ;
457479 }
458480 } ) ) ;
459481 }
@@ -702,6 +724,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende
702724 }
703725
704726 renderElement ( element : CodeCellViewModel , index : number , templateData : CodeCellRenderTemplate , height : number | undefined ) : void {
727+ this . commonRenderElement ( element , index , templateData ) ;
728+
705729 templateData . currentRenderedCell = element ;
706730
707731 if ( height === undefined ) {
0 commit comments