mirror of
https://github.com/qvacua/vimr.git
synced 2024-12-26 15:25:14 +03:00
GH-351 Filter children in one place
This commit is contained in:
parent
e7bd913e2f
commit
20a64c540c
@ -18,16 +18,24 @@ enum FileOutlineViewAction {
|
|||||||
case setParentAsWorkingDirectory(fileItem: FileItem)
|
case setParentAsWorkingDirectory(fileItem: FileItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate class FileBrowserItem: Hashable {
|
fileprivate class FileBrowserItem: Hashable, Comparable, CustomStringConvertible {
|
||||||
|
|
||||||
static func ==(left: FileBrowserItem, right: FileBrowserItem) -> Bool {
|
static func ==(left: FileBrowserItem, right: FileBrowserItem) -> Bool {
|
||||||
return left.fileItem == right.fileItem
|
return left.fileItem == right.fileItem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func <(left: FileBrowserItem, right: FileBrowserItem) -> Bool {
|
||||||
|
return left.fileItem.url.lastPathComponent < right.fileItem.url.lastPathComponent
|
||||||
|
}
|
||||||
|
|
||||||
var hashValue: Int {
|
var hashValue: Int {
|
||||||
return self.fileItem.hashValue
|
return self.fileItem.hashValue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
return self.fileItem.url.path
|
||||||
|
}
|
||||||
|
|
||||||
let fileItem: FileItem
|
let fileItem: FileItem
|
||||||
var children: [FileBrowserItem] = []
|
var children: [FileBrowserItem] = []
|
||||||
var isExpanded = false
|
var isExpanded = false
|
||||||
@ -86,14 +94,46 @@ class FileOutlineView: NSOutlineView, Flow, NSOutlineViewDataSource, NSOutlineVi
|
|||||||
}
|
}
|
||||||
|
|
||||||
func update(_ fileItem: FileItem) {
|
func update(_ fileItem: FileItem) {
|
||||||
guard let fileBrowserItem = self.fileBrowserItem(with: fileItem.url) else {
|
let url = fileItem.url
|
||||||
|
Swift.print("updating \(url)")
|
||||||
|
guard let fileBrowserItem = self.fileBrowserItem(with: url) else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Swift.print("\(fileItem.url) ->\n\(fileBrowserItem.fileItem)")
|
Swift.print("got \(fileBrowserItem) to update")
|
||||||
|
// self.update(fileBrowserItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileprivate func update(_ fileBrowserItem: FileBrowserItem) {
|
||||||
|
// let url = fileBrowserItem.fileItem.url
|
||||||
|
//
|
||||||
|
// let curChildren = fileBrowserItem.children.filter { !$0.fileItem.isHidden }
|
||||||
|
// let newChildren = (self.fileItemService.fileItemWithChildren(for: url)?.children ?? [])
|
||||||
|
// .map(FileBrowserItem.init)
|
||||||
|
// .filter { !$0.fileItem.isHidden }
|
||||||
|
//
|
||||||
|
// Swift.print("\(fileBrowserItem.fileItem.url.lastPathComponent): \(curChildren.count) vs \(newChildren.count)")
|
||||||
|
//
|
||||||
|
// let childrenToAdd = newChildren.filter { curChildren.contains($0) == false }
|
||||||
|
// let keptChildren = curChildren.filter { newChildren.contains($0) }
|
||||||
|
//
|
||||||
|
// let resultChildren = childrenToAdd.add(keptChildren)
|
||||||
|
// fileBrowserItem.children = Array(resultChildren)
|
||||||
|
// Swift.print("new resulting children: \(resultChildren)")
|
||||||
|
//
|
||||||
|
// let childrenToRecurse = keptChildren.filter{ self.isItemExpanded(self.fileBrowserItem(with: $0.fileItem.url)) }
|
||||||
|
// Swift.print("to recurse: \(childrenToRecurse)")
|
||||||
|
//
|
||||||
|
// self.reloadItem(fileBrowserItem, reloadChildren: false)
|
||||||
|
//
|
||||||
|
// childrenToRecurse.forEach(self.update)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func fileBrowserItem(with url: URL) -> FileBrowserItem? {
|
fileprivate func fileBrowserItem(with url: URL) -> FileBrowserItem? {
|
||||||
|
if self.cwd == url {
|
||||||
|
return self.root
|
||||||
|
}
|
||||||
|
|
||||||
guard self.cwd.isParent(of: url) else {
|
guard self.cwd.isParent(of: url) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -115,6 +155,10 @@ class FileOutlineView: NSOutlineView, Flow, NSOutlineViewDataSource, NSOutlineVi
|
|||||||
// MARK: - NSOutlineViewDataSource
|
// MARK: - NSOutlineViewDataSource
|
||||||
extension FileOutlineView {
|
extension FileOutlineView {
|
||||||
|
|
||||||
|
fileprivate func prepare(_ children: [FileBrowserItem]) -> [FileBrowserItem] {
|
||||||
|
return children.filter { !$0.fileItem.isHidden }.sorted()
|
||||||
|
}
|
||||||
|
|
||||||
func outlineView(_: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
|
func outlineView(_: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
|
||||||
if item == nil {
|
if item == nil {
|
||||||
let rootFileItem = fileItemService.fileItemWithChildren(for: self.cwd)
|
let rootFileItem = fileItemService.fileItemWithChildren(for: self.cwd)
|
||||||
@ -122,7 +166,7 @@ extension FileOutlineView {
|
|||||||
self.root = FileBrowserItem(fileItem: rootFileItem)
|
self.root = FileBrowserItem(fileItem: rootFileItem)
|
||||||
self.root.children = rootFileItem.children.map(FileBrowserItem.init)
|
self.root.children = rootFileItem.children.map(FileBrowserItem.init)
|
||||||
|
|
||||||
return self.root.children.filter { !$0.fileItem.isHidden }.count
|
return self.prepare(self.root.children).count
|
||||||
}
|
}
|
||||||
|
|
||||||
guard let fileBrowserItem = item as? FileBrowserItem else {
|
guard let fileBrowserItem = item as? FileBrowserItem else {
|
||||||
@ -132,8 +176,9 @@ extension FileOutlineView {
|
|||||||
let fileItem = fileBrowserItem.fileItem
|
let fileItem = fileBrowserItem.fileItem
|
||||||
if fileItem.isDir {
|
if fileItem.isDir {
|
||||||
let fileItemChildren = self.fileItemService.fileItemWithChildren(for: fileItem.url)?.children ?? []
|
let fileItemChildren = self.fileItemService.fileItemWithChildren(for: fileItem.url)?.children ?? []
|
||||||
|
fileBrowserItem.fileItem.children = fileItemChildren
|
||||||
fileBrowserItem.children = fileItemChildren.map(FileBrowserItem.init)
|
fileBrowserItem.children = fileItemChildren.map(FileBrowserItem.init)
|
||||||
return fileBrowserItem.children.filter { !$0.fileItem.isHidden }.count
|
return self.prepare(fileBrowserItem.children).count
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
@ -144,7 +189,7 @@ extension FileOutlineView {
|
|||||||
|
|
||||||
if item == nil {
|
if item == nil {
|
||||||
self.adjustColumnWidth(for: self.root.children, outlineViewLevel: level)
|
self.adjustColumnWidth(for: self.root.children, outlineViewLevel: level)
|
||||||
return self.root.children.filter({ !$0.fileItem.isHidden })[index]
|
return self.prepare(self.root.children)[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
guard let fileBrowserItem = item as? FileBrowserItem else {
|
guard let fileBrowserItem = item as? FileBrowserItem else {
|
||||||
@ -152,10 +197,10 @@ extension FileOutlineView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.adjustColumnWidth(for: fileBrowserItem.children, outlineViewLevel: level)
|
self.adjustColumnWidth(for: fileBrowserItem.children, outlineViewLevel: level)
|
||||||
return fileBrowserItem.children.filter({ !$0.fileItem.isHidden })[index]
|
return self.prepare(fileBrowserItem.children)[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
func outlineView(_: NSOutlineView, isItemExpandable item: Any) -> Bool {
|
func outlineView(_: NSOutlineView, isItemExpandable item: Any) -> Bool {
|
||||||
guard let fileBrowserItem = item as? FileBrowserItem else {
|
guard let fileBrowserItem = item as? FileBrowserItem else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -163,7 +208,7 @@ extension FileOutlineView {
|
|||||||
return fileBrowserItem.fileItem.isDir
|
return fileBrowserItem.fileItem.isDir
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc(outlineView:objectValueForTableColumn:byItem:)
|
@objc(outlineView: objectValueForTableColumn:byItem:)
|
||||||
func outlineView(_: NSOutlineView, objectValueFor: NSTableColumn?, byItem item: Any?) -> Any? {
|
func outlineView(_: NSOutlineView, objectValueFor: NSTableColumn?, byItem item: Any?) -> Any? {
|
||||||
guard let fileBrowserItem = item as? FileBrowserItem else {
|
guard let fileBrowserItem = item as? FileBrowserItem else {
|
||||||
return nil
|
return nil
|
||||||
@ -196,7 +241,7 @@ extension FileOutlineView {
|
|||||||
// MARK: - NSOutlineViewDelegate
|
// MARK: - NSOutlineViewDelegate
|
||||||
extension FileOutlineView {
|
extension FileOutlineView {
|
||||||
|
|
||||||
@objc(outlineView:viewForTableColumn:item:)
|
@objc(outlineView: viewForTableColumn:item:)
|
||||||
func outlineView(_: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
|
func outlineView(_: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
|
||||||
guard let fileBrowserItem = item as? FileBrowserItem else {
|
guard let fileBrowserItem = item as? FileBrowserItem else {
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user