You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by yi...@apache.org on 2019/12/03 11:11:39 UTC

[royale-asjs] branch develop updated: Multi Drag Drop - Ignore dragging of non-selected items, unless it's a single item

This is an automated email from the ASF dual-hosted git repository.

yishayw pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 5172b1e  Multi Drag Drop - Ignore dragging of non-selected items, unless it's a single item
5172b1e is described below

commit 5172b1e39ccae79d4bce5c4c358e1fdf898daacc
Author: DESKTOP-RH4S838\Yishay <yi...@hotmail.com>
AuthorDate: Tue Dec 3 13:10:10 2019 +0200

    Multi Drag Drop - Ignore dragging of non-selected items, unless it's a single item
---
 .../html/beads/MultiSelectionDragImageBead.as      | 25 +++++++++-----
 .../html/beads/MultiSelectionDragSourceBead.as     | 40 +++++++++++++---------
 2 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragImageBead.as b/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragImageBead.as
index 0fb795f..c9e27e6 100644
--- a/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragImageBead.as
+++ b/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragImageBead.as
@@ -19,6 +19,9 @@
 package org.apache.royale.html.beads
 {
 
+	import org.apache.royale.core.IMultiSelectionModel;
+	import org.apache.royale.html.beads.IListView;
+	import org.apache.royale.core.IStrandWithModel;
 	import org.apache.royale.collections.ArrayList;
 	import org.apache.royale.core.IBead;
 	import org.apache.royale.core.IBeadLayout;
@@ -35,7 +38,6 @@ package org.apache.royale.html.beads
 	import org.apache.royale.core.Lookalike;
 	import org.apache.royale.core.UIBase;
 	import org.apache.royale.core.IBeadView;
-	import org.apache.royale.html.IListView;
 	import org.apache.royale.events.DragEvent;
 	import org.apache.royale.events.Event;
 	import org.apache.royale.events.EventDispatcher;
@@ -101,7 +103,6 @@ package org.apache.royale.html.beads
 		/**
 		 * Creates an example/temporary component to be dragged and returns it.
 		 *
-		 * @param ir IItemRenderer The itemRenderer to be used as a template.
 		 * @return UIBase The "dragImage" to use.
 		 *
 		 *  @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
@@ -122,7 +123,7 @@ package org.apache.royale.html.beads
 				dragImage.addBead(new HorizontalLayout())
 			}
 			var itemRendererParent:IItemRendererParent = (_strand.getBeadByType(IBeadView) as IListView).dataGroup as IItemRendererParent;
-			var selectedIndices:Array = getSelectedIndices();
+			var selectedIndices:Array = model.selectedIndices;
 			for (var i:int = 0; i < selectedIndices.length; i++)
 			{
 				var ir:IItemRenderer = itemRendererParent.getItemRendererForIndex(selectedIndices[i]);
@@ -141,21 +142,27 @@ package org.apache.royale.html.beads
 			return dragImage;
 		}
 
-		private function getSelectedIndices():Array
-		{
-			return (_strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel).selectedIndices;
-		}
-
 		/**
 		 * @private
 		 *
 		 */
 		private function handleDragStart(event:DragEvent):void
 		{
-			if (getSelectedIndices())
+			var relatedObject:Object = event.relatedObject;
+			var itemRenderer:IItemRenderer = getParentOrSelfByType(relatedObject as IChild, IItemRenderer) as IItemRenderer;
+			if (itemRenderer && !model.selectedItems)
+			{
+				model.selectedItems = [itemRenderer.data];
+			}
+			if (model.selectedItems && (itemRenderer && model.selectedItems.indexOf(itemRenderer.data) > -1))
 			{
 				DragMouseController.dragImage = createDragImage();
 			}
 		}
+
+		private function get model():IMultiSelectionModel
+		{
+			return (_strand as IStrandWithModel).model as IMultiSelectionModel;
+		}
 	}
 }
