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

Commit 9332fba

Browse files
Merge branch 'enhancements/tree-view-checked-state' into enhancements/changes-tree-view
2 parents 1fc7a8a + bd15739 commit 9332fba

File tree

1 file changed

+79
-10
lines changed

1 file changed

+79
-10
lines changed

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

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -260,24 +260,93 @@ public void Blur()
260260

261261
private void ToggleNodeCheck(int idx, TreeNode node)
262262
{
263+
var isChecked = false;
264+
265+
switch (node.CheckState)
266+
{
267+
case CheckState.Mixed:
268+
case CheckState.Empty:
269+
node.CheckState = CheckState.Checked;
270+
isChecked = true;
271+
break;
272+
273+
case CheckState.Checked:
274+
node.CheckState = CheckState.Empty;
275+
break;
276+
}
277+
263278
if (node.IsFolder)
264279
{
265-
280+
266281
}
267-
else
282+
283+
ToggleParentFolders(idx, node, isChecked);
284+
}
285+
286+
private void ToggleParentFolders(int idx, TreeNode node, bool isChecked)
287+
{
288+
while (true)
268289
{
269-
switch (node.CheckState)
290+
if (node.Level > 0)
270291
{
271-
case CheckState.Empty:
272-
node.CheckState = CheckState.Checked;
273-
break;
292+
Debug.Log("ToggleParentFolders");
293+
294+
var siblingsInSameState = true;
295+
var firstSiblingIndex = idx;
296+
297+
Debug.LogFormat("Ripple CheckState index:{0} level:{1}", idx, node.Level);
298+
299+
for (var i = idx - 1; i > 0 && node.Level <= nodes[i].Level; i--)
300+
{
301+
if (node.Level < nodes[i].Level)
302+
{
303+
continue;
304+
}
305+
306+
firstSiblingIndex = i;
307+
var siblingIsChecked = nodes[i].CheckState == CheckState.Checked;
308+
Debug.LogFormat("Previous Sibling - idx:{0} name:{1} checked:{2}", i, nodes[i].Path, siblingIsChecked);
274309

275-
case CheckState.Checked:
276-
node.CheckState = CheckState.Empty;
277-
break;
310+
if (isChecked != siblingIsChecked)
311+
{
312+
siblingsInSameState = false;
313+
//break;
314+
}
315+
}
316+
317+
//if (siblingsInSameState)
318+
{
319+
for (var i = idx + 1; i < nodes.Count && node.Level <= nodes[i].Level; i++)
320+
{
321+
if (node.Level < nodes[i].Level)
322+
{
323+
continue;
324+
}
325+
326+
var siblingIsChecked = nodes[i].CheckState == CheckState.Checked;
327+
Debug.LogFormat("Next Siblings - idx:{0} name:{1} checked:{2}", i, nodes[i].Path, siblingIsChecked);
328+
}
329+
}
330+
331+
Debug.LogFormat("Siblings in same state = {0}", siblingsInSameState);
332+
333+
var parentIndex = firstSiblingIndex - 1;
334+
var parentNode = nodes[parentIndex];
335+
if (siblingsInSameState)
336+
{
337+
parentNode.CheckState = isChecked ? CheckState.Checked : CheckState.Empty;
338+
}
339+
else
340+
{
341+
parentNode.CheckState = CheckState.Mixed;
342+
}
343+
344+
idx = parentIndex;
345+
node = parentNode;
346+
continue;
278347
}
279348

280-
Debug.LogFormat("Ripple CheckState index:{0} level:{1}", idx, node.Level);
349+
break;
281350
}
282351
}
283352

0 commit comments

Comments
 (0)