Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
temptestpr

# FileTree

A convention-over-configuration SwiftUI component for adding a file/folder tree sidebar to macOS apps.
Expand Down
24 changes: 20 additions & 4 deletions Sources/FileTree/FileTree.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@ public struct FileTree: View {
initiallyExpanded: true
)
}
.focusable()
.onKeyPress(.return) {
guard store.renamingNode == nil else { return .ignored }
guard let selected = store.selectedNode else { return .ignored }
guard config.clickBehavior.enterKey == .rename else { return .ignored }
store.renamingNode = selected
return .handled
}
} else {
ProgressView()
.frame(maxWidth: .infinity, maxHeight: .infinity)
Expand Down Expand Up @@ -69,7 +77,6 @@ struct FileTreeDisclosureNode: View {
let store: FileTreeStore
let config: FileTreeConfiguration
var initiallyExpanded: Bool = false
@State private var isRenaming = false

init(
node: FileTreeNode,
Expand All @@ -86,6 +93,15 @@ struct FileTreeDisclosureNode: View {
}
}

private var isRenaming: Binding<Bool> {
Binding(
get: { store.renamingNode === node },
set: { newValue in
store.renamingNode = newValue ? node : nil
}
)
}

var body: some View {
if node.isFolder {
DisclosureGroup(isExpanded: $node.isExpanded) {
Expand Down Expand Up @@ -114,7 +130,7 @@ struct FileTreeDisclosureNode: View {
isFocused: store.isFocused(node),
isOpen: store.isOpen(node),
isModified: store.isModified(node),
isRenaming: $isRenaming,
isRenaming: isRenaming,
onRename: { newName in
Task { try? await store.renameNode(node, to: newName) }
}
Expand All @@ -134,7 +150,7 @@ struct FileTreeDisclosureNode: View {
.onTapGesture(count: 1) {
if store.selectedNode === node {
if config.clickBehavior.selectedLabelClick == .rename {
isRenaming = true
isRenaming.wrappedValue = true
}
} else {
store.select(node)
Expand All @@ -146,7 +162,7 @@ struct FileTreeDisclosureNode: View {
node: node,
store: store,
menuConfiguration: config.contextMenu,
onRenameRequest: { isRenaming = true }
onRenameRequest: { store.renamingNode = node }
)
}
}
Expand Down
1 change: 1 addition & 0 deletions Sources/FileTree/FileTreeStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Observation
public final class FileTreeStore {
public let rootNode: FileTreeNode
public var selectedNode: FileTreeNode?
public var renamingNode: FileTreeNode?
public var interactionMode: InteractionMode = .normal
public var filterQuery: String = ""
public var filterHeuristic: FilterHeuristic = .fuzzy
Expand Down