Эх сурвалжийг харах

moved galleryItem in separate file - implemented update

nayooti 4 жил өмнө
parent
commit
fc2bda876f

+ 4 - 0
deltachat-ios.xcodeproj/project.pbxproj

@@ -164,6 +164,7 @@
 		AE38B31822672DFC00EC37A1 /* ActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE38B31722672DFC00EC37A1 /* ActionCell.swift */; };
 		AE38B31822672DFC00EC37A1 /* ActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE38B31722672DFC00EC37A1 /* ActionCell.swift */; };
 		AE39D323249CFC1A007346A1 /* DocumentGalleryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */; };
 		AE39D323249CFC1A007346A1 /* DocumentGalleryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */; };
 		AE4AEE3522B1030D000AA495 /* PreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4AEE3422B1030D000AA495 /* PreviewController.swift */; };
 		AE4AEE3522B1030D000AA495 /* PreviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4AEE3422B1030D000AA495 /* PreviewController.swift */; };
+		AE4FADA32538CD5D00C81DD9 /* GalleryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4FADA22538CD5C00C81DD9 /* GalleryItem.swift */; };
 		AE52EA19229EB53C00C586C9 /* ContactDetailHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE52EA18229EB53C00C586C9 /* ContactDetailHeader.swift */; };
 		AE52EA19229EB53C00C586C9 /* ContactDetailHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE52EA18229EB53C00C586C9 /* ContactDetailHeader.swift */; };
 		AE52EA20229EB9F000C586C9 /* EditGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE52EA1F229EB9F000C586C9 /* EditGroupViewController.swift */; };
 		AE52EA20229EB9F000C586C9 /* EditGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE52EA1F229EB9F000C586C9 /* EditGroupViewController.swift */; };
 		AE6EC5242497663200A400E4 /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE6EC5232497663200A400E4 /* UIImageView+Extensions.swift */; };
 		AE6EC5242497663200A400E4 /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE6EC5232497663200A400E4 /* UIImageView+Extensions.swift */; };
@@ -468,6 +469,7 @@
 		AE38B31722672DFC00EC37A1 /* ActionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionCell.swift; sourceTree = "<group>"; };
 		AE38B31722672DFC00EC37A1 /* ActionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionCell.swift; sourceTree = "<group>"; };
 		AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentGalleryController.swift; sourceTree = "<group>"; };
 		AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentGalleryController.swift; sourceTree = "<group>"; };
 		AE4AEE3422B1030D000AA495 /* PreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewController.swift; sourceTree = "<group>"; };
 		AE4AEE3422B1030D000AA495 /* PreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewController.swift; sourceTree = "<group>"; };
+		AE4FADA22538CD5C00C81DD9 /* GalleryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryItem.swift; sourceTree = "<group>"; };
 		AE52EA18229EB53C00C586C9 /* ContactDetailHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactDetailHeader.swift; sourceTree = "<group>"; };
 		AE52EA18229EB53C00C586C9 /* ContactDetailHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactDetailHeader.swift; sourceTree = "<group>"; };
 		AE52EA1F229EB9F000C586C9 /* EditGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditGroupViewController.swift; sourceTree = "<group>"; };
 		AE52EA1F229EB9F000C586C9 /* EditGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditGroupViewController.swift; sourceTree = "<group>"; };
 		AE6EC5232497663200A400E4 /* UIImageView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Extensions.swift"; sourceTree = "<group>"; };
 		AE6EC5232497663200A400E4 /* UIImageView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Extensions.swift"; sourceTree = "<group>"; };
@@ -711,6 +713,7 @@
 				305961A92346125100C80F33 /* AvatarPosition.swift */,
 				305961A92346125100C80F33 /* AvatarPosition.swift */,
 				305961AA2346125100C80F33 /* HorizontalEdgeInsets.swift */,
 				305961AA2346125100C80F33 /* HorizontalEdgeInsets.swift */,
 				305961AB2346125100C80F33 /* NSConstraintLayoutSet.swift */,
 				305961AB2346125100C80F33 /* NSConstraintLayoutSet.swift */,
+				AE4FADA22538CD5C00C81DD9 /* GalleryItem.swift */,
 			);
 			);
 			path = Models;
 			path = Models;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1593,6 +1596,7 @@
 				AE851AD0227DF50900ED86F0 /* GroupChatDetailViewController.swift in Sources */,
 				AE851AD0227DF50900ED86F0 /* GroupChatDetailViewController.swift in Sources */,
 				30FDB72124D838240066C48D /* BaseMessageCell.swift in Sources */,
 				30FDB72124D838240066C48D /* BaseMessageCell.swift in Sources */,
 				305961D12346125100C80F33 /* Bundle+Extensions.swift in Sources */,
 				305961D12346125100C80F33 /* Bundle+Extensions.swift in Sources */,