diff --git a/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragSourceBead.as b/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragSourceBead.as
index d7c8929..a49e4c4 100644
--- a/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragSourceBead.as
+++ b/frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/MultiSelectionDragSourceBead.as
@@ -19,6 +19,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads
 {
+	import org.apache.royale.core.IStrandWithModel;
 	import org.apache.royale.collections.ArrayList;
 	import org.apache.royale.core.IBead;
 	import org.apache.royale.core.IChild;
@@ -162,8 +163,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dragSourceIndices():Array
 		{
-			var dataProviderModel:IMultiSelectionModel = _strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel;
-			return dataProviderModel.selectedIndices;
+			return model.selectedIndices;
 		}
 
 		/**
@@ -173,16 +173,23 @@ package org.apache.royale.html.beads
 		{
 			//trace("MultiSelectionDragSourceBead received the DragStart");
 
-			var dataProviderModel:IMultiSelectionModel = _strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel;
-			if (!dataProviderModel.selectedItems)
+			var relatedObject:Object = event.relatedObject;
+			var itemRenderer:IItemRenderer = getParentOrSelfByType(relatedObject as IChild, IItemRenderer) as IItemRenderer;
+			if (itemRenderer && !model.selectedItems)
 			{
+				model.selectedItems = [itemRenderer.data];
+			}
+			if (!model.selectedItems || !itemRenderer || model.selectedItems.indexOf(itemRenderer.data) < 0)
+			{
+				DragEvent.dragInitiator = this;
+				DragEvent.dragSource = null;
 				return;
 			}
 			DragEvent.dragInitiator = this;
 			DragMouseController.dragImageOffsetX = 0;
 			DragMouseController.dragImageOffsetY = -30;
 
-			DragEvent.dragSource = dataProviderModel.selectedItems;
+			DragEvent.dragSource = model.selectedItems;
 
 			var newEvent:Event = new Event("start", false, true);
 			dispatchEvent(newEvent);
@@ -191,6 +198,11 @@ package org.apache.royale.html.beads
 			}
 		}
 
+		private function get model():IMultiSelectionModel
+		{
+			return (_strand as IStrandWithModel).model as IMultiSelectionModel;
+		}
+
 		/**
 		 * @private
 		 */
@@ -226,15 +238,12 @@ package org.apache.royale.html.beads
 			dispatchEvent(newEvent);
 			if (newEvent.defaultPrevented) return;
 			
-			var dataProviderModel:IMultiSelectionModel = _strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel;
-			if (dataProviderModel is ISelectionModel) {
-				(dataProviderModel as IMultiSelectionModel).selectedIndices = null;
-			}
+			model.selectedIndices = null;
 
 			if (dragType == "copy") return;
 			var dragSource:Array = DragEvent.dragSource as Array;
-			if (dataProviderModel.dataProvider is Array) {
-				var dataArray:Array = dataProviderModel.dataProvider as Array;
+			if (model.dataProvider is Array) {
+				var dataArray:Array = model.dataProvider as Array;
 
 				for (var i:int = 0; i < dragSource.length; i++)
 				{
@@ -243,10 +252,10 @@ package org.apache.royale.html.beads
 
 				// refresh the dataProvider model
 				var newArray:Array = dataArray.slice()
-				dataProviderModel.dataProvider = newArray;
+				model.dataProvider = newArray;
 			}
-			else if (dataProviderModel.dataProvider is ArrayList) {
-				var dataList:ArrayList = dataProviderModel.dataProvider as ArrayList;
+			else if (model.dataProvider is ArrayList) {
+				var dataList:ArrayList = model.dataProvider as ArrayList;
 
 				for (i = 0; i < dragSource.length; i++)
 				{
@@ -265,8 +274,7 @@ package org.apache.royale.html.beads
 		 */
 		public function acceptedDrop(dropTarget:Object, type:String):void
 		{
-			var dataProviderModel:IMultiSelectionModel = _strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel;
-			dataProviderModel.selectedIndices = null;
+			model.selectedIndices = null;
 			dispatchEvent(new Event("complete"));
 		}