From 767b0603a6f7a9714e4b3e1c41ce8bb11a97c449 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 20 Oct 2020 01:33:16 +0400 Subject: [PATCH] Add pin list edge setting --- .../SettingsUI/Sources/DebugController.swift | 24 +++++++++++++++---- .../TelegramUI/Sources/ChatController.swift | 19 ++++++++++++--- .../Sources/ExperimentalUISettings.swift | 10 ++++++-- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index e1ad7b484e..59060fa334 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -74,6 +74,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { case photoPreview(PresentationTheme, Bool) case knockoutWallpaper(PresentationTheme, Bool) case alternativeFolderTabs(Bool) + case snapPinListToTop(Bool) case playerEmbedding(Bool) case playlistPlayback(Bool) case voiceConference @@ -93,7 +94,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return DebugControllerSection.logging.rawValue case .enableRaiseToSpeak, .keepChatNavigationStack, .skipReadHistory, .crashOnSlowQueries: return DebugControllerSection.experiments.rawValue - case .clearTips, .reimport, .resetData, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .reindexUnread, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .alternativeFolderTabs, .playerEmbedding, .playlistPlayback, .voiceConference: + case .clearTips, .reimport, .resetData, .resetDatabase, .resetDatabaseAndCache, .resetHoles, .reindexUnread, .resetBiometricsData, .optimizeDatabase, .photoPreview, .knockoutWallpaper, .alternativeFolderTabs, .snapPinListToTop, .playerEmbedding, .playlistPlayback, .voiceConference: return DebugControllerSection.experiments.rawValue case .preferredVideoCodec: return DebugControllerSection.videoExperiments.rawValue @@ -156,14 +157,16 @@ private enum DebugControllerEntry: ItemListNodeEntry { return 23 case .alternativeFolderTabs: return 24 - case .playerEmbedding: + case .snapPinListToTop: return 25 - case .playlistPlayback: + case .playerEmbedding: return 26 - case .voiceConference: + case .playlistPlayback: return 27 + case .voiceConference: + return 28 case let .preferredVideoCodec(index, _, _, _): - return 28 + index + return 29 + index case .disableVideoAspectScaling: return 100 case .enableVoipTcp: @@ -703,6 +706,16 @@ private enum DebugControllerEntry: ItemListNodeEntry { }) }).start() }) + case let .snapPinListToTop(value): + return ItemListSwitchItem(presentationData: presentationData, title: "Pin List Top Edge", value: value, sectionId: self.section, style: .blocks, updated: { value in + let _ = arguments.sharedContext.accountManager.transaction ({ transaction in + transaction.updateSharedData(ApplicationSpecificSharedDataKeys.experimentalUISettings, { settings in + var settings = settings as? ExperimentalUISettings ?? ExperimentalUISettings.defaultSettings + settings.snapPinListToTop = value + return settings + }) + }).start() + }) case let .playerEmbedding(value): return ItemListSwitchItem(presentationData: presentationData, title: "Player Embedding", value: value, sectionId: self.section, style: .blocks, updated: { value in let _ = arguments.sharedContext.accountManager.transaction ({ transaction in @@ -807,6 +820,7 @@ private func debugControllerEntries(presentationData: PresentationData, loggingS //entries.append(.photoPreview(presentationData.theme, experimentalSettings.chatListPhotos)) entries.append(.knockoutWallpaper(presentationData.theme, experimentalSettings.knockoutWallpaper)) entries.append(.alternativeFolderTabs(experimentalSettings.foldersTabAtBottom)) + entries.append(.snapPinListToTop(experimentalSettings.snapPinListToTop)) entries.append(.playerEmbedding(experimentalSettings.playerEmbedding)) entries.append(.playlistPlayback(experimentalSettings.playlistPlayback)) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 7da5eafea0..cf309cce94 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3269,6 +3269,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var isScrolled: Bool } + let messageRangeEdge: Signal = self.context.sharedContext.accountManager.sharedData(keys: Set([ApplicationSpecificSharedDataKeys.experimentalUISettings])) + |> map { sharedData -> Bool in + let experimentalSettings: ExperimentalUISettings = (sharedData.entries[ApplicationSpecificSharedDataKeys.experimentalUISettings] as? ExperimentalUISettings) ?? ExperimentalUISettings.defaultSettings + return experimentalSettings.snapPinListToTop + } + |> distinctUntilChanged + let referenceMessage: Signal if latest { referenceMessage = .single(nil) @@ -3276,10 +3283,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G referenceMessage = combineLatest( queue: Queue.mainQueue(), self.scrolledToMessageId.get(), - self.chatDisplayNode.historyNode.topVisibleMessageRange.get() + self.chatDisplayNode.historyNode.topVisibleMessageRange.get(), + messageRangeEdge ) - |> map { scrolledToMessageId, topVisibleMessageRange -> ReferenceMessage? in - let topVisibleMessage = topVisibleMessageRange?.upperBound + |> map { scrolledToMessageId, topVisibleMessageRange, messageRangeEdge -> ReferenceMessage? in + let topVisibleMessage: MessageId? + if messageRangeEdge { + topVisibleMessage = topVisibleMessageRange?.lowerBound + } else { + topVisibleMessage = topVisibleMessageRange?.upperBound + } if let scrolledToMessageId = scrolledToMessageId { if let topVisibleMessage = topVisibleMessage { diff --git a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift index 185242e856..d4e2afc539 100644 --- a/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift +++ b/submodules/TelegramUIPreferences/Sources/ExperimentalUISettings.swift @@ -14,6 +14,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { public var preferredVideoCodec: String? public var disableVideoAspectScaling: Bool public var enableVoipTcp: Bool + public var snapPinListToTop: Bool public static var defaultSettings: ExperimentalUISettings { return ExperimentalUISettings( @@ -27,7 +28,8 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { playlistPlayback: false, preferredVideoCodec: nil, disableVideoAspectScaling: false, - enableVoipTcp: false + enableVoipTcp: false, + snapPinListToTop: false ) } @@ -42,7 +44,8 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { playlistPlayback: Bool, preferredVideoCodec: String?, disableVideoAspectScaling: Bool, - enableVoipTcp: Bool + enableVoipTcp: Bool, + snapPinListToTop: Bool ) { self.keepChatNavigationStack = keepChatNavigationStack self.skipReadHistory = skipReadHistory @@ -55,6 +58,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { self.preferredVideoCodec = preferredVideoCodec self.disableVideoAspectScaling = disableVideoAspectScaling self.enableVoipTcp = enableVoipTcp + self.snapPinListToTop = snapPinListToTop } public init(decoder: PostboxDecoder) { @@ -69,6 +73,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { self.preferredVideoCodec = decoder.decodeOptionalStringForKey("preferredVideoCodec") self.disableVideoAspectScaling = decoder.decodeInt32ForKey("disableVideoAspectScaling", orElse: 0) != 0 self.enableVoipTcp = decoder.decodeInt32ForKey("enableVoipTcp", orElse: 0) != 0 + self.snapPinListToTop = decoder.decodeInt32ForKey("snapPinListToTop", orElse: 0) != 0 } public func encode(_ encoder: PostboxEncoder) { @@ -85,6 +90,7 @@ public struct ExperimentalUISettings: Equatable, PreferencesEntry { } encoder.encodeInt32(self.disableVideoAspectScaling ? 1 : 0, forKey: "disableVideoAspectScaling") encoder.encodeInt32(self.enableVoipTcp ? 1 : 0, forKey: "enableVoipTcp") + encoder.encodeInt32(self.snapPinListToTop ? 1 : 0, forKey: "snapPinListToTop") } public func isEqual(to: PreferencesEntry) -> Bool {