changeset 318:e7c3d68d8e22

Implementing AvatarCreator
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Sat, 27 Mar 2021 00:46:17 +0100
parents 81962e90d05f
children 62d278295bb7
files LazyBear.xcodeproj/project.pbxproj LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate LazyBear/LazyBearApp.swift LazyBear/Views/Onboarding/Helpers/Avatar.swift LazyBear/Views/Onboarding/Helpers/AvatarCreator.swift LazyBear/Views/Onboarding/Helpers/EnvironmentSignUp.swift LazyBear/Views/Onboarding/SignUpView.swift LazyBear/Views/Onboarding/WelcomeView.swift
diffstat 8 files changed, 148 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/LazyBear.xcodeproj/project.pbxproj	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear.xcodeproj/project.pbxproj	Sat Mar 27 00:46:17 2021 +0100
@@ -8,7 +8,6 @@
 
 /* Begin PBXBuildFile section */
 		95201A2F260C9CAF007D5300 /* SignUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95201A2E260C9CAF007D5300 /* SignUpView.swift */; };
-		95201A3E260CB20A007D5300 /* ListAvatarHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95201A3D260CB20A007D5300 /* ListAvatarHelper.swift */; };
 		954D7EA7260BBA6600A13C50 /* WatchlistCompany+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954D7EA5260BBA6600A13C50 /* WatchlistCompany+CoreDataClass.swift */; };
 		954D7EA8260BBA6600A13C50 /* WatchlistCompany+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954D7EA6260BBA6600A13C50 /* WatchlistCompany+CoreDataProperties.swift */; };
 		954D7EAC260BBB2400A13C50 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954D7EAB260BBB2400A13C50 /* HomeView.swift */; };
@@ -24,6 +23,8 @@
 		958A735225E0170900FD7ECA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 958A735125E0170900FD7ECA /* CloudKit.framework */; };
 		95AD4A2D26078C1400498079 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AD4A2C26078C1400498079 /* ContentView.swift */; };
 		95AD4A38260794A800498079 /* WhatsNewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95AD4A37260794A800498079 /* WhatsNewView.swift */; };
+		95BF36AC260E954F00B29E41 /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BF36AB260E954F00B29E41 /* Avatar.swift */; };
+		95BF36AF260E9D4100B29E41 /* AvatarCreator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BF36AE260E9D4100B29E41 /* AvatarCreator.swift */; };
 		95E512D32607B42200C283E0 /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95E512D22607B42200C283E0 /* WelcomeView.swift */; };
 		95F1E091260CBD0B0076AE63 /* UserSettings+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F1E08F260CBD0B0076AE63 /* UserSettings+CoreDataClass.swift */; };
 		95F1E092260CBD0B0076AE63 /* UserSettings+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F1E090260CBD0B0076AE63 /* UserSettings+CoreDataProperties.swift */; };