+				AE4FADA32538CD5D00C81DD9 /* GalleryItem.swift in Sources */,
 				305962002346125100C80F33 /* MessagesCollectionView.swift in Sources */,
 				305962002346125100C80F33 /* MessagesCollectionView.swift in Sources */,
 				7A451DB01FB1F84900177250 /* AppCoordinator.swift in Sources */,
 				7A451DB01FB1F84900177250 /* AppCoordinator.swift in Sources */,
 				AE38B31822672DFC00EC37A1 /* ActionCell.swift in Sources */,
 				AE38B31822672DFC00EC37A1 /* ActionCell.swift in Sources */,

+ 41 - 133
deltachat-ios/Controller/GalleryViewController.swift

@@ -1,12 +1,12 @@
 import UIKit
 import UIKit
 import DcCore
 import DcCore
-import SDWebImage
+
 
 
 class GalleryViewController: UIViewController {
 class GalleryViewController: UIViewController {
 
 
     private let dcContext: DcContext
     private let dcContext: DcContext
     // MARK: - data
     // MARK: - data
-    private let mediaMessageIds: [Int]
+    private var mediaMessageIds: [Int]
     private var items: [Int: GalleryItem] = [:]
     private var items: [Int: GalleryItem] = [:]
 
 
     // MARK: - subview specs
     // MARK: - subview specs
@@ -106,6 +106,12 @@ class GalleryViewController: UIViewController {
             timeLabel.update(date: msg.sentDate)
             timeLabel.update(date: msg.sentDate)
         }
         }
     }
     }
+
+    private func deleteItem(at index: IndexPath) {
+        let msgId = mediaMessageIds.remove(at: index.row)
+        self.dcContext.deleteMessage(msgId: msgId)
+        self.grid.deleteItems(at: [index])
+    }
 }
 }
 
 
 extension GalleryViewController: UICollectionViewDataSourcePrefetching {
 extension GalleryViewController: UICollectionViewDataSourcePrefetching {
@@ -144,10 +150,6 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
             items[indexPath.row] = galleryItem
             items[indexPath.row] = galleryItem
             item = galleryItem
             item = galleryItem
         }
         }
-        if #available(iOS 13, *) {
-            let interaction = UIContextMenuInteraction(delegate: self)
-            galleryCell.addInteraction(interaction)
-        }
         galleryCell.update(item: item)
         galleryCell.update(item: item)
         return galleryCell
         return galleryCell
     }
     }
@@ -170,6 +172,39 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
     func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
     func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
         timeLabel.hide(animated: true)
         timeLabel.hide(animated: true)
     }
     }
+
+    @available(iOS 13, *)
+    func collectionView(_ collectionView: UICollectionView,
+                        contextMenuConfigurationForItemAt indexPath: IndexPath,
+                        point: CGPoint) -> UIContextMenuConfiguration? {
+        guard let galleryCell = collectionView.cellForItem(at: indexPath) as? GalleryCell, let item = galleryCell.item else {
+            return nil
+        }
+
+        return UIContextMenuConfiguration(
+            identifier: nil,
+            previewProvider: nil,
+            actionProvider: { [weak self] _ in
+                return self?.makeContextMenu(indexPath: indexPath)
+            }
+        )
+    }
+
+    @available(iOS 13, *)
+    private func makeContextMenu(indexPath: IndexPath) -> UIMenu {
+        let deleteAction = UIAction(
+            title: String.localized("delete"),
+            image: UIImage(systemName: "trash")) { _ in
+            self.deleteItem(at: indexPath)
+        }
+
+        return UIMenu(
+            title: "",
+            image: nil,
+            identifier: nil,
+            children: [deleteAction]
+        )
+    }
 }
 }
 
 
 // MARK: - grid layout + updates
 // MARK: - grid layout + updates
@@ -224,130 +259,3 @@ extension GalleryViewController {
         present(previewController, animated: true, completion: nil)
         present(previewController, animated: true, completion: nil)
     }
     }
 }
 }
