Exemplo n.º 1
0
void AnimatorBar::UpdateAnimations(CApplication* pApp, CLayout* pFrame,  CObjType* pType, int iHandle)
{
	m_pCurrentAnimation = NULL;
	m_LockChange = true;

	m_pObjType = pType; //dont worry what value it is

	if (iHandle != -2 && iHandle != -1)
	{
		application = pApp;
		layout = pFrame;
	}

	bool bDoSave = false;

	if(pApp)
	{
		CAnimation* pAnimation = pApp->resources.FindAnimationFromNumber(iHandle);
		if (pAnimation == m_pAnimation)
			bDoSave = true;
		m_pCurrentAnimation = pAnimation;
	}

	if(animations.GetSelectedItem())
		m_SelectedItem[m_iHandle] = (CAnimation*)animations.GetItemData(animations.GetSelectedItem());

	m_iHandle = iHandle;

	if(m_SelectedItem.find(iHandle) == m_SelectedItem.end())
		m_SelectedItem[iHandle] = NULL;

	if(application)
	{
		HTREEITEM Iterate = animations.GetNextItem(animations.GetRootItem(), TVGN_ROOT);
		while(Iterate != NULL)
		{
			CAnimation* pAnim = (CAnimation*)animations.GetItemData(Iterate);
			if(pAnim)
			{
				if (animations.GetItemState(Iterate, TVIF_STATE) & TVIS_EXPANDED)
					pAnim->m_Expanded = true;
				else
					pAnim->m_Expanded = false;
			}
		

			HTREEITEM IterateChild;

			IterateChild = animations.GetChildItem(Iterate);
			if(!IterateChild)
			{
				bool Loop = true;
				while(Loop)
				{
					IterateChild = animations.GetNextItem(Iterate, TVGN_NEXT);
					if(IterateChild)
						Loop = false;
					else
						IterateChild = animations.GetParentItem(Iterate);
					if(!IterateChild)
						Loop = false;
					Iterate = IterateChild;
				}
			}

			Iterate = IterateChild;
		}
	}

	animations.DeleteAllItems();
	film_strip.DeleteAllItems();

	// Do we have a valid handle?
	if (application)
	{
		if (iHandle >= 0)
			m_pAnimation = application->resources.FindAnimationFromNumber(iHandle);
		else if (iHandle == -1)
			return;

		//if(!m_pAnimation->m_AllowSubanimations)
		//	AddAnimationToTree(m_pAnimation, TVI_ROOT);

		for(list<CAnimation>::iterator i = m_pAnimation->m_SubAnimations.begin(); i!= m_pAnimation->m_SubAnimations.end(); i++)
		{
			if(i->IsAngle())
				continue;
			
			AddAnimationToTree(&*i, TVI_ROOT);
		}
	}

	// Restore if necessary
	//if (bDoSave)
	{
		HTREEITEM Iterate = animations.GetNextItem(animations.GetRootItem(), TVGN_ROOT);
		while(Iterate != NULL)
		{

			CAnimation* pAnim = (CAnimation*)animations.GetItemData(Iterate);

			if(pAnim)
			{		
				if( pAnim->m_Expanded)
					animations.Expand(Iterate, TVE_EXPAND);
			
				if(m_SelectedItem[iHandle])
				{
					if(pAnim == m_SelectedItem[iHandle])
						animations.SelectItem(Iterate);
				}
				else
				{
					if(pAnim->m_SubAnimations.size() == 0)
						if(pAnim->m_Images.size())
						{
							m_SelectedItem[iHandle] = pAnim;
							animations.SelectItem(Iterate);
						}
				}

			}
			HTREEITEM IterateChild;

			IterateChild = animations.GetChildItem(Iterate);
			if(!IterateChild)
			{
				bool Loop = true;
				while(Loop)
				{
					IterateChild = animations.GetNextItem(Iterate, TVGN_NEXT);
					if(IterateChild)
						Loop = false;
					else
						IterateChild = animations.GetParentItem(Iterate);
					if(!IterateChild)
						Loop = false;
					Iterate = IterateChild;
				}
			}

			Iterate = IterateChild;
		}
	
	}

	m_LockChange = false;

	UpdateFilmStrip();
}
Exemplo n.º 2
0
void CAnimationEditorDlg::UpdateAnimations()
{
	m_AnimationTree.SetRedraw(false);
	
	CExpand expanded;
	DWORD selected = -1;
	if(m_AnimationTree.GetSelectedItem())
		selected = m_AnimationTree.GetItemData(m_AnimationTree.GetSelectedItem());
	if(FirstRun)
	{
		CAnimation* anim = m_Animation;
		//topmost animation we need to find a subanimation that isn't an angle
		for(list<CAnimation>::iterator i = anim->m_SubAnimations.begin(); i!= anim->m_SubAnimations.end(); i++)
		{
			if(i->IsAngle())
				continue;
			
			anim = &*i;
			i = anim->m_SubAnimations.end();
		}

		while(anim->m_SubAnimations.size() != 0)
			anim = &anim->m_SubAnimations.front();

		selected = (DWORD)anim;
	}

	// store what has been expanded (note this is a special type of nesting performed without a nested function
	map<int, bool> ToExpand;
	HTREEITEM Iterate = m_AnimationTree.GetNextItem(m_AnimationTree.GetRootItem(), TVGN_ROOT);
	while(Iterate != NULL)
	{
		if (m_AnimationTree.GetItemState(Iterate, TVIF_STATE) & TVIS_EXPANDED)
		{
			ToExpand[m_AnimationTree.GetItemData(Iterate)] = true;
		}

		HTREEITEM Iterate2;

		Iterate2 = m_AnimationTree.GetChildItem(Iterate);
		if(!Iterate2)
		{
			bool loop = true;
			while(loop)
			{
				Iterate2 = m_AnimationTree.GetNextItem(Iterate, TVGN_NEXT);
				if(Iterate2)
					loop = false;
				else
					Iterate2 = m_AnimationTree.GetParentItem(Iterate);
				if(!Iterate2)
					loop = false;
				Iterate = Iterate2;
			}
		}
		Iterate = Iterate2;
	}

	m_AnimationTree.DeleteAllItems();
	m_Frames.DeleteAllItems();
	m_ImageList.DeleteImageList();

	// End store
	for(list<CAnimation>::iterator i = m_Animation->m_SubAnimations.begin(); i!= m_Animation->m_SubAnimations.end(); i++)
	{
		if(i->IsAngle())
			continue;
		AddAnimationToTree(&*i, TVI_ROOT);
	}

	UpdateList();

	// Recover
	// store what has been expanded (note this is a special type of nesting performed without a nested function
	
	Iterate = m_AnimationTree.GetNextItem(m_AnimationTree.GetRootItem(), TVGN_ROOT);
	while(Iterate != NULL)
	{
		if( ToExpand.find( m_AnimationTree.GetItemData(Iterate)) != ToExpand.end() || FirstRun )
		{
			m_AnimationTree.SetItemState(Iterate, TVIS_EXPANDED, TVIS_EXPANDED);
		}
		if(m_AnimationTree.GetItemData(Iterate) == selected)
		{
			m_AnimationTree.SelectItem(Iterate);
		}

		HTREEITEM Iterate2;

		Iterate2 = m_AnimationTree.GetChildItem(Iterate);
		if(!Iterate2)
		{
			bool loop = true;
			while(loop)
			{
				Iterate2 = m_AnimationTree.GetNextItem(Iterate, TVGN_NEXT);
				if(Iterate2)
					loop = false;
				else
					Iterate2 = m_AnimationTree.GetParentItem(Iterate);
				if(!Iterate2)
					loop = false;
				Iterate = Iterate2;
			}
		}
		Iterate = Iterate2;
	}

	FirstRun = false;

	// End Recover
	m_AnimationTree.SetRedraw(true);
	m_AnimationTree.Invalidate();
}
Exemplo n.º 3
0
void AnimatorBar::AddAnimationToTree(CAnimation* pAnimation, HTREEITEM parent)
{
	HTREEITEM item;
	if(pAnimation->IsAngle())
	{
		CString AngleName;
		AngleName.Format("%s: %.3f", AB_ANGLE, pAnimation->m_Angle);

		// Strip trailing zeroes
		if (AngleName.Find('.') != -1) {
			while (AngleName.Right(1) == "0")
				AngleName.Delete(AngleName.GetLength() - 1);
			if (AngleName.Right(1) == ".")
				AngleName.Delete(AngleName.GetLength() - 1);
		}

		AngleName += "°";

		if(pAnimation->m_Angle == 0)
			AngleName += " (" + AB_RIGHT + ")";
		if(pAnimation->m_Angle == 90)
			AngleName += " (" + AB_BOTTOM + ")";
		if(pAnimation->m_Angle == 180)
			AngleName += " (" + AB_LEFT + ")";
		if(pAnimation->m_Angle == 270)
			AngleName += " (" + AB_TOP + ")";

		item = animations.InsertItem(AngleName, parent);
	}

	else
	{
		if (parent != TVI_ROOT)
			item = animations.InsertItem(pAnimation->m_Name, 2, 2, parent);
		else
			item = animations.InsertItem(pAnimation->m_Name, 1, 1, parent);
	}

	animations.SetItemData(item, (DWORD)pAnimation);

	vector<CAnimation*> angles;
	vector<CAnimation*> subanimations;
	for(list<CAnimation>::iterator i = pAnimation->m_SubAnimations.begin(); i != pAnimation->m_SubAnimations.end(); i++)
	{
		if(i->m_IsAngle)
			angles.push_back(&*i);
		else
			subanimations.push_back(&*i);
	}

	while(angles.size() > 0)
	{
		vector<CAnimation*>::iterator smallest = angles.begin();

		for(vector<CAnimation*>::iterator a = angles.begin(); a != angles.end(); a++)
		{
			if((*smallest)->m_Angle > (*a)->m_Angle)
				smallest = a;
		}

		AddAnimationToTree(*smallest, item);
		angles.erase(smallest);
	}

	// Now simply add subanimations below
	for(vector<CAnimation*>::iterator s = subanimations.begin(); s != subanimations.end(); s++)
		AddAnimationToTree(*s, item);

	pAnimation->m_Tree = item;
}
Exemplo n.º 4
0
void CAnimationEditorDlg::AddAnimationToTree(CAnimation* anim, HTREEITEM parent)
{
	HTREEITEM item;
	if(anim->IsAngle())
	{
		CString AngleName;
		AngleName.Format("Angle: %.3f", anim->m_Angle);

		// Strip trailing zeroes
		if (AngleName.Find('.') != -1) {
			while (AngleName.Right(1) == "0")
				AngleName.Delete(AngleName.GetLength() - 1);
			if (AngleName.Right(1) == ".")
				AngleName.Delete(AngleName.GetLength() - 1);
		}

		AngleName += "°";

		if(anim->m_Angle == 0)
			AngleName += " (right)";
		if(anim->m_Angle == 90)
			AngleName += " (bottom)";
		if(anim->m_Angle == 180)
			AngleName += " (left)";
		if(anim->m_Angle == 270)
			AngleName += " (top)";

		item = m_AnimationTree.InsertItem(AngleName, parent);
	}
	else
	{
		item = m_AnimationTree.InsertItem(anim->m_Name, parent);

	}
	m_AnimationTree.SetItemData(item, (DWORD)anim);

	vector<CAnimation*> angles;
	vector<CAnimation*> subanimations;
	for(list<CAnimation>::iterator i = anim->m_SubAnimations.begin(); i != anim->m_SubAnimations.end(); i++)
	{
		if(i->m_IsAngle)
			angles.push_back(&*i);
		else
			subanimations.push_back(&*i);
	}

	//This is a sort of 'sort on the fly' function
	while(angles.size() > 0)
	{
		vector<CAnimation*>::iterator smallest = angles.begin();

		for(vector<CAnimation*>::iterator a = angles.begin(); a != angles.end(); a++)
		{
			if((*smallest)->m_Angle > (*a)->m_Angle)
				smallest = a;
			
		}
		AddAnimationToTree(*smallest, item);
		angles.erase(smallest);
	}
	// Now simply add subanimations below
	for(vector<CAnimation*>::iterator s = subanimations.begin(); s != subanimations.end(); s++)
	{
		AddAnimationToTree(*s, item);
	}
}