Created
February 7, 2023 12:16
-
-
Save DarrenHurst/d099c191cd2c857de8049f6d0ea25371 to your computer and use it in GitHub Desktop.
Buttons - Burger Builder - Part 2 passing builder types
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// CartView.swift | |
// RTSPStreamer | |
// | |
// Created by Darren Hurst on 2023-02-05. | |
// | |
import Foundation | |
import SwiftUI | |
struct CartView: View { | |
var burgers: [BurgerBuilder] = [HamburgerBuilder(), CheeseburgerBuilder(), BaconburgerBuilder()] | |
@State var burger: Burger = Burger(burger: BaconburgerBuilder()) | |
var body: some View { | |
// returns View Type | |
ScrollView(.vertical){ | |
LazyVStack { | |
AnyView( self.showBurgerOptions() ) | |
// AnyView( burger.showBurgerView() ) | |
}.onAppear() { | |
burger.tomatoes = false | |
}.standard().frame(alignment:.top) | |
//.offset(y:-60) | |
}.standard() | |
} | |
/* Binding func */ | |
func showBurgerOptions() -> any View { | |
@State var scale = 0.9 | |
return VStack { | |
HStack { | |
ForEach (0..<burgers.count, id: \.self) { i in | |
Button(burgers[i].name, action: { | |
// set new Burger with BurgerBuilder | |
self.burger = Burger(burger: burgers[i]) | |
}).padding(10).overlay(RoundedRectangle(cornerRadius: 14) | |
.stroke(Color.DarkGray, lineWidth: 2)).frame(height:50).offset(y:60).ignoresSafeArea().shadow(radius: 3) | |
} | |
}.zIndex(5) | |
Text("Burger Type: \(burger.name)").font(.LargeBoldFont).offset(y:60) | |
ZStack { | |
Image("BunTop") | |
.offset(y:burger.tomatoes ? 80: 90) | |
//.animation(runBounce(), value: burger.tomatoes) | |
.animation(runSpring(), value: burger.tomatoes) | |
}.zIndex(2).offset(y:5) | |
ZStack { | |
Circle().shadow(radius: 10) | |
.frame(width: 240,height:240).offset(y:-40) | |
Image("Tomatoe").zIndex(5) | |
.offset(y:burger.tomatoes ? -37: -55).animation(.easeInOut, value: burger.tomatoes) | |
.opacity(burger.tomatoes ? 0.9: 0).animation(.easeInOut, value: burger.tomatoes).shadow(radius: 3) | |
Image("bacon").zIndex(4) | |
.offset(y:burger.bacon ? -37: -55).animation(.easeInOut, value: burger.bacon) | |
.opacity(burger.bacon ? 0.9: 0).animation(.easeInOut, value: burger.bacon).shadow(radius: 3) | |
Image("cheese").zIndex(3).offset(y:-25).shadow(radius: 3) | |
Image("patties").zIndex(1).offset(y:-15).shadow(radius: 3) | |
Image("BunBottom") | |
}.offset(y:-25) | |
VStack { | |
LazyVStack { | |
Toggle("Tomatoes: ", isOn: $burger.tomatoes).shadow(radius: 3).tint(.blue) | |
Toggle("Onions: ", isOn: $burger.onions).shadow(radius: 3).tint(.blue) | |
Toggle("Lettuce: ", isOn: $burger.lettuce).shadow(radius: 3).tint(.blue) | |
Toggle(isOn: $burger.ketchup){ | |
Text("Ketchup") | |
}.tint(.blue).shadow(radius: 3) | |
}.font(.Large).padding(30) | |
.overlay( | |
RoundedRectangle(cornerRadius: 14) | |
.stroke(Color.DarkGray, lineWidth: 2) | |
).padding(10).shadow(radius: 3) | |
}.offset(y:-30) | |
} | |
} | |
} | |
struct PreviewBurger : PreviewProvider { | |
let myBurger: Burger = Burger(burger: BaconburgerBuilder()) | |
static var previews: some View { | |
CartView() | |
} | |
} | |
protocol BurgerBuilder { | |
var name: String { get set} | |
var lettuce: Bool{ get set } | |
var tomatoes: Bool { get set } | |
var onions: Bool { get set } | |
var patties : Int { get set } | |
var ketchup : Bool { get set } | |
var mustard : Bool { get set } | |
var bacon: Bool { get set } | |
var cheese: Bool { get set } | |
} | |
struct Burger: BurgerBuilder { | |
var name: String | |
var lettuce: Bool | |
var tomatoes: Bool | |
var onions: Bool | |
var patties: Int | |
var ketchup: Bool | |
var mustard: Bool | |
var bacon: Bool | |
var cheese: Bool | |
init(burger: BurgerBuilder) { | |
self.name = burger.name | |
self.lettuce = burger.lettuce | |
self.tomatoes = burger.tomatoes | |
self.onions = burger.onions | |
self.patties = burger.patties | |
self.ketchup = burger.ketchup | |
self.mustard = burger.mustard | |
self.bacon = burger.bacon | |
self.cheese = burger.cheese | |
} | |
func showBurgerView() -> any View { | |
return | |
VStack { | |
Text("\(name)") | |
Text("Tomatoes: \(String(tomatoes))") | |
Text("Onions: \(String(onions))") | |
Text("Lettuce: \(String(lettuce))") | |
Text("Ketchup: \(String(ketchup))") | |
} | |
} | |
} | |
struct HamburgerBuilder: BurgerBuilder { | |
var name: String = "Basic Burger" | |
var lettuce: Bool = false | |
var tomatoes: Bool = false | |
var onions: Bool = false | |
var patties: Int = 1 | |
var ketchup: Bool = true | |
var mustard: Bool = true | |
var bacon: Bool = false | |
var cheese: Bool = false | |
} | |
struct CheeseburgerBuilder: BurgerBuilder { | |
var name: String = "Cheese Burger" | |
var lettuce: Bool = true | |
var tomatoes: Bool = true | |
var onions: Bool = true | |
var patties: Int = 1 | |
var ketchup: Bool = true | |
var mustard: Bool = true | |
var bacon: Bool = false | |
var cheese: Bool = true | |
} | |
struct BaconburgerBuilder: BurgerBuilder { | |
var name: String = "Bacon Burger" | |
var lettuce: Bool = true | |
var tomatoes: Bool = true | |
var onions: Bool = true | |
var patties: Int = 1 | |
var ketchup: Bool = true | |
var mustard: Bool = true | |
var bacon: Bool = true | |
var cheese: Bool = true | |
} | |
Screen.Recording.2023-02-07.at.7.08.20.AM.mov
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ForEach (0..<burgers.count, id: .self) { i in
Button(burgers[i].name, action: {
// set new Burger with BurgerBuilder
self.burger = Burger(burger: burgers[i])
}).padding(10).overlay(RoundedRectangle(cornerRadius: 14)
.stroke(Color.DarkGray, lineWidth: 2)).frame(height:50).offset(y:60).ignoresSafeArea().shadow(radius: 3)
}
Sets the BurgerBuilder to Burger.