Skip to content
Snippets Groups Projects
Commit d6fd49cb authored by cruxfilm's avatar cruxfilm
Browse files

Merge branch 'dev'

parents b045b08b 5dd39db5
Branches
No related tags found
1 merge request!81Resolve "Add Pull to Refresh to MailListView" & Redesign ContactView
...@@ -66,7 +66,7 @@ struct ReadMainView <M: DisplayMail>: View { ...@@ -66,7 +66,7 @@ struct ReadMainView <M: DisplayMail>: View {
tab: ReadPart.Attachments.value, tab: ReadPart.Attachments.value,
image: Image(systemName: "rectangle.and.paperclip"), image: Image(systemName: "rectangle.and.paperclip"),
description: "Tab.Label.Attachments", description: "Tab.Label.Attachments",
content: AnyView(AttachmentsViewMain(attachments: model.mail.displayAttachments, dlAll: true)) content: AnyView(AttachmentsViewMain(attachments: model.mail.displayAttachments, downloadAll: true))
) )
] ]
} }
......
...@@ -15,29 +15,40 @@ ...@@ -15,29 +15,40 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
/// a file that preview the attachments of incoming mails
// currently this view only previews a ProxyAttachment
import SwiftUI import SwiftUI
struct AttachmentsViewMain: View { struct AttachmentsViewMain: View {
// TODO: Refactor to model? // TODO: Refactor to model?
//a list that contains all the attachment files
@State var attachments: [DisplayAttachment] @State var attachments: [DisplayAttachment]
// Whether the Download all button was clicked // Whether the Download all button was clicked
@State var dlAll = true; @State var downloadAll = true;
var body: some View { var body: some View {
VStack{ VStack{
Spacer() Spacer()
// TODO: Add link section // TODO: Add link section
// check if there even are attachments to be displayed // default view if there are no attachments to be displayed
if attachments.count == 0{ if attachments.count == 0{
noAttachments noAttachments
} }
// otherwise preview the attachments
else { else {
attachmentsView attachmentsView
} }
} }
} }
/// default view if there are no attachments to be displayed
var noAttachments: some View {
return Text(NSLocalizedString("ReadView.Attachments.No", comment: "")).font(.footnote).padding(30)
}
/// a view that previews all the attachment files
var attachmentsView: some View { var attachmentsView: some View {
return VStack(alignment: .leading, spacing: 5){ return VStack(alignment: .leading, spacing: 5){
// headline // headline
...@@ -54,7 +65,7 @@ struct AttachmentsViewMain: View { ...@@ -54,7 +65,7 @@ struct AttachmentsViewMain: View {
ForEach(0..<attachments.count) { i in ForEach(0..<attachments.count) { i in
AttPrev( AttPrev(
attachment: self.attachments[i], attachment: self.attachments[i],
preload: self.dlAll shouldBeDownloaded: self.downloadAll
) )
} }
} }
...@@ -63,34 +74,39 @@ struct AttachmentsViewMain: View { ...@@ -63,34 +74,39 @@ struct AttachmentsViewMain: View {
.padding(.top, 30) .padding(.top, 30)
.padding(.bottom,10) .padding(.bottom,10)
} }
var noAttachments: some View {
return Text(NSLocalizedString("ReadView.Attachments.No", comment: "")).font(.footnote).padding(30)
}
} }
struct AttachmentsViewMain_Previews: PreviewProvider { struct AttachmentsViewMain_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
// here we call the view with a single ProxyAttachment() for
// demonstration purposes
AttachmentsViewMain(attachments: [ProxyAttachment()]) AttachmentsViewMain(attachments: [ProxyAttachment()])
} }
} }
// MARK: one AttachmentPreview /// a view that previews one attachment file
struct AttPrev:View{ struct AttPrev:View{
// the attachment that is going to be previewed
var attachment: DisplayAttachment var attachment: DisplayAttachment
var preload = false // by default false
var shouldBeDownloaded = false
// whether this attachment is already downloaded to the documents directory
@State var isDownloaded: Bool = false @State var isDownloaded: Bool = false
// used togehter with 'open' button to
// open a fullScreenView of a file
@State var isFullScreen: Bool = false @State var isFullScreen: Bool = false
func download(){ /// a func to find the documents directory
func getDocumentsDirectory() -> URL { func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0] return paths[0]
} }
/// a func that downloads the attachment into the documents directory
func download() {
let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName) let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName)
do { do {
...@@ -101,123 +117,167 @@ struct AttPrev:View{ ...@@ -101,123 +117,167 @@ struct AttPrev:View{
self.isDownloaded = true self.isDownloaded = true
} }
//is the file already downloaded? /// a func that checks if an attachment is downloaded into the documents directory or not
/// updates the 'isDownloaded' property accordingly
func getDownloadedState(){ func getDownloadedState(){
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName) let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName)
if FileManager.default.fileExists(atPath: filename.path){self.isDownloaded = true} if FileManager.default.fileExists(atPath: filename.path){self.isDownloaded = true}
} }
var body: some View{ var body: some View{
if preload {self.download()} if shouldBeDownloaded {
self.download()
}
//this QuickLookView has to be defined here so it reloads on every state-change // QuickLookView creates the preview of the file
// it has to be defined here to update correctly
let QLV = QuickLookView(name: self.attachment.myName, data: self.attachment.myData, shallDL: self.isDownloaded) let QLV = QuickLookView(name: self.attachment.myName, data: self.attachment.myData, shallDL: self.isDownloaded)
return VStack{ return VStack{
Group{ Group{
CardV(title: self.attachment.myName, CardV(title: self.attachment.myName,
//those are the actions visable under the cklicked preview // these buttons are visable under the preview
actions: self.isDownloaded||self.preload ? // when users click on the preview
actions: self.isDownloaded||self.shouldBeDownloaded ?
// different combination of buttons
// according to downloading status
[ [
/* // anyViewDeleteButton
self.ActionView(NSLocalizedString("delete", comment: ""), anyViewOpenButton,
icon: AnyView(Image(systemName: "trash")), anyViewShareButton
onClick: {
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.name!)
do {
try FileManager.default.removeItem(at: filename)
} catch let error as NSError {
print("Error: \(error)")
}
self.isDownloaded = false
}
), */
self.ActionView(NSLocalizedString("open", comment: ""),
icon: AnyView(Image(systemName: "arrow.up.and.down").rotationEffect(.degrees(45))),
onClick: {self.isFullScreen.toggle()}
),
AnyView(VStack{
shareButton
Text(NSLocalizedString("share", comment: "")).font(.system(size: 12)).foregroundColor(.blue)
})
] ]
: :
[ [
self.ActionView(NSLocalizedString("download", comment: ""), anyViewDownloadButton,
icon: AnyView(Image(systemName: "arrow.down.circle")), // both lists need same length
onClick: { // to make appearance the same
self.download()
}
),
//odd but both lists need same length
AnyView(EmptyView()), AnyView(EmptyView()),
AnyView(EmptyView()) AnyView(EmptyView())
] ]
){ ){
QLV/*TODO: QLV/*TODO:
.allowsHitTesting(false).disabled(true)*/ //this should make the whole view scrollable averywhere not just on the title .allowsHitTesting(false).disabled(true)*/ //this should make the whole view scrollable averywhere not just on the title
} }
} }
// preview should resemble the look of A4 format
.aspectRatio(100/141, contentMode: .fit)
.frame(width: UIScreen.main.bounds.width*2/3)//, maxHeight: 500) .frame(width: UIScreen.main.bounds.width*2/3)//, maxHeight: 500)
//an invisable NavigationLink to open the preview in fullscreen //a hidden NavigationLink to open the preview in fullscreen
NavigationLink(destination: QuickLookView(name: self.attachment.myName, data: self.attachment.myData) // seems not to work currently
.navigationBarItems(trailing: shareButton), isActive: self.$isFullScreen){Text("loi")}.hidden() NavigationLink(
destination: QuickLookView(name: self.attachment.myName, data: self.attachment.myData)
} .navigationBarItems(trailing: anyViewShareButton), isActive: self.$isFullScreen) {Text("loi")}.hidden()}
.onAppear(perform: { .onAppear(
perform: {
self.getDownloadedState() self.getDownloadedState()
//download all functionality //download all functionality
if self.preload {self.isDownloaded=true; self.download()} if self.shouldBeDownloaded {self.isDownloaded=true; self.download()}
})
.onDisappear(perform: {
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
} }
)
// remove file from documents directory
.onDisappear(
perform: {
let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName) let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName)
do { do {
try FileManager.default.removeItem(at: filename) try FileManager.default.removeItem(at: filename)
} catch let error as NSError {
print("Error: \(error)")
} }
catch let error as NSError {print("Error: \(error)")}
self.isDownloaded = false self.isDownloaded = false
print("======== Attachment DISAPPEAR -> REMOVE FILES ========") print("======== Attachment DISAPPEAR -> REMOVE FILES ========")
}) }
)
}
// an open button converted into an AnyView
// should open the view fullscreen
var anyViewOpenButton: AnyView {
AnyView(
Button (
action: {
self.isFullScreen.toggle()
},
label: {
VStack {
Image(systemName: "arrow.up.and.down")
.rotationEffect(.degrees(45))
Text("open").font(.system(size: 12))
}
}
)
)
} }
var shareButton: some View { // a share button converted into an AnyView
return Button(action:{ var anyViewShareButton: AnyView {
//popover the standart apple sharing stuff AnyView(
Button (
action: {
// TODO
//popover the standard apple sharing stuff
/* if let coord = AppDelegate.getAppDelegate().readViewCoordinator { /* if let coord = AppDelegate.getAppDelegate().readViewCoordinator {
coord.shareData(self.attachment.myData as NSData) coord.shareData(self.attachment.myData as NSData)
}*/ }*/
}){ },
label: {
VStack {
Image(systemName: "square.and.arrow.up") Image(systemName: "square.and.arrow.up")
Text("share").font(.system(size: 12))
}
}
)
)
}
// a delete button converted into an AnyView
var anyViewDeleteButton: AnyView {
AnyView(
Button (
action: {
// TODO
/*
let filename = getDocumentsDirectory().appendingPathComponent(self.attachment.myName)
do {
try FileManager.default.removeItem(at: filename)
} catch let error as NSError {
print("Error: \(error)")
}
self.isDownloaded = false
*/
},
label: {
VStack {
Image(systemName: "trash")
Text("delete")
.font(.system(size: 12))
} }
} }
)
)
}
//each of those buttons under the card // a download button converted into an AnyView
func ActionView( _ text:String,icon: AnyView, onClick:@escaping ()->Void={})-> AnyView{ // dowloads the file into the documents directory
return AnyView(Button( var anyViewDownloadButton: AnyView {
action: onClick AnyView(
){VStack{ Button (
icon action: {
Text(text).font(.system(size: 12)) self.download()
}}) },
label: {
VStack {
Image(systemName: "arrow.down.circle")
Text("download")
.font(.system(size: 12))
} }
} }
)
)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment