// // CustomIcon.swift // Feels (iOS) // // Created by Trey Tartt on 2/13/22. // import SwiftUI class CustomWidgetModel: ObservableObject, Codable, NSCopying { static let numberOfBGItems = 109 static var randomWidget: CustomWidgetModel { return CustomWidgetModel(leftEye: CustomWidgetEyeOptions.defaultOption, rightEye: CustomWidgetEyeOptions.defaultOption, mouth: CustomWidgetMouthOptions.defaultOption, background: CustomWidgetBackGroundOptions.defaultOption, bgColor: Color.random(), innerColor: Color.random(), bgOverlayColor: Color.random(), rightEyeColor: Color.random(), leftEyeColor: Color.random(), mouthColor: Color.random(), circleStrokeColor: Color.random(), inUse: true, uuid: UUID().uuidString, isSaved: false, createdDate: Date()) } init(leftEye: CustomWidgetEyeOptions, rightEye: CustomWidgetEyeOptions, mouth: CustomWidgetMouthOptions, background: CustomWidgetBackGroundOptions, bgColor: Color, innerColor: Color, bgOverlayColor: Color, rightEyeColor: Color, leftEyeColor: Color, mouthColor: Color, circleStrokeColor: Color, inUse: Bool, uuid: String, isSaved: Bool, createdDate: Date) { self.leftEye = leftEye self.rightEye = rightEye self.mouth = mouth self.background = background self.bgColor = bgColor self.innerColor = innerColor self.bgOverlayColor = bgOverlayColor self.rightEyeColor = rightEyeColor self.leftEyeColor = leftEyeColor self.mouthColor = mouthColor self.circleStrokeColor = circleStrokeColor self.inUse = inUse self.uuid = uuid self.isSaved = isSaved self.createdDate = createdDate } @Published var leftEye: CustomWidgetEyeOptions @Published var rightEye: CustomWidgetEyeOptions @Published var mouth: CustomWidgetMouthOptions @Published var background: CustomWidgetBackGroundOptions @Published var bgColor: Color @Published var innerColor: Color @Published var bgOverlayColor: Color @Published var leftEyeColor: Color @Published var rightEyeColor: Color @Published var mouthColor: Color @Published var circleStrokeColor: Color @Published var inUse: Bool @Published var uuid: String @Published var isSaved: Bool @Published var createdDate: Date private var oldBackground: CustomWidgetBackGroundOptions? private var oldBackgroundImages: [(Image, String)]? public var backgroundImages : [(Image, String)] { if let oldBackgroundImages = oldBackgroundImages, oldBackground == background { return oldBackgroundImages } oldBackground = background if background == .random { var blah = [(Image, String)]() for _ in 0...CustomWidgetModel.numberOfBGItems { let image = CustomWidgetBackGroundOptions.selectable.randomElement()?.image ?? CustomWidgetBackGroundOptions.defaultOption.image blah.append((image, UUID().uuidString)) } oldBackgroundImages = blah } else { var blah = [(Image, String)]() for _ in 0...CustomWidgetModel.numberOfBGItems { blah.append((background.image, UUID().uuidString)) } oldBackgroundImages = blah } return oldBackgroundImages! } enum CodingKeys: CodingKey { case leftEye, rightEye, mouth, background, bgColor, innerColor, bgOverlayColor, leftEyeColor, rightEyeColor, mouthColor, circleStrokeColor, inUse, uuid, isSaved, createdDate } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) leftEye = try container.decode(CustomWidgetEyeOptions.self, forKey: .leftEye) rightEye = try container.decode(CustomWidgetEyeOptions.self, forKey: .rightEye) mouth = try container.decode(CustomWidgetMouthOptions.self, forKey: .mouth) background = try container.decode(CustomWidgetBackGroundOptions.self, forKey: .background) bgColor = try container.decode(Color.self, forKey: .bgColor) innerColor = try container.decode(Color.self, forKey: .innerColor) bgOverlayColor = try container.decode(Color.self, forKey: .bgOverlayColor) leftEyeColor = try container.decode(Color.self, forKey: .leftEyeColor) rightEyeColor = try container.decode(Color.self, forKey: .rightEyeColor) mouthColor = try container.decode(Color.self, forKey: .mouthColor) circleStrokeColor = try container.decode(Color.self, forKey: .circleStrokeColor) inUse = try container.decode(Bool.self, forKey: .inUse) uuid = try container.decode(String.self, forKey: .uuid) isSaved = try container.decode(Bool.self, forKey: .isSaved) createdDate = try container.decode(Date.self, forKey: .createdDate) } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(leftEye, forKey: .leftEye) try container.encode(rightEye, forKey: .rightEye) try container.encode(mouth, forKey: .mouth) try container.encode(background, forKey: .background) try container.encode(bgColor, forKey: .bgColor) try container.encode(innerColor, forKey: .innerColor) try container.encode(bgOverlayColor, forKey: .bgOverlayColor) try container.encode(leftEyeColor, forKey: .leftEyeColor) try container.encode(rightEyeColor, forKey: .rightEyeColor) try container.encode(mouthColor, forKey: .mouthColor) try container.encode(circleStrokeColor, forKey: .circleStrokeColor) try container.encode(inUse, forKey: .inUse) try container.encode(uuid, forKey: .uuid) try container.encode(isSaved, forKey: .isSaved) try container.encode(createdDate, forKey: .createdDate) } func copy(with zone: NSZone? = nil) -> Any { let copy = CustomWidgetModel(leftEye: self.leftEye, rightEye: self.rightEye, mouth: self.mouth, background: self.background, bgColor: self.bgColor, innerColor: self.innerColor, bgOverlayColor: self.bgOverlayColor, rightEyeColor: self.rightEyeColor, leftEyeColor: self.leftEyeColor, mouthColor: self.mouthColor, circleStrokeColor: self.circleStrokeColor, inUse: self.inUse, uuid: self.uuid, isSaved: self.isSaved, createdDate: self.createdDate) return copy } } enum CustomWidgetBackGroundOptions: String, CaseIterable, Codable { case horrible case bad case average case good case great case random static var selectable: [CustomWidgetBackGroundOptions] { return [.great, .good, .average, .bad, .horrible] } static public var defaultOption: CustomWidgetBackGroundOptions { CustomWidgetBackGroundOptions.random } public var image: Image { return Image(self.rawValue, bundle: .main) } } enum CustomWidgetEyes: String, Codable { case left case right } enum CustomWidgetEyeOptions: String, CaseIterable, Codable { 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: CustomWidgetEyeOptions { CustomWidgetEyeOptions.fire } public var image: Image { return Image(self.rawValue, bundle: .main) } } enum CustomWidgetMouthOptions: String, CaseIterable, Codable { 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: CustomWidgetMouthOptions { CustomWidgetMouthOptions.bomb } public var image: Image { return Image(self.rawValue, bundle: .main) } }