Explorar o código

Arrow hanlding when selection is next to the object.

Szymon Kupś %!s(int64=9) %!d(string=hai) anos
pai
achega
8e4ef4682a
Modificáronse 1 ficheiros con 43 adicións e 12 borrados
  1. 43 12
      packages/ckeditor5-image/src/widget/widget.js

+ 43 - 12
packages/ckeditor5-image/src/widget/widget.js

@@ -100,7 +100,6 @@ export default class Widget extends Plugin {
 			return;
 		}
 
-		const dataController = this.editor.data;
 		const modelDocument = this.editor.document;
 		const modelSelection = modelDocument.selection;
 
@@ -109,22 +108,15 @@ export default class Widget extends Plugin {
 			return;
 		}
 
-		// Clone current selection to use it as a probe. We must leave default selection as it is so it can return
-		// to its current state after undo.
-		const probe = ModelSelection.createFromSelection( modelSelection );
-		const isForward = ( keyCode == keyCodes.delete );
-
-		dataController.modifySelection( probe, { direction: isForward ? 'forward' : 'backward' } );
+		const objectElement = this._getObjectNextToSelection( keyCode == keyCodes.delete );
 
-		const objectElement = isForward ? probe.focus.nodeBefore : probe.focus.nodeAfter;
-
-		if ( objectElement instanceof ModelElement && modelDocument.schema.objects.has( objectElement.name ) ) {
+		if ( objectElement ) {
 			domEventData.preventDefault();
 			eventInfo.stop();
 
 			modelDocument.enqueueChanges( () => {
 				// Remove previous element if empty.
-				const previousNode = probe.anchor.parent;
+				const previousNode = modelSelection.anchor.parent;
 
 				if ( previousNode.isEmpty ) {
 					const batch = modelDocument.batch();
@@ -147,12 +139,13 @@ export default class Widget extends Plugin {
 		const schema = modelDocument.schema;
 		const modelSelection = modelDocument.selection;
 		const objectElement = getSelectedElement( modelSelection );
+		const isForward = ( keyCode == keyCodes.arrowdown || keyCode == keyCodes.arrowright );
 
+		// if object element is selected.
 		if ( objectElement && schema.objects.has( objectElement.name ) ) {
 			domEventData.preventDefault();
 			eventInfo.stop();
 
-			const isForward = ( keyCode == keyCodes.arrowdown || keyCode == keyCodes.arrowright );
 			const position = isForward ? modelSelection.getLastPosition() : modelSelection.getFirstPosition();
 			const newRange = modelDocument.getNearestSelectionRange( position, isForward ? 'forward' : 'backward' );
 
@@ -161,6 +154,25 @@ export default class Widget extends Plugin {
 					modelSelection.setRanges( [ newRange ] );
 				} );
 			}
+
+			return;
+		}
+
+		// If selection is next to object element.
+		// Return if not collapsed.
+		if ( !modelSelection.isCollapsed ) {
+			return;
+		}
+
+		const objectElement2 = this._getObjectNextToSelection( isForward );
+
+		if ( objectElement2 instanceof ModelElement && modelDocument.schema.objects.has( objectElement2.name ) ) {
+			domEventData.preventDefault();
+			eventInfo.stop();
+
+			modelDocument.enqueueChanges( () => {
+				this._setSelectionOverElement( objectElement2 );
+			} );
 		}
 	}
 
@@ -173,6 +185,25 @@ export default class Widget extends Plugin {
 	_setSelectionOverElement( element ) {
 		this.editor.document.selection.setRanges( [ ModelRange.createOn( element ) ] );
 	}
+
+	_getObjectNextToSelection( forward = true ) {
+		const modelDocument = this.editor.document;
+		const schema = modelDocument.schema;
+		const modelSelection = modelDocument.selection;
+		const dataController = this.editor.data;
+
+		// Clone current selection to use it as a probe. We must leave default selection as it is so it can return
+		// to its current state after undo.
+		const probe = ModelSelection.createFromSelection( modelSelection );
+		dataController.modifySelection( probe, { direction: forward ? 'forward' : 'backward' } );
+		const objectElement = forward ? probe.focus.nodeBefore : probe.focus.nodeAfter;
+
+		if ( objectElement instanceof ModelElement && schema.objects.has( objectElement.name ) ) {
+			return objectElement;
+		}
+
+		return null;
+	}
 }
 
 function getSelectedElement( modelSelection ) {