@@ -33,7 +34,6 @@
 		950BA46B25E944F500D065EF /* Production.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Production.xcconfig; sourceTree = "<group>"; };
 		950BA46C25E944FC00D065EF /* Sandbox.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Sandbox.xcconfig; sourceTree = "<group>"; };
 		95201A2E260C9CAF007D5300 /* SignUpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpView.swift; sourceTree = "<group>"; };
-		95201A3D260CB20A007D5300 /* ListAvatarHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListAvatarHelper.swift; sourceTree = "<group>"; };
 		954D7EA5260BBA6600A13C50 /* WatchlistCompany+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WatchlistCompany+CoreDataClass.swift"; sourceTree = "<group>"; };
 		954D7EA6260BBA6600A13C50 /* WatchlistCompany+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WatchlistCompany+CoreDataProperties.swift"; sourceTree = "<group>"; };
 		954D7EAB260BBB2400A13C50 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
@@ -51,6 +51,8 @@
 		958A735125E0170900FD7ECA /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; };
 		95AD4A2C26078C1400498079 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
 		95AD4A37260794A800498079 /* WhatsNewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewView.swift; sourceTree = "<group>"; };
+		95BF36AB260E954F00B29E41 /* Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Avatar.swift; sourceTree = "<group>"; };
+		95BF36AE260E9D4100B29E41 /* AvatarCreator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarCreator.swift; sourceTree = "<group>"; };
 		95E512D22607B42200C283E0 /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = "<group>"; };
 		95F1E08F260CBD0B0076AE63 /* UserSettings+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserSettings+CoreDataClass.swift"; sourceTree = "<group>"; };
 		95F1E090260CBD0B0076AE63 /* UserSettings+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserSettings+CoreDataProperties.swift"; sourceTree = "<group>"; };
@@ -79,8 +81,9 @@
 		95201A40260CB50A007D5300 /* Helpers */ = {
 			isa = PBXGroup;
 			children = (
-				95201A3D260CB20A007D5300 /* ListAvatarHelper.swift */,
 				95531C78260CBECC00F0916A /* EnvironmentSignUp.swift */,
+				95BF36AB260E954F00B29E41 /* Avatar.swift */,
+				95BF36AE260E9D4100B29E41 /* AvatarCreator.swift */,
 			);
 			path = Helpers;
 			sourceTree = "<group>";
@@ -268,15 +271,16 @@
 				954D7EA8260BBA6600A13C50 /* WatchlistCompany+CoreDataProperties.swift in Sources */,
 				95F1E091260CBD0B0076AE63 /* UserSettings+CoreDataClass.swift in Sources */,
 				95F1E092260CBD0B0076AE63 /* UserSettings+CoreDataProperties.swift in Sources */,
+				95BF36AC260E954F00B29E41 /* Avatar.swift in Sources */,
 				95E512D32607B42200C283E0 /* WelcomeView.swift in Sources */,
 				954D7EB1260BBBEA00A13C50 /* UserHelper.swift in Sources */,
 				954D7EC6260BE84100A13C50 /* WatchlistPreviewHelper.swift in Sources */,
+				95BF36AF260E9D4100B29E41 /* AvatarCreator.swift in Sources */,
 				95AD4A38260794A800498079 /* WhatsNewView.swift in Sources */,
 				95672B8F25DDA54700DCBE4A /* LazyBearApp.swift in Sources */,
 				954D7EA7260BBA6600A13C50 /* WatchlistCompany+CoreDataClass.swift in Sources */,
 				95672B9B25DDA54800DCBE4A /* LazyBear.xcdatamodeld in Sources */,
 				95531C79260CBECC00F0916A /* EnvironmentSignUp.swift in Sources */,
-				95201A3E260CB20A007D5300 /* ListAvatarHelper.swift in Sources */,
 				95AD4A2D26078C1400498079 /* ContentView.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
Binary file LazyBear.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/LazyBear/LazyBearApp.swift	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear/LazyBearApp.swift	Sat Mar 27 00:46:17 2021 +0100
@@ -16,6 +16,7 @@
             if isAppAlreadyLaunchedOnce() {
             ContentView()
                 .environment(\.managedObjectContext, persistenceController.container.viewContext)
+                
             } else {
                 WelcomeView()
                     .environment(\.managedObjectContext, persistenceController.container.viewContext)
--- a/LazyBear/Views/Onboarding/Helpers/Avatar.swift	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear/Views/Onboarding/Helpers/Avatar.swift	Sat Mar 27 00:46:17 2021 +0100
@@ -8,13 +8,48 @@
 import SwiftUI
 
 struct Avatar: View {
+    var scaleMultipler: CGFloat
+    var backgroundHeight: CGFloat
+    @EnvironmentObject var environmentSignUp: EnvironmentSignUp
+    
     var body: some View {
-        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
+        environmentSignUp.background
+            .clipShape(Circle())
+            .frame(maxWidth: backgroundHeight + 50, maxHeight: backgroundHeight)
+            .overlay(
+                Image("Head")
+                    .scaleEffect(scaleMultipler)
+                    .colorMultiply(environmentSignUp.skinTone)
+            )
+            .overlay(
+                ZStack {
+                    Image(environmentSignUp.hair)
+                        .scaleEffect(scaleMultipler)
+                        .offset(y: -5*scaleMultipler)
+                        .colorMultiply(environmentSignUp.hairColor)
+                    
+                    Image(environmentSignUp.nose)
+                        .scaleEffect(scaleMultipler)
+                    
+                    Image(environmentSignUp.eyes)
+                        .scaleEffect(scaleMultipler)
+                        .offset(y: -5*scaleMultipler)
+                    
+                    Image(environmentSignUp.mouth)
+                        .scaleEffect(scaleMultipler)
+                        .offset(y: 5*scaleMultipler)
+                    
+                    Image(environmentSignUp.body)
+                        .scaleEffect(scaleMultipler)
+                        .offset(y: 19*scaleMultipler)
+                        .colorMultiply(environmentSignUp.bodyColor)
+                }
+            )
     }
 }
 
 struct Avatar_Previews: PreviewProvider {
     static var previews: some View {
-        Avatar()
+        Avatar(scaleMultipler: 2, backgroundHeight: 100)
     }
 }
--- a/LazyBear/Views/Onboarding/Helpers/AvatarCreator.swift	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear/Views/Onboarding/Helpers/AvatarCreator.swift	Sat Mar 27 00:46:17 2021 +0100
@@ -7,14 +7,93 @@
 
 import SwiftUI
 
+enum AvatarComponent {
+    case hair, eyes, nose, mouth, body
+}
+
 struct AvatarCreator: View {
+    var components = ["Hair", "Eyes", "Nose", "Mouth", "Body"]
+    @State private var selectedComponent = "Hair"
+    
     var body: some View {
-        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
+        NavigationView {
+            VStack {
+                Avatar(scaleMultipler: 2, backgroundHeight: 200)
+                    .padding(.top)
+                
+                Picker("Please choose a color", selection: $selectedComponent) {
+                    ForEach(components, id: \.self) {
+                        Text($0)
+                    }
+                }
+                .pickerStyle(SegmentedPickerStyle())
+                .padding()
+                
+                Divider()
+                ScrollView {
+//                    if selectedComponent == "Hair" { showAvatar(component: .hair) }
+//                    if selectedComponent == "Eyes" { showAvatar(component: .eyes) }
+//                    if selectedComponent == "Nose" { showAvatar(component: .nose) }
+//                    if selectedComponent == "Mouth" { showAvatar(component: .mouth) }
+//                    if selectedComponent == "Body" { showAvatar(component: .body) }
+                }
+            }
+            .navigationTitle("Create your avatar")
+            .navigationBarTitleDisplayMode(.inline)
+            .toolbar {
+                ToolbarItem(placement: .navigationBarLeading) {
+                    Button(action: {  }) {
+                        Text("Cancel")
+                    }
+                }
+                ToolbarItem(placement: .navigationBarTrailing) {
+                    Button(action: {  }) {
+                        Text("Done")
+                    }
+                }
+            }
+        }
     }
+    
+//    private func showAvatar(component: AvatarComponent) -> AnyView {
+//        switch component {
+//        case .hair:
+//            return AnyView(HairView())
+//        case .eyes:
+//            return AnyView(EyesView())
+//        case .nose:
+//            return AnyView(NoseView())
+//        case .mouth:
+//            return AnyView(MouthView())
+//        case .body:
+//            return AnyView(BodyView())
+//        }
+//    }
 }
 
 struct AvatarCreator_Previews: PreviewProvider {
     static var previews: some View {
         AvatarCreator()
+            .environmentObject(EnvironmentSignUp())
     }
 }
+
+struct ComponentView: View {
+    var showColors: Bool
+    var numberOfColors: Int?
+    var numberOfItems: Int
+    
+    var body: some View {
+        ScrollView(.horizontal, showsIndicators: false) {
+            HStack(spacing: 20) {
+                ForEach((1..<8)) { index in
+                    Circle()
+                        .frame(width: 50, height: 50)
+                        .foregroundColor(Color("hairColor\(index)"))
+
+                }
+            }
+            .padding(.leading)
+        }
+    }
+}
--- a/LazyBear/Views/Onboarding/Helpers/EnvironmentSignUp.swift	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear/Views/Onboarding/Helpers/EnvironmentSignUp.swift	Sat Mar 27 00:46:17 2021 +0100
@@ -8,7 +8,16 @@
 import SwiftUI
 
 class EnvironmentSignUp: ObservableObject {
+    @Published var hideAvatarSelector = false
     @Published var username = ""
-    @Published var avatar = "random4"
-    @Published var hideAvatarSelector = false
+    @Published var body = "body1"
+    @Published var bodyColor = Color("custom2")
+    @Published var eyes = "eyes3"
+    @Published var facialHair = "facialHair4"
+    @Published var hair = "hair13"
+    @Published var hairColor = Color("hairColor1")
+    @Published var mouth = "mouth4"
+    @Published var nose = "nose2"
+    @Published var skinTone = Color("skinTone2")
+    @Published var background = Color("custom7")
 }
--- a/LazyBear/Views/Onboarding/SignUpView.swift	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear/Views/Onboarding/SignUpView.swift	Sat Mar 27 00:46:17 2021 +0100
@@ -25,7 +25,7 @@
                             .padding(.bottom)
                             .opacity(0.6)
                         
-                        ProfileAvatar(size: geo.size.height * 0.3, showingAvatars: $showingAvatars)
+                        ProfileAvatar(scaleMultipler: 2, backgroundHeight: 200, showingAvatars: $showingAvatars)
                             .padding(.bottom)
                             
                         UserNameTextfield(username: $environmentSignUp.username)
@@ -52,7 +52,7 @@
                 Alert(title: Text("Select a username"), message: Text("Need ideas? Try Stockmaster, or Financial lover"), dismissButton: .default(Text("Got it!")))
             }
             .sheet(isPresented: $showingAvatars) {
-                ListAvatarHelper()
+                AvatarCreator()
             }
         }
     }
@@ -63,7 +63,6 @@
         } else {
             // Save settings to CLOUDKIT and show ContentView
             let userSettings = UserSettings(context: moc)
-            userSettings.avatar = environmentSignUp.avatar
             userSettings.username = environmentSignUp.username
             do {
                 try moc.save()
@@ -84,21 +83,17 @@
 }
 
 struct ProfileAvatar: View {
+    var scaleMultipler: CGFloat
+    var backgroundHeight: CGFloat
+    @Binding var showingAvatars: Bool
     @EnvironmentObject var environmentSignUp: EnvironmentSignUp
-    @State var size: CGFloat
-    @Binding var showingAvatars: Bool
     
     var body: some View {
         HStack {
-            Spacer()
+         Spacer()
             ZStack(alignment: .topTrailing) {
-                Image(environmentSignUp.avatar)
-                    .resizable()
-                    .frame(maxWidth: size, maxHeight: size)
-                    .scaledToFit()
-                    .clipShape(Circle())
-                    .shadow(color: Color.black.opacity(0.2), radius: 10)
-                
+               Avatar(scaleMultipler: 2, backgroundHeight: 200)
+                .shadow(color: Color.gray.opacity(0.2), radius: 10)
                 if !environmentSignUp.hideAvatarSelector {
                     Button(action: { self.showingAvatars = true }) {
                         Image(systemName: "photo")
@@ -107,7 +102,7 @@
                             .background(
                                 Circle()
                                     .foregroundColor(Color("default"))
-                                    .shadow(color: Color.gray.opacity(0.3), radius: 10, x: 0.0, y: 0.0)
+                                    .shadow(color: Color.gray.opacity(0.2), radius: 10)
                             )
                             .padding()
                     }
--- a/LazyBear/Views/Onboarding/WelcomeView.swift	Sat Mar 27 00:45:57 2021 +0100
+++ b/LazyBear/Views/Onboarding/WelcomeView.swift	Sat Mar 27 00:46:17 2021 +0100
@@ -19,7 +19,8 @@
                 SignUpView()
                     .environmentObject(environmentSignUp)
             } else {
-                ContentView()
+                SignUpView()
+                    .environmentObject(environmentSignUp)
             }
             
         } else {