Skip to content

Commit

Permalink
Added Child order manipulation functions (c0Q2VUaGP3) & refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Neko-Box-Coder committed May 14, 2023
1 parent fe4e24c commit cffa91e
Show file tree
Hide file tree
Showing 7 changed files with 425 additions and 91 deletions.
286 changes: 231 additions & 55 deletions Include/ssGUI/DataClasses/Hierarchy.hpp

Large diffs are not rendered by default.

214 changes: 186 additions & 28 deletions Src/ssGUI/DataClasses/Hierarchy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

#include "ssGUI/HelperClasses/LogWithTagsAndLevel.hpp"

#include <algorithm>


namespace ssGUI
{
Expand Down Expand Up @@ -131,8 +133,7 @@ namespace ssGUI
if(Parent != -1 && newParent == CurrentObjectsReferences.GetObjectReference(Parent))
{
StashChildrenIterator();
auto result = newParent->FindChild(CurrentObject);
if(!result)
if(!newParent->MoveChildrenIteratorToChild(CurrentObject))
{
PopChildrenIterator();
ssGUI_ERROR(ssGUI_DATA_TAG, "Invalid parent detected");
Expand Down Expand Up @@ -330,7 +331,7 @@ namespace ssGUI
ssLOG_FUNC_EXIT();
}

bool Hierarchy::IsChildComposite() const
bool Hierarchy::IsCurrentChildComposite() const
{
if(CurrentChildIteratorFrontEnd || CurrentChildIteratorBackEnd)
return false;
Expand Down Expand Up @@ -427,6 +428,27 @@ namespace ssGUI
CurrentChild--;
}
}

bool Hierarchy::MoveChildrenIteratorToChild(ssGUI::GUIObject* child)
{
if(child == nullptr)
{
ssGUI_WARNING(ssGUI_DATA_TAG, "MoveChildrenIteratorToChild is called on nullptr");
return false;
}

ssGUIObjectIndex targetIndex = CurrentObjectsReferences.GetObjectIndex(child);

if(targetIndex < 0)
return false;

ChildInfo targetInfo;
targetInfo.ChildIndex = targetIndex;
targetInfo.CompositeChild = false;

CurrentChild = std::find(Children.begin(), Children.end(), targetInfo);
return CurrentChild != Children.end();
}

bool Hierarchy::IsChildrenIteratorLast()
{
Expand Down Expand Up @@ -479,28 +501,16 @@ namespace ssGUI
if(child == nullptr)
return false;

ChildToken it = Children.begin();
ChildToken endIt = Children.end();
bool found = false;

while (true)
{
if(it == endIt)
break;

if(CurrentObjectsReferences.GetObjectReference(it->ChildIndex) == child)
{
found = true;
break;
}

it++;
}

CurrentChild = it;
CurrentChildIteratorFrontEnd = false;
CurrentChildIteratorBackEnd = false;
return found;
ssGUIObjectIndex targetIndex = CurrentObjectsReferences.GetObjectIndex(child);

if(targetIndex < 0)
return false;

ChildInfo targetInfo;
targetInfo.ChildIndex = targetIndex;
targetInfo.CompositeChild = child->IsCurrentChildComposite();

return std::find(Children.begin(), Children.end(), targetInfo) != Children.end();
}

ssGUI::GUIObject* Hierarchy::GetChild(std::string childName, bool recursive) const
Expand Down Expand Up @@ -587,7 +597,7 @@ namespace ssGUI
{
if(CurrentObjectsReferences.GetObjectReference(CurrentChild->ChildIndex) == nullptr)
{
ssGUI_ERROR(ssGUI_DATA_TAG, "invalid child found");
ssGUI_ERROR(ssGUI_DATA_TAG, "invalid child found: "<<CurrentChild->ChildIndex);
ssLOG_EXIT_PROGRAM();
return nullptr;
}
Expand All @@ -602,6 +612,114 @@ namespace ssGUI
{
return CurrentChild;
}

#define ssGUI_FIND_CHILD(targetChild)\
do\
{\
if(!MoveChildrenIteratorToChild(targetChild))\
{\
PopChildrenIterator();\
return false;\
}\
} while(0);

#define ssGUI_STASH_AND_FIND_CHILD(targetChild)\
do\
{\
StashChildrenIterator();\
\
ssGUI_FIND_CHILD(targetChild);\
} while(0);

bool Hierarchy::MoveChildBeforeTargetChild(ssGUI::GUIObject* child, ssGUI::GUIObject* target)
{
ssGUI_STASH_AND_FIND_CHILD(target);

ChildToken targetToken = GetCurrentChildToken();
ssGUI_FIND_CHILD(child);

ChangeChildOrderToBeforePosition(GetCurrentChildToken(), targetToken);
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveChildAfterTargetChild(ssGUI::GUIObject* child, ssGUI::GUIObject* target)
{
ssGUI_STASH_AND_FIND_CHILD(target);

ChildToken targetToken = GetCurrentChildToken();
ssGUI_FIND_CHILD(child);

ChangeChildOrderToAfterPosition(GetCurrentChildToken(), targetToken);
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveLastChildBeforeTargetChild(ssGUI::GUIObject* target)
{
ssGUI_STASH_AND_FIND_CHILD(target);

ChildToken targetToken = GetCurrentChildToken();
MoveChildrenIteratorToLast();
ChangeChildOrderToBeforePosition(GetCurrentChildToken(), targetToken);
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveLastChildAfterTargetChild(ssGUI::GUIObject* target)
{
ssGUI_STASH_AND_FIND_CHILD(target);

ChildToken targetToken = GetCurrentChildToken();
MoveChildrenIteratorToLast();
ChangeChildOrderToAfterPosition(GetCurrentChildToken(), targetToken);
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveFirstChildBeforeTargetChild(ssGUI::GUIObject* target)
{
ssGUI_STASH_AND_FIND_CHILD(target);

ChildToken targetToken = GetCurrentChildToken();
MoveChildrenIteratorToFirst();
ChangeChildOrderToBeforePosition(GetCurrentChildToken(), targetToken);
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveFirstChildAfterTargetChild(ssGUI::GUIObject* target)
{
ssGUI_STASH_AND_FIND_CHILD(target);

ChildToken targetToken = GetCurrentChildToken();
MoveChildrenIteratorToFirst();
ChangeChildOrderToAfterPosition(GetCurrentChildToken(), targetToken);
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveChildToFirst(ssGUI::GUIObject* child)
{
ssGUI_STASH_AND_FIND_CHILD(child);

ChildToken childToken = GetCurrentChildToken();
MoveChildrenIteratorToFirst();
ChangeChildOrderToBeforePosition(childToken, GetCurrentChildToken());
PopChildrenIterator();
return true;
}

bool Hierarchy::MoveChildToLast(ssGUI::GUIObject* child)
{
ssGUI_STASH_AND_FIND_CHILD(child);

ChildToken childToken = GetCurrentChildToken();
MoveChildrenIteratorToLast();
ChangeChildOrderToAfterPosition(childToken, GetCurrentChildToken());
PopChildrenIterator();
return true;
}

void Hierarchy::ChangeChildOrderToBeforePosition(ssGUI::Hierarchy::ChildToken child,
ssGUI::Hierarchy::ChildToken position)
Expand Down Expand Up @@ -647,7 +765,7 @@ namespace ssGUI
{
StashChildrenIterator();

if(FindChild(obj))
if(MoveChildrenIteratorToChild(obj))
{
PopChildrenIterator();
return;
Expand All @@ -669,10 +787,11 @@ namespace ssGUI
ssGUI_DEBUG(ssGUI_DATA_TAG, CurrentObject<<" removing child "<<obj);

StashChildrenIterator();
if(!FindChild(obj))
if(!MoveChildrenIteratorToChild(obj))
{
PopChildrenIterator();
ssGUI_ERROR(ssGUI_DATA_TAG, "Remove failed");
Internal_PrintChildrenStack();
ssLOG_EXIT_PROGRAM();
return;
}
Expand Down Expand Up @@ -861,6 +980,45 @@ namespace ssGUI
return HeapAllocated;
}

void Hierarchy::Internal_PrintParentStack() const
{
ssGUI::GUIObject* currentObj = CurrentObject;
do
{
ssLOG_LINE("GUI Object "<< currentObj);
if(currentObj->GetParent())
ssLOG_LINE("| is child of");
}
while(currentObj->GetParent());
}

void Hierarchy::Internal_PrintChildrenStack() const
{
std::queue<ssGUI::GUIObject*> childrenToIterate;
childrenToIterate.push(CurrentObject);
do
{
ssLOG_LINE("GUI Object " << childrenToIterate.front());

if(childrenToIterate.front()->GetChildrenCount() == 0)
ssLOG_LINE(" has no children");
else
{
ssLOG_LINE("| has children");
std::vector<ssGUI::GUIObject*> curChildren = childrenToIterate.front()->GetListOfChildren();

for(int i = 0; i < curChildren.size(); i++)
{
ssLOG_LINE(curChildren[i]);
childrenToIterate.push(curChildren[i]);
}
}
ssLOG_LINE();
childrenToIterate.pop();
}
while(!childrenToIterate.empty());
}

void Hierarchy::Internal_ChildrenManualDeletion(std::vector<ssGUI::ssGUIObjectIndex> generatedObjs)
{
for(int i = 0; i < generatedObjs.size(); i++)
Expand Down
6 changes: 3 additions & 3 deletions Src/ssGUI/Extensions/Dockable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ namespace Extensions
// if(containerParent->IsExtensionExist(ssGUI::Extensions::Layout::EXTENSION_NAME) && containerParent->GetChildrenCount() > 1)
// {
// containerParent->StashChildrenIterator();
// containerParent->FindChild(Container);
// containerParent->MoveChildrenIteratorToChild(Container);
// if(!containerParent->IsChildrenIteratorLast())
// {
// containerParent->MoveChildrenIteratorNext();
Expand Down Expand Up @@ -476,7 +476,7 @@ namespace Extensions

//Restore order
ObjectToDockNextTo->GetParent()->StashChildrenIterator();
ObjectToDockNextTo->GetParent()->FindChild(ObjectToDockNextTo);
ObjectToDockNextTo->GetParent()->MoveChildrenIteratorToChild(ObjectToDockNextTo);
ssGUI::Hierarchy::ChildToken dockObjectIt = ObjectToDockNextTo->GetParent()->GetCurrentChildToken();
ObjectToDockNextTo->GetParent()->MoveChildrenIteratorToLast();
ssGUI::Hierarchy::ChildToken lastIt = ObjectToDockNextTo->GetParent()->GetCurrentChildToken();
Expand Down Expand Up @@ -543,7 +543,7 @@ namespace Extensions

//Insert the Container after/before it
ObjectToDockNextTo->GetParent()->StashChildrenIterator();
ObjectToDockNextTo->GetParent()->FindChild(ObjectToDockNextTo);
ObjectToDockNextTo->GetParent()->MoveChildrenIteratorToChild(ObjectToDockNextTo);
ssGUI::Hierarchy::ChildToken dockObjectIt = ObjectToDockNextTo->GetParent()->GetCurrentChildToken();
ObjectToDockNextTo->GetParent()->MoveChildrenIteratorToLast();
ssGUI::Hierarchy::ChildToken lastIt = ObjectToDockNextTo->GetParent()->GetCurrentChildToken();
Expand Down
2 changes: 1 addition & 1 deletion Src/ssGUI/Extensions/Docker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ namespace Extensions
if(containerParent != nullptr)
{
containerParent->StashChildrenIterator();
containerParent->FindChild(Container);
containerParent->MoveChildrenIteratorToChild(Container);
ssGUI::Hierarchy::ChildToken posIt = containerParent->GetCurrentChildToken();
// posIt++;

Expand Down
2 changes: 1 addition & 1 deletion Src/ssGUI/Extensions/Layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1011,7 +1011,7 @@ namespace Extensions

//Rely on tag instead
// Container->StashChildrenIterator();
// if(Container->FindChild(child) && Container->IsChildComposite())
// if(Container->MoveChildrenIteratorToChild(child) && Container->IsCurrentChildComposite())
// {
// Container->PopChildrenIterator();
// ObjectsToExclude.insert(childIndex);
Expand Down
2 changes: 1 addition & 1 deletion Src/ssGUI/Extensions/Mask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -678,7 +678,7 @@ namespace Extensions

//Don't mask container's composite children
Container->StashChildrenIterator();
if(Container->FindChild(child) && Container->IsChildComposite())
if(Container->MoveChildrenIteratorToChild(child) && Container->IsCurrentChildComposite())
{
Container->PopChildrenIterator();
children.pop();
Expand Down
4 changes: 2 additions & 2 deletions Src/ssGUI/Extensions/WindowLayoutItemEnforcer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ namespace Extensions
float prevDiff = resizeFirst ? diff : resizedAmount;
//Reduce gui objects sizes before container
Container->GetParent()->StashChildrenIterator();
Container->GetParent()->FindChild(Container);
Container->GetParent()->MoveChildrenIteratorToChild(Container);
Container->GetParent()->MoveChildrenIteratorPrevious();
while(!Container->GetParent()->IsChildrenIteratorEnd() && prevDiff != 0)
{
Expand Down Expand Up @@ -154,7 +154,7 @@ namespace Extensions
//Increase gui objects sizes after container
float afterDiff = resizeFirst ? diff : resizedAmount;
Container->GetParent()->StashChildrenIterator();
Container->GetParent()->FindChild(Container);
Container->GetParent()->MoveChildrenIteratorToChild(Container);
Container->GetParent()->MoveChildrenIteratorNext();
while(!Container->GetParent()->IsChildrenIteratorEnd() && afterDiff != 0)
{
Expand Down

0 comments on commit cffa91e

Please sign in to comment.