mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Improve poll creation
This commit is contained in:
parent
7f7d0f1c74
commit
eed644e895
@ -90,6 +90,7 @@ public protocol AttachmentContainable: ViewController {
|
|||||||
var requestAttachmentMenuExpansion: () -> Void { get set }
|
var requestAttachmentMenuExpansion: () -> Void { get set }
|
||||||
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void { get set }
|
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void { get set }
|
||||||
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void { get set }
|
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void { get set }
|
||||||
|
var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void { get set }
|
||||||
var cancelPanGesture: () -> Void { get set }
|
var cancelPanGesture: () -> Void { get set }
|
||||||
var isContainerPanning: () -> Bool { get set }
|
var isContainerPanning: () -> Bool { get set }
|
||||||
var isContainerExpanded: () -> Bool { get set }
|
var isContainerExpanded: () -> Bool { get set }
|
||||||
@ -564,6 +565,11 @@ public class AttachmentController: ViewController {
|
|||||||
strongSelf.panel.updateBackgroundAlpha(alpha, transition: transition)
|
strongSelf.panel.updateBackgroundAlpha(alpha, transition: transition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
controller.updateTabBarVisibility = { [weak self, weak controller] isVisible, transition in
|
||||||
|
if let strongSelf = self, strongSelf.currentControllers.contains(where: { $0 === controller }) {
|
||||||
|
strongSelf.updateIsPanelVisible(isVisible, transition: transition)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
controller.cancelPanGesture = { [weak self] in
|
controller.cancelPanGesture = { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
@ -748,6 +754,18 @@ public class AttachmentController: ViewController {
|
|||||||
|
|
||||||
private var hasButton = false
|
private var hasButton = false
|
||||||
|
|
||||||
|
private var isPanelVisible: Bool = true
|
||||||
|
|
||||||
|
private func updateIsPanelVisible(_ isVisible: Bool, transition: ContainedViewLayoutTransition) {
|
||||||
|
if self.isPanelVisible == isVisible {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.isPanelVisible = isVisible
|
||||||
|
if let layout = self.validLayout {
|
||||||
|
self.containerLayoutUpdated(layout, transition: transition)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
|
func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
|
||||||
self.validLayout = layout
|
self.validLayout = layout
|
||||||
|
|
||||||
@ -837,6 +855,9 @@ public class AttachmentController: ViewController {
|
|||||||
if let controller = self.controller, controller.buttons.count > 1 || controller.hasTextInput {
|
if let controller = self.controller, controller.buttons.count > 1 || controller.hasTextInput {
|
||||||
hasPanel = true
|
hasPanel = true
|
||||||
}
|
}
|
||||||
|
if !self.isPanelVisible {
|
||||||
|
hasPanel = false
|
||||||
|
}
|
||||||
|
|
||||||
let isEffecitvelyCollapsedUpdated = (self.selectionCount > 0) != (self.panel.isSelecting)
|
let isEffecitvelyCollapsedUpdated = (self.selectionCount > 0) != (self.panel.isSelecting)
|
||||||
var panelHeight = self.panel.update(layout: containerLayout, buttons: self.controller?.buttons ?? [], isSelecting: self.selectionCount > 0, elevateProgress: !hasPanel && !hasButton, transition: transition)
|
var panelHeight = self.panel.update(layout: containerLayout, buttons: self.controller?.buttons ?? [], isSelecting: self.selectionCount > 0, elevateProgress: !hasPanel && !hasButton, transition: transition)
|
||||||
|
@ -69,7 +69,8 @@ final class ComposePollScreenComponent: Component {
|
|||||||
private let quizAnswerSection = ComponentView<Empty>()
|
private let quizAnswerSection = ComponentView<Empty>()
|
||||||
|
|
||||||
private let pollOptionsSectionHeader = ComponentView<Empty>()
|
private let pollOptionsSectionHeader = ComponentView<Empty>()
|
||||||
private let pollOptionsSectionFooter = ComponentView<Empty>()
|
private let pollOptionsSectionFooterContainer = UIView()
|
||||||
|
private var pollOptionsSectionFooter = ComponentView<Empty>()
|
||||||
private var pollOptionsSectionContainer: ListSectionContentView
|
private var pollOptionsSectionContainer: ListSectionContentView
|
||||||
|
|
||||||
private let pollSettingsSection = ComponentView<Empty>()
|
private let pollSettingsSection = ComponentView<Empty>()
|
||||||
@ -78,6 +79,8 @@ final class ComposePollScreenComponent: Component {
|
|||||||
private var reactionSelectionControl: ComponentView<Empty>?
|
private var reactionSelectionControl: ComponentView<Empty>?
|
||||||
|
|
||||||
private var isUpdating: Bool = false
|
private var isUpdating: Bool = false
|
||||||
|
private var ignoreScrolling: Bool = false
|
||||||
|
private var previousHadInputHeight: Bool = false
|
||||||
|
|
||||||
private var component: ComposePollScreenComponent?
|
private var component: ComposePollScreenComponent?
|
||||||
private(set) weak var state: EmptyComponentState?
|
private(set) weak var state: EmptyComponentState?
|
||||||
@ -92,6 +95,7 @@ final class ComposePollScreenComponent: Component {
|
|||||||
|
|
||||||
private var nextPollOptionId: Int = 0
|
private var nextPollOptionId: Int = 0
|
||||||
private var pollOptions: [PollOption] = []
|
private var pollOptions: [PollOption] = []
|
||||||
|
private var currentPollOptionsLimitReached: Bool = false
|
||||||
|
|
||||||
private var isAnonymous: Bool = true
|
private var isAnonymous: Bool = true
|
||||||
private var isMultiAnswer: Bool = false
|
private var isMultiAnswer: Bool = false
|
||||||
@ -237,8 +241,10 @@ final class ComposePollScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||||
|
if !self.ignoreScrolling {
|
||||||
self.updateScrolling(transition: .immediate)
|
self.updateScrolling(transition: .immediate)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func updateScrolling(transition: Transition) {
|
private func updateScrolling(transition: Transition) {
|
||||||
let navigationAlphaDistance: CGFloat = 16.0
|
let navigationAlphaDistance: CGFloat = 16.0
|
||||||
@ -351,7 +357,7 @@ final class ComposePollScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if animateIn {
|
if animateIn {
|
||||||
var targetFrame = inputMediaNode.frame
|
var targetFrame = inputNodeFrame
|
||||||
targetFrame.origin.y = availableSize.height
|
targetFrame.origin.y = availableSize.height
|
||||||
inputMediaNodeTransition.setFrame(layer: inputMediaNode.layer, frame: targetFrame)
|
inputMediaNodeTransition.setFrame(layer: inputMediaNode.layer, frame: targetFrame)
|
||||||
|
|
||||||
@ -409,9 +415,12 @@ final class ComposePollScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*if let controller = self.environment?.controller() as? ComposePollScreen {
|
if let controller = self.environment?.controller() as? ComposePollScreen {
|
||||||
controller.updateTabBarAlpha(self.inputMediaNode == nil ? 1.0 : 0.0, transition.containedViewLayoutTransition)
|
let isTabBarVisible = self.inputMediaNode == nil
|
||||||
}*/
|
DispatchQueue.main.async { [weak controller] in
|
||||||
|
controller?.updateTabBarVisibility(isTabBarVisible, transition.containedViewLayoutTransition)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
@ -436,6 +445,11 @@ final class ComposePollScreenComponent: Component {
|
|||||||
self.isUpdating = false
|
self.isUpdating = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var alphaTransition = transition
|
||||||
|
if !transition.animation.isImmediate {
|
||||||
|
alphaTransition = alphaTransition.withAnimation(.curve(duration: 0.25, curve: .easeInOut))
|
||||||
|
}
|
||||||
|
|
||||||
let environment = environment[EnvironmentType.self].value
|
let environment = environment[EnvironmentType.self].value
|
||||||
let themeUpdated = self.environment?.theme !== environment.theme
|
let themeUpdated = self.environment?.theme !== environment.theme
|
||||||
self.environment = environment
|
self.environment = environment
|
||||||
@ -491,7 +505,7 @@ final class ComposePollScreenComponent: Component {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.currentInputMode = .keyboard
|
self.currentInputMode = .keyboard
|
||||||
self.state?.updated(transition: .immediate)
|
self.state?.updated(transition: .spring(duration: 0.4))
|
||||||
},
|
},
|
||||||
dismissTextInput: {
|
dismissTextInput: {
|
||||||
},
|
},
|
||||||
@ -692,7 +706,11 @@ final class ComposePollScreenComponent: Component {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if let index = self.pollOptions.firstIndex(where: { $0.id == optionId }) {
|
if let index = self.pollOptions.firstIndex(where: { $0.id == optionId }) {
|
||||||
if index != 0 {
|
if index == 0 {
|
||||||
|
if let textInputView = self.pollTextSection.findTaggedView(tag: self.pollTextFieldTag) as? ListComposePollOptionComponent.View {
|
||||||
|
textInputView.activateInput()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if let pollOptionView = self.pollOptionsSectionContainer.itemViews[self.pollOptions[index - 1].id] {
|
if let pollOptionView = self.pollOptionsSectionContainer.itemViews[self.pollOptions[index - 1].id] {
|
||||||
if let pollOptionComponentView = pollOptionView.contents.view as? ListComposePollOptionComponent.View {
|
if let pollOptionComponentView = pollOptionView.contents.view as? ListComposePollOptionComponent.View {
|
||||||
pollOptionComponentView.activateInput()
|
pollOptionComponentView.activateInput()
|
||||||
@ -832,14 +850,31 @@ final class ComposePollScreenComponent: Component {
|
|||||||
contentHeight += pollOptionsSectionUpdateResult.size.height
|
contentHeight += pollOptionsSectionUpdateResult.size.height
|
||||||
|
|
||||||
contentHeight += 7.0
|
contentHeight += 7.0
|
||||||
var pollOptionsFooterItems: [AnimatedTextComponent.Item] = []
|
|
||||||
if self.pollOptions.count >= 10, !"".isEmpty {
|
let pollOptionsLimitReached = self.pollOptions.count >= 10
|
||||||
pollOptionsFooterItems.append(AnimatedTextComponent.Item(
|
var animatePollOptionsFooterIn = false
|
||||||
id: 3,
|
var pollOptionsFooterTransition = transition
|
||||||
isUnbreakable: true,
|
if self.currentPollOptionsLimitReached != pollOptionsLimitReached {
|
||||||
content: .text("You have added the maximum number of options.")
|
self.currentPollOptionsLimitReached = pollOptionsLimitReached
|
||||||
|
if let pollOptionsSectionFooterView = self.pollOptionsSectionFooter.view {
|
||||||
|
animatePollOptionsFooterIn = true
|
||||||
|
pollOptionsFooterTransition = pollOptionsFooterTransition.withAnimation(.none)
|
||||||
|
alphaTransition.setAlpha(view: pollOptionsSectionFooterView, alpha: 0.0, completion: { [weak pollOptionsSectionFooterView] _ in
|
||||||
|
pollOptionsSectionFooterView?.removeFromSuperview()
|
||||||
|
})
|
||||||
|
self.pollOptionsSectionFooter = ComponentView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let pollOptionsComponent: AnyComponent<Empty>
|
||||||
|
if pollOptionsLimitReached {
|
||||||
|
pollOptionsFooterTransition = pollOptionsFooterTransition.withAnimation(.none)
|
||||||
|
pollOptionsComponent = AnyComponent(MultilineTextComponent(
|
||||||
|
text: .plain(NSAttributedString(string: "You have added the maximum number of options.", font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize), textColor: environment.theme.list.freeTextColor)),
|
||||||
|
maximumNumberOfLines: 0
|
||||||
))
|
))
|
||||||
} else {
|
} else {
|
||||||
|
var pollOptionsFooterItems: [AnimatedTextComponent.Item] = []
|
||||||
pollOptionsFooterItems.append(AnimatedTextComponent.Item(
|
pollOptionsFooterItems.append(AnimatedTextComponent.Item(
|
||||||
id: 0,
|
id: 0,
|
||||||
isUnbreakable: true,
|
isUnbreakable: true,
|
||||||
@ -855,25 +890,36 @@ final class ComposePollScreenComponent: Component {
|
|||||||
isUnbreakable: true,
|
isUnbreakable: true,
|
||||||
content: .text(" more options.")
|
content: .text(" more options.")
|
||||||
))
|
))
|
||||||
}
|
pollOptionsComponent = AnyComponent(AnimatedTextComponent(
|
||||||
let pollOptionsSectionFooterSize = self.pollOptionsSectionFooter.update(
|
|
||||||
transition: transition,
|
|
||||||
component: AnyComponent(AnimatedTextComponent(
|
|
||||||
font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize),
|
font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize),
|
||||||
color: environment.theme.list.freeTextColor,
|
color: environment.theme.list.freeTextColor,
|
||||||
items: pollOptionsFooterItems
|
items: pollOptionsFooterItems
|
||||||
)),
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
let pollOptionsSectionFooterSize = self.pollOptionsSectionFooter.update(
|
||||||
|
transition: pollOptionsFooterTransition,
|
||||||
|
component: pollOptionsComponent,
|
||||||
environment: {},
|
environment: {},
|
||||||
containerSize: CGSize(width: availableSize.width - sideInset * 2.0 - sectionHeaderSideInset * 2.0, height: 1000.0)
|
containerSize: CGSize(width: availableSize.width - sideInset * 2.0 - sectionHeaderSideInset * 2.0, height: 1000.0)
|
||||||
)
|
)
|
||||||
let pollOptionsSectionFooterFrame = CGRect(origin: CGPoint(x: sideInset + sectionHeaderSideInset, y: contentHeight), size: pollOptionsSectionFooterSize)
|
let pollOptionsSectionFooterFrame = CGRect(origin: CGPoint(x: sideInset + sectionHeaderSideInset, y: contentHeight), size: pollOptionsSectionFooterSize)
|
||||||
|
|
||||||
|
if self.pollOptionsSectionFooterContainer.superview == nil {
|
||||||
|
self.scrollView.addSubview(self.pollOptionsSectionFooterContainer)
|
||||||
|
}
|
||||||
|
transition.setFrame(view: self.pollOptionsSectionFooterContainer, frame: pollOptionsSectionFooterFrame)
|
||||||
|
|
||||||
if let pollOptionsSectionFooterView = self.pollOptionsSectionFooter.view {
|
if let pollOptionsSectionFooterView = self.pollOptionsSectionFooter.view {
|
||||||
if pollOptionsSectionFooterView.superview == nil {
|
if pollOptionsSectionFooterView.superview == nil {
|
||||||
pollOptionsSectionFooterView.layer.anchorPoint = CGPoint()
|
pollOptionsSectionFooterView.layer.anchorPoint = CGPoint()
|
||||||
self.scrollView.addSubview(pollOptionsSectionFooterView)
|
self.pollOptionsSectionFooterContainer.addSubview(pollOptionsSectionFooterView)
|
||||||
}
|
}
|
||||||
transition.setPosition(view: pollOptionsSectionFooterView, position: pollOptionsSectionFooterFrame.origin)
|
pollOptionsFooterTransition.setPosition(view: pollOptionsSectionFooterView, position: CGPoint())
|
||||||
pollOptionsSectionFooterView.bounds = CGRect(origin: CGPoint(), size: pollOptionsSectionFooterFrame.size)
|
pollOptionsSectionFooterView.bounds = CGRect(origin: CGPoint(), size: pollOptionsSectionFooterFrame.size)
|
||||||
|
if animatePollOptionsFooterIn && !transition.animation.isImmediate {
|
||||||
|
alphaTransition.animateAlpha(view: pollOptionsSectionFooterView, from: 0.0, to: 1.0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
contentHeight += pollOptionsSectionFooterSize.height
|
contentHeight += pollOptionsSectionFooterSize.height
|
||||||
contentHeight += sectionSpacing
|
contentHeight += sectionSpacing
|
||||||
@ -1049,6 +1095,9 @@ final class ComposePollScreenComponent: Component {
|
|||||||
deviceMetrics: environment.deviceMetrics,
|
deviceMetrics: environment.deviceMetrics,
|
||||||
transition: transition
|
transition: transition
|
||||||
)
|
)
|
||||||
|
if self.inputMediaNode == nil {
|
||||||
|
inputHeight = environment.inputHeight
|
||||||
|
}
|
||||||
|
|
||||||
let textInputStates = self.collectTextInputStates()
|
let textInputStates = self.collectTextInputStates()
|
||||||
|
|
||||||
@ -1188,14 +1237,47 @@ final class ComposePollScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let combinedBottomInset: CGFloat
|
||||||
if isEditing {
|
if isEditing {
|
||||||
contentHeight += bottomInset + 8.0
|
combinedBottomInset = bottomInset + 8.0 + inputHeight
|
||||||
contentHeight += inputHeight
|
|
||||||
} else {
|
} else {
|
||||||
contentHeight += bottomInset
|
combinedBottomInset = bottomInset + environment.safeInsets.bottom
|
||||||
contentHeight += environment.safeInsets.bottom
|
}
|
||||||
|
contentHeight += combinedBottomInset
|
||||||
|
|
||||||
|
var recenterOnTag: AnyObject?
|
||||||
|
if let hint = transition.userData(TextFieldComponent.AnimationHint.self), let targetView = hint.view {
|
||||||
|
var matches = false
|
||||||
|
switch hint.kind {
|
||||||
|
case .textChanged:
|
||||||
|
matches = true
|
||||||
|
case let .textFocusChanged(isFocused):
|
||||||
|
if isFocused {
|
||||||
|
matches = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if matches {
|
||||||
|
for (textView, _) in self.collectTextInputStates() {
|
||||||
|
if targetView.isDescendant(of: textView) {
|
||||||
|
recenterOnTag = textView.currentTag
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if recenterOnTag == nil && self.previousHadInputHeight != (inputHeight > 0.0) {
|
||||||
|
for (textView, state) in self.collectTextInputStates() {
|
||||||
|
if state.isEditing {
|
||||||
|
recenterOnTag = textView.currentTag
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.previousHadInputHeight = (inputHeight > 0.0)
|
||||||
|
|
||||||
|
self.ignoreScrolling = true
|
||||||
|
let previousBounds = self.scrollView.bounds
|
||||||
let contentSize = CGSize(width: availableSize.width, height: contentHeight)
|
let contentSize = CGSize(width: availableSize.width, height: contentHeight)
|
||||||
if self.scrollView.frame != CGRect(origin: CGPoint(), size: availableSize) {
|
if self.scrollView.frame != CGRect(origin: CGPoint(), size: availableSize) {
|
||||||
self.scrollView.frame = CGRect(origin: CGPoint(), size: availableSize)
|
self.scrollView.frame = CGRect(origin: CGPoint(), size: availableSize)
|
||||||
@ -1208,6 +1290,31 @@ final class ComposePollScreenComponent: Component {
|
|||||||
self.scrollView.scrollIndicatorInsets = scrollInsets
|
self.scrollView.scrollIndicatorInsets = scrollInsets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let recenterOnTag {
|
||||||
|
if let targetView = self.collectTextInputStates().first(where: { $0.view.currentTag === recenterOnTag })?.view {
|
||||||
|
let caretRect = targetView.convert(targetView.bounds, to: self.scrollView)
|
||||||
|
var scrollViewBounds = self.scrollView.bounds
|
||||||
|
let minButtonDistance: CGFloat = 16.0
|
||||||
|
if -scrollViewBounds.minY + caretRect.maxY > availableSize.height - combinedBottomInset - minButtonDistance {
|
||||||
|
scrollViewBounds.origin.y = -(availableSize.height - combinedBottomInset - minButtonDistance - caretRect.maxY)
|
||||||
|
if scrollViewBounds.origin.y < 0.0 {
|
||||||
|
scrollViewBounds.origin.y = 0.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if self.scrollView.bounds != scrollViewBounds {
|
||||||
|
self.scrollView.bounds = scrollViewBounds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !previousBounds.isEmpty, !transition.animation.isImmediate {
|
||||||
|
let bounds = self.scrollView.bounds
|
||||||
|
if bounds.maxY != previousBounds.maxY {
|
||||||
|
let offsetY = previousBounds.maxY - bounds.maxY
|
||||||
|
transition.animateBoundsOrigin(view: self.scrollView, from: CGPoint(x: 0.0, y: offsetY), to: CGPoint(), additive: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.ignoreScrolling = false
|
||||||
|
|
||||||
self.updateScrolling(transition: transition)
|
self.updateScrolling(transition: transition)
|
||||||
|
|
||||||
if isEditing {
|
if isEditing {
|
||||||
@ -1251,6 +1358,8 @@ public class ComposePollScreen: ViewControllerComponentContainer, AttachmentCont
|
|||||||
}
|
}
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in
|
||||||
}
|
}
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in
|
||||||
|
}
|
||||||
public var cancelPanGesture: () -> Void = {
|
public var cancelPanGesture: () -> Void = {
|
||||||
}
|
}
|
||||||
public var isContainerPanning: () -> Bool = {
|
public var isContainerPanning: () -> Bool = {
|
||||||
|
@ -561,6 +561,7 @@ public class CreatePollControllerImpl: ItemListController, AttachmentContainable
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -236,6 +236,10 @@ public final class ListComposePollOptionComponent: Component {
|
|||||||
return self.textField.view as? TextFieldComponent.View
|
return self.textField.view as? TextFieldComponent.View
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var currentTag: AnyObject? {
|
||||||
|
return self.component?.tag
|
||||||
|
}
|
||||||
|
|
||||||
public var customUpdateIsHighlighted: ((Bool) -> Void)?
|
public var customUpdateIsHighlighted: ((Bool) -> Void)?
|
||||||
public private(set) var separatorInset: CGFloat = 0.0
|
public private(set) var separatorInset: CGFloat = 0.0
|
||||||
|
|
||||||
|
@ -81,6 +81,7 @@ public final class LocationPickerController: ViewController, AttachmentContainab
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -153,6 +153,7 @@ public final class MediaGroupsScreen: ViewController, AttachmentContainable {
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -203,6 +203,7 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = { }
|
public var requestAttachmentMenuExpansion: () -> Void = { }
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -1297,6 +1297,7 @@ open class PremiumGiftScreen: ViewControllerComponentContainer {
|
|||||||
public var animationColor: UIColor?
|
public var animationColor: UIColor?
|
||||||
|
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
|
||||||
public let mainButtonStatePromise = Promise<AttachmentMainButtonState?>(nil)
|
public let mainButtonStatePromise = Promise<AttachmentMainButtonState?>(nil)
|
||||||
private let mainButtonActionSlot = ActionSlot<Void>()
|
private let mainButtonActionSlot = ActionSlot<Void>()
|
||||||
|
@ -468,7 +468,7 @@ final class MediaEditorScreenComponent: Component {
|
|||||||
self.currentInputMode = .text
|
self.currentInputMode = .text
|
||||||
if hasFirstResponder(self) {
|
if hasFirstResponder(self) {
|
||||||
if let view = self.inputPanel.view as? MessageInputPanelComponent.View {
|
if let view = self.inputPanel.view as? MessageInputPanelComponent.View {
|
||||||
self.nextTransitionUserData = TextFieldComponent.AnimationHint(view: nil, kind: .textFocusChanged)
|
self.nextTransitionUserData = TextFieldComponent.AnimationHint(view: nil, kind: .textFocusChanged(isFocused: false))
|
||||||
if view.isActive {
|
if view.isActive {
|
||||||
view.deactivateInput(force: true)
|
view.deactivateInput(force: true)
|
||||||
} else {
|
} else {
|
||||||
@ -476,7 +476,7 @@ final class MediaEditorScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.state?.updated(transition: .spring(duration: 0.4).withUserData(TextFieldComponent.AnimationHint(view: nil, kind: .textFocusChanged)))
|
self.state?.updated(transition: .spring(duration: 0.4).withUserData(TextFieldComponent.AnimationHint(view: nil, kind: .textFocusChanged(isFocused: false))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1305,6 +1305,8 @@ public final class QuickReplySetupScreen: ViewControllerComponentContainer, Atta
|
|||||||
}
|
}
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in
|
||||||
}
|
}
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in
|
||||||
|
}
|
||||||
public var cancelPanGesture: () -> Void = {
|
public var cancelPanGesture: () -> Void = {
|
||||||
}
|
}
|
||||||
public var isContainerPanning: () -> Bool = {
|
public var isContainerPanning: () -> Bool = {
|
||||||
|
@ -338,6 +338,7 @@ public final class ThemeColorsGridController: ViewController, AttachmentContaina
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -905,7 +905,7 @@ public final class StoryItemSetContainerComponent: Component {
|
|||||||
if hasFirstResponder(self) {
|
if hasFirstResponder(self) {
|
||||||
view.deactivateInput()
|
view.deactivateInput()
|
||||||
} else {
|
} else {
|
||||||
self.state?.updated(transition: .spring(duration: 0.4).withUserData(TextFieldComponent.AnimationHint(view: nil, kind: .textFocusChanged)))
|
self.state?.updated(transition: .spring(duration: 0.4).withUserData(TextFieldComponent.AnimationHint(view: nil, kind: .textFocusChanged(isFocused: false))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,9 +69,9 @@ public final class TextFieldComponent: Component {
|
|||||||
|
|
||||||
|
|
||||||
public final class AnimationHint {
|
public final class AnimationHint {
|
||||||
public enum Kind {
|
public enum Kind: Equatable {
|
||||||
case textChanged
|
case textChanged
|
||||||
case textFocusChanged
|
case textFocusChanged(isFocused: Bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
public weak var view: View?
|
public weak var view: View?
|
||||||
@ -450,7 +450,7 @@ public final class TextFieldComponent: Component {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !self.isUpdating {
|
if !self.isUpdating {
|
||||||
self.state?.updated(transition: Transition(animation: .curve(duration: 0.5, curve: .spring)).withUserData(AnimationHint(view: self, kind: .textFocusChanged)))
|
self.state?.updated(transition: Transition(animation: .curve(duration: 0.5, curve: .spring)).withUserData(AnimationHint(view: self, kind: .textFocusChanged(isFocused: true))))
|
||||||
}
|
}
|
||||||
if component.isOneLineWhenUnfocused {
|
if component.isOneLineWhenUnfocused {
|
||||||
Queue.mainQueue().justDispatch {
|
Queue.mainQueue().justDispatch {
|
||||||
@ -461,7 +461,7 @@ public final class TextFieldComponent: Component {
|
|||||||
|
|
||||||
public func chatInputTextNodeDidFinishEditing() {
|
public func chatInputTextNodeDidFinishEditing() {
|
||||||
if !self.isUpdating {
|
if !self.isUpdating {
|
||||||
self.state?.updated(transition: Transition(animation: .curve(duration: 0.5, curve: .spring)).withUserData(AnimationHint(view: self, kind: .textFocusChanged)))
|
self.state?.updated(transition: Transition(animation: .curve(duration: 0.5, curve: .spring)).withUserData(AnimationHint(view: self, kind: .textFocusChanged(isFocused: false))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,6 +197,7 @@ class AttachmentFileControllerImpl: ItemListController, AttachmentFileController
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = {}
|
public var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -131,10 +131,10 @@ extension ChatControllerImpl {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if "".isEmpty {
|
if "".isEmpty {
|
||||||
self.push(RecentActionsSettingsSheet(context: self.context, adminPeers: authors.map(EnginePeer.init), completion: { _ in }))
|
self.push(RecentActionsSettingsSheet(context: self.context, adminPeers: authors.map(EnginePeer.init), completion: { _ in }))
|
||||||
return
|
return
|
||||||
}*/
|
}
|
||||||
|
|
||||||
self.navigationActionDisposable.set((combineLatest(authors.map { author in
|
self.navigationActionDisposable.set((combineLatest(authors.map { author in
|
||||||
self.context.engine.peers.fetchChannelParticipant(peerId: peerId, participantId: author.id)
|
self.context.engine.peers.fetchChannelParticipant(peerId: peerId, participantId: author.id)
|
||||||
|
@ -79,6 +79,7 @@ class ContactSelectionControllerImpl: ViewController, ContactSelectionController
|
|||||||
var requestAttachmentMenuExpansion: () -> Void = {}
|
var requestAttachmentMenuExpansion: () -> Void = {}
|
||||||
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
var cancelPanGesture: () -> Void = { }
|
var cancelPanGesture: () -> Void = { }
|
||||||
var isContainerPanning: () -> Bool = { return false }
|
var isContainerPanning: () -> Bool = { return false }
|
||||||
var isContainerExpanded: () -> Bool = { return false }
|
var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
@ -259,6 +259,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
|||||||
public var requestAttachmentMenuExpansion: () -> Void = { }
|
public var requestAttachmentMenuExpansion: () -> Void = { }
|
||||||
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
public var updateNavigationStack: (@escaping ([AttachmentContainable]) -> ([AttachmentContainable], AttachmentMediaPickerContext?)) -> Void = { _ in }
|
||||||
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
|
public var updateTabBarVisibility: (Bool, ContainedViewLayoutTransition) -> Void = { _, _ in }
|
||||||
public var cancelPanGesture: () -> Void = { }
|
public var cancelPanGesture: () -> Void = { }
|
||||||
public var isContainerPanning: () -> Bool = { return false }
|
public var isContainerPanning: () -> Bool = { return false }
|
||||||
public var isContainerExpanded: () -> Bool = { return false }
|
public var isContainerExpanded: () -> Bool = { return false }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user