├── images ├── macos_main.jpg ├── macos_settings.jpg ├── macos_window.jpg └── macos_dropdownmenu.jpg ├── TaskManager ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── TaskManager.entitlements ├── StaticTaskListView.swift ├── Model │ ├── TaskGroup.swift │ ├── TaskSection.swift │ └── Task.swift ├── TaskView.swift ├── TaskManagerApp.swift ├── ContentView.swift ├── TaskListView.swift └── SidebarView.swift ├── TaskManager.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ └── karinprater.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist └── project.pbxproj └── README.md /images/macos_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gahntpo/macOS-Development-TaskManager/HEAD/images/macos_main.jpg -------------------------------------------------------------------------------- /images/macos_settings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gahntpo/macOS-Development-TaskManager/HEAD/images/macos_settings.jpg -------------------------------------------------------------------------------- /images/macos_window.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gahntpo/macOS-Development-TaskManager/HEAD/images/macos_window.jpg -------------------------------------------------------------------------------- /TaskManager/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /images/macos_dropdownmenu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gahntpo/macOS-Development-TaskManager/HEAD/images/macos_dropdownmenu.jpg -------------------------------------------------------------------------------- /TaskManager/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TaskManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TaskManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /TaskManager/TaskManager.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /TaskManager/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "0.082", 10 | "red" : "0.307" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TaskManager.xcodeproj/xcuserdata/karinprater.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | TaskManager.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # macOS-Development-TaskManager 2 | Demo project for macOS app development with SwiftUI 3 | 4 | This is a project I developed for a youtube tutorial. You can watch it here: 5 | https://youtu.be/uE8RCE45Yxc 6 | 7 | 8 | ## NavigationSplitView with Inspector 9 | 10 | ![](/images/macos_main.jpg) 11 | 12 | ## DropDown Menu on Macos 13 | 14 | use contextMenu to add dropdown menu 15 | 16 | ![](/images/macos_dropdownmenu.jpg) 17 | 18 | ## Settings window 19 | 20 | use @AppStorage to store user settings 21 | 22 | ![](/images/macos_settings.jpg) 23 | 24 | ## Creating additional window types 25 | 26 | ![](/images/macos_window.jpg) 27 | 28 | 29 | -------------------------------------------------------------------------------- /TaskManager/StaticTaskListView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskListView.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct StaticTaskListView: View { 11 | 12 | let title: String 13 | let tasks: [Task] 14 | 15 | var body: some View { 16 | List(tasks) { task in 17 | HStack { 18 | Image(systemName: task.isCompleted ? "largecircle.fill.circle" : "circle") 19 | Text(task.title) 20 | } 21 | } 22 | 23 | } 24 | } 25 | 26 | #Preview { 27 | StaticTaskListView(title: "All", tasks: Task.examples()) 28 | } 29 | -------------------------------------------------------------------------------- /TaskManager/Model/TaskGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskGroup.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TaskGroup: Identifiable, Hashable { 11 | let id = UUID() 12 | var title: String 13 | let creationDate: Date 14 | var tasks: [Task] 15 | 16 | init(title: String, tasks: [Task] = []) { 17 | self.title = title 18 | self.creationDate = Date() 19 | self.tasks = tasks 20 | } 21 | 22 | 23 | static func example() -> TaskGroup { 24 | let task1 = Task(title: "Buy groceries") 25 | let task2 = Task(title: "Finish project") 26 | let task3 = Task(title: "Call dentist") 27 | 28 | var group = TaskGroup(title: "Personal") 29 | group.tasks = [task1, task2, task3] 30 | return group 31 | } 32 | 33 | static func examples() -> [TaskGroup] { 34 | let group1 = TaskGroup.example() 35 | let group2 = TaskGroup(title: "New list") 36 | return [group1, group2] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /TaskManager/TaskView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskView.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct TaskView: View { 11 | 12 | @Binding var task: Task 13 | @Binding var selectedTask: Task? 14 | @Binding var inspectorIsShown: Bool 15 | 16 | var body: some View { 17 | HStack { 18 | Image(systemName: task.isCompleted ? "largecircle.fill.circle" : "circle") 19 | .onTapGesture { 20 | task.isCompleted.toggle() 21 | } 22 | 23 | TextField("New Task", text: $task.title) 24 | .textFieldStyle(.plain) 25 | 26 | Button(action: { 27 | inspectorIsShown = true 28 | selectedTask = task 29 | }, label: { 30 | Text("More") 31 | }) 32 | } 33 | } 34 | } 35 | 36 | #Preview { 37 | TaskView(task: .constant(Task.example()), 38 | selectedTask: .constant(nil), inspectorIsShown: .constant(false)) 39 | .padding() 40 | } 41 | -------------------------------------------------------------------------------- /TaskManager/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "scale" : "1x", 6 | "size" : "16x16" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "2x", 11 | "size" : "16x16" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "scale" : "1x", 16 | "size" : "32x32" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "scale" : "2x", 21 | "size" : "32x32" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "scale" : "1x", 26 | "size" : "128x128" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "scale" : "2x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "scale" : "1x", 36 | "size" : "256x256" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "scale" : "2x", 41 | "size" : "256x256" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "scale" : "1x", 46 | "size" : "512x512" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "scale" : "2x", 51 | "size" : "512x512" 52 | } 53 | ], 54 | "info" : { 55 | "author" : "xcode", 56 | "version" : 1 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /TaskManager/TaskManagerApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskManagerApp.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct TaskManagerApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | .commands { 17 | CommandMenu("Task") { 18 | Button("Add new Task") { 19 | 20 | } 21 | .keyboardShortcut(KeyEquivalent("r"), modifiers: /*@START_MENU_TOKEN@*/.command/*@END_MENU_TOKEN@*/) 22 | } 23 | 24 | CommandGroup(after: .newItem) { 25 | Button("Add new Group") { 26 | 27 | } 28 | } 29 | } 30 | 31 | WindowGroup("Special window") { 32 | Text("special window") 33 | .frame(minWidth: 200, idealWidth: 300, minHeight: 200) 34 | } 35 | .defaultPosition(.leading) 36 | 37 | Settings { 38 | Text("Setting") 39 | .frame(maxWidth: .infinity, maxHeight: .infinity) 40 | } 41 | 42 | MenuBarExtra("Menu") { 43 | Button("Do something amazing") { 44 | 45 | } 46 | } 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /TaskManager/Model/TaskSection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskSection.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | enum TaskSection: Identifiable, CaseIterable, Hashable { 11 | 12 | case all 13 | case done 14 | case upcoming 15 | case list(TaskGroup) 16 | 17 | var id: String { 18 | switch self { 19 | case .all: 20 | "all" 21 | case .done: 22 | "done" 23 | case .upcoming: 24 | "upcoming" 25 | case .list(let taskGroup): 26 | taskGroup.id.uuidString 27 | } 28 | } 29 | 30 | var displayName: String { 31 | switch self { 32 | case .all: 33 | "All" 34 | case .done: 35 | "Done" 36 | case .upcoming: 37 | "Upcoming" 38 | case .list(let taskGroup): 39 | taskGroup.title 40 | } 41 | } 42 | 43 | var iconName: String { 44 | switch self { 45 | case .all: 46 | "star" 47 | case .done: 48 | "checkmark.circle" 49 | case .upcoming: 50 | "calendar" 51 | case .list(_): 52 | "folder" 53 | } 54 | } 55 | 56 | static var allCases: [TaskSection] { 57 | [.all, .done, .upcoming] 58 | } 59 | 60 | static func == (lhs: TaskSection, rhs: TaskSection) -> Bool { 61 | lhs.id == rhs.id 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /TaskManager/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | 12 | @State private var selection: TaskSection? = TaskSection.all 13 | 14 | @State private var allTasks = Task.examples() 15 | @State private var userCreatedGroups: [TaskGroup] = TaskGroup.examples() 16 | @State private var searchTerm: String = "" 17 | 18 | var body: some View { 19 | NavigationSplitView { 20 | SidebarView(userCreatedGroups: $userCreatedGroups, 21 | selection: $selection) 22 | 23 | } detail: { 24 | 25 | if searchTerm.isEmpty { 26 | switch selection { 27 | case .all: 28 | TaskListView(title: "All", tasks: $allTasks) 29 | case .done: 30 | StaticTaskListView(title: "All", tasks: allTasks.filter({ $0.isCompleted })) 31 | case .upcoming: 32 | StaticTaskListView(title: "All", tasks: allTasks.filter({ !$0.isCompleted })) 33 | case .list(let taskGroup): 34 | StaticTaskListView(title: taskGroup.title, tasks: taskGroup.tasks) 35 | case .none: 36 | Text("none") 37 | } 38 | } else { 39 | StaticTaskListView(title: "All", tasks: allTasks.filter({ $0.title.contains(searchTerm) })) 40 | } 41 | } 42 | .searchable(text: $searchTerm) 43 | } 44 | } 45 | 46 | #Preview { 47 | ContentView() 48 | } 49 | -------------------------------------------------------------------------------- /TaskManager/TaskListView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskListView.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct TaskListView: View { 11 | 12 | let title: String 13 | @Binding var tasks: [Task] 14 | @State private var selectedTask: Task? = nil 15 | 16 | @State private var inspectorIsShown: Bool = false 17 | 18 | var body: some View { 19 | List($tasks) { $task in 20 | TaskView(task: $task, 21 | selectedTask: $selectedTask, 22 | inspectorIsShown: $inspectorIsShown) 23 | } 24 | .navigationTitle(title) 25 | .toolbar { 26 | ToolbarItemGroup { 27 | Button { 28 | tasks.append(Task(title: "New Task")) 29 | } label: { 30 | Label("Add New Task", systemImage: "plus") 31 | } 32 | 33 | Button { 34 | inspectorIsShown.toggle() 35 | } label: { 36 | Label("Show inspector", systemImage: "sidebar.right") 37 | } 38 | } 39 | 40 | } 41 | .inspector(isPresented: $inspectorIsShown) { 42 | Group { 43 | if let selectedTask { 44 | Text(selectedTask.title).font(.title) 45 | } else { 46 | Text("nothing selected") 47 | } 48 | } 49 | .frame(minWidth: 100, maxWidth: .infinity) 50 | } 51 | } 52 | } 53 | 54 | #Preview { 55 | TaskListView(title: "All", tasks: .constant(Task.examples())) 56 | } 57 | -------------------------------------------------------------------------------- /TaskManager/Model/Task.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Task.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Task: Identifiable, Hashable { 11 | 12 | let id = UUID() 13 | var title: String 14 | var isCompleted: Bool 15 | var dueDate: Date 16 | var details: String? 17 | 18 | init(title: String, isCompleted: Bool = false, dueDate: Date = Date(), details: String? = nil) { 19 | self.title = title 20 | self.isCompleted = isCompleted 21 | self.dueDate = dueDate 22 | self.details = details 23 | } 24 | 25 | static func example() -> Task { 26 | Task(title: "Buy milk", dueDate: Calendar.current.date(byAdding: .day, value: 2, to: Date())!) 27 | } 28 | 29 | static func examples() -> [Task] { 30 | [ 31 | Task(title: "Here’s to the crazy ones"), 32 | Task(title: "the misfits, the rebels, the troublemakers", isCompleted: true), 33 | Task(title: "the round pegs in the square holes…", dueDate: Calendar.current.date(byAdding: .day, value: 1, to: Date())!), 34 | Task(title: "the ones who see things differently — they’re not fond of rules…"), 35 | Task(title: "You can quote them, disagree with them, glorify or vilify them"), 36 | Task(title: "but the only thing you can’t do is ignore them because they change things…"), 37 | Task(title: "they push the human race forward", isCompleted: true, dueDate: Calendar.current.date(byAdding: .day, value: 4, to: Date())!), 38 | Task(title: "and while some may see them as the crazy ones"), 39 | Task(title: "we see genius", isCompleted: true, dueDate: Calendar.current.date(byAdding: .day, value: 2, to: Date())!), 40 | Task(title: "because the ones who are crazy enough to think that they can change the world"), 41 | Task(title: "are the ones who do.") 42 | ] 43 | 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /TaskManager/SidebarView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SidebarView.swift 3 | // TaskManager 4 | // 5 | // Created by Karin Prater on 21.08.2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SidebarView: View { 11 | 12 | @Binding var userCreatedGroups: [TaskGroup] 13 | @Binding var selection: TaskSection? 14 | 15 | var body: some View { 16 | List(selection: $selection) { 17 | Section("Favorites") { 18 | ForEach(TaskSection.allCases) { selection in 19 | Label(selection.displayName, 20 | systemImage: selection.iconName) 21 | .tag(selection) 22 | } 23 | } 24 | 25 | Section("Your Groups") { 26 | ForEach($userCreatedGroups) { $group in 27 | HStack { 28 | Image(systemName: "folder") 29 | TextField("New Group", text: $group.title) 30 | } 31 | .tag(TaskSection.list(group)) 32 | .contextMenu { 33 | Button("Delete", role: .destructive) { 34 | if let index = userCreatedGroups.firstIndex(where: { $0.id == group.id}) { 35 | userCreatedGroups.remove(at: index) 36 | } 37 | } 38 | } 39 | } 40 | } 41 | } 42 | .safeAreaInset(edge: .bottom) { 43 | Button(action: { 44 | let newGroup = TaskGroup(title: "New Group") 45 | userCreatedGroups.append(newGroup) 46 | }, label: { 47 | Label("Add Group", systemImage: "plus.circle") 48 | }) 49 | .buttonStyle(.borderless) 50 | .foregroundColor(.accentColor) 51 | .padding() 52 | .frame(maxWidth: .infinity, alignment: .leading) 53 | .keyboardShortcut(/*@START_MENU_TOKEN@*/KeyEquivalent("a")/*@END_MENU_TOKEN@*/, modifiers: /*@START_MENU_TOKEN@*/.command/*@END_MENU_TOKEN@*/) 54 | } 55 | 56 | } 57 | } 58 | 59 | #Preview { 60 | SidebarView(userCreatedGroups: .constant(TaskGroup.examples()), 61 | selection: .constant(.all)) 62 | .listStyle(.sidebar) 63 | } 64 | -------------------------------------------------------------------------------- /TaskManager.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 175799DC2A934C4E00948A2E /* TaskManagerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799DB2A934C4E00948A2E /* TaskManagerApp.swift */; }; 11 | 175799DE2A934C4E00948A2E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799DD2A934C4E00948A2E /* ContentView.swift */; }; 12 | 175799E02A934C5200948A2E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 175799DF2A934C5200948A2E /* Assets.xcassets */; }; 13 | 175799E32A934C5200948A2E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 175799E22A934C5200948A2E /* Preview Assets.xcassets */; }; 14 | 175799EC2A934CCC00948A2E /* Task.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799EB2A934CCC00948A2E /* Task.swift */; }; 15 | 175799EE2A934DE100948A2E /* TaskGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799ED2A934DE100948A2E /* TaskGroup.swift */; }; 16 | 175799F02A934ECE00948A2E /* TaskSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799EF2A934ECE00948A2E /* TaskSection.swift */; }; 17 | 175799F22A934FF800948A2E /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799F12A934FF800948A2E /* SidebarView.swift */; }; 18 | 175799F42A93500A00948A2E /* StaticTaskListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799F32A93500A00948A2E /* StaticTaskListView.swift */; }; 19 | 175799F62A93560D00948A2E /* TaskListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799F52A93560D00948A2E /* TaskListView.swift */; }; 20 | 175799F82A93572900948A2E /* TaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175799F72A93572900948A2E /* TaskView.swift */; }; 21 | 17B3F3902A9646A60009079F /* macos_window.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 17B3F38F2A9646A60009079F /* macos_window.jpg */; }; 22 | 17B3F3922A9646B10009079F /* macos_settings.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 17B3F3912A9646B10009079F /* macos_settings.jpg */; }; 23 | 17B3F3942A9646BA0009079F /* macos_main.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 17B3F3932A9646BA0009079F /* macos_main.jpg */; }; 24 | 17B3F3962A9646F70009079F /* macos_dropdownmenu.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 17B3F3952A9646F70009079F /* macos_dropdownmenu.jpg */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXFileReference section */ 28 | 175799D82A934C4E00948A2E /* TaskManager.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TaskManager.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 175799DB2A934C4E00948A2E /* TaskManagerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskManagerApp.swift; sourceTree = ""; }; 30 | 175799DD2A934C4E00948A2E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 31 | 175799DF2A934C5200948A2E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 32 | 175799E22A934C5200948A2E /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 33 | 175799E42A934C5200948A2E /* TaskManager.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TaskManager.entitlements; sourceTree = ""; }; 34 | 175799EB2A934CCC00948A2E /* Task.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Task.swift; sourceTree = ""; }; 35 | 175799ED2A934DE100948A2E /* TaskGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskGroup.swift; sourceTree = ""; }; 36 | 175799EF2A934ECE00948A2E /* TaskSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskSection.swift; sourceTree = ""; }; 37 | 175799F12A934FF800948A2E /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = ""; }; 38 | 175799F32A93500A00948A2E /* StaticTaskListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaticTaskListView.swift; sourceTree = ""; }; 39 | 175799F52A93560D00948A2E /* TaskListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskListView.swift; sourceTree = ""; }; 40 | 175799F72A93572900948A2E /* TaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskView.swift; sourceTree = ""; }; 41 | 17B3F38F2A9646A60009079F /* macos_window.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = macos_window.jpg; sourceTree = ""; }; 42 | 17B3F3912A9646B10009079F /* macos_settings.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = macos_settings.jpg; sourceTree = ""; }; 43 | 17B3F3932A9646BA0009079F /* macos_main.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = macos_main.jpg; sourceTree = ""; }; 44 | 17B3F3952A9646F70009079F /* macos_dropdownmenu.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = macos_dropdownmenu.jpg; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 175799D52A934C4E00948A2E /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 175799CF2A934C4E00948A2E = { 59 | isa = PBXGroup; 60 | children = ( 61 | 17B3F38E2A9646650009079F /* images */, 62 | 175799DA2A934C4E00948A2E /* TaskManager */, 63 | 175799D92A934C4E00948A2E /* Products */, 64 | ); 65 | sourceTree = ""; 66 | }; 67 | 175799D92A934C4E00948A2E /* Products */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 175799D82A934C4E00948A2E /* TaskManager.app */, 71 | ); 72 | name = Products; 73 | sourceTree = ""; 74 | }; 75 | 175799DA2A934C4E00948A2E /* TaskManager */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 175799DB2A934C4E00948A2E /* TaskManagerApp.swift */, 79 | 175799DD2A934C4E00948A2E /* ContentView.swift */, 80 | 175799F12A934FF800948A2E /* SidebarView.swift */, 81 | 175799F52A93560D00948A2E /* TaskListView.swift */, 82 | 175799F72A93572900948A2E /* TaskView.swift */, 83 | 175799F32A93500A00948A2E /* StaticTaskListView.swift */, 84 | 175799EA2A934CBF00948A2E /* Model */, 85 | 175799DF2A934C5200948A2E /* Assets.xcassets */, 86 | 175799E42A934C5200948A2E /* TaskManager.entitlements */, 87 | 175799E12A934C5200948A2E /* Preview Content */, 88 | ); 89 | path = TaskManager; 90 | sourceTree = ""; 91 | }; 92 | 175799E12A934C5200948A2E /* Preview Content */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 175799E22A934C5200948A2E /* Preview Assets.xcassets */, 96 | ); 97 | path = "Preview Content"; 98 | sourceTree = ""; 99 | }; 100 | 175799EA2A934CBF00948A2E /* Model */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 175799EB2A934CCC00948A2E /* Task.swift */, 104 | 175799ED2A934DE100948A2E /* TaskGroup.swift */, 105 | 175799EF2A934ECE00948A2E /* TaskSection.swift */, 106 | ); 107 | path = Model; 108 | sourceTree = ""; 109 | }; 110 | 17B3F38E2A9646650009079F /* images */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 17B3F38F2A9646A60009079F /* macos_window.jpg */, 114 | 17B3F3912A9646B10009079F /* macos_settings.jpg */, 115 | 17B3F3932A9646BA0009079F /* macos_main.jpg */, 116 | 17B3F3952A9646F70009079F /* macos_dropdownmenu.jpg */, 117 | ); 118 | path = images; 119 | sourceTree = ""; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXNativeTarget section */ 124 | 175799D72A934C4E00948A2E /* TaskManager */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = 175799E72A934C5200948A2E /* Build configuration list for PBXNativeTarget "TaskManager" */; 127 | buildPhases = ( 128 | 175799D42A934C4E00948A2E /* Sources */, 129 | 175799D52A934C4E00948A2E /* Frameworks */, 130 | 175799D62A934C4E00948A2E /* Resources */, 131 | ); 132 | buildRules = ( 133 | ); 134 | dependencies = ( 135 | ); 136 | name = TaskManager; 137 | productName = TaskManager; 138 | productReference = 175799D82A934C4E00948A2E /* TaskManager.app */; 139 | productType = "com.apple.product-type.application"; 140 | }; 141 | /* End PBXNativeTarget section */ 142 | 143 | /* Begin PBXProject section */ 144 | 175799D02A934C4E00948A2E /* Project object */ = { 145 | isa = PBXProject; 146 | attributes = { 147 | BuildIndependentTargetsInParallel = 1; 148 | LastSwiftUpdateCheck = 1500; 149 | LastUpgradeCheck = 1500; 150 | TargetAttributes = { 151 | 175799D72A934C4E00948A2E = { 152 | CreatedOnToolsVersion = 15.0; 153 | }; 154 | }; 155 | }; 156 | buildConfigurationList = 175799D32A934C4E00948A2E /* Build configuration list for PBXProject "TaskManager" */; 157 | compatibilityVersion = "Xcode 14.0"; 158 | developmentRegion = en; 159 | hasScannedForEncodings = 0; 160 | knownRegions = ( 161 | en, 162 | Base, 163 | ); 164 | mainGroup = 175799CF2A934C4E00948A2E; 165 | productRefGroup = 175799D92A934C4E00948A2E /* Products */; 166 | projectDirPath = ""; 167 | projectRoot = ""; 168 | targets = ( 169 | 175799D72A934C4E00948A2E /* TaskManager */, 170 | ); 171 | }; 172 | /* End PBXProject section */ 173 | 174 | /* Begin PBXResourcesBuildPhase section */ 175 | 175799D62A934C4E00948A2E /* Resources */ = { 176 | isa = PBXResourcesBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | 17B3F3942A9646BA0009079F /* macos_main.jpg in Resources */, 180 | 17B3F3962A9646F70009079F /* macos_dropdownmenu.jpg in Resources */, 181 | 17B3F3922A9646B10009079F /* macos_settings.jpg in Resources */, 182 | 17B3F3902A9646A60009079F /* macos_window.jpg in Resources */, 183 | 175799E32A934C5200948A2E /* Preview Assets.xcassets in Resources */, 184 | 175799E02A934C5200948A2E /* Assets.xcassets in Resources */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | /* End PBXResourcesBuildPhase section */ 189 | 190 | /* Begin PBXSourcesBuildPhase section */ 191 | 175799D42A934C4E00948A2E /* Sources */ = { 192 | isa = PBXSourcesBuildPhase; 193 | buildActionMask = 2147483647; 194 | files = ( 195 | 175799F82A93572900948A2E /* TaskView.swift in Sources */, 196 | 175799F42A93500A00948A2E /* StaticTaskListView.swift in Sources */, 197 | 175799DE2A934C4E00948A2E /* ContentView.swift in Sources */, 198 | 175799EC2A934CCC00948A2E /* Task.swift in Sources */, 199 | 175799F02A934ECE00948A2E /* TaskSection.swift in Sources */, 200 | 175799EE2A934DE100948A2E /* TaskGroup.swift in Sources */, 201 | 175799DC2A934C4E00948A2E /* TaskManagerApp.swift in Sources */, 202 | 175799F22A934FF800948A2E /* SidebarView.swift in Sources */, 203 | 175799F62A93560D00948A2E /* TaskListView.swift in Sources */, 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | }; 207 | /* End PBXSourcesBuildPhase section */ 208 | 209 | /* Begin XCBuildConfiguration section */ 210 | 175799E52A934C5200948A2E /* Debug */ = { 211 | isa = XCBuildConfiguration; 212 | buildSettings = { 213 | ALWAYS_SEARCH_USER_PATHS = NO; 214 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 215 | CLANG_ANALYZER_NONNULL = YES; 216 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 217 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 218 | CLANG_ENABLE_MODULES = YES; 219 | CLANG_ENABLE_OBJC_ARC = YES; 220 | CLANG_ENABLE_OBJC_WEAK = YES; 221 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 222 | CLANG_WARN_BOOL_CONVERSION = YES; 223 | CLANG_WARN_COMMA = YES; 224 | CLANG_WARN_CONSTANT_CONVERSION = YES; 225 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 226 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 227 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 228 | CLANG_WARN_EMPTY_BODY = YES; 229 | CLANG_WARN_ENUM_CONVERSION = YES; 230 | CLANG_WARN_INFINITE_RECURSION = YES; 231 | CLANG_WARN_INT_CONVERSION = YES; 232 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 233 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 234 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 235 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 236 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 237 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 238 | CLANG_WARN_STRICT_PROTOTYPES = YES; 239 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 240 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 241 | CLANG_WARN_UNREACHABLE_CODE = YES; 242 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 243 | COPY_PHASE_STRIP = NO; 244 | DEBUG_INFORMATION_FORMAT = dwarf; 245 | ENABLE_STRICT_OBJC_MSGSEND = YES; 246 | ENABLE_TESTABILITY = YES; 247 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 248 | GCC_C_LANGUAGE_STANDARD = gnu17; 249 | GCC_DYNAMIC_NO_PIC = NO; 250 | GCC_NO_COMMON_BLOCKS = YES; 251 | GCC_OPTIMIZATION_LEVEL = 0; 252 | GCC_PREPROCESSOR_DEFINITIONS = ( 253 | "DEBUG=1", 254 | "$(inherited)", 255 | ); 256 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 257 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 258 | GCC_WARN_UNDECLARED_SELECTOR = YES; 259 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 260 | GCC_WARN_UNUSED_FUNCTION = YES; 261 | GCC_WARN_UNUSED_VARIABLE = YES; 262 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 263 | MACOSX_DEPLOYMENT_TARGET = 14.0; 264 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 265 | MTL_FAST_MATH = YES; 266 | ONLY_ACTIVE_ARCH = YES; 267 | SDKROOT = macosx; 268 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 269 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 270 | }; 271 | name = Debug; 272 | }; 273 | 175799E62A934C5200948A2E /* Release */ = { 274 | isa = XCBuildConfiguration; 275 | buildSettings = { 276 | ALWAYS_SEARCH_USER_PATHS = NO; 277 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 278 | CLANG_ANALYZER_NONNULL = YES; 279 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 280 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 281 | CLANG_ENABLE_MODULES = YES; 282 | CLANG_ENABLE_OBJC_ARC = YES; 283 | CLANG_ENABLE_OBJC_WEAK = YES; 284 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 285 | CLANG_WARN_BOOL_CONVERSION = YES; 286 | CLANG_WARN_COMMA = YES; 287 | CLANG_WARN_CONSTANT_CONVERSION = YES; 288 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 289 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 290 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 291 | CLANG_WARN_EMPTY_BODY = YES; 292 | CLANG_WARN_ENUM_CONVERSION = YES; 293 | CLANG_WARN_INFINITE_RECURSION = YES; 294 | CLANG_WARN_INT_CONVERSION = YES; 295 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 296 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 297 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 298 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 299 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 300 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 301 | CLANG_WARN_STRICT_PROTOTYPES = YES; 302 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 303 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 304 | CLANG_WARN_UNREACHABLE_CODE = YES; 305 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 306 | COPY_PHASE_STRIP = NO; 307 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 308 | ENABLE_NS_ASSERTIONS = NO; 309 | ENABLE_STRICT_OBJC_MSGSEND = YES; 310 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 311 | GCC_C_LANGUAGE_STANDARD = gnu17; 312 | GCC_NO_COMMON_BLOCKS = YES; 313 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 314 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 315 | GCC_WARN_UNDECLARED_SELECTOR = YES; 316 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 317 | GCC_WARN_UNUSED_FUNCTION = YES; 318 | GCC_WARN_UNUSED_VARIABLE = YES; 319 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 320 | MACOSX_DEPLOYMENT_TARGET = 14.0; 321 | MTL_ENABLE_DEBUG_INFO = NO; 322 | MTL_FAST_MATH = YES; 323 | SDKROOT = macosx; 324 | SWIFT_COMPILATION_MODE = wholemodule; 325 | }; 326 | name = Release; 327 | }; 328 | 175799E82A934C5200948A2E /* Debug */ = { 329 | isa = XCBuildConfiguration; 330 | buildSettings = { 331 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 332 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 333 | CODE_SIGN_ENTITLEMENTS = TaskManager/TaskManager.entitlements; 334 | CODE_SIGN_STYLE = Automatic; 335 | COMBINE_HIDPI_IMAGES = YES; 336 | CURRENT_PROJECT_VERSION = 1; 337 | DEVELOPMENT_ASSET_PATHS = "\"TaskManager/Preview Content\""; 338 | DEVELOPMENT_TEAM = 54YLWD89Z8; 339 | ENABLE_HARDENED_RUNTIME = YES; 340 | ENABLE_PREVIEWS = YES; 341 | GENERATE_INFOPLIST_FILE = YES; 342 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 343 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 344 | LD_RUNPATH_SEARCH_PATHS = ( 345 | "$(inherited)", 346 | "@executable_path/../Frameworks", 347 | ); 348 | MARKETING_VERSION = 1.0; 349 | PRODUCT_BUNDLE_IDENTIFIER = com.karinprater.TaskManager; 350 | PRODUCT_NAME = "$(TARGET_NAME)"; 351 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; 352 | SUPPORTS_MACCATALYST = NO; 353 | SWIFT_EMIT_LOC_STRINGS = YES; 354 | SWIFT_VERSION = 5.0; 355 | TARGETED_DEVICE_FAMILY = 1; 356 | }; 357 | name = Debug; 358 | }; 359 | 175799E92A934C5200948A2E /* Release */ = { 360 | isa = XCBuildConfiguration; 361 | buildSettings = { 362 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 363 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 364 | CODE_SIGN_ENTITLEMENTS = TaskManager/TaskManager.entitlements; 365 | CODE_SIGN_STYLE = Automatic; 366 | COMBINE_HIDPI_IMAGES = YES; 367 | CURRENT_PROJECT_VERSION = 1; 368 | DEVELOPMENT_ASSET_PATHS = "\"TaskManager/Preview Content\""; 369 | DEVELOPMENT_TEAM = 54YLWD89Z8; 370 | ENABLE_HARDENED_RUNTIME = YES; 371 | ENABLE_PREVIEWS = YES; 372 | GENERATE_INFOPLIST_FILE = YES; 373 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 374 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 375 | LD_RUNPATH_SEARCH_PATHS = ( 376 | "$(inherited)", 377 | "@executable_path/../Frameworks", 378 | ); 379 | MARKETING_VERSION = 1.0; 380 | PRODUCT_BUNDLE_IDENTIFIER = com.karinprater.TaskManager; 381 | PRODUCT_NAME = "$(TARGET_NAME)"; 382 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; 383 | SUPPORTS_MACCATALYST = NO; 384 | SWIFT_EMIT_LOC_STRINGS = YES; 385 | SWIFT_VERSION = 5.0; 386 | TARGETED_DEVICE_FAMILY = 1; 387 | }; 388 | name = Release; 389 | }; 390 | /* End XCBuildConfiguration section */ 391 | 392 | /* Begin XCConfigurationList section */ 393 | 175799D32A934C4E00948A2E /* Build configuration list for PBXProject "TaskManager" */ = { 394 | isa = XCConfigurationList; 395 | buildConfigurations = ( 396 | 175799E52A934C5200948A2E /* Debug */, 397 | 175799E62A934C5200948A2E /* Release */, 398 | ); 399 | defaultConfigurationIsVisible = 0; 400 | defaultConfigurationName = Release; 401 | }; 402 | 175799E72A934C5200948A2E /* Build configuration list for PBXNativeTarget "TaskManager" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | 175799E82A934C5200948A2E /* Debug */, 406 | 175799E92A934C5200948A2E /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | defaultConfigurationName = Release; 410 | }; 411 | /* End XCConfigurationList section */ 412 | }; 413 | rootObject = 175799D02A934C4E00948A2E /* Project object */; 414 | } 415 | --------------------------------------------------------------------------------