Files
Reflect/Shared/Views/CustomWidget/CustomWidgetModel.swift
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:47:16 -06:00

375 lines
17 KiB
Swift

//
// CustomIcon.swift
// Reflect (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: CustomWidgeImageOptions.defaultOption,
rightEye: CustomWidgeImageOptions.defaultOption,
mouth: CustomWidgeImageOptions.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: CustomWidgeImageOptions,
rightEye: CustomWidgeImageOptions,
mouth: CustomWidgeImageOptions,
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: CustomWidgeImageOptions
@Published var rightEye: CustomWidgeImageOptions
@Published var mouth: CustomWidgeImageOptions
@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(CustomWidgeImageOptions.self, forKey: .leftEye)
rightEye = try container.decode(CustomWidgeImageOptions.self, forKey: .rightEye)
mouth = try container.decode(CustomWidgeImageOptions.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 CustomWidgeImageOptions: String, CaseIterable, Codable {
case star_solid = "custom_icon/star-solid"
case jet_fighter_solid = "custom_icon/jet-fighter-solid"
case circle_xmark_solid = "custom_icon/circle-xmark-solid"
case frown_regular = "custom_icon/frown-regular"
case virus_covid_solid = "custom_icon/virus-covid-solid"
case bullhorn_solid = "custom_icon/bullhorn-solid"
case caret_down_solid = "custom_icon/caret-down-solid"
case meteor_solid = "custom_icon/meteor-solid"
case eye_solid = "custom_icon/eye-solid"
case battery_half_solid = "custom_icon/battery-half-solid"
case heart_crack_solid = "custom_icon/heart-crack-solid"
case heart_solid = "custom_icon/heart-solid"
case divide_solid = "custom_icon/divide-solid"
case location_crosshairs_solid = "custom_icon/location-crosshairs-solid"
case bitcoin_brands = "custom_icon/bitcoin-brands"
case baby_solid = "custom_icon/baby-solid"
case grin_regular = "custom_icon/grin-regular"
case poo_storm_solid = "custom_icon/poo-storm-solid"
case btc_brands = "custom_icon/btc-brands"
case shuttle_space_solid = "custom_icon/shuttle-space-solid"
case chess_king_solid = "custom_icon/chess-king-solid"
case chess_queen_solid = "custom_icon/chess-queen-solid"
case lightbulb_solid = "custom_icon/lightbulb-solid"
case skull_solid = "custom_icon/skull-solid"
case dice_one_solid = "custom_icon/dice-one-solid"
case fan_solid = "custom_icon/fan-solid"
case bolt_solid = "custom_icon/bolt-solid"
case dharmachakra_solid = "custom_icon/dharmachakra-solid"
case ban_solid = "custom_icon/ban-solid"
case skull_crossbones_solid = "custom_icon/skull-crossbones-solid"
case sad_tear_regular = "custom_icon/sad-tear-regular"
case floppy_disk_solid = "custom_icon/floppy-disk-solid"
case crosshairs_solid = "custom_icon/crosshairs-solid"
case exclamation_solid = "custom_icon/exclamation-solid"
case lemon_solid = "custom_icon/lemon-solid"
case caret_right_solid = "custom_icon/caret-right-solid"
case poo_solid = "custom_icon/poo-solid"
case rainbow_solid = "custom_icon/rainbow-solid"
case apple_brands = "custom_icon/apple-brands"
case x_solid = "custom_icon/x-solid"
case pizza_slice_solid = "custom_icon/pizza-slice-solid"
case empire_brands = "custom_icon/empire-brands"
case caret_up_solid = "custom_icon/caret-up-solid"
case life_ring_solid = "custom_icon/life-ring-solid"
case dragon_solid = "custom_icon/dragon-solid"
case cannabis_solid = "custom_icon/cannabis-solid"
case bullseye_solid = "custom_icon/bullseye-solid"
case code_compare_solid = "custom_icon/code-compare-solid"
case battery_empty_solid = "custom_icon/battery-empty-solid"
case moon_solid = "custom_icon/moon-solid"
case android_brands = "custom_icon/android-brands"
case smile_beam_regular = "custom_icon/smile-beam-regular"
case futbol_solid = "custom_icon/futbol-solid"
case dollar_sign_solid = "custom_icon/dollar-sign-solid"
case cross_solid = "custom_icon/cross-solid"
case bomb_solid = "custom_icon/bomb-solid"
case battery_full_solid = "custom_icon/battery-full-solid"
case arrow_up_solid = "custom_icon/arrow-up-solid"
case gem_solid = "custom_icon/gem-solid"
case code_solid = "custom_icon/code-solid"
case bolt_lightning_solid = "custom_icon/bolt-lightning-solid"
case caret_left_solid = "custom_icon/caret-left-solid"
case fort_awesome_brands = "custom_icon/fort-awesome-brands"
case fire_solid = "custom_icon/fire-solid"
case hotjar_brands = "custom_icon/hotjar-brands"
case burger_solid = "custom_icon/burger-solid"
case egg_solid = "custom_icon/egg-solid"
case meh_regular = "custom_icon/meh-regular"
case battery_three_quarters_solid = "custom_icon/battery-three-quarters-solid"
case crown_solid = "custom_icon/crown-solid"
case clock_solid = "custom_icon/clock-solid"
case battery_quarter_solid = "custom_icon/battery-quarter-solid"
case fly_brands = "custom_icon/fly-brands"
case baseball_solid = "custom_icon/baseball-solid"
case dice_d20_solid = "custom_icon/dice-d20-solid"
case microphone_solid = "custom_icon/microphone-solid"
case peace_solid = "custom_icon/peace-solid"
static public var defaultOption: CustomWidgeImageOptions {
CustomWidgeImageOptions.bomb_solid
}
public var image: Image {
return Image(self.rawValue, bundle: .main)
}
}
enum CustomWidgetMouthOptions: String, CaseIterable, Codable {
case star_solid = "custom_icon/star-solid"
case jet_fighter_solid = "custom_icon/jet-fighter-solid"
case circle_xmark_solid = "custom_icon/circle-xmark-solid"
case frown_regular = "custom_icon/frown-regular"
case virus_covid_solid = "custom_icon/virus-covid-solid"
case bullhorn_solid = "custom_icon/bullhorn-solid"
case caret_down_solid = "custom_icon/caret-down-solid"
case meteor_solid = "custom_icon/meteor-solid"
case eye_solid = "custom_icon/eye-solid"
case battery_half_solid = "custom_icon/battery-half-solid"
case heart_crack_solid = "custom_icon/heart-crack-solid"
case heart_solid = "custom_icon/heart-solid"
case divide_solid = "custom_icon/divide-solid"
case location_crosshairs_solid = "custom_icon/location-crosshairs-solid"
case bitcoin_brands = "custom_icon/bitcoin-brands"
case baby_solid = "custom_icon/baby-solid"
case grin_regular = "custom_icon/grin-regular"
case poo_storm_solid = "custom_icon/poo-storm-solid"
case btc_brands = "custom_icon/btc-brands"
case shuttle_space_solid = "custom_icon/shuttle-space-solid"
case chess_king_solid = "custom_icon/chess-king-solid"
case chess_queen_solid = "custom_icon/chess-queen-solid"
case lightbulb_solid = "custom_icon/lightbulb-solid"
case skull_solid = "custom_icon/skull-solid"
case dice_one_solid = "custom_icon/dice-one-solid"
case fan_solid = "custom_icon/fan-solid"
case bolt_solid = "custom_icon/bolt-solid"
case dharmachakra_solid = "custom_icon/dharmachakra-solid"
case ban_solid = "custom_icon/ban-solid"
case skull_crossbones_solid = "custom_icon/skull-crossbones-solid"
case sad_tear_regular = "custom_icon/sad-tear-regular"
case floppy_disk_solid = "custom_icon/floppy-disk-solid"
case crosshairs_solid = "custom_icon/crosshairs-solid"
case exclamation_solid = "custom_icon/exclamation-solid"
case lemon_solid = "custom_icon/lemon-solid"
case caret_right_solid = "custom_icon/caret-right-solid"
case poo_solid = "custom_icon/poo-solid"
case rainbow_solid = "custom_icon/rainbow-solid"
case apple_brands = "custom_icon/apple-brands"
case x_solid = "custom_icon/x-solid"
case pizza_slice_solid = "custom_icon/pizza-slice-solid"
case empire_brands = "custom_icon/empire-brands"
case caret_up_solid = "custom_icon/caret-up-solid"
case life_ring_solid = "custom_icon/life-ring-solid"
case dragon_solid = "custom_icon/dragon-solid"
case cannabis_solid = "custom_icon/cannabis-solid"
case bullseye_solid = "custom_icon/bullseye-solid"
case code_compare_solid = "custom_icon/code-compare-solid"
case battery_empty_solid = "custom_icon/battery-empty-solid"
case moon_solid = "custom_icon/moon-solid"
case android_brands = "custom_icon/android-brands"
case smile_beam_regular = "custom_icon/smile-beam-regular"
case futbol_solid = "custom_icon/futbol-solid"
case dollar_sign_solid = "custom_icon/dollar-sign-solid"
case cross_solid = "custom_icon/cross-solid"
case bomb_solid = "custom_icon/bomb-solid"
case battery_full_solid = "custom_icon/battery-full-solid"
case arrow_up_solid = "custom_icon/arrow-up-solid"
case gem_solid = "custom_icon/gem-solid"
case code_solid = "custom_icon/code-solid"
case bolt_lightning_solid = "custom_icon/bolt-lightning-solid"
case caret_left_solid = "custom_icon/caret-left-solid"
case fort_awesome_brands = "custom_icon/fort-awesome-brands"
case fire_solid = "custom_icon/fire-solid"
case hotjar_brands = "custom_icon/hotjar-brands"
case burger_solid = "custom_icon/burger-solid"
case egg_solid = "custom_icon/egg-solid"
case meh_regular = "custom_icon/meh-regular"
case battery_three_quarters_solid = "custom_icon/battery-three-quarters-solid"
case crown_solid = "custom_icon/crown-solid"
case clock_solid = "custom_icon/clock-solid"
case battery_quarter_solid = "custom_icon/battery-quarter-solid"
case fly_brands = "custom_icon/fly-brands"
case baseball_solid = "custom_icon/baseball-solid"
case dice_d20_solid = "custom_icon/dice-d20-solid"
case microphone_solid = "custom_icon/microphone-solid"
case peace_solid = "custom_icon/peace-solid"
static public var defaultOption: CustomWidgetMouthOptions {
CustomWidgetMouthOptions.bomb_solid
}
public var image: Image {
return Image(self.rawValue, bundle: .main)
}
}