Skip to content

Commit bb406f4

Browse files
* improve search speed
* improve search accuracy
1 parent 07ebe63 commit bb406f4

File tree

8 files changed

+140
-32
lines changed

8 files changed

+140
-32
lines changed

IconChanger.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
900D1CF8281936C7007ABB12 /* FullDiskPermision.swift in Sources */ = {isa = PBXBuildFile; fileRef = 900D1CF7281936C7007ABB12 /* FullDiskPermision.swift */; };
1515
900D1CFA281938D6007ABB12 /* IconList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 900D1CF9281938D6007ABB12 /* IconList.swift */; };
1616
9017B5F8294DBBA9005709C6 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 9017B5F7294DBBA9005709C6 /* Sparkle */; };
17+
9017B5FA294ED626005709C6 /* IconRes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9017B5F9294ED626005709C6 /* IconRes.swift */; };
18+
9017B5FC294EDAB4005709C6 /* LocalImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9017B5FB294EDAB4005709C6 /* LocalImageView.swift */; };
1719
9053434F286B2A6800237F98 /* AutoUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9053434E286B2A6800237F98 /* AutoUpdater.swift */; };
1820
90534352286C8BDA00237F98 /* fileicon in Resources */ = {isa = PBXBuildFile; fileRef = 90534351286C8BDA00237F98 /* fileicon */; };
1921
9053438B287550C200237F98 /* helper.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9053438A287534C300237F98 /* helper.sh */; };
@@ -44,6 +46,8 @@
4446
900D1CEF281934C8007ABB12 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
4547
900D1CF7281936C7007ABB12 /* FullDiskPermision.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullDiskPermision.swift; sourceTree = "<group>"; };
4648
900D1CF9281938D6007ABB12 /* IconList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconList.swift; sourceTree = "<group>"; };
49+
9017B5F9294ED626005709C6 /* IconRes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconRes.swift; sourceTree = "<group>"; };
50+
9017B5FB294EDAB4005709C6 /* LocalImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalImageView.swift; sourceTree = "<group>"; };
4751
9053434D286B2A2900237F98 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
4852
9053434E286B2A6800237F98 /* AutoUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutoUpdater.swift; sourceTree = "<group>"; };
4953
90534350286B441900237F98 /* sparkle.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = sparkle.xml; sourceTree = "<group>"; };
@@ -128,6 +132,8 @@
128132
90B57C21286ACBA700EE52D3 /* StringTest.playground */,
129133
90534350286B441900237F98 /* sparkle.xml */,
130134
9053438A287534C300237F98 /* helper.sh */,
135+
9017B5F9294ED626005709C6 /* IconRes.swift */,
136+
9017B5FB294EDAB4005709C6 /* LocalImageView.swift */,
131137
);
132138
path = IconChanger;
133139
sourceTree = "<group>";
@@ -241,7 +247,9 @@
241247
900D1CEB281934C7007ABB12 /* ContentView.swift in Sources */,
242248
908A792C281A759A00951B15 /* SettingView.swift in Sources */,
243249
908A790B281A128700951B15 /* Request.swift in Sources */,
250+
9017B5FA294ED626005709C6 /* IconRes.swift in Sources */,
244251
908A78FB2819640800951B15 /* IconManager.swift in Sources */,
252+
9017B5FC294EDAB4005709C6 /* LocalImageView.swift in Sources */,
245253
90B57B8028695BDF00EE52D3 /* AliasName.swift in Sources */,
246254
900D1CE9281934C7007ABB12 /* IconChangerApp.swift in Sources */,
247255
900D1CFA281938D6007ABB12 /* IconList.swift in Sources */,

IconChanger/ChangeView.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ struct ChangeView: View {
1414
GridItem(.flexible(), alignment: .top),
1515
GridItem(.flexible(), alignment: .top)]
1616

17-
@State var icons: [URL] = []
17+
@State var icons: [IconRes] = []
1818
@State var inIcons: [URL] = []
19+
@State var showProgress = false
1920
let setPath: LaunchPadManagerDBHelper.AppInfo
2021

