setHandlePos sets given splits handle position to given 0-1 normalized value. Handles are indexed 0..Tiles-1 for main tiles handles, then sequentially for any additional child sub-splits depending on tile config. Calls updateSplits after to ensure renormalization and NeedsLayout to ensure layout is
(idx int, val float32)
| 550 | // Calls updateSplits after to ensure renormalization and |
| 551 | // NeedsLayout to ensure layout is updated. |
| 552 | func (sl *Splits) setHandlePos(idx int, val float32) { |
| 553 | val = math32.Clamp(val, 0, 1) |
| 554 | |
| 555 | update := func(idx int, nw float32, s []float32) { |
| 556 | n := len(s) |
| 557 | old := s[idx] |
| 558 | sumTo := float32(0) |
| 559 | for i := range idx + 1 { |
| 560 | sumTo += s[i] |
| 561 | } |
| 562 | delta := nw - sumTo |
| 563 | uval := old + delta |
| 564 | if uval < 0 { |
| 565 | uval = 0 |
| 566 | delta = -old |
| 567 | nw = sumTo + delta |
| 568 | } |
| 569 | rmdr := 1 - nw |
| 570 | oldrmdr := 1 - sumTo |
| 571 | if oldrmdr <= 0 { |
| 572 | if rmdr > 0 { |
| 573 | dper := rmdr / float32((n-1)-idx) |
| 574 | for i := idx + 1; i < n; i++ { |
| 575 | s[i] = dper |
| 576 | } |
| 577 | } |
| 578 | } else { |
| 579 | for i := idx + 1; i < n; i++ { |
| 580 | cur := s[i] |
| 581 | s[i] = rmdr * (cur / oldrmdr) // proportional |
| 582 | } |
| 583 | } |
| 584 | s[idx] = uval |
| 585 | } |
| 586 | |
| 587 | nt := len(sl.Tiles) |
| 588 | if idx < nt-1 { |
| 589 | update(idx, val, sl.TileSplits) |
| 590 | sl.updateSplits() |
| 591 | sl.NeedsLayout() |
| 592 | return |
| 593 | } |
| 594 | ci := nt - 1 |
| 595 | for i, t := range sl.Tiles { |
| 596 | tn := tileNumElements[t] - 1 |
| 597 | if tn == 0 { |
| 598 | continue |
| 599 | } |
| 600 | if idx < ci || idx >= ci+tn { |
| 601 | ci += tn |
| 602 | continue |
| 603 | } |
| 604 | ri := idx - ci |
| 605 | switch t { |
| 606 | case TileSplit: |
| 607 | update(0, val, sl.SubSplits[i]) |
| 608 | case TileFirstLong, TileSecondLong: |
| 609 | if ri == 0 { |
no test coverage detected