Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion XcodeCleaner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1150;
LastUpgradeCheck = 1170;
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = "Kirill Pustovalov";
TargetAttributes = {
9DD3BA6B24B4639400EDA308 = {
Expand Down Expand Up @@ -422,6 +422,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
Expand Down Expand Up @@ -482,6 +483,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
Expand Down
13 changes: 10 additions & 3 deletions XcodeCleaner/DirectoryManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,16 @@ struct DirectoryManager {
let derivedDataPath = "DerivedData/"
return "\(xcodePath + derivedDataPath)"
}
func getDeviceSupportPath() -> String {
func getIOSDeviceSupportPath() -> String {
let xcodePath = getXcodeDefaultPath()
let deviceSupportPath = "iOS DeviceSupport/"
return "\(xcodePath + deviceSupportPath)"
}
func getWatchOSDeviceSupportPath() -> String {
let xcodePath = getXcodeDefaultPath()
let watchOSDeviceSupport = "watchOS DeviceSupport/"
return "\(xcodePath + watchOSDeviceSupport)"
}
func getArchivesPath() -> String {
let xcodePath = getXcodeDefaultPath()
let archivesPath = "Archives/"
Expand Down Expand Up @@ -125,8 +130,10 @@ struct DirectoryManager {
switch type {
case .derivedData:
path = getDerivedDataPath()
case .deviceSupport:
path = getDeviceSupportPath()
case .iOSDeviceSupport:
path = getIOSDeviceSupportPath()
case .watchOSDeviceSupport:
path = getWatchOSDeviceSupportPath()
case .archives:
path = getArchivesPath()
case .iOSDeviceLogs:
Expand Down
6 changes: 3 additions & 3 deletions XcodeCleaner/Enums/DirectoryType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
import SwiftUI

public enum DirectoryType: String, CaseIterable {

case derivedData
case deviceSupport
case iOSDeviceSupport
case watchOSDeviceSupport
case documentationCache
case archives
case iOSDeviceLogs
case documentationCache
}
2 changes: 1 addition & 1 deletion XcodeCleaner/Protocols/PieChartViewModelProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ import Foundation
protocol PieChartViewModelProtocol {
var items: [PieChartItemModel] { get set }

mutating func createItems(derivedData: [DirectoryModel], deviceSupport: [DirectoryModel], archives: [DirectoryModel], iOSDeviceLogs: [DirectoryModel], documentationCache: [DirectoryModel])
mutating func createItems(derivedData: [DirectoryModel], iOSDeviceSupport: [DirectoryModel], watchOSDeviceSupport: [DirectoryModel], archives: [DirectoryModel], iOSDeviceLogs: [DirectoryModel], documentationCache: [DirectoryModel])
func getPCItems() -> PCItems
}
2 changes: 1 addition & 1 deletion XcodeCleaner/Protocols/ViewModelProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ protocol ViewModelProtocol {
var totalSize: Int64 { get set }

var derivedData: [DirectoryModel] { get set }
var deviceSupport: [DirectoryModel] { get set }
var iOSDeviceSupport: [DirectoryModel] { get set }
var archives: [DirectoryModel] { get set }

var scanProgress: Double { get }
Expand Down
27 changes: 17 additions & 10 deletions XcodeCleaner/ViewModels/PieChartViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,20 @@ import SwiftUI
struct PieChartViewModel: PieChartViewModelProtocol {
var items: [PieChartItemModel] = []

mutating func createItems(derivedData: [DirectoryModel], deviceSupport: [DirectoryModel], archives: [DirectoryModel], iOSDeviceLogs: [DirectoryModel], documentationCache: [DirectoryModel]) {
mutating func createItems(derivedData: [DirectoryModel], iOSDeviceSupport: [DirectoryModel], watchOSDeviceSupport: [DirectoryModel], archives: [DirectoryModel], iOSDeviceLogs: [DirectoryModel], documentationCache: [DirectoryModel]) {
var derivedDataSize: Int64 = 0
derivedData.forEach {
derivedDataSize += $0.size
}

var deviceSupportSize: Int64 = 0
deviceSupport.forEach {
deviceSupportSize += $0.size
var iOSDeviceSupportSize: Int64 = 0
iOSDeviceSupport.forEach {
iOSDeviceSupportSize += $0.size
}

var watchOSDeviceSupportSize: Int64 = 0
watchOSDeviceSupport.forEach {
watchOSDeviceSupportSize += $0.size
}

var archivesSize: Int64 = 0
Expand All @@ -38,28 +43,30 @@ struct PieChartViewModel: PieChartViewModelProtocol {
}

var derivedData: PieChartItemModel
var deviceSupport: PieChartItemModel
var iOSDeviceSupport: PieChartItemModel
var watchOSDeviceSupport: PieChartItemModel
var archives: PieChartItemModel
var iOSDeviceLogs: PieChartItemModel
var documentationCache: PieChartItemModel

if derivedDataSize == 0 && deviceSupportSize == 0 && archivesSize == 0 && iOSDeviceLogsSize == 0 && documentationCacheSize == 0 {
if derivedDataSize == 0 && iOSDeviceSupportSize == 0 && archivesSize == 0 && iOSDeviceLogsSize == 0 && watchOSDeviceSupportSize == 0 && documentationCacheSize == 0 {
let defaultValue = 1.0

derivedData = PieChartItemModel(value: defaultValue, color: .pink)
deviceSupport = PieChartItemModel(value: defaultValue, color: Color(.cyan))
iOSDeviceSupport = PieChartItemModel(value: defaultValue, color: Color(.cyan))
archives = PieChartItemModel(value: defaultValue, color: .orange)

let items = [archives, deviceSupport, derivedData]
let items = [archives, iOSDeviceSupport, derivedData]
self.items = items
} else {
derivedData = PieChartItemModel(value: Double(derivedDataSize), color: .pink)
deviceSupport = PieChartItemModel(value: Double(deviceSupportSize), color: Color(.cyan))
iOSDeviceSupport = PieChartItemModel(value: Double(iOSDeviceSupportSize), color: Color(.cyan))
watchOSDeviceSupport = PieChartItemModel(value: Double(watchOSDeviceSupportSize), color: .green)
archives = PieChartItemModel(value: Double(archivesSize), color: .orange)
iOSDeviceLogs = PieChartItemModel(value: Double(iOSDeviceLogsSize), color: .purple)
documentationCache = PieChartItemModel(value: Double(documentationCacheSize), color: .gray)

let items = [archives, deviceSupport, derivedData, iOSDeviceLogs, documentationCache]
let items = [archives, iOSDeviceSupport, watchOSDeviceSupport, derivedData, iOSDeviceLogs, documentationCache]

var normalizedItems: [PieChartItemModel] = []

Expand Down
54 changes: 38 additions & 16 deletions XcodeCleaner/ViewModels/ViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ class ViewModel: ObservableObject, ViewModelProtocol {
var totalSize: Int64 = 0

var derivedData: [DirectoryModel] = []
var deviceSupport: [DirectoryModel] = []
var iOSDeviceSupport: [DirectoryModel] = []
var watchOSDeviceSupport: [DirectoryModel] = []
var archives: [DirectoryModel] = []
var iOSDeviceLogs: [DirectoryModel] = []
var documentationCache: [DirectoryModel] = []
Expand All @@ -40,26 +41,41 @@ class ViewModel: ObservableObject, ViewModelProtocol {

let derivedDataDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getDerivedDataPath())
directoriesCount += derivedDataDirectories.count
DispatchQueue.global(qos: .utility).async {
self.calculateSize(ofDirectory: &self.derivedData, subDirectories: derivedDataDirectories, type: .derivedData)
}

let deviceSupportDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getDeviceSupportPath())
directoriesCount += deviceSupportDirectories.count
let iOSDeviceSupportDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getIOSDeviceSupportPath())
directoriesCount += iOSDeviceSupportDirectories.count
DispatchQueue.global(qos: .utility).async {
self.calculateSize(ofDirectory: &self.iOSDeviceSupport, subDirectories: iOSDeviceSupportDirectories, type: .iOSDeviceSupport)
}

let watchOSDeviceSupportDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getWatchOSDeviceSupportPath())
directoriesCount += watchOSDeviceSupportDirectories.count
DispatchQueue.global(qos: .utility).async {
self.calculateSize(ofDirectory: &self.watchOSDeviceSupport, subDirectories: watchOSDeviceSupportDirectories, type: .watchOSDeviceSupport)
}

let archivesDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getArchivesPath())
directoriesCount += archivesDirectories.count
DispatchQueue.global(qos: .utility).async {
self.calculateSize(ofDirectory: &self.archives, subDirectories: archivesDirectories, type: .archives)
}

let iOSDeviceLogsDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getIOSDeviceLogsPath())
directoriesCount += iOSDeviceLogsDirectories.count
DispatchQueue.global(qos: .utility).async {
self.calculateSize(ofDirectory: &self.iOSDeviceLogs, subDirectories: iOSDeviceLogsDirectories, type: .iOSDeviceLogs)
}

let documentationCacheDirectories = directoryManager.getSubDirectoriesForPath(path: directoryManager.getDocumentationCachePath())
directoriesCount += documentationCacheDirectories.count

DispatchQueue.global(qos: .utility).async {
self.calculateSize(ofDirectory: &self.derivedData, subDirectories: derivedDataDirectories, type: .derivedData)
self.calculateSize(ofDirectory: &self.deviceSupport, subDirectories: deviceSupportDirectories, type: .deviceSupport)
self.calculateSize(ofDirectory: &self.archives, subDirectories: archivesDirectories, type: .archives)
self.calculateSize(ofDirectory: &self.iOSDeviceLogs, subDirectories: iOSDeviceLogsDirectories, type: .iOSDeviceLogs)
self.calculateSize(ofDirectory: &self.documentationCache, subDirectories: documentationCacheDirectories, type: .documentationCache)

}

DispatchQueue.global(qos: .utility).async {
self.isScanStarted.toggle()
self.isReadyToBeCleaned.toggle()

Expand Down Expand Up @@ -93,10 +109,14 @@ class ViewModel: ObservableObject, ViewModelProtocol {
directories = derivedData
directoryName = "Derived Data"
circleColor = .pink
case .deviceSupport:
directories = deviceSupport
directoryName = "Device Support"
case .iOSDeviceSupport:
directories = iOSDeviceSupport
directoryName = "iOS Device Support"
circleColor = Color(.cyan)
case .watchOSDeviceSupport:
directories = watchOSDeviceSupport
directoryName = "watchOS Device Support"
circleColor = .green
case .archives:
directories = archives
directoryName = "Archives"
Expand All @@ -107,7 +127,7 @@ class ViewModel: ObservableObject, ViewModelProtocol {
circleColor = .purple
case .documentationCache:
directories = documentationCache
directoryName = "Doc. Cache"
directoryName = "Documentation Cache"
circleColor = .gray
}

Expand All @@ -122,7 +142,8 @@ class ViewModel: ObservableObject, ViewModelProtocol {
totalSize = 0

derivedData.removeAll()
deviceSupport.removeAll()
iOSDeviceSupport.removeAll()
watchOSDeviceSupport.removeAll()
archives.removeAll()
iOSDeviceLogs.removeAll()
documentationCache.removeAll()
Expand All @@ -131,7 +152,7 @@ class ViewModel: ObservableObject, ViewModelProtocol {
}
func getViewModelForPieChart() -> PieChartViewModelProtocol {
var viewModel = PieChartViewModel()
viewModel.createItems(derivedData: derivedData, deviceSupport: deviceSupport, archives: archives, iOSDeviceLogs: iOSDeviceLogs, documentationCache: documentationCache)
viewModel.createItems(derivedData: derivedData, iOSDeviceSupport: iOSDeviceSupport, watchOSDeviceSupport: watchOSDeviceSupport, archives: archives, iOSDeviceLogs: iOSDeviceLogs, documentationCache: documentationCache)

return viewModel
}
Expand All @@ -143,7 +164,8 @@ class ViewModel: ObservableObject, ViewModelProtocol {

DispatchQueue.global(qos: .userInitiated).async {
self.directoryManager.cleanDirectory(forType: .derivedData)
self.directoryManager.cleanDirectory(forType: .deviceSupport)
self.directoryManager.cleanDirectory(forType: .iOSDeviceSupport)
self.directoryManager.cleanDirectory(forType: .watchOSDeviceSupport)
self.directoryManager.cleanDirectory(forType: .archives)
self.directoryManager.cleanDirectory(forType: .iOSDeviceLogs)
self.directoryManager.cleanDirectory(forType: .documentationCache)
Expand Down
20 changes: 11 additions & 9 deletions XcodeCleaner/Views/BodyViews/BodyView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@ struct BodyView: View {
var viewModel: PieChartViewModelProtocol

var body: some View {
HStack {
DirectoryListView()
.frame(width: 350)
GeometryReader { geometryReader in
PieChartView(items: self.viewModel.getPCItems())
.frame(width: geometryReader.size.width / 2, height: geometryReader.size.height / 2)
.position(CGPoint(x: geometryReader.size.width / 2, y: geometryReader.size.height / 2))
.animation(.easeIn(duration: 1.0))
GeometryReader { globalGeometry in
HStack {
DirectoryListView()
.frame(width: 450)
GeometryReader { geometryReader in
PieChartView(items: self.viewModel.getPCItems())
.frame(width: globalGeometry.size.width / 2, height: globalGeometry.size.height / 2)
.position(CGPoint(x: geometryReader.size.width / 2, y: geometryReader.size.height / 2))
.animation(.easeIn(duration: 1.0))
}
}
}
}
Expand All @@ -28,7 +30,7 @@ struct BodyView: View {
struct MainView_Previews: PreviewProvider {
static var previews: some View {
var viewModel = PieChartViewModel()
viewModel.createItems(derivedData: [DirectoryModel(name: "Test", size: 2)], deviceSupport: [DirectoryModel(name: "Test", size: 2)], archives: [DirectoryModel(name: "Test", size: 2)], iOSDeviceLogs: [DirectoryModel(name: "Test", size: 2)], documentationCache: [DirectoryModel(name: "Test", size: 2)])
viewModel.createItems(derivedData: [DirectoryModel(name: "Test", size: 2)], iOSDeviceSupport: [DirectoryModel(name: "Test", size: 2)], watchOSDeviceSupport: [DirectoryModel(name: "Test", size: 4)], archives: [DirectoryModel(name: "Test", size: 2)], iOSDeviceLogs: [DirectoryModel(name: "Test", size: 2)], documentationCache: [DirectoryModel(name: "Test", size: 2)])

return BodyView(viewModel: viewModel)
.environmentObject(ViewModel())
Expand Down
10 changes: 6 additions & 4 deletions XcodeCleaner/Views/BodyViews/DropDownView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,23 @@ struct DropDownView: View {
HStack {
HStack {
Text("\(viewModel.directories.count == 0 ? "": isExpanded ? "▲": "▼") \(viewModel.directoryName)")
.font(.title)
.font(.system(size: 22))
.fontWeight(.heavy)
Spacer()

Text("\(BytesToStringFormatter.format(size: viewModel.totalSize))")
.foregroundColor(viewModel.circleColor)
.font(.title)
.font(.system(size: 22))
.fontWeight(.heavy)

Circle()
.fill(viewModel.circleColor)
.frame(width: 30, height: 30)
.frame(width: 22, height: 22)
}
}.onTapGesture {
self.isExpanded.toggle()
withAnimation {
self.isExpanded.toggle()
}
}
if viewModel.directories.count > 0 {
if isExpanded {
Expand Down
2 changes: 1 addition & 1 deletion XcodeCleaner/Views/FooterViews/FooterView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct FooterView: View {
.padding(10)

Text("\(BytesToStringFormatter.format(size: viewModel.totalSize, allowedUnits: [.useGB]))")
.font(.title)
.font(.system(size: 22))
.fontWeight(.heavy)
.foregroundColor(.pink)
.frame(width: 100)
Expand Down