2122
@Environment(\.presentationMode) var presentationMode
@@ -32,12 +33,19 @@ struct ChangeView: View {
3233
ProgressView()
3334
}
3435
} else {
35-
LazyVGrid(columns: rules) {
36-
ForEach(icons, id: \.self) { icon in
37-
ImageView(url: icon, setPath: setPath)
36+
ZStack {
37+
LazyVGrid(columns: rules) {
38+
ForEach(icons, id: \.self) { icon in
39+
ImageView(icon: icon, setPath: setPath, showPro: $showProgress)
40+
}
41+
42+
Spacer()
3843
}
44+
.disabled(showProgress)
3945

40-
Spacer()
46+
if showProgress {
47+
ProgressView()
48+
}
4149
}
4250
}
4351
}
@@ -48,7 +56,7 @@ struct ChangeView: View {
4856
ScrollView(showsIndicators: false) {
4957
LazyVGrid(columns: rules) {
5058
ForEach(inIcons, id: \.self) { icon in
51-
ImageView(url: icon, setPath: setPath)
59+
LocalImageView(url: icon, setPath: setPath)
5260
}
5361

5462
Spacer()

IconChanger/IconList.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ struct IconList: View {
2929
ForEach(iconManager.apps, id: \.url) { app in
3030
IconView(app: app, setPath: $setPath, searchText: $searchText, setAlias: $setAlias)
3131
}
32-
.onAppear {
33-
print(iconManager.apps.map(\.name))
34-
}
3532
}
3633
}
3734
}

IconChanger/IconManager.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,20 +160,20 @@ class IconManager: ObservableObject {
160160
return String(url[count..<endCount] ?? "")
161161
}
162162

163-
func getIcons(_ app: LaunchPadManagerDBHelper.AppInfo) async throws -> [URL] {
163+
func getIcons(_ app: LaunchPadManagerDBHelper.AppInfo) async throws -> [IconRes] {
164164
let appName = app.name
165165
let urlName = AliasName.getNames(for: app.url.deletingPathExtension().lastPathComponent) ?? app.url.deletingPathExtension().lastPathComponent
166166
let bundleName = try getAppBundleName(app)
167167

168-
var urls = [URL]()
168+
var res = [IconRes]()
169169

170-
urls.append(contentsOf: try await MyQueryRequestController().sendRequest(appName))
171-
urls.append(contentsOf: try await MyQueryRequestController().sendRequest(urlName))
170+
res.append(contentsOf: try await MyQueryRequestController().sendRequest(appName))
171+
res.append(contentsOf: try await MyQueryRequestController().sendRequest(urlName))
172172
if let bundleName {
173-
urls.append(contentsOf: try await MyQueryRequestController().sendRequest(bundleName))
173+
res.append(contentsOf: try await MyQueryRequestController().sendRequest(bundleName))
174174
}
175175

176-
return Set(urls).map { $0 }
176+
return Set(res).map { $0 }
177177
}
178178

179179
func getAppBundleName(_ app: LaunchPadManagerDBHelper.AppInfo) throws -> String? {

IconChanger/IconRes.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// IconRes.swift
3+
// IconChanger
4+
//
5+
// Created by 朱浩宇 on 2022/12/18.
6+
//
7+
8+
import Foundation
9+
10+
struct IconRes: Hashable {
11+
let appName: String
12+
let icnsUrl: URL
13+
let lowResPngUrl: URL
14+
let downloads: Int
15+
}

IconChanger/ImageView.swift

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,36 @@ import SwiftUI
99
import LaunchPadManagerDBHelper
1010

1111
struct ImageView: View {
12-
let url: URL
12+
let icon: IconRes
1313
let setPath: LaunchPadManagerDBHelper.AppInfo
14+
@State var preveiw: NSImage?
1415

15-
@State var nsimage: NSImage?
16+
@Binding var showPro: Bool
1617

1718
@Environment(\.presentationMode) var presentationMode
1819

1920
var body: some View {
20-
if let nsimage = nsimage {
21-
Image(nsImage: nsimage)
21+
if let preveiw = preveiw {
22+
Image(nsImage: preveiw)
2223
.resizable()
2324
.scaledToFit()
2425
.onTapGesture {
25-
do {
26-
try IconManager.shared.setImage(nsimage, app: setPath)
27-
presentationMode.wrappedValue.dismiss()
28-
} catch {
29-
print(error)
26+
Task {
27+
do {
28+
showPro = true
29+
30+
guard let nsimage = try await MyRequestController().sendRequest(icon.icnsUrl) else {
31+
showPro = false
32+
return
33+
}
34+
try IconManager.shared.setImage(nsimage, app: setPath)
35+
36+
showPro = false
37+
presentationMode.wrappedValue.dismiss()
38+
39+
} catch {
40+
print(error)
41+
}
3042
}
3143
}
3244
} else {
@@ -38,7 +50,7 @@ struct ImageView: View {
3850
}
3951
.task {
4052
do {
41-
nsimage = try await MyRequestController().sendRequest(url)
53+
preveiw = try await MyRequestController().sendRequest(icon.lowResPngUrl)
4254
} catch {
4355
print(error)
4456
}

IconChanger/LocalImageView.swift

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
//
2+
// LocalImageView.swift
3+
// IconChanger
4+
//
5+
// Created by 朱浩宇 on 2022/12/18.
6+
//
7+
8+
import SwiftUI
9+
import LaunchPadManagerDBHelper
10+
11+
struct LocalImageView: View {
12+
let url: URL
13+
let setPath: LaunchPadManagerDBHelper.AppInfo
14+
15+
@State var nsimage: NSImage?
16+
17+
@Environment(\.presentationMode) var presentationMode
18+
19+
var body: some View {
20+
if let nsimage = nsimage {
21+
Image(nsImage: nsimage)
22+
.resizable()
23+
.scaledToFit()
24+
.onTapGesture {
25+
do {
26+
try IconManager.shared.setImage(nsimage, app: setPath)
27+
presentationMode.wrappedValue.dismiss()
28+
} catch {
29+
print(error)
30+
}
31+
}
32+
} else {
33+
Image("Unknown")
34+
.resizable()
35+
.scaledToFit()
36+
.overlay {
37+
ProgressView()
38+
}
39+
.task {
40+
do {
41+
nsimage = try await MyRequestController().sendRequest(url)
42+
} catch {
43+
print(error)
44+
}
45+
}
46+
}
47+
}
48+
49+
func saveImage(_ image: NSImage) -> Data? {
50+
guard
51+
let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil)
52+
else { return nil } // TODO: handle error
53+
let newRep = NSBitmapImageRep(cgImage: cgImage)
54+
newRep.size = image.size // if you want the same size
55+
guard
56+
let pngData = newRep.representation(using: .png, properties: [:])
57+
else { return nil } // TODO: handle error
58+
return pngData
59+
}
60+
}

IconChanger/Request.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class MyRequestController {
5555
}
5656

5757
class MyQueryRequestController {
58-
func sendRequest(_ query: String) async throws -> [URL] {
58+
func sendRequest(_ query: String) async throws -> [IconRes] {
5959
/* Configure session, choose between:
6060
* defaultSessionConfiguration
6161
* ephemeralSessionConfiguration
@@ -102,13 +102,21 @@ class MyQueryRequestController {
102102

103103
let json = try JSON(data: data)
104104
print(json)
105-
let hits = json["hits"].arrayValue
105+
let res = json["hits"].arrayValue.compactMap { hit in
106+
if let lowResPngUrl = hit["lowResPngUrl"].url, let icnsUrl = hit["icnsUrl"].url {
107+
return IconRes(appName: hit["appName"].stringValue, icnsUrl: icnsUrl, lowResPngUrl: lowResPngUrl, downloads: hit["downloads"].intValue)
108+
} else {
109+
return nil
110+
}
111+
}
106112

107-
return hits.map { json in
108-
(Foundation.URL(string: json["icnsUrl"].stringValue), json["downloads"].intValue)
109-
}.sorted { hit1, hit2 in
110-
hit1.1 > hit2.1
111-
}.compactMap(\.0)
113+
return res
114+
.filter {
115+
$0.appName.lowercased().replace(target: " ", withString: "").contains(query.lowercased().replace(target: " ", withString: ""))
116+
}
117+
.sorted { res1, res2 in
118+
res1.downloads > res2.downloads
119+
}
112120
}
113121

114122
func qeuryMix(_ query: String) -> String {

0 commit comments

Comments
 (0)