11// MIT license. Copyright (c) 2023 TriangleDraw. All rights reserved.
22import SwiftUI
33import TriangleDrawLibrary
4+ import TTProgressHUD
5+
6+ enum ShareData {
7+ case none
8+ case exportPNG( image: UIImage , filename: String ? )
9+ }
410
511struct HCMenuView : View {
612 @ObservedObject var model : HCMenuViewModel
713 @Environment ( \. dismiss) var dismiss
814 @State private var gridMode : CanvasGridMode
915 @State private var symmetryMode : SymmetryMode
16+ @State private var hudVisible = false
17+ @State private var hudConfig = TTProgressHUDConfig ( title: " Exporting " )
18+ @State private var isSharePresented : Bool = false
19+ @State private var shareData : ShareData = . none
1020
1121 init ( model: HCMenuViewModel ) {
1222 self . model = model
1323 self . _gridMode = State ( initialValue: model. initialGridMode)
1424 self . _symmetryMode = State ( initialValue: model. initialSymmetryMode)
1525 }
1626
27+ var exportPNGButton : some View {
28+ Button ( " Bitmap PNG " ) {
29+ hudVisible = true
30+ model. exportToPNG ( ) { status in
31+ switch status {
32+ case let HCMenuViewModel . ExportPNGStatus . ok( image, filename) :
33+ hudVisible = false
34+ self . shareData = ShareData . exportPNG ( image: image, filename: filename)
35+ self . isSharePresented = true
36+ case HCMenuViewModel . ExportPNGStatus . progress( let progress) :
37+ log. debug ( " progress: \( progress) " )
38+ case HCMenuViewModel . ExportPNGStatus . error( let message) :
39+ log. error ( " Unable to export to PNG. \( message) " )
40+ hudVisible = false
41+ }
42+ }
43+ }
44+ }
45+
1746 var emailDeveloperButton : some View {
1847 #if os(iOS)
1948 let view = MailButtonView (
@@ -25,7 +54,7 @@ struct HCMenuView: View {
2554 #endif
2655 }
2756
28- var body : some View {
57+ var navigationStack : some View {
2958 NavigationStack {
3059 Form {
3160 Section ( header: Text ( " Grid system " ) ) {
@@ -51,7 +80,7 @@ struct HCMenuView: View {
5180 }
5281 }
5382 Section ( header: Text ( " Export " ) ) {
54- Button ( " Bitmap PNG " ) { }
83+ exportPNGButton
5584 Button ( " Vector PDF " ) { }
5685 Button ( " Vector SVG " ) { }
5786 }
@@ -70,6 +99,37 @@ struct HCMenuView: View {
7099 }
71100 } . navigationViewStyle ( . stack)
72101 }
102+
103+ var body : some View {
104+ ZStack ( alignment: . top) {
105+ navigationStack
106+ TTProgressHUD ( $hudVisible, config: hudConfig)
107+ }
108+ . sheet ( isPresented: $isSharePresented, onDismiss: {
109+ log. debug ( " dismiss ActivityViewController " )
110+ shareData = . none
111+ } , content: {
112+ ActivityViewController ( shareData: $shareData)
113+ } )
114+ }
115+ }
116+
117+ struct ActivityViewController : UIViewControllerRepresentable {
118+ @Binding var shareData : ShareData
119+
120+ func makeUIViewController( context: UIViewControllerRepresentableContext < ActivityViewController > ) -> UIActivityViewController {
121+ switch shareData {
122+ case . none:
123+ log. debug ( " share: none " )
124+ let activityItems = [ URL ( string: " http://www.triangledraw.com/ " ) !]
125+ return UIActivityViewController ( activityItems: activityItems, applicationActivities: nil )
126+ case let . exportPNG( image, filename) :
127+ log. debug ( " share: png " )
128+ return HCMenuViewController . createSharePNGActivityViewController ( image: image, filename: filename, triangleCount: 0 )
129+ }
130+ }
131+
132+ func updateUIViewController( _ uiViewController: UIActivityViewController , context: UIViewControllerRepresentableContext < ActivityViewController > ) { }
73133}
74134
75135struct HCMenuView_Previews : PreviewProvider {
0 commit comments