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
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 {

View File

@@ -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

View File

@@ -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
}