From edea37dba6beaae7c10f48a1cae29da18d585727 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 21 Oct 2017 12:14:15 -0700 Subject: [PATCH] Add TreeController.normalizeSelectedNodes and supporting functions in Node. --- Frameworks/RSTree/RSTree/Node.swift | 28 +++++++++++++++++++ Frameworks/RSTree/RSTree/TreeController.swift | 16 ++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Frameworks/RSTree/RSTree/Node.swift b/Frameworks/RSTree/RSTree/Node.swift index 8fe38a466..c97649080 100644 --- a/Frameworks/RSTree/RSTree/Node.swift +++ b/Frameworks/RSTree/RSTree/Node.swift @@ -103,6 +103,34 @@ public final class Node: Equatable { } return nil } + + public func hasAncestor(in nodes: [Node]) -> Bool { + + for node in nodes { + if node.isAncestor(of: self) { + return true + } + } + return false + } + + public func isAncestor(of node: Node) -> Bool { + + if node == self { + return false + } + + var nomad = node + while true { + guard let parent = nomad.parent else { + return false + } + if parent == self { + return true + } + nomad = parent + } + } } diff --git a/Frameworks/RSTree/RSTree/TreeController.swift b/Frameworks/RSTree/RSTree/TreeController.swift index 8ff3785d8..435b9087e 100644 --- a/Frameworks/RSTree/RSTree/TreeController.swift +++ b/Frameworks/RSTree/RSTree/TreeController.swift @@ -67,6 +67,21 @@ public final class TreeController { return nodeInArrayRepresentingObject(nodes: [rootNode], representedObject: representedObject, recurse: true) } + + public func normalizedSelectedNodes(_ nodes: [Node]) -> [Node] { + + // An array of nodes might include a leaf node and its parent. Remove the leaf node. + + var normalizedNodes = [Node]() + + for node in nodes { + if !node.hasAncestor(in: nodes) { + normalizedNodes += [node] + } + } + + return normalizedNodes + } } private extension TreeController { @@ -117,5 +132,4 @@ private extension TreeController { return childNodesDidChange } - }