Browse Source

Photos

master
marcoschmickler 4 years ago
parent
commit
0db2a2e480
  1. 2
      kplayer/photo/SPhotoModel.swift
  2. 41
      kplayer/photo/SPhotoView.swift
  3. 19
      kplayer/util/AsyncImage.swift
  4. 24
      kplayer/util/ImageLoadOperation.swift

2
kplayer/photo/SPhotoModel.swift

@ -7,9 +7,11 @@ import Foundation
class SPhotoModel : ObservableObject { class SPhotoModel : ObservableObject {
@Published var allItems : [MediaItem] @Published var allItems : [MediaItem]
@Published var selectedItem : MediaItem
@Published var index = 0 @Published var index = 0
init(allItems: [MediaItem]) { init(allItems: [MediaItem]) {
self.allItems = allItems self.allItems = allItems
selectedItem = allItems[0]
} }
} }

41
kplayer/photo/SPhotoView.swift

@ -8,7 +8,12 @@ import SwiftUI
struct SPhotoView : View { struct SPhotoView : View {
var completionHandler: ((Bool) -> Void)? var completionHandler: ((Bool) -> Void)?
@ObservedObject
var model: SPhotoModel var model: SPhotoModel
@State
var update = false
@State var scale: CGFloat = 1.0
@State var lastScaleValue: CGFloat = 1.0
var body: some View { var body: some View {
VStack { VStack {
@ -18,22 +23,45 @@ struct SPhotoView : View {
completionHandler!(true) completionHandler!(true)
}, label: { }, label: {
Text("cancel") Text("cancel")
})
}).foregroundColor(update ? Color.yellow : Color.blue)
.buttonStyle(BorderlessButtonStyle()) .buttonStyle(BorderlessButtonStyle())
Spacer()
} }
}.frame(height: 50) }.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) { ScrollView(.horizontal, showsIndicators: false) {
HStack { HStack {
ForEach(model.allItems) { item in ForEach(model.allItems) { item in
Button(action: { Button(action: {
gotoSnapshot(item) gotoSnapshot(item)
}) {
}, label: {
AsyncImage(item: item, placeholder: { Text("Loading ...") }, AsyncImage(item: item, placeholder: { Text("Loading ...") },
image: { Image(uiImage: $0).resizable() }) image: { Image(uiImage: $0).resizable() })
}
}).buttonStyle(BorderlessButtonStyle())
}.frame(height: 70) }.frame(height: 70)
} }
} }
@ -41,6 +69,9 @@ struct SPhotoView : View {
} }
func gotoSnapshot(_ item: MediaItem) { func gotoSnapshot(_ item: MediaItem) {
model.selectedItem = item
update.toggle()
print("select \(model.selectedItem.imageUrlAbsolute)")
} }
} }

19
kplayer/util/AsyncImage.swift

@ -1,6 +1,7 @@
import SwiftUI import SwiftUI
import Haneke import Haneke
import Alamofire import Alamofire
//import AlamofireImage
struct AsyncImage<Placeholder: View>: View { struct AsyncImage<Placeholder: View>: View {
@StateObject private var item: MediaItem @StateObject private var item: MediaItem
@ -41,12 +42,13 @@ struct AsyncImage<Placeholder: View>: View {
} }
func setImage(newItem: MediaItem) { func setImage(newItem: MediaItem) {
if newItem.thumbImage != nil {
if thumb && newItem.thumbImage != nil {
return return
} }
if newItem.image != nil { if newItem.image != nil {
newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0) newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0)
newItem.image = nil
} else { } else {
if newItem.thumbUrl != nil { if newItem.thumbUrl != nil {
let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)! let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)!
@ -54,21 +56,10 @@ struct AsyncImage<Placeholder: View>: View {
Shared.imageCache.fetch(URL: URL).onSuccess { Shared.imageCache.fetch(URL: URL).onSuccess {
i in 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)
}
}
} }
} }

24
kplayer/util/ImageLoadOperation.swift

@ -39,22 +39,22 @@ public class ImageLoadOperation: Operation {
return return
} }
if let img = UIImage(data: data, scale: 1) { if let img = UIImage(data: data, scale: 1) {
if imageURL.isFileURL {
// if imageURL.isFileURL {
DispatchQueue.main.async { DispatchQueue.main.async {
self.succeeder(img) self.succeeder(img)
} }
return 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)
// }
// }
} }
} }
} }

Loading…
Cancel
Save