add settingsview

load dict and save dict
xcode 14+
This commit is contained in:
neon443
2025-11-19 08:53:38 +00:00
parent 7ca11e49a1
commit c670958562
5 changed files with 98 additions and 44 deletions

View File

@@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 77; objectVersion = 63;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@@ -30,6 +30,10 @@
A955B3F22EC22E9700E1732D /* BrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F02EC22E9700E1732D /* BrowseView.swift */; }; A955B3F22EC22E9700E1732D /* BrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F02EC22E9700E1732D /* BrowseView.swift */; };
A955B3F52EC22EE900E1732D /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F42EC22EE900E1732D /* SearchView.swift */; }; A955B3F52EC22EE900E1732D /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F42EC22EE900E1732D /* SearchView.swift */; };
A955B3F62EC22EE900E1732D /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F42EC22EE900E1732D /* SearchView.swift */; }; A955B3F62EC22EE900E1732D /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F42EC22EE900E1732D /* SearchView.swift */; };
A957C1742ECCE2CE00EA3EE9 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A957C1732ECCE2CE00EA3EE9 /* SettingsView.swift */; };
A957C1752ECCE2CE00EA3EE9 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A957C1732ECCE2CE00EA3EE9 /* SettingsView.swift */; };
A957C1772ECD008E00EA3EE9 /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = A957C1762ECD008E00EA3EE9 /* Bundle.swift */; };
A957C1782ECD008E00EA3EE9 /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = A957C1762ECD008E00EA3EE9 /* Bundle.swift */; };
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */; }; A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */; };
A986A6AE2EB658DF00B6E0FA /* Messages.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A969D6932EA3E86500399C05 /* Messages.framework */; }; A986A6AE2EB658DF00B6E0FA /* Messages.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A969D6932EA3E86500399C05 /* Messages.framework */; };
A986A6BA2EB658E100B6E0FA /* StickerSlackiMessageApp.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; A986A6BA2EB658E100B6E0FA /* StickerSlackiMessageApp.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@@ -111,6 +115,8 @@
A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedView.swift; sourceTree = "<group>"; }; A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedView.swift; sourceTree = "<group>"; };
A955B3F02EC22E9700E1732D /* BrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseView.swift; sourceTree = "<group>"; }; A955B3F02EC22E9700E1732D /* BrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseView.swift; sourceTree = "<group>"; };
A955B3F42EC22EE900E1732D /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = "<group>"; }; A955B3F42EC22EE900E1732D /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = "<group>"; };
A957C1732ECCE2CE00EA3EE9 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
A957C1762ECD008E00EA3EE9 /* Bundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = "<group>"; };
A969D6932EA3E86500399C05 /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = Library/Frameworks/Messages.framework; sourceTree = DEVELOPER_DIR; }; A969D6932EA3E86500399C05 /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = Library/Frameworks/Messages.framework; sourceTree = DEVELOPER_DIR; };
A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPreview.swift; sourceTree = "<group>"; }; A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPreview.swift; sourceTree = "<group>"; };
A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = StickerSlackiMessageApp.appex; sourceTree = BUILT_PRODUCTS_DIR; }; A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = StickerSlackiMessageApp.appex; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -173,6 +179,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
A9104C7D2EB4022500D160EA /* MSSticker.swift */, A9104C7D2EB4022500D160EA /* MSSticker.swift */,
A957C1762ECD008E00EA3EE9 /* Bundle.swift */,
); );
path = Extensions; path = Extensions;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -221,6 +228,7 @@
A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */, A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */,
A955B3F02EC22E9700E1732D /* BrowseView.swift */, A955B3F02EC22E9700E1732D /* BrowseView.swift */,
A955B3F42EC22EE900E1732D /* SearchView.swift */, A955B3F42EC22EE900E1732D /* SearchView.swift */,
A957C1732ECCE2CE00EA3EE9 /* SettingsView.swift */,
); );
path = SwiftUI; path = SwiftUI;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -400,6 +408,7 @@
}; };
}; };
buildConfigurationList = A949B1DA2EA04C0B00215164 /* Build configuration list for PBXProject "StickerSlack" */; buildConfigurationList = A949B1DA2EA04C0B00215164 /* Build configuration list for PBXProject "StickerSlack" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en; developmentRegion = en;
hasScannedForEncodings = 0; hasScannedForEncodings = 0;
knownRegions = ( knownRegions = (
@@ -411,7 +420,6 @@
packageReferences = ( packageReferences = (
A9112EAA2EAFFDB0006739E2 /* XCRemoteSwiftPackageReference "Haptics" */, A9112EAA2EAFFDB0006739E2 /* XCRemoteSwiftPackageReference "Haptics" */,
); );
preferredProjectObjectVersion = 77;
productRefGroup = A949B1E02EA04C0B00215164 /* Products */; productRefGroup = A949B1E02EA04C0B00215164 /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
@@ -463,6 +471,8 @@
A949B1F42EA04E8200215164 /* ContentView.swift in Sources */, A949B1F42EA04E8200215164 /* ContentView.swift in Sources */,
A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */, A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */,
A9104C802EB4022500D160EA /* MSSticker.swift in Sources */, A9104C802EB4022500D160EA /* MSSticker.swift in Sources */,
A957C1772ECD008E00EA3EE9 /* Bundle.swift in Sources */,
A957C1742ECCE2CE00EA3EE9 /* SettingsView.swift in Sources */,
A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */, A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */,
A955B3EE2EC22C4A00E1732D /* DownloadedView.swift in Sources */, A955B3EE2EC22C4A00E1732D /* DownloadedView.swift in Sources */,
A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */, A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */,
@@ -508,9 +518,11 @@
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */, A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
A955B3ED2EC22C4A00E1732D /* DownloadedView.swift in Sources */, A955B3ED2EC22C4A00E1732D /* DownloadedView.swift in Sources */,
A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */, A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */,
A957C1752ECCE2CE00EA3EE9 /* SettingsView.swift in Sources */,
A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */, A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */,
A955B3F62EC22EE900E1732D /* SearchView.swift in Sources */, A955B3F62EC22EE900E1732D /* SearchView.swift in Sources */,
A9B9A8322EB2CD29004C9245 /* SlackResponse.swift in Sources */, A9B9A8322EB2CD29004C9245 /* SlackResponse.swift in Sources */,
A957C1782ECD008E00EA3EE9 /* Bundle.swift in Sources */,
A9B9A82E2EB2CCBE004C9245 /* StickerSlackTests.swift in Sources */, A9B9A82E2EB2CCBE004C9245 /* StickerSlackTests.swift in Sources */,
A9B9A8312EB2CD14004C9245 /* FilterCategory.swift in Sources */, A9B9A8312EB2CD14004C9245 /* FilterCategory.swift in Sources */,
A9EB72502EB94FAD00658CEB /* EmojiPreview.swift in Sources */, A9EB72502EB94FAD00658CEB /* EmojiPreview.swift in Sources */,

