Remove top level only item from OutlineTree

This commit is contained in:
Balazs Perlaki-Horvath 2025-04-20 14:30:03 +02:00 committed by Kelson
parent 1164425624
commit 6c5344e4a3
3 changed files with 4 additions and 15 deletions

View File

@ -91,23 +91,15 @@ final class OutlineItem: ObservableObject, Identifiable {
let index: Int let index: Int
let text: String let text: String
let level: Int let level: Int
let isCollapsible: Bool
private(set) var children: [OutlineItem]? private(set) var children: [OutlineItem]?
@Published var isExpanded = true @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.id = id
self.index = index self.index = index
self.text = text self.text = text
self.level = level self.level = level
self.isCollapsible = isCollapsible
} }
convenience init(index: Int, text: String, level: Int) { convenience init(index: Int, text: String, level: Int) {

View File

@ -732,14 +732,12 @@ final class BrowserViewModel: NSObject, ObservableObject,
@MainActor private func generateOutlineTree(headings: [[String: String]]) { @MainActor private func generateOutlineTree(headings: [[String: String]]) {
let root = OutlineItem(index: -1, text: "", level: 0) let root = OutlineItem(index: -1, text: "", level: 0)
var stack: [OutlineItem] = [root] var stack: [OutlineItem] = [root]
var all = [String: OutlineItem]()
headings.enumerated().forEach { index, heading in headings.enumerated().forEach { index, heading in
guard let id = heading["id"], guard let id = heading["id"],
let text = heading["text"], let text = heading["text"],
let tag = heading["tag"], let level = Int(tag.suffix(1)) else { return } let tag = heading["tag"], let level = Int(tag.suffix(1)) else { return }
let item = OutlineItem(id: id, index: index, text: text, level: level) let item = OutlineItem(id: id, index: index, text: text, level: level)
all[item.id] = item
// get last item in stack // get last item in stack
// if last item is child of item's sibling, unwind stack until a sibling is found // 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 { if let rootChildren = root.children, rootChildren.count == 1, let rootFirstChild = rootChildren.first {
self.outlineItemTree = [rootFirstChild.asNonCollapsible()] self.outlineItemTree = rootFirstChild.children ?? []
} else { } else {
self.outlineItemTree = root.children ?? [] self.outlineItemTree = root.children ?? []
} }

View File

@ -90,8 +90,7 @@ struct OutlineButton: View {
var body: some View { var body: some View {
if let children = item.children { if let children = item.children {
let isExpanded = item.isCollapsible ? $item.isExpanded : .constant(true) DisclosureGroup(isExpanded: $item.isExpanded) {
DisclosureGroup(isExpanded: isExpanded) {
ForEach(children) { child in ForEach(children) { child in
OutlineNode(item: child, action: action) OutlineNode(item: child, action: action)
} }