Показать сообщение отдельно
Старый 25.12.2007, 10:44
f3ath вне форума Посмотреть профиль Отправить личное сообщение для f3ath Найти все сообщения от f3ath
  № 36  
f3ath

Регистрация: Dec 2007
Сообщений: 8
Tooltip, он же Hint, он же всплывающая подсказка, на AS 2.0. Рабочий вариант класса, который использован мной в готовом приложении. Выкладываю as is, кому нужно, тот разберется.

Код:
class Tooltip
{
	private var clientList:Array;
	private var currentHintIndex;
	private var globalMovieClip; // movieClip to get mouse coordinates from, usually _root?
	
	private var xMouseValue, yMouseValue:Number;
	private var delayCounter:Number;

	private var hitTestCalled:Boolean;
	
	public static var interval:Number = 50; // ticks interval in millisec
	public static var delay:Number = 700; // delay mouse stops and before hint shown
	public static var movieClipName; // movieclip himself
	
	private var hint;
	
	public function Tooltip()
	{
		clientList = [];
		globalMovieClip = _root;
		xMouseValue = globalMovieClip._Xmouse; 
		yMouseValue = globalMovieClip._Ymouse; 
		delayCounter = 0;
		hitTestCalled = false;
		setInterval(this, 'tick', interval);
	}
	
	public function tick()
	{
		if((xMouseValue == globalMovieClip._Xmouse) && (yMouseValue == globalMovieClip._Ymouse))
		{
			delayCounter += Tooltip.interval;
			if(delayCounter >= Tooltip.delay)
			{
				if(!hitTestCalled) doHitTest();
				hitTestCalled = true;
			};
		}
		else
		{
			hitTestCalled = false;
			delayCounter = 0;
			hideCurrent();
		}
		
		xMouseValue = globalMovieClip._Xmouse; 
		yMouseValue = globalMovieClip._Ymouse; 
		
	}
	private function showHint(i)
	{
		currentHintIndex = i;
		if(!clientList[i].txt) return;
		hint = mx.managers.DepthManager.createObjectAtDepth('HintMovieClip', mx.managers.DepthManager.kTooltip);
		hint.txt.text = clientList[i].txt;
		hint._x = globalMovieClip._Xmouse + 10; 
		hint._y = globalMovieClip._Ymouse + 10; 
		hint.setDepthTo(mx.managers.DepthManager.kTooltip);
	}

	private function hideHint(i)
	{
		currentHintIndex = undefined;
		hint.removeMovieClip();
	}
	
	private function hideCurrent()
	{
		if(undefined == currentHintIndex) return;
		hideHint(currentHintIndex);
	}
	
	private function doHitTest()
	{
		
		var mc = getTopmostVisibleMC(_root._Xmouse, _root._Ymouse, _root);
		//trace('topmost='+mc);
		var index = clientList.getIndexByProp('mc', mc)
		

		if(undefined != index)
		{
			showHint(index);
		}
		else
		{
			sweep(); //while we're in idle
		}
	}
	
	public function registerClient(mc, txt:String)
	{
		var i = clientList.getIndexByProp('mc', mc);
		if(undefined == i)
		{
			clientList.push({mc:mc, txt:txt});
		}
		else
		{
			clientList[i].txt = txt;
		}
	}

	public function removeClient(mc)
	{
		var i = clientList.getIndexByProp('mc', mc);
		if(undefined == 1) return;
		clientList.splice(i, 1);
	}
	
	public function sweep()
	{
		var sweepedList:Array = [];
		for(var i:Number = 0; i < clientList.length; i++)
		{
			if(clientList[i].mc) sweepedList.push(clientList[i]);
		}
		clientList = sweepedList;
	}
	
	public function get length():Number
	{
		return clientList.length;
	}
	
	private function getTopmostVisibleMC(x, y, papa)
	{
		var candidate = undefined;

		for(var foo in papa)
		{
			if('movieclip' == typeof(papa[foo]))
			{
				if(!candidate && papa[foo]._visible)
				{
					if(papa[foo].hitTest(x, y, true)) candidate = papa[foo];
				}
				else
				{
					if((candidate.getDepth() < papa[foo].getDepth()))
					{
						if(papa[foo]._visible && papa[foo].hitTest(x, y, true))
						{
							candidate = papa[foo];
							//trace('ht='+candidate+'@'+candidate.getDepth());
						}
					}
				}
			}
		}
		return candidate;
	}
	
}