Various fixes

This commit is contained in:
Ilya Laktyushin 2024-06-28 16:05:45 +04:00
parent 8e8f997021
commit ed8f1b35e9
9 changed files with 94 additions and 82 deletions

View File

@ -567,7 +567,7 @@ public class AttachmentController: ViewController {
}
}
private func minimize(damping: CGFloat? = nil, initialVelocity: CGFloat? = nil) {
fileprivate func minimize(damping: CGFloat? = nil, initialVelocity: CGFloat? = nil) {
guard let controller = self.controller, let navigationController = controller.navigationController as? NavigationController else {
return
}
@ -1104,6 +1104,12 @@ public class AttachmentController: ViewController {
self.hasTextInput = false
self.requestLayout(transition: .immediate)
}
public func minimizeIfNeeded() {
if self.shouldMinimizeOnSwipe?(self.node.currentType) == true {
self.node.minimize()
}
}
public func updateSelectionCount(_ count: Int) {
self.node.updateSelectionCount(count, animated: false)

View File

@ -6,7 +6,12 @@ import SwiftSignalKit
import TelegramPresentationData
final class MinimizedHeaderNode: ASDisplayNode {
var theme: NavigationControllerTheme
var theme: NavigationControllerTheme {
didSet {
self.minimizedBackgroundNode.backgroundColor = self.theme.navigationBar.opaqueBackgroundColor
self.minimizedCloseButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Instant View/Close"), color: self.theme.navigationBar.primaryTextColor), for: .normal)
}
}
let strings: PresentationStrings
private let minimizedBackgroundNode: ASDisplayNode
@ -83,7 +88,7 @@ final class MinimizedHeaderNode: ASDisplayNode {
self.minimizedTitleNode = ImmediateTextNode()
self.minimizedCloseButton = HighlightableButtonNode()
self.minimizedCloseButton.setImage(UIImage(bundleImageName: "Instant View/Close"), for: .normal)
self.minimizedCloseButton.setImage(generateTintedImage(image: UIImage(bundleImageName: "Instant View/Close"), color: self.theme.navigationBar.primaryTextColor), for: .normal)
super.init()

View File

@ -0,0 +1,45 @@
import Foundation
import UIKit
import Display
import TelegramCore
final class MediaAreaMaskLayer: CALayer {
private var params: (referenceSize: CGSize, mediaAreas: [MediaArea])?
func update(referenceSize: CGSize, mediaAreas: [MediaArea], borderMaskLayer: CALayer?) {
guard referenceSize != self.params?.referenceSize && mediaAreas != self.params?.mediaAreas else {
return
}
for mediaArea in mediaAreas {
let size = CGSize(width: mediaArea.coordinates.width / 100.0 * referenceSize.width, height: mediaArea.coordinates.height / 100.0 * referenceSize.height)
let position = CGPoint(x: mediaArea.coordinates.x / 100.0 * referenceSize.width, y: mediaArea.coordinates.y / 100.0 * referenceSize.height)
let cornerRadius: CGFloat
if let radius = mediaArea.coordinates.cornerRadius {
cornerRadius = radius / 100.0 * size.width
} else {
cornerRadius = size.height * 0.18
}
let layer = CALayer()
layer.backgroundColor = UIColor.white.cgColor
layer.bounds = CGRect(origin: .zero, size: size)
layer.position = position
layer.cornerRadius = cornerRadius
layer.transform = CATransform3DMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0, 0.0, 0.0, 1.0)
self.addSublayer(layer)
if let borderMaskLayer {
let borderLayer = CAShapeLayer()
borderLayer.strokeColor = UIColor.white.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.lineWidth = 2.0
borderLayer.path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil)
borderLayer.bounds = CGRect(origin: .zero, size: size)
borderLayer.position = position
borderLayer.transform = layer.transform
borderMaskLayer.addSublayer(borderLayer)
}
}
}
}

View File

@ -917,7 +917,18 @@ final class StoryItemContentComponent: Component {
mediaAreasEffectView.removeFromSuperview()
}
}
if !component.item.mediaAreas.isEmpty {
let shimmeringMediaAreas: [MediaArea] = component.item.mediaAreas.filter { mediaArea in
if case .link = mediaArea {
return true
} else if case .venue = mediaArea {
return true
} else {
return false
}
}
if !shimmeringMediaAreas.isEmpty {
let mediaAreasEffectView: StoryItemLoadingEffectView
if let current = self.mediaAreasEffectView {
mediaAreasEffectView = current
@ -928,44 +939,14 @@ final class StoryItemContentComponent: Component {
}
mediaAreasEffectView.update(size: availableSize, transition: transition)
let maskLayer: CALayer
if let current = mediaAreasEffectView.layer.mask {
let maskLayer: MediaAreaMaskLayer
if let current = mediaAreasEffectView.layer.mask as? MediaAreaMaskLayer {
maskLayer = current
} else {
maskLayer = CALayer()
maskLayer = MediaAreaMaskLayer()
mediaAreasEffectView.layer.mask = maskLayer
}
if (maskLayer.sublayers ?? []).isEmpty {
let referenceSize = availableSize
for mediaArea in component.item.mediaAreas {
guard case .venue = mediaArea else {
continue
}
let size = CGSize(width: mediaArea.coordinates.width / 100.0 * referenceSize.width, height: mediaArea.coordinates.height / 100.0 * referenceSize.height)
let position = CGPoint(x: mediaArea.coordinates.x / 100.0 * referenceSize.width, y: mediaArea.coordinates.y / 100.0 * referenceSize.height)
let cornerRadius = size.height * 0.18
let layer = CALayer()
layer.backgroundColor = UIColor.white.cgColor
layer.bounds = CGRect(origin: .zero, size: size)
layer.position = position
layer.cornerRadius = cornerRadius
maskLayer.addSublayer(layer)
let borderLayer = CAShapeLayer()
borderLayer.strokeColor = UIColor.white.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.lineWidth = 2.0
borderLayer.path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil)
borderLayer.bounds = CGRect(origin: .zero, size: size)
borderLayer.position = position
mediaAreasEffectView.borderMaskLayer.addSublayer(borderLayer)
layer.transform = CATransform3DMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0, 0.0, 0.0, 1.0)
borderLayer.transform = layer.transform
}
}
maskLayer.update(referenceSize: availableSize, mediaAreas: shimmeringMediaAreas, borderMaskLayer: mediaAreasEffectView.borderMaskLayer)
} else if let mediaAreasEffectView = self.mediaAreasEffectView {
self.mediaAreasEffectView = nil
mediaAreasEffectView.removeFromSuperview()

View File

@ -913,9 +913,6 @@ public final class StoryItemSetContainerComponent: Component {
@objc private func tapGesture(_ recognizer: UITapGestureRecognizer) {
if case .ended = recognizer.state, let component = self.component, let itemLayout = self.itemLayout {
if let _ = self.sendMessageContext.menuController {
return
}
if self.displayLikeReactions {
self.displayLikeReactions = false
self.sendMessageContext.currentInputMode = .text

View File

@ -3347,32 +3347,7 @@ final class StoryItemSetContainerSendMessage {
var actions: [ContextMenuAction] = []
switch mediaArea {
case let .venue(coordinates, venue):
let action = { [weak controller, weak view] in
let _ = view
/*let subject = EngineMessage(stableId: 0, stableVersion: 0, id: EngineMessage.Id(peerId: PeerId(0), namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 0, flags: [], tags: [], globalTags: [], localTags: [], customTags: [], forwardInfo: nil, author: nil, text: "", attributes: [], media: [.geo(TelegramMediaMap(latitude: venue.latitude, longitude: venue.longitude, heading: nil, accuracyRadius: nil, geoPlace: nil, venue: venue.venue, liveBroadcastingTimeout: nil, liveProximityNotificationRadius: nil))], peers: [:], associatedMessages: [:], associatedMessageIds: [], associatedMedia: [:], associatedThreadInfo: nil, associatedStories: [:])
let locationController = LocationViewController(
context: context,
updatedPresentationData: updatedPresentationData,
subject: subject,
isStoryLocation: true,
params: LocationViewParams(
sendLiveLocation: { _ in },
stopLiveLocation: { _ in },
openUrl: { url in
context.sharedContext.applicationBindings.openUrl(url)
},
openPeer: { _ in }
)
)
view?.updateModalTransitionFactor(1.0, transition: .animated(duration: 0.5, curve: .spring))
locationController.dismissed = { [weak view] in
view?.updateModalTransitionFactor(0.0, transition: .animated(duration: 0.5, curve: .spring))
Queue.mainQueue().after(0.5, {
view?.updateIsProgressPaused()
})
}
controller?.push(locationController)*/
let action = { [weak controller] in
let searchController = context.sharedContext.makeStorySearchController(context: context, scope: .location(coordinates: coordinates, venue: venue), listContext: nil)
controller?.push(searchController)
}
@ -3475,12 +3450,16 @@ final class StoryItemSetContainerSendMessage {
let node = controller.displayNode
let menuController = makeContextMenuController(actions: actions, blurred: true)
menuController.centerHorizontally = true
menuController.dismissed = { [weak self, weak view] in
menuController.dismissed = { [weak self, weak view, weak menuController] in
if let self, let view {
self.selectedMediaArea = nil
Queue.mainQueue().after(0.1) {
self.menuController = nil
view.updateIsProgressPaused()
if self.menuController === menuController {
self.selectedMediaArea = nil
Queue.mainQueue().after(0.1) {
if self.menuController === menuController {
self.menuController = nil
view.updateIsProgressPaused()
}
}
}
}
}

View File

@ -30,6 +30,7 @@ import ChatListUI
import StoryContainerScreen
import ChatMessageNotificationItem
import PhoneNumberFormat
import AttachmentUI
final class UnauthorizedApplicationContext {
let sharedContext: SharedAccountContextImpl
@ -436,6 +437,10 @@ final class AuthorizedApplicationContext {
return false
}
if let topContoller = strongSelf.rootController.topViewController as? AttachmentController {
topContoller.minimizeIfNeeded()
}
for controller in strongSelf.rootController.viewControllers {
if let controller = controller as? ChatControllerImpl, controller.chatLocation.peerId == chatLocation.peerId, (controller.chatLocation.threadId == nil || controller.chatLocation.threadId == chatLocation.threadId) {
return true

View File

@ -43,6 +43,10 @@ extension ChatControllerImpl {
}
func presentAttachmentMenu(subject: AttachMenuSubject) {
guard self.audioRecorderValue == nil && self.videoRecorderValue == nil else {
return
}
let context = self.context
let inputIsActive = self.presentationInterfaceState.inputMode == .text

View File

@ -1935,16 +1935,6 @@ public final class WebAppController: ViewController, AttachmentContainable {
let attachMenuBot = attachMenuBots.first(where: { $0.peer.id == botId && !$0.flags.contains(.notActivated) })
// items.append(.action(ContextMenuActionItem(text: "Minimize", icon: { theme in
// return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/HideArchive"), color: theme.contextMenu.primaryColor)
// }, action: { [weak self] c, _ in
// c?.dismiss(completion: nil)
//
// if let self, let parentController = self.parentController(), let navigationController = self.getNavigationController() {
// navigationController.minimizeViewController(parentController, animated: true)
// }
// })))
if hasSettings {
items.append(.action(ContextMenuActionItem(text: presentationData.strings.WebApp_Settings, icon: { theme in
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Settings"), color: theme.contextMenu.primaryColor)