Преглед изворни кода

Flash navigator enhancements:
- The tooltip is always at 1:1 scale even if the whole graph is zoomed out.
- Provide some feedback when an error occurs while loading the data (instead of spinning forever)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@825 a333f486-631f-4898-b8df-5754b55c2be0

dflaven пре 14 година
родитељ
комит
cef4533c56

+ 4 - 3
navigator/iTop/GraphNode.as

@@ -65,7 +65,7 @@
 			m_oIcon.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoadError);
 			m_oIcon.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
 			m_oIcon.load(myURL);
-			addChild(m_oIcon);
+			//addChild(m_oIcon);
 			addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)  
 			addEventListener(MouseEvent.MOUSE_UP, mouseReleased); 
 			addEventListener( MouseEvent.MOUSE_OVER, mouseOver );
@@ -99,15 +99,16 @@
 			// Add the Loader on the Sprite when the loading is completed
 			m_oIcon.x = -m_oIcon.width / 2;
 			m_oIcon.y = -m_oIcon.height + 8; // Slightly shifted downward
-			
 			// Construct a tooltip
 			addChild(m_oToolTip);
 			addChild(m_oIcon);
+			//hitArea = m_oIcon; // Drag only by the icon...
 			trace('m_sLabel, getChildIndex:'+getChildIndex(m_sLabel));
 			trace('m_oToolTip, getChildIndex:'+getChildIndex(m_oToolTip));
+			trace('m_oIcon, getChildIndex:'+getChildIndex(m_oIcon));
 			//swapChildren(m_oToolTip, );
 			// Start the tooltip
-			m_oToolTip.start(); 
+			m_oToolTip.start();
 		}
 		 
 		function mouseDown(event:MouseEvent):void 

+ 55 - 17
navigator/iTop/Navigator.as

@@ -1,4 +1,4 @@
-package iTop
+package iTop
 {
 	import flash.display.*;
 	import flash.geom.*;
@@ -35,7 +35,7 @@ package iTop
 		protected var m_Ks = 30; // Solid friction coeff
 		protected var m_deltaT = 0.1; // Interval of time between updates
 		protected var m_MAX_ITEMS_PER_ROW = 8;
-		protected var m_FOCUS_DELAY_COUNTDOWN = 50; // 50 images to zoom & pan correctly
+		protected var m_FOCUS_DELAY_COUNTDOWN = 30; // 30 images to zoom & pan correctly
 		protected var m_fZoom:Number;
 		
 		// Constructor
@@ -99,6 +99,10 @@ package iTop
 			m_oCanvas.scaleX = m_fZoom;
 			m_oCanvas.scaleY = m_fZoom;
 		}
+		function GetZommLevel()
+		{
+			return m_fZoom;
+		}
 		
 		function doLoadData()
 		{
@@ -119,25 +123,52 @@ package iTop
 		
 		function onXMLLoadComplete(event:Event):void
 		{
-			var myXML:XML = XML(m_oLoader.data);
-			//trace("Data loaded." + myXML);
-			//trace("===========================");
-			parseXMLData(null, myXML, 0, 0);
-			m_sTitle.text = myXML.attribute("title");
-			m_oZoomSlider.enabled = true;
-			removeChild(m_oPreloader);
-			addEventListener(Event.ENTER_FRAME, drawLines);
-			m_oZoomSlider.value = 100;
-			m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange);
-			stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)  
-			stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
-			//trace('======= Initial Posistions =========');
-			//DumpPositions();
+			try
+			{
+				var myXML:XML = XML(m_oLoader.data);
+				//trace("Data loaded." + myXML);
+				//trace("===========================");
+				parseXMLData(null, myXML, 0, 0);
+				m_sTitle.text = myXML.attribute("title");
+				m_oZoomSlider.enabled = true;
+				addEventListener(Event.ENTER_FRAME, drawLines);
+				m_oZoomSlider.value = 100;
+				m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange);
+				stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)  
+				stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
+				//trace('======= Initial Posistions =========');
+				//DumpPositions();
+			}
+			catch(error:IOErrorEvent)
+			{
+				m_sTitle.text = "I/O Error: unable to load the graph data ("+error+")";
+			}
+			catch(error:TypeError)
+			{
+				m_sTitle.text = "Error: unable to load the graph data (Invalid XML data)";
+			}
+			catch(error:Error)
+			{
+				m_sTitle.text = "Error: unable to load the graph data ("+error+")";
+			}
+			finally
+			{
+				if (m_oPreloader != null)
+				{
+					removeChild(m_oPreloader);
+					m_oPreloader = null;
+				}
+			}
 		}
 
 		function onXMLLoadError(event:IOErrorEvent):void
 		{
-			trace("An error occured:" + Event);
+				if (m_oPreloader != null)
+				{
+					removeChild(m_oPreloader);
+					m_oPreloader = null;
+				}
+				m_sTitle.text = "I/O Error: unable to load the graph data ("+event+")";
 		}
 		
 		function parseXMLData(oParentNode:GraphNode, oXMLData:XML, iChildIndex:Number, iChildCount:Number)
@@ -363,6 +394,13 @@ package iTop
 				trace('FOCUS_DELAY:'+this.m_FOCUS_DELAY_COUNTDOWN);
 				UpdatePanAndZoom(m_FOCUS_DELAY_COUNTDOWN / 30);
 			}
+			else if (this.m_FOCUS_DELAY_COUNTDOWN == 0)
+			{
+				// Increase the friction so that manually manipulating objects gets easier
+				trace("More friction now...");
+				m_Ks = 5*m_Ks; // 5 times more friction
+				this.m_FOCUS_DELAY_COUNTDOWN--;
+			}
 		}
 		function drawArrow(oPt:Point, dx:Number, dy:Number, color:uint):void
 		{

+ 5 - 1
navigator/iTop/ToolTip.as

@@ -1,4 +1,4 @@
-package iTop
+package iTop
 {
 	import flash.display.*;
 	import flash.geom.*;
@@ -93,6 +93,10 @@ package iTop
 		private function appear(i:uint):void
 		{
 			// The delay has elapsed, show (smoothly) the tooltip
+			// Make sure that the tooltip always appears at se same scale 1:1 even
+			// if the whole scene is zoomed out
+			scaleX = 1 / this.parent.parent.scaleX;
+			scaleY = 1 / this.parent.parent.scaleY;
 			if (this.timer != null)
 			{
 				this.timer.stop();

BIN
navigator/navigator.fla


BIN
navigator/navigator.swf