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(); }
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(); }
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; }
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); } }