From 6c5344e4a31bb3c1b78fc50f1aacf2cb2d198d2c Mon Sep 17 00:00:00 2001 From: Balazs Perlaki-Horvath Date: Sun, 20 Apr 2025 14:30:03 +0200 Subject: [PATCH] Remove top level only item from OutlineTree --- Model/Entities/Entities.swift | 10 +--------- ViewModel/BrowserViewModel.swift | 6 ++---- Views/Buttons/OutlineButton.swift | 3 +-- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/Model/Entities/Entities.swift b/Model/Entities/Entities.swift index f003b84d..88c0a57c 100644 --- a/Model/Entities/Entities.swift +++ b/Model/Entities/Entities.swift @@ -91,23 +91,15 @@ final class OutlineItem: ObservableObject, Identifiable { let index: Int let text: String let level: Int - let isCollapsible: Bool private(set) var children: [OutlineItem]? @Published var isExpanded = true - - func asNonCollapsible() -> OutlineItem { - let copy = OutlineItem(id: id, index: index, text: text, level: level, isCollapsible: false) - copy.children = children - return copy - } - init(id: String, index: Int, text: String, level: Int, isCollapsible: Bool = true) { + init(id: String, index: Int, text: String, level: Int) { self.id = id self.index = index self.text = text self.level = level - self.isCollapsible = isCollapsible } convenience init(index: Int, text: String, level: Int) { diff --git a/ViewModel/BrowserViewModel.swift b/ViewModel/BrowserViewModel.swift index 12dc2f59..f9d98c99 100644 --- a/ViewModel/BrowserViewModel.swift +++ b/ViewModel/BrowserViewModel.swift @@ -732,14 +732,12 @@ final class BrowserViewModel: NSObject, ObservableObject, @MainActor private func generateOutlineTree(headings: [[String: String]]) { let root = OutlineItem(index: -1, text: "", level: 0) var stack: [OutlineItem] = [root] - var all = [String: OutlineItem]() headings.enumerated().forEach { index, heading in guard let id = heading["id"], let text = heading["text"], let tag = heading["tag"], let level = Int(tag.suffix(1)) else { return } let item = OutlineItem(id: id, index: index, text: text, level: level) - all[item.id] = item // get last item in stack // if last item is child of item's sibling, unwind stack until a sibling is found @@ -760,9 +758,9 @@ final class BrowserViewModel: NSObject, ObservableObject, } } - // if there is only one h1, make the first item non collapsible + // if there is only one item at top level, do not display it only it's children if let rootChildren = root.children, rootChildren.count == 1, let rootFirstChild = rootChildren.first { - self.outlineItemTree = [rootFirstChild.asNonCollapsible()] + self.outlineItemTree = rootFirstChild.children ?? [] } else { self.outlineItemTree = root.children ?? [] } diff --git a/Views/Buttons/OutlineButton.swift b/Views/Buttons/OutlineButton.swift index 9e2ec6d3..8bb917ed 100644 --- a/Views/Buttons/OutlineButton.swift +++ b/Views/Buttons/OutlineButton.swift @@ -90,8 +90,7 @@ struct OutlineButton: View { var body: some View { if let children = item.children { - let isExpanded = item.isCollapsible ? $item.isExpanded : .constant(true) - DisclosureGroup(isExpanded: isExpanded) { + DisclosureGroup(isExpanded: $item.isExpanded) { ForEach(children) { child in OutlineNode(item: child, action: action) }