Skip to content

Commit 64b0407

Browse files
committed
added context menu to History
1 parent 6b9fd07 commit 64b0407

File tree

5 files changed

+98
-26
lines changed

5 files changed

+98
-26
lines changed

QRCode-Generator/ViewModels/HistoryViewModel.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,34 @@ class HistoryViewModel: ObservableObject {
4747
}
4848

4949
let historyFromDisk = readHistory()
50-
50+
5151
if historyFromDisk.isEmpty {
5252
history = [content]
53-
} else if content != historyFromDisk[0] {
53+
} else if !NSSet(array: history).contains(content) {
5454
history = [content] + historyFromDisk
5555
}
5656

57-
let mutableArray = NSMutableArray(array: history)
57+
let mutableArray = NSMutableArray(array: withoutDuplicates(history))
5858

5959
do {
6060
try mutableArray.write(to: historyPath)
6161
} catch {
6262
print (error)
6363
}
6464
}
65+
66+
func withoutDuplicates<T>(_ array: [T]) -> [T] {
67+
let orderedSet: NSMutableOrderedSet = []
68+
var modifiedArray = [T]()
69+
70+
orderedSet.addObjects(from: array)
71+
72+
for i in 0...(orderedSet.count - 1) {
73+
modifiedArray.append(orderedSet[i] as! T)
74+
}
75+
76+
return modifiedArray
77+
}
6578

6679
func readHistory() -> [String] {
6780
guard let historyPath else {

QRCode-Generator/Views/HistoryView.swift

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct HistoryView: View {
1717
VStack(alignment: .trailing) {
1818
Button(action: {
1919
(NSApplication.shared.delegate as? AppDelegate)?.qrCodeViewModel.shouldUpdateURL.toggle()
20-
20+
2121
showingHistory = false
2222
}, label: {
2323
Image(systemName: ImageConstants.close)
@@ -28,7 +28,7 @@ struct HistoryView: View {
2828

2929
List() {
3030
ForEach(historyViewModel.history, id: \.self) { entry in
31-
VStack {
31+
let vStack = VStack {
3232
HStack {
3333
Text(entry)
3434

@@ -48,23 +48,15 @@ struct HistoryView: View {
4848
}
4949
})
5050

51-
Button(role: .destructive, action: {
52-
withAnimation {
53-
if let selectionIndex = historyViewModel.history.firstIndex(of: entry) {
54-
historyViewModel.delete(selectionIndex)
55-
}
56-
}
57-
}, label: {
58-
Image(systemName: ImageConstants.trash)
59-
})
51+
getDeleteButton(entry: entry)
6052
}
6153

6254
if let currentPreviewURL,
6355
let qrCodeImage = QRCodeGenerator().getQRCodeImage(content: currentPreviewURL),
6456
currentPreviewURL == entry {
65-
57+
6658
Divider()
67-
59+
6860
Image(nsImage: qrCodeImage)
6961
.resizable()
7062
.interpolation(.none)
@@ -74,20 +66,65 @@ struct HistoryView: View {
7466

7567
return NSItemProvider(item: FileManager.getExportPath(currentPreviewURL) as NSSecureCoding, typeIdentifier: UTType.fileURL.identifier)
7668
}
77-
.contextMenu {
78-
Button {
79-
TemporaryQRCodeExporter().exportQRCodeImage(qrCodeImage, currentPreviewURL)
80-
81-
OpenPanelManager.showPanel(image: qrCodeImage, url: currentPreviewURL)
82-
} label: {
83-
Label("Save", systemImage: "square.and.arrow.down")
84-
}
85-
}
8669
}
8770
}
71+
72+
addContextMenu(view: vStack, isNeeded: currentPreviewURL == entry)
8873
}
8974
}
75+
.scrollIndicators(.never)
76+
}
77+
.frame(width: 400, height: 400)
78+
}
79+
80+
@ViewBuilder
81+
func addContextMenu(view: some View, isNeeded: Bool) -> some View {
82+
if isNeeded {
83+
view.background {
84+
Color.clear
85+
.contextMenu {
86+
saveButton
87+
copyImageButton
88+
}
89+
}
90+
} else {
91+
view
92+
}
93+
}
94+
95+
@ViewBuilder
96+
func getDeleteButton(entry: String) -> some View {
97+
Button(role: .destructive, action: {
98+
withAnimation {
99+
if let selectionIndex = historyViewModel.history.firstIndex(of: entry) {
100+
historyViewModel.delete(selectionIndex)
101+
}
102+
}
103+
}, label: {
104+
Image(systemName: ImageConstants.trash)
105+
})
106+
}
107+
108+
var saveButton: some View {
109+
Button {
110+
if let qrCodeImage = QRCodeGenerator().getQRCodeImage(content: currentPreviewURL ?? "") {
111+
OpenPanelManager.showPanel(image: qrCodeImage, url: currentPreviewURL ?? "")
112+
}
113+
} label: {
114+
Label("Save", systemImage: "")
115+
}
116+
}
117+
118+
var copyImageButton: some View {
119+
Button {
120+
// write the file to disk
121+
TemporaryQRCodeExporter().exportQRCodeWithString(currentPreviewURL ?? "")
122+
let fileUrl = FileManager.getExportPath(currentPreviewURL ?? "")
123+
let pasteboard = NSPasteboard.general
124+
pasteboard.clearContents()
125+
pasteboard.setData(Data(fileUrl.absoluteString.utf8), forType: .fileURL)
126+
} label: {
127+
Label("Copy image", systemImage: "")
90128
}
91-
.frame(width: 400, height: 600)
92129
}
93130
}

QRtist.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@
169169
dependencies = (
170170
);
171171
name = QRtist;
172+
packageProductDependencies = (
173+
);
172174
productName = "QRCode-Generator";
173175
productReference = ED42846A29C9CC4F00AD8DCA /* QRtist.app */;
174176
productType = "com.apple.product-type.application";
@@ -197,6 +199,8 @@
197199
Base,
198200
);
199201
mainGroup = ED42846129C9CC4F00AD8DCA;
202+
packageReferences = (
203+
);
200204
productRefGroup = ED42846B29C9CC4F00AD8DCA /* Products */;
201205
projectDirPath = "";
202206
projectRoot = "";
7.92 KB
Binary file not shown.

QRtist.xcodeproj/xcuserdata/ibrahimhassan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,22 @@
33
uuid = "8A44D2B0-8CE3-486B-804F-45C7262F7982"
44
type = "1"
55
version = "2.0">
6+
<Breakpoints>
7+
<BreakpointProxy
8+
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
9+
<BreakpointContent
10+
uuid = "BB7B777F-6069-4265-BC6F-71AD44F4F047"
11+
shouldBeEnabled = "Yes"
12+
ignoreCount = "0"
13+
continueAfterRunningActions = "No"
14+
filePath = "QRCode-Generator/ViewModels/QRCodeViewModel.swift"
15+
startingColumnNumber = "9223372036854775807"
16+
endingColumnNumber = "9223372036854775807"
17+
startingLineNumber = "37"
18+
endingLineNumber = "37"
19+
landmarkName = "getQRCodeImage(_:)"
20+
landmarkType = "7">
21+
</BreakpointContent>
22+
</BreakpointProxy>
23+
</Breakpoints>
624
</Bucket>

0 commit comments

Comments
 (0)