Browse Source

Photos

master
marcoschmickler 4 years ago
parent
commit
36a21cef01
  1. 76
      kplayer/photo/SPhotoView.swift

76
kplayer/photo/SPhotoView.swift

@ -10,10 +10,10 @@ struct SPhotoView : View {
var completionHandler: ((Bool) -> Void)? var completionHandler: ((Bool) -> Void)?
@ObservedObject @ObservedObject
var model: SPhotoModel var model: SPhotoModel
@State
var update = false
@State var scrub = false
@State var scale: CGFloat = 1.0 @State var scale: CGFloat = 1.0
@State var lastScaleValue: CGFloat = 1.0 @State var lastScaleValue: CGFloat = 1.0
@State var proxy: GeometryProxy?
var body: some View { var body: some View {
VStack { VStack {
@ -23,23 +23,24 @@ struct SPhotoView : View {
completionHandler!(true) completionHandler!(true)
}, label: { }, label: {
Text("cancel") Text("cancel")
}).foregroundColor(update ? Color.yellow : Color.blue)
})//.foregroundColor(update ? Color.yellow : Color.blue)
.buttonStyle(BorderlessButtonStyle()) .buttonStyle(BorderlessButtonStyle())
Spacer() Spacer()
} }
}.frame(height: 50) }.frame(height: 50)
GeometryReader { geo in
// AsyncImage(item: model.selectedItem, 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()
SwiftUI.AsyncImage(url: URL(string: model.allItems[model.index].imageUrlAbsolute)) { image in
image.resizable().scaledToFill()
} }
placeholder: { placeholder: {
if let i = model.selectedItem.thumbImage { if let i = model.selectedItem.thumbImage {
Image(uiImage: i)
}
else {
Image(uiImage: i) .resizable().scaledToFill()
} else {
ProgressView() ProgressView()
} }
}.scaleEffect(scale)
}.frame(height: geo.size.height - 120)
.scaleEffect(scale)
.gesture(MagnificationGesture() .gesture(MagnificationGesture()
.onChanged { val in .onChanged { val in
let delta = val / self.lastScaleValue let delta = val / self.lastScaleValue
@ -47,31 +48,60 @@ struct SPhotoView : View {
scale = self.scale * delta scale = self.scale * delta
//... anything else e.g. clamping the newScale //... anything else e.g. clamping the newScale
}.onEnded { val in
}
.onEnded { val in
// without this the next gesture will be broken // without this the next gesture will be broken
self.lastScaleValue = 1.0 self.lastScaleValue = 1.0
}) })
.contentShape(Rectangle()).clipped();
ScrollView(.horizontal, showsIndicators: false) {
if scale <= 1.0 {
GeometryReader { geometry in
HStack { HStack {
ForEach(model.allItems) { item in
Button(action: {
gotoSnapshot(item)
}, label: {
ForEach(model.indexItems) { item in
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)
}.onAppear() {
proxy = geometry
} }
.gesture(
DragGesture()
.onChanged { gesture in
let dragged = gesture.translation
let xpos = Double(gesture.startLocation.x + dragged.width)
let width = Double(proxy!.size.width - 30)
let i = Int(Double(model.allItems.count - 1) * (xpos / width))
if (i < model.allItems.count) {
model.thumbIndex = i
} }
print("size \(width) xpos \(xpos) i \(i)")
scrub = true
} }
.onEnded { gesture in
let xpos = gesture.predictedEndLocation.x
let width = Double(proxy!.size.width - 30)
func gotoSnapshot(_ item: MediaItem) {
model.selectedItem = item
update.toggle()
let i = Int(Double(model.allItems.count - 1) * (xpos / width))
print("select \(model.selectedItem.imageUrlAbsolute)")
if (i < model.allItems.count) {
model.index = i
}
scrub = false
print("size \(width) xpos \(xpos) i \(i)")
}
)
}.overlay(
(model.allItems[model.thumbIndex].thumbImage != nil) ? Image(uiImage: model.allItems[model.thumbIndex].thumbImage!).frame(width: 200, height: 200, alignment: .top).offset(x: 0, y: -150) : nil)
}
}.contentShape(Rectangle()).clipped();
}
} }
} }
Loading…
Cancel
Save