View File

@@ -23,7 +23,6 @@ class EmojiHoarder: ObservableObject {
@Published var emojis: [Emoji] = [] @Published var emojis: [Emoji] = []
@Published var trie: Trie = Trie() @Published var trie: Trie = Trie()
// @Published var filteredEmojis: [String] = []
@Published var downloadedEmojis: Set<String> = [] @Published var downloadedEmojis: Set<String> = []
@Published var downloadedEmojisArr: [String] = [] @Published var downloadedEmojisArr: [String] = []
@Published var searchTerm: String = "" @Published var searchTerm: String = ""
@@ -75,11 +74,11 @@ class EmojiHoarder: ObservableObject {
//cl i disabled ts cos its quicker to rebuild it then to load ts //cl i disabled ts cos its quicker to rebuild it then to load ts
func saveTrie() { func saveTrie() {
return // return
guard let data = try? encoder.encode(trie.root) else { // guard let data = try? encoder.encode(trie.root) else {
fatalError("failed to encode trie") // fatalError("failed to encode trie")
} // }
try! data.write(to: EmojiHoarder.localTrie) // try! data.write(to: EmojiHoarder.localTrie)
guard let dataDict = try? encoder.encode(trie.dict) else { guard let dataDict = try? encoder.encode(trie.dict) else {
fatalError("failed to encode trie dict") fatalError("failed to encode trie dict")
@@ -88,13 +87,13 @@ class EmojiHoarder: ObservableObject {
} }
func loadTrie() { func loadTrie() {
return // return
guard FileManager.default.fileExists(atPath: EmojiHoarder.localTrie.path) else { return } // guard FileManager.default.fileExists(atPath: EmojiHoarder.localTrie.path) else { return }
guard let data = try? Data(contentsOf: EmojiHoarder.localTrie) else { return } // guard let data = try? Data(contentsOf: EmojiHoarder.localTrie) else { return }
guard let decoded = try? decoder.decode(TrieNode.self, from: data) else { // guard let decoded = try? decoder.decode(TrieNode.self, from: data) else {
fatalError("failed to decode trie") // fatalError("failed to decode trie")
} // }
self.trie.root = decoded // self.trie.root = decoded
guard FileManager.default.fileExists(atPath: EmojiHoarder.localTrieDict.path) else { return } guard FileManager.default.fileExists(atPath: EmojiHoarder.localTrieDict.path) else { return }
guard let dataDict = try? Data(contentsOf: EmojiHoarder.localTrieDict) else { return } guard let dataDict = try? Data(contentsOf: EmojiHoarder.localTrieDict) else { return }

View File

@@ -0,0 +1,20 @@
//
// Bundle.swift
// StickerSlack
//
// Created by neon443 on 18/11/2025.
//
import Foundation
extension Bundle {
var appVersion: String {
let version = infoDictionary?["CFBundleVersion"] as? String
return version ?? "0.0"
}
var appBuild: String {
let build = infoDictionary?["CFBundleVersion"] as? String
return "(" + (build ?? "0") + ")"
}
}

View File

@@ -18,35 +18,12 @@ struct ContentView: View {
BrowseView(hoarder: hoarder) BrowseView(hoarder: hoarder)
} }
// Tab {
// List {
// Text("\(searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji")
//
// ForEach(hoarder.filteredEmojis, id: \.self) { name in
// if let emoji = hoarder.trie.dict[name] {
// EmojiRow(emoji: emoji)
// }
// }
// }
// .onChange(of: searchTerm) { _ in
// hoarder.filterEmojis(by: searchTerm)
// }
// .refreshable {
// Task.detached {
// await hoarder.refreshDB()
// }
// searchTerm = ""
// }
// } label: {
// Label("Search", systemImage: "magnifyingglass")
// }
Tab("Downloaded", systemImage: "arrow.down.circle.fill") { Tab("Downloaded", systemImage: "arrow.down.circle.fill") {
DownloadedView(hoarder: hoarder) DownloadedView(hoarder: hoarder)
} }
Tab("Tree", systemImage: "tree.fill") { Tab("Settings", systemImage: "gear") {
TrieTestingView(hoarder: hoarder) SettingsView(hoarder: hoarder)
} }
Tab(role: .search) { Tab(role: .search) {
@@ -63,10 +40,6 @@ struct ContentView: View {
.tabItem { .tabItem {
Label("Browse", systemImage: "square.grid.2x2.fill") Label("Browse", systemImage: "square.grid.2x2.fill")
} }
TrieTestingView(hoarder: hoarder)
.tabItem {
Label("Trie", systemImage: "tree.fill")
}
SearchView(hoarder: hoarder) SearchView(hoarder: hoarder)
.tabItem { .tabItem {
Label("Search", systemImage: "magnifyingglass") Label("Search", systemImage: "magnifyingglass")

View File

@@ -0,0 +1,50 @@
//
// SettingsView.swift
// StickerSlack
//
// Created by neon443 on 18/11/2025.
//
import SwiftUI
struct SettingsView: View {
@ObservedObject var hoarder: EmojiHoarder
var body: some View {
NavigationStack {
List {
Section {
VStack(alignment: .leading) {
Image(systemName: "app.dashed")
.resizable().scaledToFit()
.frame(width: 100, height: 100)
.clipShape(RoundedRectangle(cornerRadius: 24))
.foregroundStyle(.purple)
.shadow(color: .purple, radius: 5)
Text("StickerSlack")
.font(.title)
.monospaced()
.bold()
}
}
Section {
Text("")
}
Section("Debug") {
NavigationLink {
TrieTestingView()
} label: {
Label("Tree", systemImage: "tree")
}
}
// Section(content: <#T##() -> View#>, header: <#T##() -> View#>, footer: <#T##() -> View#>)
}
}
}
}
#Preview {
SettingsView(hoarder: EmojiHoarder(localOnly: true, skipIndex: true))
}