Pre-allocated the list of program for performance.

This commit is contained in:
2025-02-06 23:03:45 -08:00
parent 1decb79a4e
commit cf2b5b8cec
3 changed files with 23 additions and 30 deletions

View File

@@ -1,10 +1,10 @@
import AppKit import AppKit
struct Program { struct Program {
let path: String var path: String = ""
let name: String var name: String = ""
let ext : String var ext : String = ""
var img : NSImage? var img : NSImage? = nil
} }
final class PathManager { final class PathManager {

View File

@@ -16,7 +16,8 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
{ {
private var keyboardEvents: EventMonitor? 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 private var programsTableViewSelection = 0
@@ -185,8 +186,8 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
controller.programsTableViewSelection += 1 controller.programsTableViewSelection += 1
} }
if controller.programsTableViewSelection > controller.programsList.count-1 { if controller.programsTableViewSelection > controller.listIndex-1 {
controller.programsTableViewSelection = controller.programsList.count-1 controller.programsTableViewSelection = controller.listIndex-1
} else if controller.programsTableViewSelection < 0 { } else if controller.programsTableViewSelection < 0 {
controller.programsTableViewSelection = 0 controller.programsTableViewSelection = 0
} }
@@ -239,7 +240,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
} }
private func reloadProgramsTableViewData() { private func reloadProgramsTableViewData() {
if programsList.count > 0 { if listIndex > 0 {
tableViewHeightAnchor?.constant = 210 tableViewHeightAnchor?.constant = 210
} else { } else {
tableViewHeightAnchor?.constant = 0 tableViewHeightAnchor?.constant = 0
@@ -289,22 +290,19 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
guard let searchInput = obj.object as? EditableNSTextField guard let searchInput = obj.object as? EditableNSTextField
else { return } else { return }
programsList = [] listIndex = 0
if !searchInput.stringValue.isEmpty { if !searchInput.stringValue.isEmpty {
for path in PathManager.shared.paths { outerloop: for path in PathManager.shared.paths {
if programsList.count >= 10 { break }
for i in path.value.indices { for i in path.value.indices {
var prog = path.value[i] var prog = path.value[i]
if programsList.count >= 10 { break } if listIndex >= 10 { break outerloop }
if prog.name.lowercased().contains(searchInput.stringValue.lowercased()) if prog.name.lowercased().contains(searchInput.stringValue.lowercased()) {
{ programsList[listIndex].path = prog.path
let url = URL(fileURLWithPath: prog.path).appendingPathComponent(prog.name+prog.ext) programsList[listIndex].name = prog.name
let image = NSWorkspace.shared.icon(forFile: url.path) programsList[listIndex].ext = prog.ext
prog.img = image programsList[listIndex].img = NSWorkspace.shared.icon(forFile: URL(fileURLWithPath: prog.path).appendingPathComponent(prog.name+prog.ext).path)
programsList.append(prog) listIndex += 1
} }
} }
} }
@@ -318,7 +316,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool { func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
if commandSelector == #selector(NSResponder.insertNewline(_:)) { if commandSelector == #selector(NSResponder.insertNewline(_:)) {
if programsList.count > 0 { if listIndex > 0 {
let program = programsList[programsTableViewSelection] let program = programsList[programsTableViewSelection]
openProgram(program) openProgram(program)
NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to: nil, from: self) NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to: nil, from: self)
@@ -344,7 +342,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
} }
func numberOfRows(in tableView: NSTableView) -> Int { func numberOfRows(in tableView: NSTableView) -> Int {
return programsList.count return listIndex
} }
func tableView(_ tableView: NSTableView, func tableView(_ tableView: NSTableView,
@@ -365,13 +363,9 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
// searchInput.stringValue // searchInput.stringValue
let app = program.name + program.ext let app = program.name + program.ext
let rangeToHighlight = let rangeToHighlight = (app.lowercased() as NSString).range(of: searchInput.stringValue.lowercased())
(app.lowercased() as NSString)
.range(of: searchInput.stringValue.lowercased())
let attributedString = NSMutableAttributedString(string: app) let attributedString = NSMutableAttributedString(string: app)
attributedString.addAttributes( attributedString.addAttributes([.foregroundColor: NSColor.labelColor], range: rangeToHighlight)
[.foregroundColor: NSColor.labelColor],
range: rangeToHighlight)
cell.titleField.attributedStringValue = attributedString cell.titleField.attributedStringValue = attributedString
cell.progPathLabel.stringValue = program.path cell.progPathLabel.stringValue = program.path

View File

@@ -281,8 +281,7 @@ class SettingsViewController: NSViewController,
override func viewWillAppear() { override func viewWillAppear() {
super.viewWillAppear() super.viewWillAppear()
// PERF: Maybe we shouldn't fetch it on every appearance? // Fetch the saved key codes and modifiers.
// Only do it in AppDelegate?
if let code = UserDefaults.standard.object(forKey: "keyCode") as? Int { if let code = UserDefaults.standard.object(forKey: "keyCode") as? Int {
keyCode = code keyCode = code
} }