From cf2b5b8cecce8f44b2f8de1996ae86d32701c419 Mon Sep 17 00:00:00 2001 From: igor Date: Thu, 6 Feb 2025 23:03:45 -0800 Subject: [PATCH] Pre-allocated the list of program for performance. --- src/PathManager.swift | 8 +++--- src/SearchViewController.swift | 42 ++++++++++++++------------------ src/SettingsViewController.swift | 3 +-- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/PathManager.swift b/src/PathManager.swift index f949e74..09aa150 100644 --- a/src/PathManager.swift +++ b/src/PathManager.swift @@ -1,10 +1,10 @@ import AppKit struct Program { - let path: String - let name: String - let ext : String - var img : NSImage? + var path: String = "" + var name: String = "" + var ext : String = "" + var img : NSImage? = nil } final class PathManager { diff --git a/src/SearchViewController.swift b/src/SearchViewController.swift index 6e3d8a3..d094a46 100644 --- a/src/SearchViewController.swift +++ b/src/SearchViewController.swift @@ -16,7 +16,8 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, { private var keyboardEvents: EventMonitor? - private var programsList: [Program] = [] + private var programsList: [Program] = Array(repeating: Program(), count: 10) + private var listIndex = 0 private var programsTableViewSelection = 0 @@ -185,8 +186,8 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, controller.programsTableViewSelection += 1 } - if controller.programsTableViewSelection > controller.programsList.count-1 { - controller.programsTableViewSelection = controller.programsList.count-1 + if controller.programsTableViewSelection > controller.listIndex-1 { + controller.programsTableViewSelection = controller.listIndex-1 } else if controller.programsTableViewSelection < 0 { controller.programsTableViewSelection = 0 } @@ -239,7 +240,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, } private func reloadProgramsTableViewData() { - if programsList.count > 0 { + if listIndex > 0 { tableViewHeightAnchor?.constant = 210 } else { tableViewHeightAnchor?.constant = 0 @@ -289,22 +290,19 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, guard let searchInput = obj.object as? EditableNSTextField else { return } - programsList = [] - + listIndex = 0 if !searchInput.stringValue.isEmpty { - for path in PathManager.shared.paths { - if programsList.count >= 10 { break } - + outerloop: for path in PathManager.shared.paths { for i in path.value.indices { var prog = path.value[i] - if programsList.count >= 10 { break } + if listIndex >= 10 { break outerloop } - if prog.name.lowercased().contains(searchInput.stringValue.lowercased()) - { - let url = URL(fileURLWithPath: prog.path).appendingPathComponent(prog.name+prog.ext) - let image = NSWorkspace.shared.icon(forFile: url.path) - prog.img = image - programsList.append(prog) + if prog.name.lowercased().contains(searchInput.stringValue.lowercased()) { + programsList[listIndex].path = prog.path + programsList[listIndex].name = prog.name + programsList[listIndex].ext = prog.ext + programsList[listIndex].img = NSWorkspace.shared.icon(forFile: URL(fileURLWithPath: prog.path).appendingPathComponent(prog.name+prog.ext).path) + listIndex += 1 } } } @@ -318,7 +316,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool { if commandSelector == #selector(NSResponder.insertNewline(_:)) { - if programsList.count > 0 { + if listIndex > 0 { let program = programsList[programsTableViewSelection] openProgram(program) NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to: nil, from: self) @@ -344,7 +342,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, } func numberOfRows(in tableView: NSTableView) -> Int { - return programsList.count + return listIndex } func tableView(_ tableView: NSTableView, @@ -365,13 +363,9 @@ class SearchViewController: NSViewController, NSTextFieldDelegate, // searchInput.stringValue let app = program.name + program.ext - let rangeToHighlight = - (app.lowercased() as NSString) - .range(of: searchInput.stringValue.lowercased()) + let rangeToHighlight = (app.lowercased() as NSString).range(of: searchInput.stringValue.lowercased()) let attributedString = NSMutableAttributedString(string: app) - attributedString.addAttributes( - [.foregroundColor: NSColor.labelColor], - range: rangeToHighlight) + attributedString.addAttributes([.foregroundColor: NSColor.labelColor], range: rangeToHighlight) cell.titleField.attributedStringValue = attributedString cell.progPathLabel.stringValue = program.path diff --git a/src/SettingsViewController.swift b/src/SettingsViewController.swift index 4ec0bc6..9901211 100644 --- a/src/SettingsViewController.swift +++ b/src/SettingsViewController.swift @@ -281,8 +281,7 @@ class SettingsViewController: NSViewController, override func viewWillAppear() { super.viewWillAppear() - // PERF: Maybe we shouldn't fetch it on every appearance? - // Only do it in AppDelegate? + // Fetch the saved key codes and modifiers. if let code = UserDefaults.standard.object(forKey: "keyCode") as? Int { keyCode = code }