mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 05:19:13 +00:00
move listrow
compute letterstats once sort by in letterstats
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
A9104C802EB4022500D160EA /* MSSticker.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9104C7D2EB4022500D160EA /* MSSticker.swift */; };
|
A9104C802EB4022500D160EA /* MSSticker.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9104C7D2EB4022500D160EA /* MSSticker.swift */; };
|
||||||
A921C2DF2ED067BB00E57B1A /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */; };
|
A921C2DF2ED067BB00E57B1A /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */; };
|
||||||
A921C2E02ED067BB00E57B1A /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */; };
|
A921C2E02ED067BB00E57B1A /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */; };
|
||||||
|
A921C2E22ED071C900E57B1A /* ListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A921C2E12ED071C900E57B1A /* ListRow.swift */; };
|
||||||
|
A921C2E32ED071C900E57B1A /* ListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A921C2E12ED071C900E57B1A /* ListRow.swift */; };
|
||||||
A924C3732EA9127200F20781 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = A924C3712EA9127200F20781 /* Emoji.swift */; };
|
A924C3732EA9127200F20781 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = A924C3712EA9127200F20781 /* Emoji.swift */; };
|
||||||
A924C3782EA9225800F20781 /* Haptics in Frameworks */ = {isa = PBXBuildFile; productRef = A924C3772EA9225800F20781 /* Haptics */; };
|
A924C3782EA9225800F20781 /* Haptics in Frameworks */ = {isa = PBXBuildFile; productRef = A924C3772EA9225800F20781 /* Haptics */; };
|
||||||
A931D4082EBC9646007BC75B /* Haptics in Frameworks */ = {isa = PBXBuildFile; productRef = A931D4072EBC9646007BC75B /* Haptics */; };
|
A931D4082EBC9646007BC75B /* Haptics in Frameworks */ = {isa = PBXBuildFile; productRef = A931D4072EBC9646007BC75B /* Haptics */; };
|
||||||
@@ -110,6 +112,7 @@
|
|||||||
A9104C732EB3AE4700D160EA /* StickerSlack.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = StickerSlack.icon; sourceTree = "<group>"; };
|
A9104C732EB3AE4700D160EA /* StickerSlack.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = StickerSlack.icon; sourceTree = "<group>"; };
|
||||||
A9104C7D2EB4022500D160EA /* MSSticker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSSticker.swift; sourceTree = "<group>"; };
|
A9104C7D2EB4022500D160EA /* MSSticker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSSticker.swift; sourceTree = "<group>"; };
|
||||||
A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = "<group>"; };
|
A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = "<group>"; };
|
||||||
|
A921C2E12ED071C900E57B1A /* ListRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRow.swift; sourceTree = "<group>"; };
|
||||||
A924C3712EA9127200F20781 /* Emoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = "<group>"; };
|
A924C3712EA9127200F20781 /* Emoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = "<group>"; };
|
||||||
A924C3742EA9134C00F20781 /* StickerSlack.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StickerSlack.entitlements; sourceTree = "<group>"; };
|
A924C3742EA9134C00F20781 /* StickerSlack.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StickerSlack.entitlements; sourceTree = "<group>"; };
|
||||||
A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterCategory.swift; sourceTree = "<group>"; };
|
A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterCategory.swift; sourceTree = "<group>"; };
|
||||||
@@ -241,6 +244,7 @@
|
|||||||
A955B3F42EC22EE900E1732D /* SearchView.swift */,
|
A955B3F42EC22EE900E1732D /* SearchView.swift */,
|
||||||
A957C1732ECCE2CE00EA3EE9 /* SettingsView.swift */,
|
A957C1732ECCE2CE00EA3EE9 /* SettingsView.swift */,
|
||||||
A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */,
|
A921C2DE2ED067BB00E57B1A /* WelcomeView.swift */,
|
||||||
|
A921C2E12ED071C900E57B1A /* ListRow.swift */,
|
||||||
);
|
);
|
||||||
path = SwiftUI;
|
path = SwiftUI;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -503,6 +507,7 @@
|
|||||||
A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */,
|
A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */,
|
||||||
A9BBC5182EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
A9BBC5182EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
||||||
A9EB72492EB948C400658CEB /* EmojiRow.swift in Sources */,
|
A9EB72492EB948C400658CEB /* EmojiRow.swift in Sources */,
|
||||||
|
A921C2E22ED071C900E57B1A /* ListRow.swift in Sources */,
|
||||||
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */,
|
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -533,6 +538,7 @@
|
|||||||
A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */,
|
A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */,
|
||||||
A955B3F12EC22E9700E1732D /* BrowseView.swift in Sources */,
|
A955B3F12EC22E9700E1732D /* BrowseView.swift in Sources */,
|
||||||
A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */,
|
A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */,
|
||||||
|
A921C2E32ED071C900E57B1A /* ListRow.swift in Sources */,
|
||||||
A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */,
|
A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */,
|
||||||
A9EB724D2EB94A6B00658CEB /* TrieTestingView.swift in Sources */,
|
A9EB724D2EB94A6B00658CEB /* TrieTestingView.swift in Sources */,
|
||||||
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ class EmojiHoarder: ObservableObject {
|
|||||||
@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 = ""
|
||||||
|
|
||||||
@Published var letterStats: [EmojiHoarder.LetterStat] = []
|
@Published var letterStats: [EmojiHoarder.LetterStat] = []
|
||||||
|
@Published var letterStatsSorting: EmojiHoarder.LetterStatSorting = .init(by: .letter, ascending: true)
|
||||||
|
|
||||||
@Published var showWelcome: Bool = true
|
@Published var showWelcome: Bool = true
|
||||||
|
|
||||||
@@ -115,6 +117,7 @@ class EmojiHoarder: ObservableObject {
|
|||||||
}
|
}
|
||||||
buildTrieDict()
|
buildTrieDict()
|
||||||
saveTrie()
|
saveTrie()
|
||||||
|
generateLetterStats()
|
||||||
print("done building trie in", Date().timeIntervalSince1970-start)
|
print("done building trie in", Date().timeIntervalSince1970-start)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,20 +209,52 @@ class EmojiHoarder: ObservableObject {
|
|||||||
self.showWelcome = newValue
|
self.showWelcome = newValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateLetterStats() -> [EmojiHoarder.LetterStat] {
|
func generateLetterStats() {
|
||||||
var result: [EmojiHoarder.LetterStat] = []
|
var result: [EmojiHoarder.LetterStat] = []
|
||||||
for child in trie.root.children {
|
for child in trie.root.children {
|
||||||
let count = trie.collectWords(startingWith: child.key, from: child.value).count
|
let count = trie.collectWords(startingWith: child.key, from: child.value).count
|
||||||
let stat = LetterStat(char: child.key, count: count)
|
let stat = LetterStat(char: child.key, count: count)
|
||||||
result.append(stat)
|
result.append(stat)
|
||||||
}
|
}
|
||||||
return result
|
self.letterStats = result
|
||||||
|
sortLetterStats(by: self.letterStatsSorting)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortLetterStats(by: EmojiHoarder.LetterStatSorting) {
|
||||||
|
self.letterStatsSorting = by
|
||||||
|
let sortByLetter = letterStatsSorting.by == .letter
|
||||||
|
switch by.ascending {
|
||||||
|
case true:
|
||||||
|
letterStats.sort {
|
||||||
|
if sortByLetter {
|
||||||
|
$0.char > $1.char
|
||||||
|
} else {
|
||||||
|
$0.count > $1.count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case false:
|
||||||
|
letterStats.sort {
|
||||||
|
if sortByLetter {
|
||||||
|
$0.char > $1.char
|
||||||
|
} else {
|
||||||
|
$0.count < $1.count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LetterStat: Hashable {
|
struct LetterStat: Hashable {
|
||||||
var char: String
|
var char: String
|
||||||
var count: Int
|
var count: Int
|
||||||
}
|
}
|
||||||
|
enum SortLetterStatsBy: String, CaseIterable {
|
||||||
|
case letter = "Letter"
|
||||||
|
case count = "Count"
|
||||||
|
}
|
||||||
|
struct LetterStatSorting: Hashable, Equatable {
|
||||||
|
var by: EmojiHoarder.SortLetterStatsBy = .count
|
||||||
|
var ascending: Bool = true
|
||||||
|
}
|
||||||
|
|
||||||
// func filterEmojis(byCategory category: FilterCategory, searchTerm: String) {
|
// func filterEmojis(byCategory category: FilterCategory, searchTerm: String) {
|
||||||
// guard category != .none else {
|
// guard category != .none else {
|
||||||
|
|||||||
26
StickerSlack/SwiftUI/ListRow.swift
Normal file
26
StickerSlack/SwiftUI/ListRow.swift
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// ListRow.swift
|
||||||
|
// StickerSlack
|
||||||
|
//
|
||||||
|
// Created by neon443 on 21/11/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct ListRow: View {
|
||||||
|
@State var number: Int
|
||||||
|
@State var text: String
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack {
|
||||||
|
Text("\(number)")
|
||||||
|
.padding(.trailing, 10)
|
||||||
|
.foregroundStyle(.gray)
|
||||||
|
Text(text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
ListRow(number: 1, text: "hi!")
|
||||||
|
}
|
||||||
@@ -39,8 +39,29 @@ struct SettingsView: View {
|
|||||||
Text("\(hoarder.downloadedEmojis.count) downloaded Emoji")
|
Text("\(hoarder.downloadedEmojis.count) downloaded Emoji")
|
||||||
NavigationLink {
|
NavigationLink {
|
||||||
List {
|
List {
|
||||||
ForEach(hoarder.generateLetterStats(), id: \.self) { stat in
|
Picker(selection: $hoarder.letterStatsSorting.by) {
|
||||||
Text("\(stat.count) Emoji starting with \(stat.char)")
|
ForEach(EmojiHoarder.SortLetterStatsBy.allCases, id: \.self) { sortType in
|
||||||
|
Text(sortType.rawValue).tag(sortType)
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label("Sort by", systemImage: "arrow.up.arrow.down")
|
||||||
|
}
|
||||||
|
Picker(selection: $hoarder.letterStatsSorting.ascending) {
|
||||||
|
Text("Ascending").tag(true)
|
||||||
|
Text("Descending").tag(false)
|
||||||
|
} label: {
|
||||||
|
Label("Order", systemImage: "greaterthan")
|
||||||
|
}
|
||||||
|
.onChange(of: hoarder.letterStatsSorting) { _ in
|
||||||
|
hoarder.sortLetterStats(by: hoarder.letterStatsSorting)
|
||||||
|
}
|
||||||
|
|
||||||
|
ForEach(hoarder.letterStats, id: \.self) { stat in
|
||||||
|
HStack {
|
||||||
|
Text("\(stat.char)")
|
||||||
|
Spacer()
|
||||||
|
Text("\(stat.count)")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
|
|||||||
@@ -30,20 +30,6 @@ struct WelcomeView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ListRow: View {
|
|
||||||
@State var number: Int
|
|
||||||
@State var text: String
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
HStack {
|
|
||||||
Text("\(number)")
|
|
||||||
.padding(.trailing, 10)
|
|
||||||
.foregroundStyle(.gray)
|
|
||||||
Text(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
WelcomeView()
|
WelcomeView()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user