Various improvements

This commit is contained in:
Isaac 2024-07-27 00:04:05 +08:00
parent c2d4b88d32
commit 81cbb58312
5 changed files with 24 additions and 23 deletions

View File

@ -12627,7 +12627,7 @@ Sorry for the inconvenience.";
"BotPreviews.SubtitleLoading" = "loading"; "BotPreviews.SubtitleLoading" = "loading";
"BotPreviews.SubtitleEmpty" = "no preview added"; "BotPreviews.SubtitleEmpty" = "no preview added";
"BotPreviews.SubtitleCount_1" = "1 preview"; "BotPreviews.SubtitleCount_1" = "1 preview";
"BotPreviews.SubtitleCount_any" = "1 previews"; "BotPreviews.SubtitleCount_any" = "%d previews";
"BotPreviews.SheetDeleteTitle_1" = "Delete 1 Preview?"; "BotPreviews.SheetDeleteTitle_1" = "Delete 1 Preview?";
"BotPreviews.SheetDeleteTitle_any" = "Delete %d Previews?"; "BotPreviews.SheetDeleteTitle_any" = "Delete %d Previews?";
"BotPreviews.LanguageTab.Main" = "Main"; "BotPreviews.LanguageTab.Main" = "Main";

View File

@ -3614,11 +3614,15 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
effectiveScrollingOffset = self.itemGrid.scrollingOffset effectiveScrollingOffset = self.itemGrid.scrollingOffset
botPreviewLanguageTabFrame.origin.y -= effectiveScrollingOffset botPreviewLanguageTabFrame.origin.y -= effectiveScrollingOffset
let isSelectingOrReordering = self.isReordering || self.itemInteraction.selectedIds != nil
if let botPreviewLanguageTabView = botPreviewLanguageTab.view { if let botPreviewLanguageTabView = botPreviewLanguageTab.view {
if botPreviewLanguageTabView.superview == nil { if botPreviewLanguageTabView.superview == nil {
self.view.addSubview(botPreviewLanguageTabView) self.view.addSubview(botPreviewLanguageTabView)
} }
transition.updateFrame(view: botPreviewLanguageTabView, frame: botPreviewLanguageTabFrame) 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() let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: id, ids: updatedPinnedIds).startStandalone()
} }
} }
self.update(transition: animated ? .animated(duration: 0.4, curve: .spring) : .immediate)
} }
} }
} }

View File

@ -32,13 +32,13 @@ private enum LanguageListEntryType {
private enum LanguageListEntry: Comparable, Identifiable { private enum LanguageListEntry: Comparable, Identifiable {
case localizationTitle(text: String, section: ItemListSectionId) 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 { var stableId: LanguageListEntryId {
switch self { switch self {
case .localizationTitle: case .localizationTitle:
return .localizationTitle return .localizationTitle
case let .localization(index, info, _): case let .localization(index, info, _, _):
return .localization(info?.languageCode ?? "\(index)") return .localization(info?.languageCode ?? "\(index)")
} }
} }
@ -47,7 +47,7 @@ private enum LanguageListEntry: Comparable, Identifiable {
switch self { switch self {
case .localizationTitle: case .localizationTitle:
return 1000 return 1000
case let .localization(index, _, _): case let .localization(index, _, _, _):
return 1001 + index return 1001 + index
} }
} }
@ -60,8 +60,8 @@ private enum LanguageListEntry: Comparable, Identifiable {
switch self { switch self {
case let .localizationTitle(text, section): case let .localizationTitle(text, section):
return ItemListSectionHeaderItem(presentationData: ItemListPresentationData(presentationData), text: text, sectionId: section) return ItemListSectionHeaderItem(presentationData: ItemListPresentationData(presentationData), text: text, sectionId: section)
case let .localization(_, info, type): 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), sectionId: type == .official ? LanguageListSection.official.rawValue : LanguageListSection.unofficial.rawValue, alwaysPlain: searchMode, action: { 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 { if let info {
selectLocalization(info) selectLocalization(info)
} }
@ -106,7 +106,7 @@ private final class LocalizationListSearchContainerNode: SearchDisplayController
return true 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 } let presentationData = context.sharedContext.currentPresentationData.with { $0 }
self.presentationData = presentationData self.presentationData = presentationData
@ -157,7 +157,7 @@ private final class LocalizationListSearchContainerNode: SearchDisplayController
var entries: [LanguageListEntry] = [] var entries: [LanguageListEntry] = []
if let items = items { if let items = items {
for item in 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)) let previousEntriesAndPresentationData = previousEntriesHolder.swap((entries, presentationData.theme, presentationData.strings))
@ -364,38 +364,29 @@ final class LanguageSelectionScreenNode: ViewControllerTracingNode {
var entries: [LanguageListEntry] = [] var entries: [LanguageListEntry] = []
var existingIds = Set<String>() var existingIds = Set<String>()
var localizationListState = localizationListState
localizationListState.availableOfficialLocalizations = localizationListState.availableOfficialLocalizations.filter {
!strongSelf.excludeIds.contains($0.languageCode)
}
localizationListState.availableSavedLocalizations = []
if !localizationListState.availableOfficialLocalizations.isEmpty { if !localizationListState.availableOfficialLocalizations.isEmpty {
strongSelf.currentListState = localizationListState strongSelf.currentListState = localizationListState
let availableSavedLocalizations = localizationListState.availableSavedLocalizations.filter({ info in !localizationListState.availableOfficialLocalizations.contains(where: { $0.languageCode == info.languageCode }) }) let availableSavedLocalizations = localizationListState.availableSavedLocalizations.filter({ info in !localizationListState.availableOfficialLocalizations.contains(where: { $0.languageCode == info.languageCode }) })
if !availableSavedLocalizations.isEmpty { if !availableSavedLocalizations.isEmpty {
//entries.append(.localizationTitle(text: presentationData.strings.Localization_InterfaceLanguage.uppercased(), section: LanguageListSection.unofficial.rawValue))
for info in availableSavedLocalizations { for info in availableSavedLocalizations {
if existingIds.contains(info.languageCode) { if existingIds.contains(info.languageCode) {
continue continue
} }
existingIds.insert(info.languageCode) 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 { for info in localizationListState.availableOfficialLocalizations {
if existingIds.contains(info.languageCode) { if existingIds.contains(info.languageCode) {
continue continue
} }
existingIds.insert(info.languageCode) 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 { } else {
for _ in 0 ..< 15 { 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( contentNode: LocalizationListSearchContainerNode(
context: self.context, context: self.context,
listState: self.currentListState ?? LocalizationListState.defaultSettings, listState: self.currentListState ?? LocalizationListState.defaultSettings,
excludedIds: self.excludeIds,
selectLocalization: { [weak self] info in selectLocalization: { [weak self] info in
self?.selectLocalization(info) self?.selectLocalization(info)
}), }),

View File

@ -124,7 +124,7 @@ private func rippleOffset(
} }
if distance <= 60.0 { if distance <= 60.0 {
rippleAmount *= 0.4 rippleAmount = 0.4 * rippleAmount
} }
// A vector of length `amplitude` that points away from position. // 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)) 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 { if let currentCloneView = self.currentCloneView {
currentCloneView.removeFromSuperview() currentCloneView.removeFromSuperview()

View File

@ -138,7 +138,7 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode {
if self.editableControlNode != nil { if self.editableControlNode != nil {
return false 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 return super.canBeSelected
} else { } else {
return false 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.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)) 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 { 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)) 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 { if strongSelf.editableControlNode == nil {