diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoEditorSliderView.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoEditorSliderView.h index 514aad3bda..319a69076e 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoEditorSliderView.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGPhotoEditorSliderView.h @@ -35,6 +35,7 @@ @property (nonatomic, strong) UIImage *knobImage; @property (nonatomic, readonly) UIImageView *knobView; +@property (nonatomic, assign) bool disableSnapToPositions; @property (nonatomic, assign) NSInteger positionsCount; @property (nonatomic, assign) CGFloat dotSize; diff --git a/submodules/LegacyComponents/Sources/TGPhotoEditorSliderView.m b/submodules/LegacyComponents/Sources/TGPhotoEditorSliderView.m index f5210889db..96f847a378 100644 --- a/submodules/LegacyComponents/Sources/TGPhotoEditorSliderView.m +++ b/submodules/LegacyComponents/Sources/TGPhotoEditorSliderView.m @@ -89,7 +89,7 @@ const CGFloat TGPhotoEditorSliderViewInternalMargin = 7.0f; - (void)setPositionsCount:(NSInteger)positionsCount { _positionsCount = positionsCount; - _tapGestureRecognizer.enabled = _positionsCount > 1; + _tapGestureRecognizer.enabled = !_disableSnapToPositions && _positionsCount > 1; _doubleTapGestureRecognizer.enabled = !_tapGestureRecognizer.enabled; } @@ -158,7 +158,6 @@ const CGFloat TGPhotoEditorSliderViewInternalMargin = 7.0f; knobFrame = CGRectMake(knobFrame.origin.y, knobFrame.origin.x, knobFrame.size.width, knobFrame.size.height); } - CGFloat markPosition = visualMargin + visualTotalLength / (_maximumValue - _minimumValue) * (ABS(_minimumValue) + _startValue); if (_markValue > FLT_EPSILON) { CGContextSetFillColorWithColor(context, _backColor.CGColor); @@ -174,60 +173,14 @@ const CGFloat TGPhotoEditorSliderViewInternalMargin = 7.0f; CGContextSetBlendMode(context, kCGBlendModeCopy); } - - if (false && _minimumUndottedValue > -1 && self.positionsCount > 1) { - CGContextSetLineWidth(context, backFrame.size.height); - CGContextSetLineCap(context, kCGLineCapRound); - - for (NSInteger i = 1; i < self.positionsCount; i++) - { - CGFloat previousX = margin + totalLength / (self.positionsCount - 1) * (i - 1); - CGFloat currentX = margin + totalLength / (self.positionsCount - 1) * i; - - if (_minimumUndottedValue < i) { - CGFloat normalDashWidth = 16.0f; - CGFloat dashFraction = 0.6f; - CGFloat totalLineWidth = currentX - previousX; - int numberOfDashes = (int)floor((double)(totalLineWidth / normalDashWidth)); - CGFloat dashWidth = (totalLineWidth / (CGFloat)numberOfDashes); - - CGFloat innerWidth = dashWidth * dashFraction - 2.0f; - CGFloat innerOffset = (dashWidth - innerWidth) / 2.0f; - - CGFloat dottedX = previousX; - - while (dottedX + innerWidth < currentX) { - bool highlighted = dottedX + dashWidth / 2.0f < CGRectGetMaxX(trackFrame); - - CGContextSetStrokeColorWithColor(context, highlighted ? _trackColor.CGColor : _backColor.CGColor); - - CGContextMoveToPoint(context, dottedX + innerOffset, CGRectGetMidY(backFrame)); - CGContextAddLineToPoint(context, dottedX + innerOffset + innerWidth, CGRectGetMidY(backFrame)); - CGContextStrokePath(context); - - dottedX += dashWidth; - } - } else { - bool highlighted = (previousX + (currentX - previousX) / 2.0f) < CGRectGetMaxX(trackFrame); - CGContextSetStrokeColorWithColor(context, highlighted ? _trackColor.CGColor : _backColor.CGColor); - - CGContextMoveToPoint(context, previousX, CGRectGetMidY(backFrame)); - CGContextAddLineToPoint(context, currentX, CGRectGetMidY(backFrame)); - CGContextStrokePath(context); - } - } - } else { - CGContextSetFillColorWithColor(context, _backColor.CGColor); - [self drawRectangle:backFrame cornerRadius:self.trackCornerRadius context:context]; - } + + CGContextSetFillColorWithColor(context, _backColor.CGColor); + [self drawRectangle:backFrame cornerRadius:self.trackCornerRadius context:context]; CGContextSetBlendMode(context, kCGBlendModeNormal); - - if (false && _minimumUndottedValue > -1) { - } else { - CGContextSetFillColorWithColor(context, _trackColor.CGColor); - [self drawRectangle:trackFrame cornerRadius:self.trackCornerRadius context:context]; - } + + CGContextSetFillColorWithColor(context, _trackColor.CGColor); + [self drawRectangle:trackFrame cornerRadius:self.trackCornerRadius context:context]; if (!_startHidden || self.displayEdges) { @@ -644,14 +597,14 @@ const CGFloat TGPhotoEditorSliderViewInternalMargin = 7.0f; totalLength -= _knobPadding * 2; CGFloat previousValue = self.value; - if (self.positionsCount > 1) + if (self.positionsCount > 1 && !self.disableSnapToPositions) { NSInteger position = (NSInteger)round((_knobDragCenter / totalLength) * (self.positionsCount - 1)); _knobDragCenter = position * totalLength / (self.positionsCount - 1); } [self setValue:[self valueForCenterPosition:_knobDragCenter totalLength:totalLength knobSize:_knobView.image.size.width vertical:vertical]]; - if (previousValue != self.value && (self.positionsCount > 1 || self.value == self.minimumValue || self.value == self.maximumValue || (self.minimumValue != self.startValue && self.value == self.startValue))) + if (previousValue != self.value && !self.disableSnapToPositions && (self.positionsCount > 1 || self.value == self.minimumValue || self.value == self.maximumValue || (self.minimumValue != self.startValue && self.value == self.startValue))) { [_feedbackGenerator selectionChanged]; [_feedbackGenerator prepare]; diff --git a/submodules/LegacyUI/Sources/TelegramInitializeLegacyComponents.swift b/submodules/LegacyUI/Sources/TelegramInitializeLegacyComponents.swift index a9bc6176eb..b56eabf474 100644 --- a/submodules/LegacyUI/Sources/TelegramInitializeLegacyComponents.swift +++ b/submodules/LegacyUI/Sources/TelegramInitializeLegacyComponents.swift @@ -308,7 +308,7 @@ private final class LegacyComponentsGlobalsProviderImpl: NSObject, LegacyCompone let navigationBar = presentationTheme.rootController.navigationBar let tabBar = presentationTheme.rootController.tabBar - return TGMediaAssetsPallete(dark: presentationTheme.overallDarkAppearance, backgroundColor: theme.plainBackgroundColor, selectionColor: theme.itemHighlightedBackgroundColor, separatorColor: theme.itemPlainSeparatorColor, textColor: theme.itemPrimaryTextColor, secondaryTextColor: theme.controlSecondaryColor, accentColor: theme.itemAccentColor, destructiveColor: theme.itemDestructiveColor, barBackgroundColor: tabBar.backgroundColor, barSeparatorColor: tabBar.separatorColor, navigationTitleColor: navigationBar.primaryTextColor, badge: generateStretchableFilledCircleImage(diameter: 22.0, color: navigationBar.accentTextColor), badgeTextColor: navigationBar.opaqueBackgroundColor, sendIconImage: PresentationResourcesChat.chatInputPanelSendButtonImage(presentationTheme), doneIconImage: PresentationResourcesChat.chatInputPanelApplyButtonImage(presentationTheme), maybeAccentColor: navigationBar.accentTextColor) + return TGMediaAssetsPallete(dark: presentationTheme.overallDarkAppearance, backgroundColor: theme.plainBackgroundColor, selectionColor: theme.itemHighlightedBackgroundColor, separatorColor: theme.itemPlainSeparatorColor, textColor: theme.itemPrimaryTextColor, secondaryTextColor: theme.controlSecondaryColor, accentColor: theme.itemAccentColor, destructiveColor: theme.itemDestructiveColor, barBackgroundColor: navigationBar.opaqueBackgroundColor, barSeparatorColor: tabBar.separatorColor, navigationTitleColor: navigationBar.primaryTextColor, badge: generateStretchableFilledCircleImage(diameter: 22.0, color: navigationBar.accentTextColor), badgeTextColor: navigationBar.opaqueBackgroundColor, sendIconImage: PresentationResourcesChat.chatInputPanelSendButtonImage(presentationTheme), doneIconImage: PresentationResourcesChat.chatInputPanelApplyButtonImage(presentationTheme), maybeAccentColor: navigationBar.accentTextColor) } func checkButtonPallete() -> TGCheckButtonPallete! { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 3eaebd90cd..b672dd99f1 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -183,7 +183,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate private let serviceBackgroundColorPromise = Promise() private var wallpaperDisposable = MetaDisposable() - private var currentBackgroundColors: ([UInt32], Int32?)? + private var currentBackgroundColors: ([UInt32], Int32?, Int32?)? private var currentBackgroundPromise = Promise<(UIColor, UIColor?)?>() private var patternWallpaper: TelegramWallpaper? @@ -506,11 +506,24 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate if !preview { if !backgroundColors.isEmpty { - strongSelf.currentBackgroundColors = (backgroundColors, strongSelf.state.rotation) + strongSelf.currentBackgroundColors = (backgroundColors, strongSelf.state.rotation, strongSelf.state.patternIntensity) } else { strongSelf.currentBackgroundColors = nil } strongSelf.patternPanelNode.backgroundColors = strongSelf.currentBackgroundColors + } else { + let previousIntensity = strongSelf.patternPanelNode.backgroundColors?.2 + let updatedIntensity = strongSelf.state.patternIntensity + if let previousIntensity = previousIntensity { + if (previousIntensity < 0) != (updatedIntensity < 0) { + if !backgroundColors.isEmpty { + strongSelf.currentBackgroundColors = (backgroundColors, strongSelf.state.rotation, strongSelf.state.patternIntensity) + } else { + strongSelf.currentBackgroundColors = nil + } + strongSelf.patternPanelNode.backgroundColors = strongSelf.currentBackgroundColors + } + } } if let _ = theme, let (layout, navigationBarHeight, messagesBottomInset) = strongSelf.validLayout { diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift index 01d1e28c4c..a570cc3b46 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryController.swift @@ -315,7 +315,6 @@ public class WallpaperGalleryController: ViewController { self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) self.toolbarNode?.updateThemeAndStrings(theme: self.presentationData.theme, strings: self.presentationData.strings) self.patternPanelNode?.updateTheme(self.presentationData.theme) - //self.patternPanelNode?.backgroundColors = self.presentationData.theme.overallDarkAppearance ? ([self.presentationData.theme.list.blocksBackgroundColor.rgb], nil) : nil self.colorsPanelNode?.updateTheme(self.presentationData.theme) } @@ -619,11 +618,11 @@ public class WallpaperGalleryController: ViewController { strongSelf.patternInitialWallpaper = enabled ? initialWallpaper : nil switch initialWallpaper { case let .color(color): - strongSelf.patternPanelNode?.backgroundColors = ([color], nil) + strongSelf.patternPanelNode?.backgroundColors = ([color], nil, nil) case let .gradient(colors, settings): - strongSelf.patternPanelNode?.backgroundColors = (colors, settings.rotation) + strongSelf.patternPanelNode?.backgroundColors = (colors, settings.rotation, nil) case let .file(file) where file.isPattern: - strongSelf.patternPanelNode?.backgroundColors = (file.settings.colors, file.settings.rotation) + strongSelf.patternPanelNode?.backgroundColors = (file.settings.colors, file.settings.rotation, file.settings.intensity) default: break } @@ -821,13 +820,16 @@ public class WallpaperGalleryController: ViewController { patternPanelNode.patternChanged = { [weak self] pattern, intensity, preview in if let strongSelf = self, strongSelf.validLayout != nil, let patternInitialWallpaper = strongSelf.patternInitialWallpaper { var colors: [UInt32] = [] + var rotation: Int32? switch patternInitialWallpaper { case let .color(color): colors = [color] case let .file(file): colors = file.settings.colors - case let .gradient(colorsValue, _): + rotation = file.settings.rotation + case let .gradient(colorsValue, settings): colors = colorsValue + rotation = settings.rotation default: break } @@ -841,9 +843,10 @@ public class WallpaperGalleryController: ViewController { default: break } + + strongSelf.patternPanelNode?.backgroundColors = (colors, rotation, intensity) } } - patternPanelNode.backgroundColors = self.presentationData.theme.overallDarkAppearance ? ([self.presentationData.theme.list.blocksBackgroundColor.rgb], nil) : nil self.patternPanelNode = patternPanelNode currentPatternPanelNode = patternPanelNode self.overlayNode?.insertSubnode(patternPanelNode, belowSubnode: self.toolbarNode!) diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift b/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift index 6536649a55..368468de21 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperPatternPanelNode.swift @@ -189,9 +189,22 @@ final class WallpaperPatternPanelNode: ASDisplayNode { } } - var backgroundColors: ([UInt32], Int32?)? = nil { + var backgroundColors: ([UInt32], Int32?, Int32?)? = nil { didSet { + var updated = false if oldValue?.0 != self.backgroundColors?.0 || oldValue?.1 != self.backgroundColors?.1 { + updated = true + } else if oldValue?.2 != self.backgroundColors?.2 { + if let oldIntensity = oldValue?.2, let newIntensity = self.backgroundColors?.2 { + if (oldIntensity < 0) != (newIntensity < 0) { + updated = true + } + } else if (oldValue?.2 != nil) != (self.backgroundColors?.2 != nil) { + updated = true + } + } + + if updated { self.updateWallpapers() } } @@ -259,11 +272,14 @@ final class WallpaperPatternPanelNode: ASDisplayNode { self.scrollNode.view.alwaysBounceHorizontal = true let sliderView = TGPhotoEditorSliderView() + sliderView.disableSnapToPositions = true sliderView.trackCornerRadius = 1.0 sliderView.lineSize = 2.0 sliderView.minimumValue = 0.0 sliderView.startValue = 0.0 sliderView.maximumValue = 200.0 + sliderView.positionsCount = 3 + sliderView.useLinesForPositions = true sliderView.value = 150.0 sliderView.disablesInteractiveTransitionGestureRecognizer = true sliderView.backgroundColor = .clear @@ -284,7 +300,14 @@ final class WallpaperPatternPanelNode: ASDisplayNode { node.removeFromSupernode() } - let backgroundColors = self.backgroundColors ?? ([0xd6e2ee], nil) + let backgroundColors = self.backgroundColors ?? ([0xd6e2ee], nil, nil) + let intensity: Int32 = backgroundColors.2.flatMap { value in + if value < 0 { + return -80 + } else { + return 80 + } + } ?? 80 var selectedFileId: Int64? if let currentWallpaper = self.currentWallpaper, case let .file(file) = currentWallpaper { @@ -298,7 +321,7 @@ final class WallpaperPatternPanelNode: ASDisplayNode { var updatedWallpaper = wallpaper if case let .file(file) = updatedWallpaper { - let settings = WallpaperSettings(colors: backgroundColors.0, intensity: 100, rotation: backgroundColors.1) + let settings = WallpaperSettings(colors: backgroundColors.0, intensity: intensity, rotation: backgroundColors.1) updatedWallpaper = .file(id: file.id, accessHash: file.accessHash, isCreator: file.isCreator, isDefault: file.isDefault, isPattern: updatedWallpaper.isPattern, isDark: file.isDark, slug: file.slug, file: file.file, settings: settings) }