bool cUpdateLayout::operator()(ecs::cEntityWithData& ed, cmp::cLocation * zOldLoc) { auto world = mainecs()->TagusToEntities("World")->second->second.Component<ecs::cmp::cWorldData>(); auto newloc = ed->second.Component<cmp::cLocation>(); auto oldlvl_it = world->mLevelMap.find(zOldLoc->mLevelId); auto newlvl_it = world->mLevelMap.find(newloc->mLevelId); //rl::cLayout * oldlay = (oldlvl_it != world->mLevelMap.end()) ? &oldlvl_it->second->second.Component<cmp::cLevelData>()->mLayout : nullptr; //rl::cLayout * newlay = (newlvl_it != world->mLevelMap.end()) ? &newlvl_it->second->second.Component<cmp::cLevelData>()->mLayout : nullptr; // level didn't change if (zOldLoc->mLevelId == newloc->mLevelId) { if (newlvl_it != world->mLevelMap.end()) UpdateLayout(ed, newlvl_it->second, zOldLoc->mPos); } else // level changed { if (oldlvl_it != world->mLevelMap.end()) RemoveFromLayout(ed, oldlvl_it->second, zOldLoc->mPos); if (newlvl_it != world->mLevelMap.end()) AddToLayout(ed, newlvl_it->second); } return true; }
//------------------------------------------------------------------------------ CIwAttrInstance* CUIEdProjectUI::Move(CIwAttrInstance* inst,CIwAttrInstance* parent,int actionModifer) { int i; CUIEdAttrShared& shared=CIwTheHost.m_Shared; CUIEdAttrLinkData* link=GetLink(inst); CUIEdAttrLinkData* parentLink=GetLink(parent); CUIEdAttrLinkData* sibling=NULL; CUIEdAttrLinkData* layout=NULL; CUIEdAttrLinkData* layoutSibling=NULL; if (link==NULL) return NULL; if (link->m_Type==LAYOUTITEM_PROPERTYSET) if (parentLink==NULL || link->m_Element->m_Parent==NULL || parentLink->m_Element->m_Class->GetMember(link->m_Element->m_Parent->m_Member->m_Name)==NULL) return NULL; if (link->m_Parent!=NULL) { for (i=0; i<(int)link->m_Parent->m_Children.size(); i++) { if (link->m_Parent->m_Children[i]==link) { link->m_Parent->m_Children.erase(link->m_Parent->m_Children.begin()+i); break; } } if (link->m_LayoutItem!=NULL && link->m_Element->m_Parent!=NULL && link->m_Element->m_Parent->m_Instance==link->m_LayoutItem) shared.Remove(link->m_LayoutItem); else { if (link->m_LayoutItem!=NULL) shared.Remove(link->m_LayoutItem); shared.Remove(link->m_Element); } } if (actionModifer&ACTIONMODIFIER_INSERT) { sibling=parentLink; parentLink=parentLink->m_Parent; } if (link->m_Type==LAYOUTITEM_FOCUS) { if (parentLink->m_Type!=LAYOUTITEM_ELEMENT) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT); if (parentLink==NULL) return NULL; layout=parentLink->GetFocus(); if (layout!=NULL) Delete(layout->m_Element); MoveLink(link,parentLink,sibling); AddToElement(link,parentLink,sibling); return link->m_Element; } if (link->m_Type==LAYOUTITEM_PROPERTYSET) { if (parentLink->m_Type!=LAYOUTITEM_ELEMENT) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT,&sibling); if (parentLink==NULL) return NULL; MoveLink(link,parentLink,sibling); AddToElement(link,parentLink,sibling); return link->m_Element; } if (parentLink->m_Type==LAYOUTITEM_FOCUS || parentLink->m_Type==LAYOUTITEM_PROPERTYSET) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT,&sibling); if (parentLink->m_Type==LAYOUTITEM_LAYOUTITEM) parentLink=parentLink->GetParent(LAYOUTITEM_LAYOUT,&sibling); if (link->m_Type==LAYOUTITEM_ELEMENT) { if (parentLink->m_Type==LAYOUTITEM_LAYOUT) { layout=parentLink; layoutSibling=sibling; parentLink=layout->GetParent(LAYOUTITEM_ELEMENT,&sibling); } else if (parentLink->m_Type==LAYOUTITEM_ELEMENT) layout=parentLink->GetLayout(); if (layout!=NULL) MoveLink(link,layout,layoutSibling); else MoveLink(link,parentLink,sibling); AddToElement(link,parentLink,sibling); if (layout!=NULL) { if (link->m_LayoutItem==NULL) AddToLayout(link,layout,layoutSibling); else Add2(link->m_LayoutItem,layout->m_Element,layoutSibling!=NULL ? layoutSibling->m_Element : NULL); } return link->m_Element; } if (link->m_Type==LAYOUTITEM_LAYOUT) { if (parentLink->m_Type==LAYOUTITEM_LAYOUT) { layout=parentLink; layoutSibling=sibling; parentLink=layout->GetParent(LAYOUTITEM_ELEMENT,&sibling); } else if (parentLink->m_Type==LAYOUTITEM_ELEMENT) { layout=parentLink->GetLayout(); if (layout==NULL) { layout=parentLink; layoutSibling=sibling; } } if (layout==NULL) return NULL; MoveLink(link,layout,layoutSibling); if (layout->m_Type==LAYOUTITEM_LAYOUT) { if (link->m_LayoutItem==NULL) { AddToLayout(link,layout,layoutSibling); Add2(link->m_Element,link->m_LayoutItem); } else Add2(link->m_LayoutItem,layout->m_Element,layoutSibling!=NULL ? layoutSibling->m_Element : NULL); } else AddToElement(link,parentLink,sibling); for (i=0; i<(int)link->m_Children.size(); i++) { if (link->m_Children[i]->m_Type==LAYOUTITEM_ELEMENT) { shared.Remove(link->m_Children[i]->m_Element); AddToElement(link->m_Children[i],parentLink,sibling); } } return link->m_Element; } if (link->m_Type==LAYOUTITEM_LAYOUTITEM) { if (parentLink->m_Type==LAYOUTITEM_ELEMENT) { if (parentLink->GetLayout()==NULL) parentLink=parentLink->GetParent(LAYOUTITEM_LAYOUT,&sibling); else { parentLink=parentLink->GetLayout(); sibling=NULL; } } if (parentLink==NULL) return NULL; MoveLink(link,parentLink,sibling); AddToLayout(link,parentLink,sibling); Add2(link->m_Element,link->m_LayoutItem); return link->m_Element; } return inst; }
//------------------------------------------------------------------------------ CIwAttrInstance* CUIEdProjectUI::SetLayout(CIwAttrInstance* inst,CIwAttrInstance* parent) { if (inst==NULL || parent==NULL) return NULL; int i; CIwAttrInstance* inst2=NULL; std::vector<CIwAttrNote> notes; std::vector<CIwAttrNote> notes1; std::vector<CIwAttrNote> notes2; CUIEdAttrLinkData* link2=NULL; CUIEdAttrLinkData* link=GetLink(inst); if (link==NULL) return NULL; link=ResolveAddItem(link); CUIEdAttrLinkData* parentLink=GetLink(parent); if (parentLink==NULL) return NULL; if (parentLink->m_Type!=LAYOUTITEM_ELEMENT) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT); if (link==NULL) { link2=parentLink->GetLayout(); if (link2!=NULL) { inst2=link2->m_Element; link2->UnlinkAndRemove(); CIwTheHost.m_Shared.Remove(inst2); delete inst2; } SetupElements(parentLink->m_Element,parentLink->m_Parent); SetChanged(true); return parent; } link->m_Element->FillNotes(notes1,true,0,true); if (parentLink->GetLayout()!=NULL) { link2=parentLink->GetLayout(); inst2=link2->m_Element; for (i=0; i<(int)link2->m_Children.size(); i++) { delete link2->m_Children[i]; } link2->m_Children.clear(); } for (i=0; i<(int)notes1.size(); i++) { if (notes1[i].m_Name.IsSameAs(L"class",false)) { if (parentLink->GetLayout()==NULL) { std::vector<wxString> argv2; argv2.push_back(L"{"); inst2=parentLink->m_Element->AddFromNote(L"C"+notes1[i].m_Data,notes1[i],argv2,parentLink->m_Element); link2=new CUIEdAttrLinkData(link->m_Name,link->m_Type,parentLink,inst2); parentLink->m_Children.push_back(link2); } notes1.erase(notes1.begin()+i); break; } } if (inst2==NULL) return NULL; inst2->FillNotes(notes,false,0,true); parentLink->GetLayout()->m_Name=link->m_Name; for (i=0; i<(int)inst2->m_Data.size(); i++) { delete inst2->m_Data[i]; } inst2->m_Data.clear(); inst2->m_ExtraData.clear(); inst2->m_Class=link->m_Element->m_Class; inst2->AddDefaults(link->m_Element->m_Class); int mode=0; int info=0; for (i=0; i<(int)notes1.size(); i++) { switch (mode) { case 0: if (notes1[i].m_Name.IsSameAs(L"element")) { info=notes1[i].m_Info; mode=1; } else notes2.push_back(notes1[i]); break; case 1: if (notes1[i].m_Name.IsSameAs(L"}") && notes1[i].m_Info==info) mode=0; break; } } for (i=0; i<(int)notes.size(); i++) { switch (mode) { case 0: if (notes[i].m_Name.IsSameAs(L"element")) { info=notes[i].m_Info; notes2.push_back(notes[i]); mode=1; } break; case 1: notes2.push_back(notes[i]); if (notes[i].m_Name.IsSameAs(L"}") && notes[i].m_Info==info) mode=0; break; } } inst2->GetFromNotes(notes2); SetName(link2); SetupElements(link2->m_Element,parentLink); for (i=0; i<(int)parentLink->m_Children.size(); i++) { link=parentLink->m_Children[i]; if (link->m_Type==LAYOUTITEM_ELEMENT) { AddToLayout(link,link2); if (link->m_LayoutItem!=NULL) { parentLink->m_Children.erase(parentLink->m_Children.begin()+i); i--; link2->m_Children.push_back(link); link->m_Parent=link2; } } } SetChanged(true); return link2->m_Element; }
//------------------------------------------------------------------------------ CIwAttrInstance* CUIEdProjectUI::Add(CIwAttrInstance* inst,CIwAttrInstance* parent,int actionModifer) { if (inst==NULL || parent==NULL) return NULL; CUIEdAttrLinkData* link=GetLink(inst); if (link==NULL) return NULL; if ((actionModifer&ACTIONMODIFIER_TAKEALL)==0) link=ResolveAddItem(link); CUIEdAttrLinkData* sibling=NULL; CUIEdAttrLinkData* parentLink=GetLink(parent); CUIEdAttrLinkData* layout=NULL; CUIEdAttrLinkData* layoutSibling=NULL; if (parentLink==NULL) return NULL; if ((actionModifer&ACTIONMODIFIER_INSERT) && parentLink->m_Parent!=NULL) { sibling=parentLink; parentLink=parentLink->m_Parent; } if (link->m_Type==LAYOUTITEM_FOCUS) { if (parentLink->m_Type!=LAYOUTITEM_ELEMENT) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT); if (parentLink==NULL) return NULL; return CopyFocus(link,parentLink); } if (link->m_Type==LAYOUTITEM_PROPERTYSET) { if (parentLink->m_Type!=LAYOUTITEM_ELEMENT) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT,&sibling); if (parentLink==NULL) return NULL; if (parentLink->m_Element->m_Class->GetMember(link->m_Element->m_Parent->m_Member->m_Name)==NULL) return NULL; link=Copy(link,parentLink,sibling,actionModifer); if (link==NULL) return NULL; AddToElement(link,parentLink,sibling); return link->m_Element; } if (parentLink->m_Type==LAYOUTITEM_FOCUS || parentLink->m_Type==LAYOUTITEM_PROPERTYSET) parentLink=parentLink->GetParent(LAYOUTITEM_ELEMENT,&sibling); if (parentLink->m_Type==LAYOUTITEM_LAYOUTITEM) parentLink=parentLink->GetParent(LAYOUTITEM_LAYOUT,&sibling); if (link->m_Type==LAYOUTITEM_ELEMENT) { if (parentLink->m_Type==LAYOUTITEM_LAYOUT) { layout=parentLink; layoutSibling=sibling; parentLink=layout->GetParent(LAYOUTITEM_ELEMENT,&sibling); } else if (parentLink->m_Type==LAYOUTITEM_ELEMENT) layout=parentLink->GetLayout(); if (layout!=NULL) link=Copy(link,layout,layoutSibling,actionModifer); else link=Copy(link,parentLink,sibling,actionModifer); if (link==NULL) return NULL; if ((actionModifer&ACTIONMODIFIER_KEEPNAME)==0) SetName(link); AddToElement(link,parentLink,sibling); if (layout!=NULL) AddToLayout(link,layout,layoutSibling); return link->m_Element; } if (link->m_Type==LAYOUTITEM_LAYOUT) { bool replaceLayout=false; if (parentLink->m_Type==LAYOUTITEM_ELEMENT) { if (parentLink->GetLayout()==NULL) replaceLayout=true; else parentLink=parentLink->GetLayout(); sibling=NULL; } layout=link; if (replaceLayout) link=CopyLayout(link,parentLink); else link=Copy(link,parentLink,sibling,actionModifer); if (link==NULL) return NULL; if ((actionModifer&ACTIONMODIFIER_KEEPNAME)==0) SetName(link); if (!replaceLayout) { AddToLayout(link,parentLink,sibling); Add2(link->m_Element,link->m_LayoutItem); } CopyLayoutChildren(link,layout,actionModifer); return link->m_Element; } if (link->m_Type==LAYOUTITEM_LAYOUTITEM) { if (parentLink->m_Type==LAYOUTITEM_ELEMENT) { if (parentLink->GetLayout()==NULL) parentLink=parentLink->GetParent(LAYOUTITEM_LAYOUT,&sibling); else { parentLink=parentLink->GetLayout(); sibling=NULL; } } if (parentLink==NULL) return NULL; link=Copy(link,parentLink,sibling,actionModifer); if (link==NULL) return NULL; if ((actionModifer&ACTIONMODIFIER_KEEPNAME)==0) SetName(link); AddToLayout(link,parentLink,sibling); Add2(link->m_Element,link->m_LayoutItem); return link->m_Element; } return NULL; }