mirror of
https://github.com/ichmagmaus111/ghostgram.git
synced 2026-07-14 19:47:18 +02:00
Update Ghostgram features
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import SGSimpleSettings
|
||||
import Foundation
|
||||
import UIKit
|
||||
import Display
|
||||
@@ -291,7 +292,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
fileprivate var avatarEditorPreviewView: AvatarEditorPreviewView?
|
||||
|
||||
private var cameraActivateAreaNode: AccessibilityAreaNode
|
||||
private var placeholderNode: MediaPickerPlaceholderNode?
|
||||
fileprivate var placeholderNode: MediaPickerPlaceholderNode?
|
||||
private var manageNode: MediaPickerManageNode?
|
||||
private var scrollingArea: SparseItemGridScrollingArea
|
||||
private var isFastScrolling = false
|
||||
@@ -317,6 +318,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
private var fastScrollContentOffset = ValuePromise<CGPoint>(ignoreRepeated: true)
|
||||
private var fastScrollDisposable: Disposable?
|
||||
|
||||
fileprivate var currentContentOffset: GridNodeVisibleContentOffset?
|
||||
fileprivate var scrolledToTop = true
|
||||
fileprivate var scrolledExactlyToTop = true
|
||||
fileprivate var isSwitchingAssetGroup = false
|
||||
@@ -453,33 +455,9 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
self.currentContentOffset = offset
|
||||
self.updateNavigation(transition: .immediate)
|
||||
|
||||
var scrolledToTop = false
|
||||
var scrolledExactlyToTop = false
|
||||
if case let .known(contentOffset) = offset {
|
||||
if contentOffset < 30.0 {
|
||||
scrolledToTop = true
|
||||
}
|
||||
if contentOffset < 5.0 {
|
||||
scrolledExactlyToTop = true
|
||||
}
|
||||
}
|
||||
|
||||
var updated = false
|
||||
var transition: ContainedViewLayoutTransition = .animated(duration: 0.5, curve: .easeInOut)
|
||||
if self.scrolledToTop != scrolledToTop {
|
||||
self.scrolledToTop = scrolledToTop
|
||||
updated = true
|
||||
}
|
||||
if self.scrolledExactlyToTop != scrolledExactlyToTop {
|
||||
self.scrolledExactlyToTop = scrolledExactlyToTop
|
||||
updated = true
|
||||
transition = .animated(duration: 0.25, curve: .easeInOut)
|
||||
}
|
||||
if updated {
|
||||
self.controller?.updateNavigationButtons(transition: transition)
|
||||
}
|
||||
self.updateTopEdgeEffect()
|
||||
}
|
||||
|
||||
self.hiddenMediaDisposable = (self.hiddenMediaId.get()
|
||||
@@ -687,8 +665,8 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
useModernCamera = true
|
||||
}
|
||||
|
||||
if useLegacyCamera {
|
||||
let enableAnimations = self.controller?.context.sharedContext.energyUsageSettings.fullTranslucency ?? true
|
||||
if useLegacyCamera && !SGSimpleSettings.shared.disableGalleryCamera {
|
||||
let enableAnimations = self.controller?.context.sharedContext.energyUsageSettings.fullTranslucency ?? true && !SGSimpleSettings.shared.disableGalleryCameraPreview
|
||||
|
||||
let cameraView = TGAttachmentCameraView(forSelfPortrait: false, videoModeByDefault: controller.bannedSendPhotos != nil && controller.bannedSendVideos == nil)!
|
||||
cameraView.clipsToBounds = true
|
||||
@@ -711,7 +689,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
|
||||
self.gridNode.scrollView.addSubview(cameraView)
|
||||
self.gridNode.addSubnode(self.cameraActivateAreaNode)
|
||||
} else if useModernCamera, !Camera.isIpad {
|
||||
} else if useModernCamera, !Camera.isIpad, !SGSimpleSettings.shared.disableGalleryCamera {
|
||||
#if !targetEnvironment(simulator)
|
||||
var cameraPosition: Camera.Position = .back
|
||||
if case .assets(nil, .createAvatar) = controller.subject {
|
||||
@@ -771,6 +749,41 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
}
|
||||
}
|
||||
|
||||
func updateTopEdgeEffect() {
|
||||
guard let offset = self.currentContentOffset else {
|
||||
return
|
||||
}
|
||||
var scrolledToTop = false
|
||||
var scrolledExactlyToTop = false
|
||||
if case let .known(contentOffset) = offset {
|
||||
if contentOffset < 30.0 {
|
||||
scrolledToTop = true
|
||||
}
|
||||
if contentOffset < 5.0 {
|
||||
scrolledExactlyToTop = true
|
||||
}
|
||||
}
|
||||
if self.placeholderNode != nil {
|
||||
scrolledToTop = true
|
||||
scrolledExactlyToTop = true
|
||||
}
|
||||
|
||||
var updated = false
|
||||
var transition: ContainedViewLayoutTransition = .animated(duration: 0.5, curve: .easeInOut)
|
||||
if self.scrolledToTop != scrolledToTop {
|
||||
self.scrolledToTop = scrolledToTop
|
||||
updated = true
|
||||
}
|
||||
if self.scrolledExactlyToTop != scrolledExactlyToTop {
|
||||
self.scrolledExactlyToTop = scrolledExactlyToTop
|
||||
updated = true
|
||||
transition = .animated(duration: 0.25, curve: .easeInOut)
|
||||
}
|
||||
if updated {
|
||||
self.controller?.updateNavigationButtons(transition: transition)
|
||||
}
|
||||
}
|
||||
|
||||
func setupSelectionGesture() {
|
||||
guard self.selectionGesture == nil else {
|
||||
return
|
||||
@@ -831,14 +844,18 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
let isCameraActive = !self.isSuspended && !self.hasGallery && self.isCameraPreviewVisible
|
||||
if let cameraView = self.cameraView {
|
||||
if isCameraActive {
|
||||
cameraView.resumePreview()
|
||||
if !SGSimpleSettings.shared.disableGalleryCameraPreview {
|
||||
cameraView.resumePreview()
|
||||
}
|
||||
} else {
|
||||
cameraView.pausePreview()
|
||||
}
|
||||
} else if let camera = self.modernCamera, let cameraView = self.modernCameraView {
|
||||
if isCameraActive {
|
||||
cameraView.isEnabled = true
|
||||
camera.startCapture()
|
||||
if !SGSimpleSettings.shared.disableGalleryCameraPreview {
|
||||
cameraView.isEnabled = true
|
||||
camera.startCapture()
|
||||
}
|
||||
} else {
|
||||
cameraView.isEnabled = false
|
||||
camera.stopCapture()
|
||||
@@ -1685,6 +1702,8 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
self.placeholderNode = placeholderNode
|
||||
|
||||
placeholderTransition = .immediate
|
||||
|
||||
self.updateTopEdgeEffect()
|
||||
}
|
||||
placeholderNode.update(layout: layout, theme: self.presentationData.theme, strings: self.presentationData.strings, hasCamera: false, transition: placeholderTransition)
|
||||
placeholderTransition.updateFrame(node: placeholderNode, frame: innerBounds)
|
||||
@@ -1849,6 +1868,8 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
}
|
||||
|
||||
if case let .noAccess(cameraAccess) = self.state {
|
||||
self.controller?.titleView.isEnabled = false
|
||||
|
||||
var hasCamera = cameraAccess == .authorized
|
||||
var story = false
|
||||
if let subject = self.controller?.subject {
|
||||
@@ -1885,6 +1906,8 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
placeholderTransition = .immediate
|
||||
|
||||
self.updateNavigation(transition: .immediate)
|
||||
|
||||
self.updateTopEdgeEffect()
|
||||
}
|
||||
placeholderNode.update(layout: layout, theme: self.presentationData.theme, strings: self.presentationData.strings, hasCamera: hasCamera, transition: placeholderTransition)
|
||||
placeholderTransition.updateFrame(node: placeholderNode, frame: innerBounds)
|
||||
@@ -2388,7 +2411,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
)
|
||||
|
||||
self.titleView.isHighlighted = true
|
||||
let contextController = ContextController(
|
||||
let contextController = makeContextController(
|
||||
presentationData: self.presentationData,
|
||||
source: .reference(MediaPickerContextReferenceContentSource(controller: self, sourceView: self.titleView)),
|
||||
items: .single(ContextController.Items(content: .custom(content))),
|
||||
@@ -2514,7 +2537,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
moreIsVisible = true
|
||||
} else {
|
||||
let title: String
|
||||
let isEnabled: Bool
|
||||
var isEnabled: Bool
|
||||
if self.controllerNode.currentDisplayMode == .selected {
|
||||
title = "" // self.presentationData.strings.Attachment_SelectedMedia(count)
|
||||
isEnabled = false
|
||||
@@ -2522,7 +2545,12 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
title = self.selectedCollectionValue?.localizedTitle ?? self.presentationData.strings.MediaPicker_Recents
|
||||
isEnabled = true
|
||||
}
|
||||
self.titleView.updateTitle(title: title, isEnabled: isEnabled, animated: true)
|
||||
var titleIsEnabled = isEnabled
|
||||
if self.controllerNode.placeholderNode != nil {
|
||||
titleIsEnabled = false
|
||||
}
|
||||
|
||||
self.titleView.updateTitle(title: title, isEnabled: titleIsEnabled, animated: true)
|
||||
self.cancelButtonNode.setState(isEnabled ? .cancel : .back, animated: true)
|
||||
isBack = !isEnabled
|
||||
|
||||
@@ -2609,7 +2637,14 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
}
|
||||
}
|
||||
|
||||
if let moreButton = self.rightButton {
|
||||
if moreIsVisible, case .glass = self.style {
|
||||
let moreButton: ComponentView<Empty>
|
||||
if let current = self.rightButton {
|
||||
moreButton = current
|
||||
} else {
|
||||
moreButton = ComponentView<Empty>()
|
||||
self.rightButton = moreButton
|
||||
}
|
||||
let moreButtonSize = moreButton.update(
|
||||
transition: buttonTransition,
|
||||
component: AnyComponent(GlassBarButtonComponent(
|
||||
@@ -2638,18 +2673,28 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
if let view = moreButton.view {
|
||||
if view.superview == nil {
|
||||
self.view.addSubview(view)
|
||||
if transition.isAnimated {
|
||||
let transition = ComponentTransition(transition)
|
||||
transition.animateAlpha(view: view, from: 0.0, to: 1.0)
|
||||
transition.animateScale(view: view, from: 0.1, to: 1.0)
|
||||
}
|
||||
}
|
||||
view.bounds = CGRect(origin: .zero, size: moreButtonFrame.size)
|
||||
view.center = moreButtonFrame.center
|
||||
}
|
||||
}
|
||||
|
||||
if let moreButtonView = self.rightButton?.view {
|
||||
transition.updateAlpha(layer: moreButtonView.layer, alpha: moreIsVisible ? 1.0 : 0.0)
|
||||
transition.updateTransformScale(layer: moreButtonView.layer, scale: moreIsVisible ? 1.0 : 0.1)
|
||||
} else {
|
||||
transition.updateAlpha(node: self.moreButtonNode.iconNode, alpha: moreIsVisible ? 1.0 : 0.0)
|
||||
transition.updateTransformScale(node: self.moreButtonNode.iconNode, scale: moreIsVisible ? 1.0 : 0.1)
|
||||
} else if let moreButton = self.rightButton {
|
||||
self.rightButton = nil
|
||||
if let view = moreButton.view {
|
||||
if transition.isAnimated {
|
||||
let transition = ComponentTransition(transition)
|
||||
view.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25, removeOnCompletion: false, completion: { _ in
|
||||
view.removeFromSuperview()
|
||||
})
|
||||
transition.animateScale(view: view, from: 1.0, to: 0.1)
|
||||
} else {
|
||||
view.removeFromSuperview()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if case .assets(_, .story) = self.subject {
|
||||
@@ -2923,7 +2968,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
self?.presentFilePicker()
|
||||
})))
|
||||
|
||||
let contextController = ContextController(presentationData: self.presentationData, source: .reference(MediaPickerContextReferenceContentSource(controller: self, sourceView: view)), items: .single(ContextController.Items(content: .list(items))), gesture: gesture)
|
||||
let contextController = makeContextController(presentationData: self.presentationData, source: .reference(MediaPickerContextReferenceContentSource(controller: self, sourceView: view)), items: .single(ContextController.Items(content: .list(items))), gesture: gesture)
|
||||
self.presentInGlobalOverlay(contextController)
|
||||
|
||||
return
|
||||
@@ -3084,7 +3129,7 @@ public final class MediaPickerScreenImpl: ViewController, MediaPickerScreen, Att
|
||||
return ContextController.Items(content: .list(items))
|
||||
}
|
||||
|
||||
let contextController = ContextController(presentationData: self.presentationData, source: .reference(MediaPickerContextReferenceContentSource(controller: self, sourceView: view)), items: items, gesture: gesture)
|
||||
let contextController = makeContextController(presentationData: self.presentationData, source: .reference(MediaPickerContextReferenceContentSource(controller: self, sourceView: view)), items: items, gesture: gesture)
|
||||
self.presentInGlobalOverlay(contextController)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user