@@ -260,24 +260,93 @@ public void Blur()
260
260
261
261
private void ToggleNodeCheck ( int idx , TreeNode node )
262
262
{
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
+
263
278
if ( node . IsFolder )
264
279
{
265
-
280
+
266
281
}
267
- else
282
+
283
+ ToggleParentFolders ( idx , node , isChecked ) ;
284
+ }
285
+
286
+ private void ToggleParentFolders ( int idx , TreeNode node , bool isChecked )
287
+ {
288
+ while ( true )
268
289
{
269
- switch ( node . CheckState )
290
+ if ( node . Level > 0 )
270
291
{
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 ) ;
274
309
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 ;
278
347
}
279
348
280
- Debug . LogFormat ( "Ripple CheckState index:{0} level:{1}" , idx , node . Level ) ;
349
+ break ;
281
350
}
282
351
}
283
352
0 commit comments