286 lines
8.6 KiB
Swift
286 lines
8.6 KiB
Swift
//
|
|
// CreateIconView.swift
|
|
// Feels (iOS)
|
|
//
|
|
// Created by Trey Tartt on 2/13/22.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
enum BackGroundOptions: String, CaseIterable {
|
|
case horrible
|
|
case bad
|
|
case average
|
|
case good
|
|
case great
|
|
case random
|
|
|
|
static var selectable: [BackGroundOptions] {
|
|
return [.great, .good, .average, .bad, .horrible]
|
|
}
|
|
}
|
|
|
|
enum Eyes {
|
|
case left
|
|
case right
|
|
}
|
|
|
|
enum EyeOptions: String, CaseIterable {
|
|
case fire = "fire"
|
|
case bolt = "bolt2"
|
|
case dollar = "dollar"
|
|
case bell = "bell"
|
|
case btc = "btc"
|
|
case code = "code"
|
|
case crown = "crown"
|
|
case divide = "divide"
|
|
case exclamation = "exclamation"
|
|
case fan = "fan"
|
|
case floppy = "floppy"
|
|
case x = "x"
|
|
case skull = "skull"
|
|
case covid = "covid"
|
|
case bomb = "bomb"
|
|
case skull2 = "skull2"
|
|
case poo = "poo"
|
|
|
|
static public var defaultOption: AnyView {
|
|
let image = Image(EyeOptions.fire.rawValue, bundle: .main)
|
|
.resizable()
|
|
.frame(width: 20, height: 20)
|
|
return AnyView(image)
|
|
}
|
|
}
|
|
|
|
enum MouthOptions: String, CaseIterable {
|
|
case fire = "fire"
|
|
case bolt = "bolt2"
|
|
case dollar = "dollar"
|
|
case bell = "bell"
|
|
case btc = "btc"
|
|
case code = "code"
|
|
case crown = "crown"
|
|
case divide = "divide"
|
|
case exclamation = "exclamation"
|
|
case fan = "fan"
|
|
case floppy = "floppy"
|
|
case x = "x"
|
|
case skull = "skull"
|
|
case covid = "covid"
|
|
case bomb = "bomb"
|
|
case skull2 = "skull2"
|
|
case poo = "poo"
|
|
|
|
static public var defaultOption: AnyView {
|
|
let image = Image(MouthOptions.bomb.rawValue, bundle: .main)
|
|
.resizable()
|
|
.frame(width: 20, height: 20)
|
|
return AnyView(image)
|
|
}
|
|
}
|
|
|
|
struct CreateIconView: View {
|
|
@State private var mouth: AnyView = MouthOptions.defaultOption
|
|
@StateObject private var customIcon = CustomIcon(leftEye: EyeOptions.defaultOption,
|
|
rightEye: EyeOptions.defaultOption,
|
|
mouth: MouthOptions.defaultOption,
|
|
background: [(AnyView, UUID)](),
|
|
bgColor: .red,
|
|
innerColor: .green)
|
|
|
|
private var randomElements: [AnyView] = [
|
|
AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue)
|
|
.resizable()
|
|
.frame(width: 20, height: 20)),
|
|
AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue)
|
|
.resizable()
|
|
.frame(width: 20, height: 20)),
|
|
AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue)
|
|
.resizable()
|
|
.frame(width: 20, height: 20)),
|
|
AnyView(Image(BackGroundOptions.selectable.randomElement()!.rawValue)
|
|
.resizable()
|
|
.frame(width: 20, height: 20))
|
|
]
|
|
|
|
func update(eye: Eyes, eyeOption: EyeOptions) {
|
|
let image = Image(eyeOption.rawValue, bundle: .main)
|
|
.resizable()
|
|
.frame(width: 20, height: 20)
|
|
switch eye {
|
|
case .left:
|
|
customIcon.leftEye = AnyView(image)
|
|
case .right:
|
|
customIcon.rightEye = AnyView(image)
|
|
}
|
|
}
|
|
|
|
func createRandom() {
|
|
customIcon.bgColor = Color(
|
|
red: .random(in: 0...1),
|
|
green: .random(in: 0...1),
|
|
blue: .random(in: 0...1)
|
|
)
|
|
|
|
customIcon.innerColor = Color(
|
|
red: .random(in: 0...1),
|
|
green: .random(in: 0...1),
|
|
blue: .random(in: 0...1)
|
|
)
|
|
|
|
update(eye: .left, eyeOption: EyeOptions.allCases.randomElement()!)
|
|
update(eye: .right, eyeOption: EyeOptions.allCases.randomElement()!)
|
|
update(mouthOption: MouthOptions.allCases.randomElement()!)
|
|
|
|
update(background: BackGroundOptions.allCases.randomElement()!)
|
|
}
|
|
|
|
func update(mouthOption: MouthOptions) {
|
|
let image = AnyView(Image(mouthOption.rawValue, bundle: .main)
|
|
.resizable()
|
|
.frame(width: 20, height: 20))
|
|
customIcon.mouth = image
|
|
}
|
|
|
|
func update(background: BackGroundOptions) {
|
|
customIcon.background.removeAll()
|
|
|
|
if background == .random {
|
|
for _ in 0...120 {
|
|
let image = Image(BackGroundOptions.selectable.randomElement()!.rawValue, bundle: .main)
|
|
|
|
let sizedImage = image
|
|
.resizable()
|
|
.frame(width: 20, height: 20)
|
|
|
|
customIcon.background.append((AnyView(sizedImage), UUID()))
|
|
}
|
|
return
|
|
}
|
|
let image = Image(background.rawValue, bundle: .main)
|
|
|
|
let sizedImage = image
|
|
.resizable()
|
|
.frame(width: 20, height: 20)
|
|
|
|
for _ in 0...120 {
|
|
customIcon.background.append((AnyView(sizedImage), UUID()))
|
|
}
|
|
}
|
|
|
|
var mixBG: some View {
|
|
VStack {
|
|
HStack {
|
|
randomElements[0]
|
|
randomElements[1]
|
|
}
|
|
HStack {
|
|
randomElements[2]
|
|
randomElements[3]
|
|
}
|
|
}
|
|
}
|
|
|
|
var iconView: some View {
|
|
IconView(customIcon: customIcon)
|
|
}
|
|
|
|
var body: some View {
|
|
VStack {
|
|
iconView
|
|
.padding()
|
|
Spacer()
|
|
|
|
VStack {
|
|
ColorPicker("Set the background color", selection: $customIcon.bgColor)
|
|
.padding([.leading, .trailing])
|
|
ColorPicker("Set the inner color", selection: $customIcon.innerColor)
|
|
.padding([.leading, .trailing])
|
|
}
|
|
|
|
HStack {
|
|
Spacer()
|
|
Menu("Left Eye") {
|
|
ForEach(EyeOptions.allCases, id: \.self) { option in
|
|
Button(action: {
|
|
update(eye: .left, eyeOption: option)
|
|
}, label: {
|
|
Label(option.rawValue, image: option.rawValue)
|
|
})
|
|
}
|
|
}
|
|
Spacer()
|
|
Menu("Right Eye") {
|
|
ForEach(EyeOptions.allCases, id: \.self) { option in
|
|
Button(action: {
|
|
update(eye: .left, eyeOption: option)
|
|
}, label: {
|
|
Label(option.rawValue, image: option.rawValue)
|
|
})
|
|
}
|
|
}
|
|
Spacer()
|
|
Menu("Mouth") {
|
|
ForEach(MouthOptions.allCases, id: \.self) { option in
|
|
Button(action: {
|
|
update(mouthOption: option)
|
|
}, label: {
|
|
Label(option.rawValue, image: option.rawValue)
|
|
})
|
|
}
|
|
}
|
|
Spacer()
|
|
}
|
|
.padding(.top, 10)
|
|
|
|
VStack{
|
|
Text("Background")
|
|
|
|
HStack {
|
|
ForEach(BackGroundOptions.selectable, id: \.self) { bg in
|
|
Image(bg.rawValue, bundle: .main)
|
|
.resizable()
|
|
.frame(width: CGFloat(50), height: CGFloat(50), alignment: .center)
|
|
.onTapGesture {
|
|
update(background: bg)
|
|
}
|
|
}
|
|
mixBG
|
|
.onTapGesture {
|
|
update(background: .random)
|
|
}
|
|
}
|
|
}
|
|
.padding(.top, 10)
|
|
|
|
Button(action: {
|
|
createRandom()
|
|
}, label: {
|
|
Text("Random")
|
|
.font(.title)
|
|
.fontWeight(.bold)
|
|
.foregroundColor(Color(UIColor.white))
|
|
.frame(minWidth: 0, maxWidth: .infinity)
|
|
.background(.blue)
|
|
})
|
|
|
|
Button(action: {
|
|
// let icon = icon
|
|
}, label: {
|
|
Text("Save")
|
|
.font(.title)
|
|
.fontWeight(.bold)
|
|
.foregroundColor(Color(UIColor.white))
|
|
.frame(minWidth: 0, maxWidth: .infinity)
|
|
.background(.green)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CreateIconView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
CreateIconView()
|
|
}
|
|
}
|