@@ -259,24 +259,83 @@ public void Blur()
259
259
260
260
private void ToggleNodeCheck ( int idx , TreeNode node )
261
261
{
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
+
262
277
if ( node . IsFolder )
263
278
{
264
-
279
+
265
280
}
266
- else
281
+
282
+ ToggleParentFolders ( idx , node , isChecked ) ;
283
+ }
284
+
285
+ private void ToggleParentFolders ( int idx , TreeNode node , bool isChecked )
286
+ {
287
+ while ( true )
267
288
{
268
- switch ( node . CheckState )
289
+ if ( node . Level > 0 )
269
290
{
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
+ }
273
319
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 ;
277
336
}
278
337
279
- Debug . LogFormat ( "Ripple CheckState index:{0} level:{1}" , idx , node . Level ) ;
338
+ break ;
280
339
}
281
340
}
282
341
0 commit comments