diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index a5f2b09caa..f55b0b7fea 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -12631,7 +12631,7 @@ Sorry for the inconvenience."; "BotPreviews.SubtitleLoading" = "loading"; "BotPreviews.SubtitleEmpty" = "no preview added"; "BotPreviews.SubtitleCount_1" = "1 preview"; -"BotPreviews.SubtitleCount_any" = "1 previews"; +"BotPreviews.SubtitleCount_any" = "%d previews"; "BotPreviews.SheetDeleteTitle_1" = "Delete 1 Preview?"; "BotPreviews.SheetDeleteTitle_any" = "Delete %d Previews?"; "BotPreviews.LanguageTab.Main" = "Main"; diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift index 15327d43df..738ef1a489 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift @@ -3614,11 +3614,15 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr effectiveScrollingOffset = self.itemGrid.scrollingOffset botPreviewLanguageTabFrame.origin.y -= effectiveScrollingOffset + let isSelectingOrReordering = self.isReordering || self.itemInteraction.selectedIds != nil + if let botPreviewLanguageTabView = botPreviewLanguageTab.view { if botPreviewLanguageTabView.superview == nil { self.view.addSubview(botPreviewLanguageTabView) } transition.updateFrame(view: botPreviewLanguageTabView, frame: botPreviewLanguageTabFrame) + transition.updateAlpha(layer: botPreviewLanguageTabView.layer, alpha: isSelectingOrReordering ? 0.5 : 1.0) + botPreviewLanguageTabView.isUserInteractionEnabled = !isSelectingOrReordering } } @@ -4405,6 +4409,8 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: id, ids: updatedPinnedIds).startStandalone() } } + + self.update(transition: animated ? .animated(duration: 0.4, curve: .spring) : .immediate) } } } diff --git a/submodules/TelegramUI/Components/Settings/LanguageSelectionScreen/Sources/LanguageSelectionScreenNode.swift b/submodules/TelegramUI/Components/Settings/LanguageSelectionScreen/Sources/LanguageSelectionScreenNode.swift index b31bb91475..cd14148e2e 100644 --- a/submodules/TelegramUI/Components/Settings/LanguageSelectionScreen/Sources/LanguageSelectionScreenNode.swift +++ b/submodules/TelegramUI/Components/Settings/LanguageSelectionScreen/Sources/LanguageSelectionScreenNode.swift @@ -32,13 +32,13 @@ private enum LanguageListEntryType { private enum LanguageListEntry: Comparable, Identifiable { case localizationTitle(text: String, section: ItemListSectionId) - case localization(index: Int, info: LocalizationInfo?, type: LanguageListEntryType) + case localization(index: Int, info: LocalizationInfo?, type: LanguageListEntryType, isEnabled: Bool) var stableId: LanguageListEntryId { switch self { case .localizationTitle: return .localizationTitle - case let .localization(index, info, _): + case let .localization(index, info, _, _): return .localization(info?.languageCode ?? "\(index)") } } @@ -47,7 +47,7 @@ private enum LanguageListEntry: Comparable, Identifiable { switch self { case .localizationTitle: return 1000 - case let .localization(index, _, _): + case let .localization(index, _, _, _): return 1001 + index } } @@ -60,8 +60,8 @@ private enum LanguageListEntry: Comparable, Identifiable { switch self { case let .localizationTitle(text, section): return ItemListSectionHeaderItem(presentationData: ItemListPresentationData(presentationData), text: text, sectionId: section) - case let .localization(_, info, type): - return LocalizationListItem(presentationData: ItemListPresentationData(presentationData), id: info?.languageCode ?? "", title: info?.title ?? " ", subtitle: info?.localizedTitle ?? " ", checked: false, activity: false, loading: info == nil, editing: LocalizationListItemEditing(editable: false, editing: false, revealed: false, reorderable: false), sectionId: type == .official ? LanguageListSection.official.rawValue : LanguageListSection.unofficial.rawValue, alwaysPlain: searchMode, action: { + case let .localization(_, info, type, isEnabled): + return LocalizationListItem(presentationData: ItemListPresentationData(presentationData), id: info?.languageCode ?? "", title: info?.title ?? " ", subtitle: info?.localizedTitle ?? " ", checked: false, activity: false, loading: info == nil, editing: LocalizationListItemEditing(editable: false, editing: false, revealed: false, reorderable: false), enabled: isEnabled, sectionId: type == .official ? LanguageListSection.official.rawValue : LanguageListSection.unofficial.rawValue, alwaysPlain: searchMode, action: { if let info { selectLocalization(info) } @@ -106,7 +106,7 @@ private final class LocalizationListSearchContainerNode: SearchDisplayController return true } - init(context: AccountContext, listState: LocalizationListState, selectLocalization: @escaping (LocalizationInfo) -> Void) { + init(context: AccountContext, listState: LocalizationListState, excludedIds: [String], selectLocalization: @escaping (LocalizationInfo) -> Void) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } self.presentationData = presentationData @@ -157,7 +157,7 @@ private final class LocalizationListSearchContainerNode: SearchDisplayController var entries: [LanguageListEntry] = [] if let items = items { for item in items { - entries.append(.localization(index: entries.count, info: item, type: .official)) + entries.append(.localization(index: entries.count, info: item, type: .official, isEnabled: !excludedIds.contains(item.languageCode))) } } let previousEntriesAndPresentationData = previousEntriesHolder.swap((entries, presentationData.theme, presentationData.strings)) @@ -364,38 +364,29 @@ final class LanguageSelectionScreenNode: ViewControllerTracingNode { var entries: [LanguageListEntry] = [] var existingIds = Set() - var localizationListState = localizationListState - localizationListState.availableOfficialLocalizations = localizationListState.availableOfficialLocalizations.filter { - !strongSelf.excludeIds.contains($0.languageCode) - } - localizationListState.availableSavedLocalizations = [] - if !localizationListState.availableOfficialLocalizations.isEmpty { strongSelf.currentListState = localizationListState let availableSavedLocalizations = localizationListState.availableSavedLocalizations.filter({ info in !localizationListState.availableOfficialLocalizations.contains(where: { $0.languageCode == info.languageCode }) }) if !availableSavedLocalizations.isEmpty { - //entries.append(.localizationTitle(text: presentationData.strings.Localization_InterfaceLanguage.uppercased(), section: LanguageListSection.unofficial.rawValue)) for info in availableSavedLocalizations { if existingIds.contains(info.languageCode) { continue } existingIds.insert(info.languageCode) - entries.append(.localization(index: entries.count, info: info, type: .unofficial)) + entries.append(.localization(index: entries.count, info: info, type: .unofficial, isEnabled: !strongSelf.excludeIds.contains(info.languageCode))) } - } else { - //entries.append(.localizationTitle(text: presentationData.strings.Localization_InterfaceLanguage.uppercased(), section: LanguageListSection.official.rawValue)) } for info in localizationListState.availableOfficialLocalizations { if existingIds.contains(info.languageCode) { continue } existingIds.insert(info.languageCode) - entries.append(.localization(index: entries.count, info: info, type: .official)) + entries.append(.localization(index: entries.count, info: info, type: .official, isEnabled: !strongSelf.excludeIds.contains(info.languageCode))) } } else { for _ in 0 ..< 15 { - entries.append(.localization(index: entries.count, info: nil, type: .official)) + entries.append(.localization(index: entries.count, info: nil, type: .official, isEnabled: true)) } } @@ -542,6 +533,7 @@ final class LanguageSelectionScreenNode: ViewControllerTracingNode { contentNode: LocalizationListSearchContainerNode( context: self.context, listState: self.currentListState ?? LocalizationListState.defaultSettings, + excludedIds: self.excludeIds, selectLocalization: { [weak self] info in self?.selectLocalization(info) }), diff --git a/submodules/TelegramUI/Components/SpaceWarpView/Sources/SpaceWarpView.swift b/submodules/TelegramUI/Components/SpaceWarpView/Sources/SpaceWarpView.swift index 7c3bc20527..4d77d7cc97 100644 --- a/submodules/TelegramUI/Components/SpaceWarpView/Sources/SpaceWarpView.swift +++ b/submodules/TelegramUI/Components/SpaceWarpView/Sources/SpaceWarpView.swift @@ -124,7 +124,7 @@ private func rippleOffset( } if distance <= 60.0 { - rippleAmount *= 0.4 + rippleAmount = 0.4 * rippleAmount } // A vector of length `amplitude` that points away from position. @@ -368,7 +368,7 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode { transition.setFrame(view: self.backgroundView, frame: CGRect(origin: CGPoint(), size: size)) - let params = RippleParams(amplitude: 26.0, frequency: 15.0, decay: 8.0, speed: 1400.0) + let params = RippleParams(amplitude: 20.0, frequency: 15.0, decay: 8.0, speed: 1400.0) if let currentCloneView = self.currentCloneView { currentCloneView.removeFromSuperview() diff --git a/submodules/TranslateUI/Sources/LocalizationListItem.swift b/submodules/TranslateUI/Sources/LocalizationListItem.swift index dc60b5f59d..6723f2bdc5 100644 --- a/submodules/TranslateUI/Sources/LocalizationListItem.swift +++ b/submodules/TranslateUI/Sources/LocalizationListItem.swift @@ -138,7 +138,7 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode { if self.editableControlNode != nil { return false } - if let _ = self.layoutParams?.0, let item = self.item, !item.loading { + if let _ = self.layoutParams?.0, let item = self.item, !item.loading, item.enabled { return super.canBeSelected } else { return false @@ -334,6 +334,9 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode { transition.updateFrame(node: strongSelf.titleNode, frame: CGRect(origin: CGPoint(x: editingOffset + revealOffset + leftInset, y: 8.0), size: titleLayout.size)) transition.updateFrame(node: strongSelf.subtitleNode, frame: CGRect(origin: CGPoint(x: editingOffset + revealOffset + leftInset, y: strongSelf.titleNode.frame.maxY + 1.0), size: subtitleLayout.size)) + strongSelf.titleNode.alpha = item.enabled ? 1.0 : 0.5 + strongSelf.subtitleNode.alpha = item.enabled ? 1.0 : 0.5 + if let editableControlSizeAndApply = editableControlSizeAndApply { let editableControlFrame = CGRect(origin: CGPoint(x: params.leftInset + revealOffset, y: 0.0), size: CGSize(width: editableControlSizeAndApply.0, height: layout.contentSize.height)) if strongSelf.editableControlNode == nil {