mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various theme editor fixes
This commit is contained in:
parent
6353454d6f
commit
b3ded6f7f7
@ -20,12 +20,14 @@ private final class EditThemeControllerArguments {
|
||||
let updateState: ((EditThemeControllerState) -> EditThemeControllerState) -> Void
|
||||
let openColors: () -> Void
|
||||
let openFile: () -> Void
|
||||
let toggleDark: () -> Void
|
||||
|
||||
init(context: AccountContext, updateState: @escaping ((EditThemeControllerState) -> EditThemeControllerState) -> Void, openColors: @escaping () -> Void, openFile: @escaping () -> Void) {
|
||||
init(context: AccountContext, updateState: @escaping ((EditThemeControllerState) -> EditThemeControllerState) -> Void, openColors: @escaping () -> Void, openFile: @escaping () -> Void, toggleDark: @escaping () -> Void) {
|
||||
self.context = context
|
||||
self.updateState = updateState
|
||||
self.openColors = openColors
|
||||
self.openFile = openFile
|
||||
self.toggleDark = toggleDark
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,6 +56,7 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
||||
case chatPreviewHeader(PresentationTheme, String)
|
||||
case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationChatBubbleCorners, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, [ChatPreviewMessageItem])
|
||||
case changeColors(PresentationTheme, String)
|
||||
case toggleDark(PresentationTheme, String)
|
||||
case uploadTheme(PresentationTheme, String)
|
||||
case uploadInfo(PresentationTheme, String)
|
||||
|
||||
@ -61,7 +64,7 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
||||
switch self {
|
||||
case .title, .slug, .slugInfo:
|
||||
return EditThemeControllerSection.info.rawValue
|
||||
case .chatPreviewHeader, .chatPreview, .changeColors, .uploadTheme, .uploadInfo:
|
||||
case .chatPreviewHeader, .chatPreview, .changeColors, .toggleDark, .uploadTheme, .uploadInfo:
|
||||
return EditThemeControllerSection.chatPreview.rawValue
|
||||
}
|
||||
}
|
||||
@ -80,10 +83,12 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
||||
return 4
|
||||
case .changeColors:
|
||||
return 5
|
||||
case .uploadTheme:
|
||||
case .toggleDark:
|
||||
return 6
|
||||
case .uploadInfo:
|
||||
case .uploadTheme:
|
||||
return 7
|
||||
case .uploadInfo:
|
||||
return 8
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,6 +130,12 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .toggleDark(lhsTheme, lhsText):
|
||||
if case let .toggleDark(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .uploadTheme(lhsTheme, lhsText):
|
||||
if case let .uploadTheme(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
|
||||
return true
|
||||
@ -177,6 +188,10 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
||||
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
||||
arguments.openColors()
|
||||
})
|
||||
case let .toggleDark(_, text):
|
||||
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
||||
arguments.toggleDark()
|
||||
})
|
||||
case let .uploadTheme(_, text):
|
||||
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
||||
arguments.openFile()
|
||||
@ -255,7 +270,11 @@ private func editThemeControllerEntries(presentationData: PresentationData, stat
|
||||
entries.append(.chatPreview(presentationData.theme, previewTheme, previewTheme.chat.defaultWallpaper, presentationData.chatFontSize, presentationData.chatBubbleCorners, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, [ChatPreviewMessageItem(outgoing: false, reply: (previewIncomingReplyName, previewIncomingReplyText), text: previewIncomingText), ChatPreviewMessageItem(outgoing: true, reply: nil, text: previewOutgoingText)]))
|
||||
|
||||
entries.append(.changeColors(presentationData.theme, presentationData.strings.EditTheme_ChangeColors))
|
||||
if !hasSettings {
|
||||
if hasSettings {
|
||||
if previewTheme.overallDarkAppearance {
|
||||
entries.append(.toggleDark(presentationData.theme, "Toggle Base Theme"))
|
||||
}
|
||||
} else {
|
||||
entries.append(.uploadTheme(presentationData.theme, uploadText))
|
||||
entries.append(.uploadInfo(presentationData.theme, uploadInfo))
|
||||
}
|
||||
@ -278,6 +297,11 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
||||
wallpaper = theme.chat.defaultWallpaper
|
||||
settingsPromise.set(.single(settings))
|
||||
hasSettings = settings != nil
|
||||
} else if let settings = settings {
|
||||
theme = makePresentationTheme(settings: settings) ?? presentationData.theme
|
||||
wallpaper = theme.chat.defaultWallpaper
|
||||
settingsPromise.set(.single(settings))
|
||||
hasSettings = true
|
||||
} else {
|
||||
theme = presentationData.theme
|
||||
wallpaper = presentationData.chatWallpaper
|
||||
@ -333,6 +357,10 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
||||
let _ = (combineLatest(queue: Queue.mainQueue(), previewThemePromise.get(), settingsPromise.get())
|
||||
|> take(1)).start(next: { theme, previousSettings in
|
||||
var controllerDismissImpl: (() -> Void)?
|
||||
var generalThemeReference = generalThemeReference
|
||||
if let settings = previousSettings {
|
||||
generalThemeReference = .builtin(PresentationBuiltinThemeReference(baseTheme: settings.baseTheme))
|
||||
}
|
||||
let controller = ThemeAccentColorController(context: context, mode: .edit(theme: theme, wallpaper: nil, generalThemeReference: generalThemeReference, defaultThemeReference: nil, create: false, completion: { updatedTheme, settings in
|
||||
updateState { current in
|
||||
var state = current
|
||||
@ -398,6 +426,37 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
||||
}
|
||||
})
|
||||
presentControllerImpl?(controller, nil)
|
||||
}, toggleDark: {
|
||||
let _ = (combineLatest(queue: Queue.mainQueue(), previewThemePromise.get(), settingsPromise.get())
|
||||
|> take(1)).start(next: { theme, previousSettings in
|
||||
var updatedTheme = theme
|
||||
var updatedSettings: TelegramThemeSettings?
|
||||
|
||||
if let themeSettings = previousSettings {
|
||||
if updatedTheme.referenceTheme == .night {
|
||||
updatedTheme = updatedTheme.withUpdated(referenceTheme: .nightAccent)
|
||||
updatedSettings = TelegramThemeSettings(baseTheme: .tinted, accentColor: themeSettings.accentColor, outgoingAccentColor: themeSettings.outgoingAccentColor, messageColors: themeSettings.messageColors, animateMessageColors: themeSettings.animateMessageColors, wallpaper: themeSettings.wallpaper)
|
||||
if let settings = updatedSettings, let theme = makePresentationTheme(settings: settings) {
|
||||
updatedTheme = theme
|
||||
}
|
||||
} else if updatedTheme.referenceTheme == .nightAccent {
|
||||
updatedSettings = TelegramThemeSettings(baseTheme: .night, accentColor: themeSettings.accentColor, outgoingAccentColor: themeSettings.outgoingAccentColor, messageColors: themeSettings.messageColors, animateMessageColors: themeSettings.animateMessageColors, wallpaper: themeSettings.wallpaper)
|
||||
if let settings = updatedSettings, let theme = makePresentationTheme(settings: settings) {
|
||||
updatedTheme = theme
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateState { current in
|
||||
var state = current
|
||||
previewThemePromise.set(.single(updatedTheme))
|
||||
state.updatedTheme = updatedTheme
|
||||
return state
|
||||
}
|
||||
if previousSettings != nil {
|
||||
settingsPromise.set(.single(updatedSettings))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), previewThemePromise.get())
|
||||
|
@ -432,15 +432,24 @@ final class ThemeAccentColorController: ViewController {
|
||||
|
||||
if case let .colors(initialThemeReference, true) = strongSelf.mode {
|
||||
let themeSpecificAccentColor = settings.themeSpecificAccentColors[themeReference.index]
|
||||
accentColor = themeSpecificAccentColor?.color ?? defaultDayAccentColor
|
||||
|
||||
var customAccentColor: UIColor?
|
||||
if let color = themeSpecificAccentColor?.color {
|
||||
accentColor = color
|
||||
customAccentColor = accentColor
|
||||
} else if case let .cloud(cloudTheme) = initialThemeReference, let settings = cloudTheme.theme.settings {
|
||||
accentColor = UIColor(rgb: settings.accentColor)
|
||||
customAccentColor = accentColor
|
||||
} else {
|
||||
accentColor = defaultDayAccentColor
|
||||
}
|
||||
|
||||
var referenceTheme: PresentationTheme?
|
||||
if let accentColor = themeSpecificAccentColor, let customWallpaper = settings.themeSpecificChatWallpapers[coloredThemeIndex(reference: themeReference, accentColor: accentColor)] {
|
||||
wallpaper = customWallpaper
|
||||
} else if let customWallpaper = settings.themeSpecificChatWallpapers[themeReference.index] {
|
||||
wallpaper = customWallpaper
|
||||
} else {
|
||||
let theme = makePresentationTheme(mediaBox: strongSelf.context.sharedContext.accountManager.mediaBox, themeReference: themeReference, accentColor: themeSpecificAccentColor?.color, wallpaper: themeSpecificAccentColor?.wallpaper, baseColor: themeSpecificAccentColor?.baseColor) ?? defaultPresentationTheme
|
||||
let theme = makePresentationTheme(mediaBox: strongSelf.context.sharedContext.accountManager.mediaBox, themeReference: themeReference, accentColor: customAccentColor, wallpaper: themeSpecificAccentColor?.wallpaper, baseColor: themeSpecificAccentColor?.baseColor) ?? defaultPresentationTheme
|
||||
referenceTheme = theme
|
||||
wallpaper = theme.chat.defaultWallpaper
|
||||
}
|
||||
|
@ -713,7 +713,8 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
||||
let _ = (resolvedWallpaper
|
||||
|> deliverOnMainQueue).start(next: { wallpaper in
|
||||
let controller = ThemeAccentColorController(context: context, mode: .edit(theme: theme, wallpaper: wallpaper, generalThemeReference: reference.generalThemeReference, defaultThemeReference: nil, create: true, completion: { result, settings in
|
||||
let controller = editThemeController(context: context, mode: .create(result, nil), navigateToChat: { peerId in
|
||||
let controller = editThemeController(context: context, mode: .create(result, settings
|
||||
), navigateToChat: { peerId in
|
||||
if let navigationController = getNavigationControllerImpl?() {
|
||||
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
|
||||
}
|
||||
@ -929,7 +930,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
||||
})))
|
||||
} else {
|
||||
items.append(.action(ContextMenuActionItem(text: strings.Theme_Context_ChangeColors, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/ApplyTheme"), color: theme.contextMenu.primaryColor) }, action: { c, f in
|
||||
guard let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: reference, preview: false) else {
|
||||
guard let theme = makePresentationTheme(mediaBox: context.sharedContext.accountManager.mediaBox, themeReference: effectiveThemeReference, preview: false) else {
|
||||
return
|
||||
}
|
||||
|
||||
@ -945,8 +946,12 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
||||
|
||||
let _ = (resolvedWallpaper
|
||||
|> deliverOnMainQueue).start(next: { wallpaper in
|
||||
let controller = ThemeAccentColorController(context: context, mode: .edit(theme: theme, wallpaper: wallpaper, generalThemeReference: reference.generalThemeReference, defaultThemeReference: nil, create: true, completion: { result, settings in
|
||||
let controller = editThemeController(context: context, mode: .create(result, nil), navigateToChat: { peerId in
|
||||
var hasSettings = false
|
||||
if case let .cloud(cloudTheme) = effectiveThemeReference, cloudTheme.theme.settings != nil {
|
||||
hasSettings = true
|
||||
}
|
||||
let controller = ThemeAccentColorController(context: context, mode: .edit(theme: theme, wallpaper: wallpaper, generalThemeReference: effectiveThemeReference.generalThemeReference, defaultThemeReference: nil, create: true, completion: { result, settings in
|
||||
let controller = editThemeController(context: context, mode: .create(hasSettings ? nil : result, hasSettings ? settings : nil), navigateToChat: { peerId in
|
||||
if let navigationController = getNavigationControllerImpl?() {
|
||||
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ public final class AnimatedStickerResourceSource: AnimatedStickerNodeSource {
|
||||
}
|
||||
|
||||
public func directDataPath() -> Signal<String, NoError> {
|
||||
return self.account.postbox.mediaBox.resourceData(resource)
|
||||
return self.account.postbox.mediaBox.resourceData(self.resource)
|
||||
|> filter { data in
|
||||
return data.complete
|
||||
}
|
||||
|
@ -1324,6 +1324,10 @@ public final class PresentationTheme: Equatable {
|
||||
return PresentationTheme(name: name.flatMap(PresentationThemeName.custom) ?? .custom(self.name.string), index: self.index, referenceTheme: self.referenceTheme, overallDarkAppearance: self.overallDarkAppearance, intro: self.intro, passcode: self.passcode, rootController: self.rootController, list: self.list, chatList: self.chatList, chat: self.chat.withUpdated(defaultWallpaper: defaultWallpaper), actionSheet: self.actionSheet, contextMenu: self.contextMenu, inAppNotification: self.inAppNotification, chart: self.chart, preview: self.preview)
|
||||
}
|
||||
|
||||
public func withUpdated(referenceTheme: PresentationBuiltinThemeReference) -> PresentationTheme {
|
||||
return PresentationTheme(name: self.name, index: self.index, referenceTheme: referenceTheme, overallDarkAppearance: self.overallDarkAppearance, intro: self.intro, passcode: self.passcode, rootController: self.rootController, list: self.list, chatList: self.chatList, chat: self.chat, actionSheet: self.actionSheet, contextMenu: self.contextMenu, inAppNotification: self.inAppNotification, chart: self.chart, preview: self.preview)
|
||||
}
|
||||
|
||||
public func withUpdated(preview: Bool) -> PresentationTheme {
|
||||
return PresentationTheme(name: self.name, index: self.index, referenceTheme: self.referenceTheme, overallDarkAppearance: self.overallDarkAppearance, intro: self.intro, passcode: self.passcode, rootController: self.rootController, list: self.list, chatList: self.chatList, chat: self.chat, actionSheet: self.actionSheet, contextMenu: self.contextMenu, inAppNotification: self.inAppNotification, chart: self.chart, preview: preview)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user