mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 01:10:09 +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 updateState: ((EditThemeControllerState) -> EditThemeControllerState) -> Void
|
||||||
let openColors: () -> Void
|
let openColors: () -> Void
|
||||||
let openFile: () -> 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.context = context
|
||||||
self.updateState = updateState
|
self.updateState = updateState
|
||||||
self.openColors = openColors
|
self.openColors = openColors
|
||||||
self.openFile = openFile
|
self.openFile = openFile
|
||||||
|
self.toggleDark = toggleDark
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,6 +56,7 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
|||||||
case chatPreviewHeader(PresentationTheme, String)
|
case chatPreviewHeader(PresentationTheme, String)
|
||||||
case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationChatBubbleCorners, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, [ChatPreviewMessageItem])
|
case chatPreview(PresentationTheme, PresentationTheme, TelegramWallpaper, PresentationFontSize, PresentationChatBubbleCorners, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, [ChatPreviewMessageItem])
|
||||||
case changeColors(PresentationTheme, String)
|
case changeColors(PresentationTheme, String)
|
||||||
|
case toggleDark(PresentationTheme, String)
|
||||||
case uploadTheme(PresentationTheme, String)
|
case uploadTheme(PresentationTheme, String)
|
||||||
case uploadInfo(PresentationTheme, String)
|
case uploadInfo(PresentationTheme, String)
|
||||||
|
|
||||||
@ -61,7 +64,7 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
|||||||
switch self {
|
switch self {
|
||||||
case .title, .slug, .slugInfo:
|
case .title, .slug, .slugInfo:
|
||||||
return EditThemeControllerSection.info.rawValue
|
return EditThemeControllerSection.info.rawValue
|
||||||
case .chatPreviewHeader, .chatPreview, .changeColors, .uploadTheme, .uploadInfo:
|
case .chatPreviewHeader, .chatPreview, .changeColors, .toggleDark, .uploadTheme, .uploadInfo:
|
||||||
return EditThemeControllerSection.chatPreview.rawValue
|
return EditThemeControllerSection.chatPreview.rawValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,10 +83,12 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
|||||||
return 4
|
return 4
|
||||||
case .changeColors:
|
case .changeColors:
|
||||||
return 5
|
return 5
|
||||||
case .uploadTheme:
|
case .toggleDark:
|
||||||
return 6
|
return 6
|
||||||
case .uploadInfo:
|
case .uploadTheme:
|
||||||
return 7
|
return 7
|
||||||
|
case .uploadInfo:
|
||||||
|
return 8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,6 +130,12 @@ private enum EditThemeControllerEntry: ItemListNodeEntry {
|
|||||||
} else {
|
} else {
|
||||||
return false
|
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):
|
case let .uploadTheme(lhsTheme, lhsText):
|
||||||
if case let .uploadTheme(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
|
if case let .uploadTheme(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText {
|
||||||
return true
|
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: {
|
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
||||||
arguments.openColors()
|
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):
|
case let .uploadTheme(_, text):
|
||||||
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
return ItemListActionItem(presentationData: presentationData, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: {
|
||||||
arguments.openFile()
|
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(.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))
|
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(.uploadTheme(presentationData.theme, uploadText))
|
||||||
entries.append(.uploadInfo(presentationData.theme, uploadInfo))
|
entries.append(.uploadInfo(presentationData.theme, uploadInfo))
|
||||||
}
|
}
|
||||||
@ -278,6 +297,11 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
|||||||
wallpaper = theme.chat.defaultWallpaper
|
wallpaper = theme.chat.defaultWallpaper
|
||||||
settingsPromise.set(.single(settings))
|
settingsPromise.set(.single(settings))
|
||||||
hasSettings = settings != nil
|
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 {
|
} else {
|
||||||
theme = presentationData.theme
|
theme = presentationData.theme
|
||||||
wallpaper = presentationData.chatWallpaper
|
wallpaper = presentationData.chatWallpaper
|
||||||
@ -333,6 +357,10 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
|||||||
let _ = (combineLatest(queue: Queue.mainQueue(), previewThemePromise.get(), settingsPromise.get())
|
let _ = (combineLatest(queue: Queue.mainQueue(), previewThemePromise.get(), settingsPromise.get())
|
||||||
|> take(1)).start(next: { theme, previousSettings in
|
|> take(1)).start(next: { theme, previousSettings in
|
||||||
var controllerDismissImpl: (() -> Void)?
|
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
|
let controller = ThemeAccentColorController(context: context, mode: .edit(theme: theme, wallpaper: nil, generalThemeReference: generalThemeReference, defaultThemeReference: nil, create: false, completion: { updatedTheme, settings in
|
||||||
updateState { current in
|
updateState { current in
|
||||||
var state = current
|
var state = current
|
||||||
@ -398,6 +426,37 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
presentControllerImpl?(controller, nil)
|
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())
|
let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get(), previewThemePromise.get())
|
||||||
|
|||||||
@ -432,7 +432,16 @@ final class ThemeAccentColorController: ViewController {
|
|||||||
|
|
||||||
if case let .colors(initialThemeReference, true) = strongSelf.mode {
|
if case let .colors(initialThemeReference, true) = strongSelf.mode {
|
||||||
let themeSpecificAccentColor = settings.themeSpecificAccentColors[themeReference.index]
|
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?
|
var referenceTheme: PresentationTheme?
|
||||||
if let accentColor = themeSpecificAccentColor, let customWallpaper = settings.themeSpecificChatWallpapers[coloredThemeIndex(reference: themeReference, accentColor: accentColor)] {
|
if let accentColor = themeSpecificAccentColor, let customWallpaper = settings.themeSpecificChatWallpapers[coloredThemeIndex(reference: themeReference, accentColor: accentColor)] {
|
||||||
@ -440,7 +449,7 @@ final class ThemeAccentColorController: ViewController {
|
|||||||
} else if let customWallpaper = settings.themeSpecificChatWallpapers[themeReference.index] {
|
} else if let customWallpaper = settings.themeSpecificChatWallpapers[themeReference.index] {
|
||||||
wallpaper = customWallpaper
|
wallpaper = customWallpaper
|
||||||
} else {
|
} 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
|
referenceTheme = theme
|
||||||
wallpaper = theme.chat.defaultWallpaper
|
wallpaper = theme.chat.defaultWallpaper
|
||||||
}
|
}
|
||||||
|
|||||||
@ -713,7 +713,8 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
|||||||
let _ = (resolvedWallpaper
|
let _ = (resolvedWallpaper
|
||||||
|> deliverOnMainQueue).start(next: { wallpaper in
|
|> 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 = 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?() {
|
if let navigationController = getNavigationControllerImpl?() {
|
||||||
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
|
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
|
||||||
}
|
}
|
||||||
@ -929,7 +930,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
|||||||
})))
|
})))
|
||||||
} else {
|
} 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
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -945,8 +946,12 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The
|
|||||||
|
|
||||||
let _ = (resolvedWallpaper
|
let _ = (resolvedWallpaper
|
||||||
|> deliverOnMainQueue).start(next: { wallpaper in
|
|> 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
|
var hasSettings = false
|
||||||
let controller = editThemeController(context: context, mode: .create(result, nil), navigateToChat: { peerId in
|
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?() {
|
if let navigationController = getNavigationControllerImpl?() {
|
||||||
context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peerId)))
|
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> {
|
public func directDataPath() -> Signal<String, NoError> {
|
||||||
return self.account.postbox.mediaBox.resourceData(resource)
|
return self.account.postbox.mediaBox.resourceData(self.resource)
|
||||||
|> filter { data in
|
|> filter { data in
|
||||||
return data.complete
|
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)
|
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 {
|
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)
|
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