-
-class GalleryItem {
-
-    var onImageLoaded: ((UIImage?) -> Void)?
-
-    var msg: DcMsg
-
-    var fileUrl: URL? {
-        return msg.fileURL
-    }
-
-    var thumbnailImage: UIImage? {
-        willSet {
-           onImageLoaded?(newValue)
-        }
-    }
-
-    var showPlayButton: Bool {
-        switch msg.viewtype {
-        case .video:
-            return true
-        default:
-            return false
-        }
-    }
-
-    init(msgId: Int) {
-        self.msg = DcMsg(id: msgId)
-
-        if let key = msg.fileURL?.absoluteString, let image = ThumbnailCache.shared.restoreImage(key: key) {
-            self.thumbnailImage = image
-        } else {
-            loadThumbnail()
-        }
-    }
-
-    private func loadThumbnail() {
-        guard let viewtype = msg.viewtype, let url = msg.fileURL else {
-            return
-        }
-        switch viewtype {
-        case .image:
-            thumbnailImage = msg.image
-        case .video:
-            loadVideoThumbnail(from: url)
-        case .gif:
-            loadGifThumbnail(from: url)
-        default:
-           safe_fatalError("unsupported viewtype - viewtype \(viewtype) not supported.")
-        }
-    }
-
-    private func loadGifThumbnail(from url: URL) {
-        DispatchQueue.global(qos: .userInteractive).async {
-            guard let imageData = try? Data(contentsOf: url) else {
-                return
-            }
-            let thumbnailImage = SDAnimatedImage(data: imageData)
-            DispatchQueue.main.async { [weak self] in
-                self?.thumbnailImage = thumbnailImage
-            }
-        }
-    }
-
-    private func loadVideoThumbnail(from url: URL) {
-        DispatchQueue.global(qos: .userInteractive).async {
-            let thumbnailImage = DcUtils.generateThumbnailFromVideo(url: url)
-            DispatchQueue.main.async { [weak self] in
-                self?.thumbnailImage = thumbnailImage
-                if let image = thumbnailImage {
-                    ThumbnailCache.shared.storeImage(image: image, key: url.absoluteString)
-                }
-            }
-        }
-    }
-}
-
-// MARK: UIContextMenuInteractionDelegate
-@available(iOS 13, *)
-extension GalleryViewController: UIContextMenuInteractionDelegate {
-    func contextMenuInteraction(
-        _ interaction: UIContextMenuInteraction,
-        configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
-
-        guard let galleryCell = interaction.view as? GalleryCell, let galleryItem = galleryCell.item else {
-            return nil
-        }
-
-        return UIContextMenuConfiguration(
-            identifier: nil,
-            previewProvider: nil,
-            actionProvider: { [weak self] _ in
-                return self?.makeContextMenu(item: galleryItem)
-            }
-        )
-    }
-
-    private func makeContextMenu(item: GalleryItem) -> UIMenu {
-        let deleteAction = UIAction(
-            title: String.localized("delete"),
-            image: nil) { _ in
-            self.dcContext.deleteMessage(msgId: item.msg.id)
-            self.grid.reloadData()
-        }
-
-        return UIMenu(
-            title: "",
-            image: nil,
-            identifier: nil,
-            children: [deleteAction]
-        )
-    }
-
-}
-
-/*
-
- // MARK: - Context menu
- private func prepareContextMenu() {
- UIMenuController.shared.menuItems = [
- UIMenuItem(title: String.localized("info"), action: #selector(BaseMessageCell.messageInfo)),
- UIMenuItem(title: String.localized("delete"), action: #selector(BaseMessageCell.messageDelete)),
- UIMenuItem(title: String.localized("forward"), action: #selector(BaseMessageCell.messageForward))
- ]
- UIMenuController.shared.update()
- }
- */

+ 79 - 0
deltachat-ios/MessageKit/Models/GalleryItem.swift

@@ -0,0 +1,79 @@
+import UIKit
+import DcCore
+import SDWebImage
+
+class GalleryItem {
+
+    var onImageLoaded: ((UIImage?) -> Void)?
+
+    var msg: DcMsg
+
+    var fileUrl: URL? {
+        return msg.fileURL
+    }
+
+    var thumbnailImage: UIImage? {
+        willSet {
+            onImageLoaded?(newValue)
+        }
+    }
+
+    var showPlayButton: Bool {
+        switch msg.viewtype {
+        case .video:
+            return true
+        default:
+            return false
+        }
+    }
+
+    init(msgId: Int) {
+        self.msg = DcMsg(id: msgId)
+
+        if let key = msg.fileURL?.absoluteString, let image = ThumbnailCache.shared.restoreImage(key: key) {
+            self.thumbnailImage = image
+        } else {
+            loadThumbnail()
+        }
+    }
+
+    private func loadThumbnail() {
+        guard let viewtype = msg.viewtype, let url = msg.fileURL else {
+            return
+        }
+        switch viewtype {
+        case .image:
+            thumbnailImage = msg.image
+        case .video:
+            loadVideoThumbnail(from: url)
+        case .gif:
+            loadGifThumbnail(from: url)
+        default:
+            safe_fatalError("unsupported viewtype - viewtype \(viewtype) not supported.")
+        }
+    }
+
+    private func loadGifThumbnail(from url: URL) {
+        DispatchQueue.global(qos: .userInteractive).async {
+            guard let imageData = try? Data(contentsOf: url) else {
+                return
+            }
+            let thumbnailImage = SDAnimatedImage(data: imageData)
+            DispatchQueue.main.async { [weak self] in
+                self?.thumbnailImage = thumbnailImage
+            }
+        }
+    }
+
+    private func loadVideoThumbnail(from url: URL) {
+        DispatchQueue.global(qos: .userInteractive).async {
+            let thumbnailImage = DcUtils.generateThumbnailFromVideo(url: url)
+            DispatchQueue.main.async { [weak self] in
+                self?.thumbnailImage = thumbnailImage
+                if let image = thumbnailImage {
+                    ThumbnailCache.shared.storeImage(image: image, key: url.absoluteString)
+                }
+            }
+        }
+    }
+}