├── 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 | 
11 |
12 | ## DropDown Menu on Macos
13 |
14 | use contextMenu to add dropdown menu
15 |
16 | 
17 |
18 | ## Settings window
19 |
20 | use @AppStorage to store user settings
21 |
22 | 
23 |
24 | ## Creating additional window types
25 |
26 | 
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 |
--------------------------------------------------------------------------------