From d4a35686868f8181295eac449649ecad760d049e Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 21 Dec 2022 00:07:52 +0400 Subject: [PATCH] [WIP] Cache cleanup --- .../Sources/PieChartComponent.swift | 63 ++++++++++++++----- .../StorageCategoryItemCompoment.swift | 4 +- .../Sources/StorageUsageScreen.swift | 2 + 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/PieChartComponent.swift b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/PieChartComponent.swift index e7bea7fb22..e3cd0b51bc 100644 --- a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/PieChartComponent.swift +++ b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/PieChartComponent.swift @@ -99,11 +99,43 @@ final class PieChartComponent: Component { let innerDiameter: CGFloat = 100.0 let spacing: CGFloat = 2.0 let innerAngleSpacing: CGFloat = spacing / (innerDiameter * 0.5) + let minAngle: CGFloat = innerAngleSpacing * 2.0 + 2.0 / (innerDiameter * 0.5) var valueSum: Double = 0.0 for item in component.chartData.items { valueSum += item.value } + var angles: [Double] = [] + var totalAngle: Double = 0.0 + for i in 0 ..< component.chartData.items.count { + let item = component.chartData.items[i] + var angle = item.value / valueSum * CGFloat.pi * 2.0 + if angle < minAngle { + angle = minAngle + } + totalAngle += angle + angles.append(angle) + } + if totalAngle > CGFloat.pi * 2.0 { + let deltaAngle = totalAngle - CGFloat.pi * 2.0 + + var availableAngleSum: Double = 0.0 + for i in 0 ..< angles.count { + let itemAngle = angles[i] + let availableItemAngle = max(0.0, itemAngle - minAngle) + if availableItemAngle > 0.0 { + availableAngleSum += availableItemAngle + } + } + let itemFraction = deltaAngle / availableAngleSum + for i in 0 ..< angles.count { + let availableItemAngle = max(0.0, angles[i] - minAngle) + if availableItemAngle > 0.0 { + let itemDelta = availableItemAngle * itemFraction + angles[i] -= itemDelta + } + } + } let diameter: CGFloat = 200.0 let reducedDiameter: CGFloat = 170.0 @@ -138,7 +170,7 @@ final class PieChartComponent: Component { transition.setFrame(layer: shapeLayer, frame: shapeLayerFrame) - let angleValue: CGFloat = item.value / valueSum * CGFloat.pi * 2.0 + let angleValue: CGFloat = angles[i] let innerStartAngle = startAngle + innerAngleSpacing * 0.5 var innerEndAngle = startAngle + angleValue - innerAngleSpacing * 0.5 @@ -173,41 +205,42 @@ final class PieChartComponent: Component { label = ComponentView() self.labels[item.id] = label } - let labelSize = label.update(transition: .immediate, component: AnyComponent(Text(text: "\(fractionString)%", font: Font.with(size: 15.0, design: .round, weight: .medium), color: component.theme.list.itemCheckColors.foregroundColor)), environment: {}, containerSize: CGSize(width: 100.0, height: 100.0)) + let labelSize = label.update(transition: .immediate, component: AnyComponent(Text(text: "\(fractionString)%", font: Font.with(size: 16.0, design: .round, weight: .semibold), color: component.theme.list.itemCheckColors.foregroundColor)), environment: {}, containerSize: CGSize(width: 100.0, height: 100.0)) + var centerOffset: CGFloat = 0.5 + + var labelScale: CGFloat = 1.0 + if angleValue < 0.38 { + labelScale = angleValue / 0.38 + centerOffset = labelScale * 0.6 + (1.0 - labelScale) * 0.5 + } + let midAngle: CGFloat = (innerStartAngle + innerEndAngle) * 0.5 - let centerDistance: CGFloat = (innerDiameter * 0.5 + (diameter - innerDiameter) * 0.25) + let centerDistance: CGFloat = (innerDiameter * 0.5 + (diameter * 0.5 - innerDiameter * 0.5) * centerOffset) let labelCenter = CGPoint( x: shapeLayerFrame.midX + cos(midAngle) * centerDistance, y: shapeLayerFrame.midY + sin(midAngle) * centerDistance ) let labelFrame = CGRect(origin: CGPoint(x: labelCenter.x - labelSize.width * 0.5, y: labelCenter.y - labelSize.height * 0.5), size: labelSize) - //x2 + y2 = r2 - //x = sqrt(r2 - y2) - //y = sqrt(r2 - x2) - - /*let localLabelRect = labelFrame.offsetBy(dx: -shapeLayerFrame.midX, dy: -shapeLayerFrame.midY) - let outerIntersectionX1 = sqrt(pow(diameter * 0.5, 2.0) - pow(localLabelRect.minY, 2.0)) - let outerIntersectionX2 = sqrt(pow(diameter * 0.5, 2.0) - pow(localLabelRect.maxY, 2.0)) - let outerIntersectionY1 = sqrt(pow(diameter * 0.5, 2.0) - pow(localLabelRect.minX, 2.0)) - let outerIntersectionY2 = sqrt(pow(diameter * 0.5, 2.0) - pow(localLabelRect.maxX, 2.0))*/ - if let labelView = label.view { if labelView.superview == nil { self.addSubview(labelView) } labelView.bounds = CGRect(origin: CGPoint(), size: labelFrame.size) transition.setPosition(view: labelView, position: labelFrame.center) + transition.setScale(view: labelView, scale: labelScale) + + let normalAlpha: CGFloat = labelScale < 0.5 ? 0.0 : 1.0 if let selectedKey = self.selectedKey { if selectedKey == item.id { - transition.setAlpha(view: labelView, alpha: 1.0) + transition.setAlpha(view: labelView, alpha: normalAlpha) } else { transition.setAlpha(view: labelView, alpha: 0.0) } } else { - transition.setAlpha(view: labelView, alpha: 1.0) + transition.setAlpha(view: labelView, alpha: normalAlpha) } } } diff --git a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageCategoryItemCompoment.swift b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageCategoryItemCompoment.swift index d424387c98..1a24727b9f 100644 --- a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageCategoryItemCompoment.swift +++ b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageCategoryItemCompoment.swift @@ -208,7 +208,9 @@ final class StorageCategoryItemComponent: Component { let fractionValue: Double = floor(component.category.sizeFraction * 100.0 * 10.0) / 10.0 let fractionString: String - if abs(Double(Int(fractionValue)) - fractionValue) < 0.001 { + if fractionValue < 0.1 { + fractionString = "<0.1" + } else if abs(Double(Int(fractionValue)) - fractionValue) < 0.001 { fractionString = "\(Int(fractionValue))" } else { fractionString = "\(fractionValue)" diff --git a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift index 5c66ccbf3b..56f6806935 100644 --- a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift +++ b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift @@ -222,8 +222,10 @@ private final class StorageUsageScreenComponent: Component { alphaTransition = .easeInOut(duration: 0.25) } alphaTransition.setAlpha(view: self.scrollView, alpha: self.currentStats != nil ? 1.0 : 0.0) + alphaTransition.setAlpha(view: self.headerOffsetContainer, alpha: self.currentStats != nil ? 1.0 : 0.0) } else { transition.setAlpha(view: self.scrollView, alpha: self.currentStats != nil ? 1.0 : 0.0) + transition.setAlpha(view: self.headerOffsetContainer, alpha: self.currentStats != nil ? 1.0 : 0.0) } let environment = environment[ViewControllerComponentContainer.Environment.self].value