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 2021/07/29 13:10:52 UTC

[royale-asjs] branch develop updated: Fixes #1139

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 ece6775  Fixes #1139
     new 78c45ec  Merge branch 'develop' of https://github.com/apache/royale-asjs into develop
ece6775 is described below

commit ece67751297db0b1c6877b353ef14419637cbf3b
Author: Yishay Weiss <yi...@hotmail.com>
AuthorDate: Thu Jul 29 16:09:12 2021 +0300

    Fixes #1139
---
 .../Basic/src/main/resources/basic-manifest.xml    |   2 +-
 .../org/apache/royale/html/beads/DragBead.as       | 138 +++++++++++++++++++++
 .../main/royale/mx/containers/beads/PanelView.as   |  15 ++-
 3 files changed, 149 insertions(+), 6 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index 75b1021..e85b84d 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -115,7 +115,7 @@
     <component id="ListView" class="org.apache.royale.html.beads.ListView"/>
     <component id="AccordionView" class="org.apache.royale.html.beads.AccordionView"/>
     <component id="CenterElement" class="org.apache.royale.html.beads.CenterElement"/>
-    <component id="StyleInheritanceBead" class="org.apache.royale.html.beads.StyleInheritanceBead"/>
+    <component id="DragBead" class="org.apache.royale.html.beads.DragBead"/>
     <component id="HideComboPopupOnMouseDownBead" class="org.apache.royale.html.beads.HideComboPopupOnMouseDownBead"/>
     <component id="KeepComboPopupWithinParentBounds" class="org.apache.royale.html.beads.KeepComboPopupWithinParentBounds"/>
     <component id="StyleInheritanceWithObserverBead" class="org.apache.royale.html.beads.StyleInheritanceWithObserverBead"/>
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DragBead.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DragBead.as
new file mode 100644
index 0000000..1b40131
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DragBead.as
@@ -0,0 +1,138 @@
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.beads
+{
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.MouseEvent;
+	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IUIBase;
+	import org.apache.royale.core.IChild;
+	import org.apache.royale.geom.Point;
+	import org.apache.royale.geom.Rectangle;
+	
+	/**
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10.2
+	 *  @playerversion AIR 2.6
+	 *  @productversion Royale 0.9.8
+	 */
+	public class DragBead implements IBead
+	{
+		protected var _host:IUIBase;
+		protected var startingPoint:Point;
+		private var _hitArea:IEventDispatcher;
+		private var _moveArea:Rectangle;
+		/**
+		 *  @copy org.apache.royale.core.IBead#strand
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.8
+		 */
+		public function set strand(value:IStrand):void
+		{
+			_host = value as IUIBase;
+			if (!_hitArea)
+			{
+				_hitArea = value as IEventDispatcher;
+			}
+			if (!_moveArea)
+			{
+				var hostParent:IUIBase = (_host as IChild).parent as IUIBase;
+				_moveArea = new Rectangle(hostParent.x, hostParent.y, hostParent.width, hostParent.height);
+			}
+			_hitArea.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
+		}
+
+		/**
+		 *  Area on which user presses mouse down to drag strand. Typically this is the title bar of a panel.
+		 *  If nothing is specified then the hit area is assumed to be the whole strand.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.8
+		 */
+		public function get hitArea():IEventDispatcher
+		{
+			return _hitArea;
+		}
+
+		public function set hitArea(value:IEventDispatcher):void
+		{
+			_hitArea = value;
+		}
+
+		/**
+		 *  Area to which dragging is constrained. By default it is the width and height of the strand's parent
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.8
+		 */
+		public function get moveArea():Rectangle
+		{
+			return _moveArea;
+		}
+
+		public function set moveArea(value:Rectangle):void
+		{
+			_moveArea = value;
+		}
+
+		protected function mouseDownHandler(event:MouseEvent):void
+		{
+			startingPoint = new Point(event.clientX, event.clientY);
+			_host.topMostEventDispatcher.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
+			_host.topMostEventDispatcher.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+		}
+
+		protected function mouseMoveHandler(event:MouseEvent):void
+		{
+
+			var xDelta:Number = event.clientX - startingPoint.x;
+			var yDelta:Number = event.clientY - startingPoint.y;
+			var potentialX:Number = _host.x + xDelta;
+			var potentialY:Number = _host.y + yDelta;
+			if (potentialX < 0 || potentialX > _moveArea.x + _moveArea.width - _host.width)
+			{
+				xDelta = 0;
+			}
+			if (potentialY < 0 || potentialY > _moveArea.y + _moveArea.height - _host.height)
+			{
+				yDelta = 0;
+			}
+			_host.x = _host.x + xDelta;
+			_host.y = _host.y + yDelta;
+			startingPoint.x += xDelta;
+			startingPoint.y += yDelta;
+		}
+
+		protected function mouseUpHandler(event:MouseEvent):void
+		{
+			_host.topMostEventDispatcher.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+			_host.topMostEventDispatcher.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
+		}
+
+	}
+}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as
index 280c656..f34da21 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/PanelView.as
@@ -30,6 +30,7 @@ import mx.core.Container;
 import mx.core.ContainerLayout;
 import mx.core.UIComponent;
 
+import org.apache.royale.html.beads.DragBead;
 import org.apache.royale.core.IBead;
 import org.apache.royale.core.ILayoutChild;
 import org.apache.royale.core.IStrand;
@@ -70,12 +71,16 @@ public class PanelView extends org.apache.royale.html.beads.PanelView
     override public function set strand(value:IStrand):void
     {
         titleBar = new PanelTitleBar();
-		var panel:IEventDispatcher = value as IEventDispatcher;
-		panel.addEventListener("widthChanged", handleSizeChanged);
-		panel.addEventListener("heightChanged", handleSizeChanged);
-		panel.addEventListener("sizeChanged", handleSizeChanged);
+	var dragBead:DragBead = new DragBead();
+	dragBead.hitArea = titleBar;
+        dragBead.moveArea = (titleBar as UIComponent).screen;
+	value.addBead(dragBead);
+	var panel:IEventDispatcher = value as IEventDispatcher;
+	panel.addEventListener("widthChanged", handleSizeChanged);
+	panel.addEventListener("heightChanged", handleSizeChanged);
+	panel.addEventListener("sizeChanged", handleSizeChanged);
         super.strand = value;
-	}
+     }
 	
 	private var sawSizeChanged:Boolean;