fixed disconnect!
can remove all modifiers in pivot
This commit is contained in:
parent
c30c20e8b2
commit
23c7c60b5b
92
index.html
92
index.html
@ -40,24 +40,27 @@ var N =
|
||||
{
|
||||
let remove = (inArray, inMatch) => inArray.findIndex( (inMember, inIndex, inArray) => (inMember === inMatch) ? inArray.splice(inIndex, 1) : false );
|
||||
|
||||
// if no specific child was passed
|
||||
if(inNodeMinor === null)
|
||||
{
|
||||
// get all the children
|
||||
let check = N.Step(inNodeMajor, inKey);
|
||||
if(!check){ return; }
|
||||
check.forEach( inLoopNode =>
|
||||
{
|
||||
if(inLoopNode.Link[inKey].Get.length == 1)
|
||||
{
|
||||
// we're about to delete the last get reference on a minor node, just purge the key entirely
|
||||
delete inLoopNode.Link[inKey];
|
||||
}
|
||||
else
|
||||
{
|
||||
remove( inLoopNode.Link[inKey].Get, inNodeMajor);
|
||||
}
|
||||
|
||||
// go down to each child ...
|
||||
check.forEach( inNodeMinor =>
|
||||
{
|
||||
let connections = inNodeMinor.Link[inKey];
|
||||
remove( connections.Get, inNodeMajor); // ... and remove any reference to the parent
|
||||
|
||||
// if after the remove operation, this child has no connections on inKey, scrub the key
|
||||
if(!connections.Set.length && !connections.Get.length)
|
||||
{
|
||||
delete inNodeMinor.Link[inKey];
|
||||
}
|
||||
});
|
||||
// we just wiped out all set, if get is empty we can purge the key from major
|
||||
|
||||
// we just wiped out all outgoing connections to the parent, if incoming connections are empty too we can purge the key there as well
|
||||
if(inNodeMajor.Link[inKey].Get.length == 0)
|
||||
{
|
||||
delete inNodeMajor.Link[inKey];
|
||||
@ -65,20 +68,27 @@ var N =
|
||||
return;
|
||||
}
|
||||
|
||||
// if no specific parent was passed
|
||||
if(inNodeMajor === null)
|
||||
{
|
||||
inNodeMinor.Link[inKey].Get.forEach( inLoopNode =>
|
||||
// get all the parents
|
||||
let check = N.Step(inNodeMinor, inKey, false);
|
||||
if(!check){ return; }
|
||||
|
||||
// go up to each parent ...
|
||||
check.forEach( inNodeMajor =>
|
||||
{
|
||||
if(inLoopNode.Link[inKey].Set.length == 1)
|
||||
let connections = inNodeMajor.Link[inKey];
|
||||
remove( connections.Set, inNodeMinor); // ... and remove any reference to the child
|
||||
|
||||
// if after the remove operation, this parent has no connections on inKey, scrub the key
|
||||
if( !connections.Set.length && !connections.Get.length )
|
||||
{
|
||||
delete inLoopNode.Link[inKey];
|
||||
}
|
||||
else
|
||||
{
|
||||
remove( inLoopNode.Link[inKey].Set, inNodeMinor);
|
||||
delete inNodeMajor.Link[inKey];
|
||||
}
|
||||
});
|
||||
// we just wiped out all get, if set is empty we can purge the key from minor
|
||||
|
||||
// we just wiped out all incoming connections to the child, if outgoing connections are empty too we can purge the key there as well
|
||||
if(inNodeMinor.Link[inKey].Set.length == 0)
|
||||
{
|
||||
delete inNodeMinor.Link[inKey];
|
||||
@ -86,7 +96,7 @@ var N =
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// if a specific parent and child were passed
|
||||
if(inNodeMajor.Link[inKey].Set.length == 1)
|
||||
{
|
||||
delete inNodeMajor.Link[inKey];
|
||||
@ -110,7 +120,7 @@ var N =
|
||||
let connectionGroup = inNode.Link[inKey];
|
||||
if(!connectionGroup)
|
||||
{
|
||||
if(inForceCreate)
|
||||
if(inForceCreate === true)
|
||||
{
|
||||
inNode.Link[inKey] = connectionGroup = {Get:[], Set:[]};
|
||||
}
|
||||
@ -262,24 +272,24 @@ var Pivot =
|
||||
{
|
||||
N.ID.Walk++;
|
||||
|
||||
let pivotRoot = N.Create({Leaves:Pivot.Leaves});
|
||||
let pivotRoot = N.Create({Label:"Pivot Root", Leaves:Pivot.Leaves});
|
||||
N.Connect(Pivot.Root, pivotRoot, "Pivot");
|
||||
return Pivot.Pivot(pivotRoot, inPivotIndicies, inSumIndicies);
|
||||
},
|
||||
Delete(inRoot)
|
||||
{
|
||||
N.ID.Walk++;
|
||||
|
||||
let scan = n =>
|
||||
let check = N.Step(inRoot, "Modifier");
|
||||
if(check)
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
N.Walk(scan, inRoot, "Hierarchy")
|
||||
while(check.length>0)
|
||||
{
|
||||
Pivot.Unmodify(check[0]);
|
||||
}
|
||||
}
|
||||
},
|
||||
Modify(inNode)
|
||||
{
|
||||
let modified = N.Create({});
|
||||
let modified = N.Create({Label:"Modifier"});
|
||||
N.ID.Walk++;
|
||||
if(N.Step(inNode, "Hierarchy").length)
|
||||
{
|
||||
@ -290,7 +300,6 @@ var Pivot =
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
N.Connect(Pivot.Root, modified, "Modifier");
|
||||
}
|
||||
|
||||
@ -313,15 +322,13 @@ var Pivot =
|
||||
|
||||
return modified;
|
||||
},
|
||||
Unmodify(inNode)
|
||||
Unmodify(inModifier)
|
||||
{
|
||||
let modifier = N.Step(inNode, "ModifyAt", false)[0];
|
||||
|
||||
N.Disconnect(modifier, null, "ModifyUp");
|
||||
N.Disconnect(modifier, null, "ModifyDown");
|
||||
N.Disconnect(modifier, null, "ModifyOut");
|
||||
N.Disconnect(modifier, null, "ModifyAt");
|
||||
N.Disconnect(null, modifier, "Modifier");
|
||||
N.Disconnect(inModifier, null, "ModifyUp");
|
||||
N.Disconnect(inModifier, null, "ModifyDown");
|
||||
N.Disconnect(inModifier, null, "ModifyOut");
|
||||
N.Disconnect(inModifier, null, "ModifyAt");
|
||||
N.Disconnect(null, inModifier, "Modifier");
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@ -412,7 +419,7 @@ let ElNode = ({node, depth}) =>
|
||||
className:"Icon Modify remove",
|
||||
onClick:e=>
|
||||
{
|
||||
Pivot.Unmodify(node);
|
||||
Pivot.Unmodify(N.Step(node, "ModifyAt", false)[0]);
|
||||
Render();
|
||||
}
|
||||
}, "Unmodify");
|
||||
@ -433,6 +440,7 @@ let ElNode = ({node, depth}) =>
|
||||
let ElPivot = ({pivot}) =>
|
||||
{
|
||||
return h("div", {style:{display:"inline-block", width:"500px"}}, [
|
||||
h("button", {onClick:e=>{Pivot.Delete(pivot);Render();}}, "delete?"),
|
||||
h(ElModifiers, {node:pivot}),
|
||||
h(ElNode, {node:pivot, depth:0})
|
||||
]);
|
||||
@ -445,7 +453,7 @@ let ElModifiers = ({node}) =>
|
||||
h("strong", null, "modifiers"),
|
||||
...modifiers.map( m => h("span", {onClick:e=>
|
||||
{
|
||||
Pivot.Unmodify(N.Step(m, "ModifyAt")[0]);
|
||||
Pivot.Unmodify(m);
|
||||
Render();
|
||||
}
|
||||
}, "modifier"))
|
||||
|
Loading…
Reference in New Issue
Block a user