Esempio n. 1
0
			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;
}