|
212 | 212 | - `:metadata-panel-last-drag-height` - last height set by dragging |
213 | 213 | - `:set-metadata-panel-height!` - setter for panel height |
214 | 214 | - `:set-metadata-panel-last-drag-height!` - setter for last drag height" |
215 | | - [{:keys [tree tips max-depth active-cols x-mult y-mult |
216 | | - show-internal-markers show-distance-from-origin scale-origin width-px component-height-px |
217 | | - show-scale-gridlines show-pixel-grid col-spacing left-shift-px tree-metadata-gap-px |
218 | | - highlights selected-ids metadata-rows metadata-panel-collapsed |
219 | | - metadata-panel-height metadata-panel-last-drag-height |
220 | | - color-by-enabled? color-by-field color-by-palette color-by-type-override |
221 | | - legend-pos legend-collapsed? legend-labels legend-visible? |
222 | | - set-legend-pos! set-legend-collapsed! set-legend-labels! set-legend-visible! |
223 | | - set-left-shift-px! set-tree-metadata-gap-px! |
224 | | - set-active-cols! set-selected-ids! set-metadata-rows! |
225 | | - set-metadata-panel-height! set-metadata-panel-last-drag-height!]}] |
| 215 | + [{:keys [tree |
| 216 | + tips |
| 217 | + max-depth |
| 218 | + x-mult |
| 219 | + y-mult |
| 220 | + show-internal-markers |
| 221 | + show-distance-from-origin |
| 222 | + scale-origin |
| 223 | + width-px |
| 224 | + component-height-px |
| 225 | + show-scale-gridlines |
| 226 | + show-pixel-grid |
| 227 | + col-spacing |
| 228 | + highlights |
| 229 | + metadata-panel-collapsed |
| 230 | + color-by-enabled? |
| 231 | + color-by-field |
| 232 | + color-by-palette |
| 233 | + color-by-type-override |
| 234 | + active-cols set-active-cols! |
| 235 | + selected-ids set-selected-ids! |
| 236 | + metadata-rows set-metadata-rows! |
| 237 | + metadata-panel-height set-metadata-panel-height! |
| 238 | + metadata-panel-last-drag-height set-metadata-panel-last-drag-height! |
| 239 | + tree-metadata-gap-px set-tree-metadata-gap-px! |
| 240 | + left-shift-px set-left-shift-px! |
| 241 | + legend-pos set-legend-pos! |
| 242 | + legend-collapsed? set-legend-collapsed! |
| 243 | + legend-labels set-legend-labels! |
| 244 | + legend-visible? set-legend-visible! |
| 245 | + active-reroot-node-id set-active-reroot-node-id! |
| 246 | + positioned-tree set-positioned-tree!]}] |
226 | 247 | (let [;; Dynamic layout math |
227 | 248 | current-x-scale (if (pos? max-depth) |
228 | 249 | (* (/ (- width-px 400) max-depth) x-mult) |
|
482 | 503 | :marker-fill (:node-marker-fill LAYOUT) |
483 | 504 | :highlights merged-highlights |
484 | 505 | :selected-ids selected-ids |
| 506 | + :active-reroot-node-id active-reroot-node-id |
| 507 | + :set-active-reroot-node-id! set-active-reroot-node-id! |
485 | 508 | :on-toggle-selection toggle-selection |
486 | 509 | :on-select-subtree select-subtree}) |
487 | 510 |
|
|
620 | 643 | metadata changes don't re-parse the Newick string. |
621 | 644 | When no tree is available, renders [[EmptyState]] instead." |
622 | 645 | [{:keys [width-px component-height-px]}] |
623 | | - (let [{:keys [newick-str parsed-tree metadata-rows active-cols |
624 | | - x-mult y-mult show-internal-markers show-distance-from-origin |
625 | | - scale-origin show-scale-gridlines show-pixel-grid |
626 | | - col-spacing left-shift-px tree-metadata-gap-px highlights selected-ids metadata-panel-collapsed |
627 | | - metadata-panel-height metadata-panel-last-drag-height |
628 | | - color-by-enabled? color-by-field color-by-palette color-by-type-override |
629 | | - legend-pos legend-collapsed? legend-labels legend-visible? |
630 | | - set-legend-pos! set-legend-collapsed! set-legend-labels! set-legend-visible! |
631 | | - set-left-shift-px! set-tree-metadata-gap-px! |
632 | | - set-metadata-panel-height! set-metadata-panel-last-drag-height! |
633 | | - set-active-cols! set-selected-ids! set-metadata-rows!]} (state/use-app-state) |
| 646 | + (let [{:keys [newick-str |
| 647 | + parsed-tree |
| 648 | + metadata-rows set-metadata-rows! |
| 649 | + active-cols set-active-cols! |
| 650 | + x-mult |
| 651 | + y-mult |
| 652 | + show-internal-markers |
| 653 | + show-distance-from-origin |
| 654 | + scale-origin |
| 655 | + show-scale-gridlines |
| 656 | + show-pixel-grid |
| 657 | + col-spacing |
| 658 | + left-shift-px set-left-shift-px! |
| 659 | + tree-metadata-gap-px set-tree-metadata-gap-px! |
| 660 | + highlights |
| 661 | + selected-ids set-selected-ids! |
| 662 | + metadata-panel-collapsed |
| 663 | + metadata-panel-height set-metadata-panel-height! |
| 664 | + metadata-panel-last-drag-height set-metadata-panel-last-drag-height! |
| 665 | + color-by-enabled? |
| 666 | + color-by-field |
| 667 | + color-by-palette |
| 668 | + color-by-type-override |
| 669 | + legend-pos set-legend-pos! |
| 670 | + legend-collapsed? set-legend-collapsed! |
| 671 | + legend-labels set-legend-labels! |
| 672 | + legend-visible? set-legend-visible! |
| 673 | + active-reroot-node-id set-active-reroot-node-id! |
| 674 | + positioned-tree set-positioned-tree!]} (state/use-app-state) |
634 | 675 |
|
635 | 676 | ;; Stage 1: parse + position — re-runs when newick-str or parsed-tree changes. |
636 | 677 | ;; When parsed-tree is available (e.g. Nextstrain import), uses it directly |
637 | 678 | ;; via position-tree, skipping the Newick parse step. |
638 | 679 | {:keys [tree raw-tips max-depth]} |
639 | 680 | (uix/use-memo |
640 | | - (fn [] (cond |
641 | | - parsed-tree |
642 | | - (let [{:keys [tree tips max-depth]} (tree/position-tree parsed-tree)] |
643 | | - {:tree tree :raw-tips tips :max-depth max-depth}) |
644 | | - |
645 | | - (and (string? newick-str) (not (str/blank? newick-str))) |
646 | | - (let [{:keys [tree tips max-depth]} (tree/parse-and-position newick-str)] |
647 | | - {:tree tree :raw-tips tips :max-depth max-depth}))) |
648 | | - [newick-str parsed-tree]) |
| 681 | + (fn [] |
| 682 | + (cond |
| 683 | + parsed-tree |
| 684 | + (let [{:keys [tree tips max-depth]} (tree/position-tree parsed-tree)] |
| 685 | + (set-positioned-tree! tree) ;; <-- Save it |
| 686 | + {:tree tree :raw-tips tips :max-depth max-depth}) |
| 687 | + |
| 688 | + (and (string? newick-str) (not (str/blank? newick-str))) |
| 689 | + (let [{:keys [tree tips max-depth]} (tree/parse-and-position newick-str)] |
| 690 | + (set-positioned-tree! tree) ;; <-- Save it |
| 691 | + {:tree tree :raw-tips tips :max-depth max-depth}))) |
| 692 | + [newick-str parsed-tree set-positioned-tree!]) |
649 | 693 |
|
650 | 694 | ;; Stage 2: enrich leaves with metadata — re-runs when metadata or cols change |
651 | 695 | tips (uix/use-memo |
|
682 | 726 | :set-legend-collapsed! set-legend-collapsed! |
683 | 727 | :set-legend-labels! set-legend-labels! |
684 | 728 | :set-legend-visible! set-legend-visible! |
| 729 | + :active-reroot-node-id active-reroot-node-id |
| 730 | + :set-active-reroot-node-id! set-active-reroot-node-id! |
685 | 731 | :selected-ids selected-ids |
686 | 732 | :metadata-rows metadata-rows |
687 | 733 | :metadata-panel-collapsed metadata-panel-collapsed |
|
0 commit comments