diff --git a/kplayer/photo/SPhotoModel.swift b/kplayer/photo/SPhotoModel.swift index add8129..f0987ff 100644 --- a/kplayer/photo/SPhotoModel.swift +++ b/kplayer/photo/SPhotoModel.swift @@ -7,9 +7,11 @@ import Foundation class SPhotoModel : ObservableObject { @Published var allItems : [MediaItem] + @Published var selectedItem : MediaItem @Published var index = 0 init(allItems: [MediaItem]) { self.allItems = allItems + selectedItem = allItems[0] } } diff --git a/kplayer/photo/SPhotoView.swift b/kplayer/photo/SPhotoView.swift index 1555364..5d4e0d9 100644 --- a/kplayer/photo/SPhotoView.swift +++ b/kplayer/photo/SPhotoView.swift @@ -8,7 +8,12 @@ import SwiftUI struct SPhotoView : View { var completionHandler: ((Bool) -> Void)? + @ObservedObject var model: SPhotoModel + @State + var update = false + @State var scale: CGFloat = 1.0 + @State var lastScaleValue: CGFloat = 1.0 var body: some View { VStack { @@ -18,22 +23,45 @@ struct SPhotoView : View { completionHandler!(true) }, label: { Text("cancel") - }) + }).foregroundColor(update ? Color.yellow : Color.blue) .buttonStyle(BorderlessButtonStyle()) + Spacer() } }.frame(height: 50) - AsyncImage(item: model.allItems[model.index], thumb: false, placeholder: { Text("Loading ...") }, - image: { Image(uiImage: $0).resizable() }) + // AsyncImage(item: model.selectedItem, thumb: false, placeholder: { Text("Loading ...") }, image: { Image(uiImage: $0).resizable() }) + SwiftUI.AsyncImage(url: URL(string: model.selectedItem.imageUrlAbsolute)){ image in + image //.resizable();//.scaledToFit() + } + placeholder: { + if let i = model.selectedItem.thumbImage { + Image(uiImage: i) + } + else { + ProgressView() + } + }.scaleEffect(scale) + .gesture(MagnificationGesture() + .onChanged { val in + let delta = val / self.lastScaleValue + self.lastScaleValue = val + scale = self.scale * delta + +//... anything else e.g. clamping the newScale + }.onEnded { val in + // without this the next gesture will be broken + self.lastScaleValue = 1.0 + }) + .contentShape(Rectangle()).clipped(); ScrollView(.horizontal, showsIndicators: false) { HStack { ForEach(model.allItems) { item in Button(action: { gotoSnapshot(item) - }) { + }, label: { AsyncImage(item: item, placeholder: { Text("Loading ...") }, image: { Image(uiImage: $0).resizable() }) - } + }).buttonStyle(BorderlessButtonStyle()) }.frame(height: 70) } } @@ -41,6 +69,9 @@ struct SPhotoView : View { } func gotoSnapshot(_ item: MediaItem) { + model.selectedItem = item + update.toggle() + print("select \(model.selectedItem.imageUrlAbsolute)") } } diff --git a/kplayer/util/AsyncImage.swift b/kplayer/util/AsyncImage.swift index 3c6ab6d..32d7659 100644 --- a/kplayer/util/AsyncImage.swift +++ b/kplayer/util/AsyncImage.swift @@ -1,6 +1,7 @@ import SwiftUI import Haneke import Alamofire +//import AlamofireImage struct AsyncImage: View { @StateObject private var item: MediaItem @@ -41,12 +42,13 @@ struct AsyncImage: View { } func setImage(newItem: MediaItem) { - if newItem.thumbImage != nil { + if thumb && newItem.thumbImage != nil { return } if newItem.image != nil { newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0) + newItem.image = nil } else { if newItem.thumbUrl != nil { let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)! @@ -54,21 +56,10 @@ struct AsyncImage: View { Shared.imageCache.fetch(URL: URL).onSuccess { i in - newItem.image = i - newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0) + //newItem.image = i + newItem.thumbImage = i.scaleToSize(66.0, height: 44.0) } } } - - if !thumb { - let URL = Foundation.URL(string: newItem.imageUrlAbsolute)! - - Shared.imageCache.fetch(URL: URL).onSuccess { - i in - - newItem.image = i - newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0) - } - } } } diff --git a/kplayer/util/ImageLoadOperation.swift b/kplayer/util/ImageLoadOperation.swift index af61750..ec32483 100644 --- a/kplayer/util/ImageLoadOperation.swift +++ b/kplayer/util/ImageLoadOperation.swift @@ -39,22 +39,22 @@ public class ImageLoadOperation: Operation { return } if let img = UIImage(data: data, scale: 1) { - if imageURL.isFileURL { + // if imageURL.isFileURL { DispatchQueue.main.async { self.succeeder(img) } return - } - if let decodedImg = img.decodeImage() { - if self.isCancelled { - // print("Decoding 2 cancelled") - return - } - DispatchQueue.main.async { - print("lazy fetch image decoded") - self.succeeder(decodedImg) - } - } +// } +// if let decodedImg = img.decodeImage() { +// if self.isCancelled { +// // print("Decoding 2 cancelled") +// return +// } +// DispatchQueue.main.async { +// print("lazy fetch image decoded") +// self.succeeder(decodedImg) +// } +// } } } }