Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 1dac0e2

Browse files
Starting to ripple the checked state up through the tree
1 parent 2b9cdb5 commit 1dac0e2

File tree

1 file changed

+69
-10
lines changed

1 file changed

+69
-10
lines changed

src/UnityExtension/Assets/Editor/GitHub.Unity/UI/TreeControl.cs

Lines changed: 69 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,24 +259,83 @@ public void Blur()
259259

260260
private void ToggleNodeCheck(int idx, TreeNode node)
261261
{
262+
var isChecked = false;
263+
264+
switch (node.CheckState)
265+
{
266+
case CheckState.Mixed:
267+
case CheckState.Empty:
268+
node.CheckState = CheckState.Checked;
269+
isChecked = true;
270+
break;
271+
272+
case CheckState.Checked:
273+
node.CheckState = CheckState.Empty;
274+
break;
275+
}
276+
262277
if (node.IsFolder)
263278
{
264-
279+
265280
}
266-
else
281+
282+
ToggleParentFolders(idx, node, isChecked);
283+
}
284+
285+
private void ToggleParentFolders(int idx, TreeNode node, bool isChecked)
286+
{
287+
while (true)
267288
{
268-
switch (node.CheckState)
289+
if (node.Level > 0)
269290
{
270-
case CheckState.Empty:
271-
node.CheckState = CheckState.Checked;
272-
break;
291+
Debug.Log("ToggleParentFolders");
292+
293+
var siblingsInSameState = true;
294+
var firstSiblingIndex = idx;
295+
296+
Debug.LogFormat("Ripple CheckState index:{0} level:{1}", idx, node.Level);
297+
298+
for (var i = idx - 1; i > 0 && nodes[i].Level == node.Level; i--)
299+
{
300+
firstSiblingIndex = i;
301+
var siblingIsChecked = nodes[i].CheckState == CheckState.Checked;
302+
Debug.LogFormat("Previous Sibling - idx:{0} name:{1} checked:{2}", i, nodes[i].Path, siblingIsChecked);
303+
304+
if (isChecked != siblingIsChecked)
305+
{
306+
siblingsInSameState = false;
307+
//break;
308+
}
309+
}
310+
311+
//if (siblingsInSameState)
312+
{
313+
for (var i = idx + 1; i < nodes.Count && nodes[i].Level == node.Level; i++)
314+
{
315+
var siblingIsChecked = nodes[i].CheckState == CheckState.Checked;
316+
Debug.LogFormat("Next Siblings - idx:{0} name:{1} checked:{2}", i, nodes[i].Path, siblingIsChecked);
317+
}
318+
}
273319

274-
case CheckState.Checked:
275-
node.CheckState = CheckState.Empty;
276-
break;
320+
Debug.LogFormat("Siblings in same state = {0}", siblingsInSameState);
321+
322+
var parentIndex = firstSiblingIndex - 1;
323+
var parentNode = nodes[parentIndex];
324+
if (siblingsInSameState)
325+
{
326+
parentNode.CheckState = isChecked ? CheckState.Checked : CheckState.Empty;
327+
}
328+
else
329+
{
330+
parentNode.CheckState = CheckState.Mixed;
331+
}
332+
333+
idx = parentIndex;
334+
node = parentNode;
335+
continue;
277336
}
278337

279-
Debug.LogFormat("Ripple CheckState index:{0} level:{1}", idx, node.Level);
338+
break;
280339
}
281340
}
282341

0 commit comments

Comments
 (0)