From 83060e8353b81f2848db66d94c243d0f7b31ba5b Mon Sep 17 00:00:00 2001 From: Trey t Date: Mon, 21 Feb 2022 11:36:45 -0600 Subject: [PATCH] closed #89 make custom widgets codable --- Feels.xcodeproj/project.pbxproj | 6 ++ .../Assets.xcassets/custom_icon/Contents.json | 6 ++ .../custom_icon/bell.imageset/Contents.json | 24 +++++ .../custom_icon/bell.imageset/bell-solid.svg | 1 + .../custom_icon/bolt2.imageset/Contents.json | 24 +++++ .../custom_icon/bolt2.imageset/bolt-solid.svg | 1 + .../custom_icon/bomb.imageset/Contents.json | 24 +++++ .../custom_icon/bomb.imageset/bomb-solid.svg | 1 + .../custom_icon/btc.imageset/Contents.json | 24 +++++ .../custom_icon/btc.imageset/btc-brands.svg | 1 + .../custom_icon/code.imageset/Contents.json | 24 +++++ .../custom_icon/code.imageset/code-solid.svg | 1 + .../custom_icon/covid.imageset/Contents.json | 24 +++++ .../covid.imageset/virus-covid-solid.svg | 1 + .../custom_icon/crown.imageset/Contents.json | 24 +++++ .../crown.imageset/crown-solid.svg | 1 + .../custom_icon/divide.imageset/Contents.json | 24 +++++ .../divide.imageset/divide-solid.svg | 1 + .../custom_icon/dollar.imageset/Contents.json | 24 +++++ .../dollar.imageset/dollar-sign-solid.svg | 1 + .../exclamation.imageset/Contents.json | 24 +++++ .../exclamation-solid.svg | 1 + .../custom_icon/fan.imageset/Contents.json | 24 +++++ .../custom_icon/fan.imageset/fan-solid.svg | 1 + .../custom_icon/fire.imageset/Contents.json | 24 +++++ .../custom_icon/fire.imageset/fire-solid.svg | 1 + .../custom_icon/floppy.imageset/Contents.json | 24 +++++ .../floppy.imageset/floppy-disk-solid.svg | 1 + .../missing.imageset/Contents.json | 24 +++++ .../missing.imageset/times-solid.svg | 1 + .../custom_icon/poo.imageset/Contents.json | 24 +++++ .../custom_icon/poo.imageset/poo-solid.svg | 1 + .../custom_icon/skull.imageset/Contents.json | 24 +++++ .../skull.imageset/skull-solid.svg | 1 + .../custom_icon/skull2.imageset/Contents.json | 24 +++++ .../skull-crossbones-solid.svg | 1 + .../custom_icon/x.imageset/Contents.json | 24 +++++ .../custom_icon/x.imageset/x-solid.svg | 1 + FeelsWidget/FeelsWidget.swift | 18 +--- Shared/Color+Codable.swift | 100 ++++++++++++++++++ Shared/Models/UserDefaultsStore.swift | 22 +++- Shared/Random.swift | 25 ----- .../views/CustomIcon/CreateWidgetView.swift | 77 +++++--------- .../CustomWidget/CustomWidgetModel.swift | 70 +++++++++++- .../views/CustomWidget/CustomWidgetView.swift | 35 +----- 45 files changed, 679 insertions(+), 130 deletions(-) create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/bell-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/bolt-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/bomb-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/btc-brands.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/code.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/code.imageset/code-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/virus-covid-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/crown-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/divide-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/dollar-sign-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/exclamation-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/fan-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/fire-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/floppy-disk-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/times-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/poo-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/skull-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/skull-crossbones-solid.svg create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/x.imageset/Contents.json create mode 100644 FeelsWidget/Assets.xcassets/custom_icon/x.imageset/x-solid.svg create mode 100644 Shared/Color+Codable.swift diff --git a/Feels.xcodeproj/project.pbxproj b/Feels.xcodeproj/project.pbxproj index dc08ca8..df6a90b 100644 --- a/Feels.xcodeproj/project.pbxproj +++ b/Feels.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ 1C04488E27C2AE5200D22444 /* IconViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C04488C27C2ADDB00D22444 /* IconViewModel.swift */; }; 1C04489627C2DB0100D22444 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C358FAC27ADD0C3002C83A6 /* Theme.swift */; }; 1C04489727C2DB9B00D22444 /* BGView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603127A5C1C800C520BD /* BGView.swift */; }; + 1C04489927C3F24000D22444 /* Color+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C04489827C3F24000D22444 /* Color+Codable.swift */; }; + 1C04489A27C3F24F00D22444 /* Color+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C04489827C3F24000D22444 /* Color+Codable.swift */; }; 1C0DAB45279DB0FB003B1F21 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1C0DAB47279DB0FB003B1F21 /* Localizable.strings */; }; 1C10E24E27A1AB110047948B /* UserDefaultsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5F4977279C945E0092F1B4 /* UserDefaultsStore.swift */; }; 1C10E25027A1AB220047948B /* OnboardingDay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CA03774279A294800D26164 /* OnboardingDay.swift */; }; @@ -168,6 +170,7 @@ 1C04488627C1C81D00D22444 /* PersonalityPackable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonalityPackable.swift; sourceTree = ""; }; 1C04488927C2ABD500D22444 /* IconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconView.swift; sourceTree = ""; }; 1C04488C27C2ADDB00D22444 /* IconViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconViewModel.swift; sourceTree = ""; }; + 1C04489827C3F24000D22444 /* Color+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Codable.swift"; sourceTree = ""; }; 1C0DAB46279DB0FB003B1F21 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 1C0DAB48279DB116003B1F21 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 1C2162EA27C14EFA004353D1 /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; }; @@ -482,6 +485,7 @@ 1CD90B75278C8119001C4FEA /* LocalNotification.swift */, 1C4FF3C527BEE07800BE8F34 /* Persisence */, 1CD90B5C278C7EAD001C4FEA /* Random.swift */, + 1C04489827C3F24000D22444 /* Color+Codable.swift */, 1C2162EA27C14EFA004353D1 /* Date+Extensions.swift */, 1C2162ED27C15191004353D1 /* MoodEntryFunctions.swift */, 1C683FC92792281400745862 /* Stats.swift */, @@ -834,6 +838,7 @@ 1C358FAD27ADD0C3002C83A6 /* Theme.swift in Sources */, 1C2162EB27C14EFA004353D1 /* Date+Extensions.swift in Sources */, 1C02589C27B9677A00EB91AC /* CreateWidgetView.swift in Sources */, + 1C04489927C3F24000D22444 /* Color+Codable.swift in Sources */, 1C358FC227B4D227002C83A6 /* WeekTotalTemplate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -874,6 +879,7 @@ files = ( 1CD90B65278C7EBA001C4FEA /* Mood.swift in Sources */, 1C04488B27C2ABDE00D22444 /* IconView.swift in Sources */, + 1C04489A27C3F24F00D22444 /* Color+Codable.swift in Sources */, 1C361F1127C03C3D00E832FC /* OnboardingTime.swift in Sources */, 1CEC967227B9C9FB00CC8688 /* CustomWidgetView.swift in Sources */, 1C2162F827C16E3C004353D1 /* MoodTintable.swift in Sources */, diff --git a/FeelsWidget/Assets.xcassets/custom_icon/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/Contents.json new file mode 100644 index 0000000..96ef9c7 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "bell-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/bell-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/bell-solid.svg new file mode 100644 index 0000000..f21cc7d --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/bell.imageset/bell-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/Contents.json new file mode 100644 index 0000000..e15231d --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "bolt-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/bolt-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/bolt-solid.svg new file mode 100644 index 0000000..bd3d9d0 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/bolt2.imageset/bolt-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/Contents.json new file mode 100644 index 0000000..ed251d3 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "bomb-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/bomb-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/bomb-solid.svg new file mode 100644 index 0000000..0427c34 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/bomb.imageset/bomb-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/Contents.json new file mode 100644 index 0000000..706f48b --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "btc-brands.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/btc-brands.svg b/FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/btc-brands.svg new file mode 100644 index 0000000..e6eee0f --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/btc.imageset/btc-brands.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/code.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/code.imageset/Contents.json new file mode 100644 index 0000000..8e9f650 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/code.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "code-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/code.imageset/code-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/code.imageset/code-solid.svg new file mode 100644 index 0000000..725f767 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/code.imageset/code-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/Contents.json new file mode 100644 index 0000000..2e06d53 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "virus-covid-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/virus-covid-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/virus-covid-solid.svg new file mode 100644 index 0000000..02be96a --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/covid.imageset/virus-covid-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/Contents.json new file mode 100644 index 0000000..fa0a54b --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "crown-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/crown-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/crown-solid.svg new file mode 100644 index 0000000..d8bce79 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/crown.imageset/crown-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/Contents.json new file mode 100644 index 0000000..aca17bd --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "divide-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/divide-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/divide-solid.svg new file mode 100644 index 0000000..78cc82f --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/divide.imageset/divide-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/Contents.json new file mode 100644 index 0000000..3ee36bc --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "dollar-sign-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/dollar-sign-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/dollar-sign-solid.svg new file mode 100644 index 0000000..32fefc5 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/dollar.imageset/dollar-sign-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/Contents.json new file mode 100644 index 0000000..3024f0d --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "exclamation-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/exclamation-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/exclamation-solid.svg new file mode 100644 index 0000000..bb39970 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/exclamation.imageset/exclamation-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/Contents.json new file mode 100644 index 0000000..a352b15 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "fan-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/fan-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/fan-solid.svg new file mode 100644 index 0000000..041671e --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/fan.imageset/fan-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/Contents.json new file mode 100644 index 0000000..42accce --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "fire-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/fire-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/fire-solid.svg new file mode 100644 index 0000000..9ab0ec0 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/fire.imageset/fire-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/Contents.json new file mode 100644 index 0000000..aea3ab6 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "floppy-disk-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/floppy-disk-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/floppy-disk-solid.svg new file mode 100644 index 0000000..464c1c0 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/floppy.imageset/floppy-disk-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/Contents.json new file mode 100644 index 0000000..c1376d8 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "times-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/times-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/times-solid.svg new file mode 100644 index 0000000..8144622 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/missing.imageset/times-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/Contents.json new file mode 100644 index 0000000..0285bef --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "poo-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/poo-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/poo-solid.svg new file mode 100644 index 0000000..2815329 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/poo.imageset/poo-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/Contents.json new file mode 100644 index 0000000..c46da19 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "skull-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/skull-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/skull-solid.svg new file mode 100644 index 0000000..2972599 --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/skull.imageset/skull-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/Contents.json new file mode 100644 index 0000000..761674e --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "skull-crossbones-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/skull-crossbones-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/skull-crossbones-solid.svg new file mode 100644 index 0000000..c4e92ee --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/skull2.imageset/skull-crossbones-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/Assets.xcassets/custom_icon/x.imageset/Contents.json b/FeelsWidget/Assets.xcassets/custom_icon/x.imageset/Contents.json new file mode 100644 index 0000000..2c8ae1e --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/x.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "x-solid.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/FeelsWidget/Assets.xcassets/custom_icon/x.imageset/x-solid.svg b/FeelsWidget/Assets.xcassets/custom_icon/x.imageset/x-solid.svg new file mode 100644 index 0000000..3f6383c --- /dev/null +++ b/FeelsWidget/Assets.xcassets/custom_icon/x.imageset/x-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/FeelsWidget/FeelsWidget.swift b/FeelsWidget/FeelsWidget.swift index 64e4011..260510f 100644 --- a/FeelsWidget/FeelsWidget.swift +++ b/FeelsWidget/FeelsWidget.swift @@ -290,23 +290,11 @@ struct FeelsIconWidgetEntryView : View { struct SmallIconView: View { var entry: Provider.Entry - @AppStorage(UserDefaultsStore.Keys.customIcon.rawValue, store: GroupUserDefaults.groupDefaults) private var savedCustomIcon = Data() var body: some View { - ZStack { - if let image = UIImage(data: savedCustomIcon) { - GeometryReader { geo in - Image(uiImage: image) - .resizable() - .scaledToFit() - } - } else { - GeometryReader { geo in - Mood.missing.graphic - .resizable() - .scaledToFit() - } - } + GeometryReader { geo in + CustomWidgetView(customWidgetModel: UserDefaultsStore.getCustomWidget()) + .frame(width: geo.size.width, height: geo.size.height) } } } diff --git a/Shared/Color+Codable.swift b/Shared/Color+Codable.swift new file mode 100644 index 0000000..a4b798e --- /dev/null +++ b/Shared/Color+Codable.swift @@ -0,0 +1,100 @@ +// +// Color+Codable.swift +// FirestoreCodableSamples +// +// Created by Peter Friese on 18.03.21. +// + +import SwiftUI + +// Inspired by https://cocoacasts.com/from-hex-to-uicolor-and-back-in-swift +// Make Color codable. This includes support for transparency. +// See https://www.digitalocean.com/community/tutorials/css-hex-code-colors-alpha-values +extension Color: Codable { + init(hex: String) { + let rgba = hex.toRGBA() + + self.init(.sRGB, + red: Double(rgba.r), + green: Double(rgba.g), + blue: Double(rgba.b), + opacity: Double(rgba.alpha)) + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let hex = try container.decode(String.self) + + self.init(hex: hex) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(toHex) + } + + var toHex: String? { + return toHex() + } + + func toHex(alpha: Bool = false) -> String? { + guard let components = cgColor?.components, components.count >= 3 else { + return nil + } + + let r = Float(components[0]) + let g = Float(components[1]) + let b = Float(components[2]) + var a = Float(1.0) + + if components.count >= 4 { + a = Float(components[3]) + } + + if alpha { + return String(format: "%02lX%02lX%02lX%02lX", + lroundf(r * 255), + lroundf(g * 255), + lroundf(b * 255), + lroundf(a * 255)) + } + else { + return String(format: "%02lX%02lX%02lX", + lroundf(r * 255), + lroundf(g * 255), + lroundf(b * 255)) + } + } +} + +extension String { + func toRGBA() -> (r: CGFloat, g: CGFloat, b: CGFloat, alpha: CGFloat) { + var hexSanitized = self.trimmingCharacters(in: .whitespacesAndNewlines) + hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "") + + var rgb: UInt64 = 0 + + var r: CGFloat = 0.0 + var g: CGFloat = 0.0 + var b: CGFloat = 0.0 + var a: CGFloat = 1.0 + + let length = hexSanitized.count + + Scanner(string: hexSanitized).scanHexInt64(&rgb) + + if length == 6 { + r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0 + g = CGFloat((rgb & 0x00FF00) >> 8) / 255.0 + b = CGFloat(rgb & 0x0000FF) / 255.0 + } + else if length == 8 { + r = CGFloat((rgb & 0xFF000000) >> 24) / 255.0 + g = CGFloat((rgb & 0x00FF0000) >> 16) / 255.0 + b = CGFloat((rgb & 0x0000FF00) >> 8) / 255.0 + a = CGFloat(rgb & 0x000000FF) / 255.0 + } + + return (r, g, b, a) + } +} diff --git a/Shared/Models/UserDefaultsStore.swift b/Shared/Models/UserDefaultsStore.swift index 641c9c3..6eaf9d3 100644 --- a/Shared/Models/UserDefaultsStore.swift +++ b/Shared/Models/UserDefaultsStore.swift @@ -18,7 +18,7 @@ class UserDefaultsStore { case moodImages case moodTint case personalityPack - case customIcon + case customWidget case contentViewCurrentSelectedHeaderViewBackDays case contentViewHeaderTag @@ -81,5 +81,25 @@ class UserDefaultsStore { return Theme.system } } + + static func getCustomWidget() -> CustomWidgetModel { + if let data = GroupUserDefaults.groupDefaults.object(forKey: UserDefaultsStore.Keys.customWidget.rawValue) as? Data, + let model = try? JSONDecoder().decode(CustomWidgetModel.self, from: data) { + return model + } else { + return CustomWidgetModel.defaultCustomWidget + } + } + + @discardableResult + static func saveCustomWidget(widgetModel: CustomWidgetModel) -> CustomWidgetModel { + do { + let data = try JSONEncoder().encode(widgetModel) + GroupUserDefaults.groupDefaults.set(data, forKey: UserDefaultsStore.Keys.customWidget.rawValue) + return UserDefaultsStore.getCustomWidget() + } catch { + fatalError("error saving") + } + } } diff --git a/Shared/Random.swift b/Shared/Random.swift index 574c662..8d72d04 100644 --- a/Shared/Random.swift +++ b/Shared/Random.swift @@ -127,31 +127,6 @@ extension Color { blue: .random(in: 0...1) ) } - - init(hex: String) { - let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) - var int: UInt64 = 0 - Scanner(string: hex).scanHexInt64(&int) - let a, r, g, b: UInt64 - switch hex.count { - case 3: // RGB (12-bit) - (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) - case 6: // RGB (24-bit) - (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) - case 8: // ARGB (32-bit) - (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) - default: - (a, r, g, b) = (1, 1, 1, 0) - } - - self.init( - .sRGB, - red: Double(r) / 255, - green: Double(g) / 255, - blue: Double(b) / 255, - opacity: Double(a) / 255 - ) - } } extension String { diff --git a/Shared/views/CustomIcon/CreateWidgetView.swift b/Shared/views/CustomIcon/CreateWidgetView.swift index 8a8ce1c..85e27bf 100644 --- a/Shared/views/CustomIcon/CreateWidgetView.swift +++ b/Shared/views/CustomIcon/CreateWidgetView.swift @@ -8,10 +8,10 @@ import SwiftUI struct CreateWidgetView: View { - @AppStorage(UserDefaultsStore.Keys.customIcon.rawValue, store: GroupUserDefaults.groupDefaults) private var savedCustomIcon = Data() - @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system + @StateObject var customWidget = UserDefaultsStore.getCustomWidget() + static var iconViewBGs: [(CustomWidgetBackGroundOptions, UUID)] = { var blah = [(CustomWidgetBackGroundOptions, UUID)]() for _ in 0...99 { @@ -21,17 +21,7 @@ struct CreateWidgetView: View { }() @State private var mouth: CustomWidgetMouthOptions = CustomWidgetMouthOptions.defaultOption - @StateObject private var customIcon = CustomWidgetModel(leftEye: CustomWidgetEyeOptions.defaultOption, - rightEye: CustomWidgetEyeOptions.defaultOption, - mouth: CustomWidgetMouthOptions.defaultOption, - background: CreateWidgetView.iconViewBGs, - bgColor: .red, - innerColor: .green, - bgOverlayColor: .black, - rightEyeColor: .orange, - leftEyeColor: .yellow, - mouthColor: .purple, - circleStrokeColor: .pink) + private var randomElements: [AnyView] = [ AnyView(Image(CustomWidgetBackGroundOptions.selectable.randomElement()!.rawValue) .resizable() @@ -50,20 +40,20 @@ struct CreateWidgetView: View { func update(eye: CustomWidgetEyes, eyeOption: CustomWidgetEyeOptions) { switch eye { case .left: - customIcon.leftEye = eyeOption + customWidget.leftEye = eyeOption case .right: - customIcon.rightEye = eyeOption + customWidget.rightEye = eyeOption } } func createRandom() { - customIcon.bgColor = Color.random() - customIcon.innerColor = Color.random() - customIcon.bgOverlayColor = Color.random() - customIcon.circleStrokeColor = Color.random() - customIcon.leftEyeColor = Color.random() - customIcon.rightEyeColor = Color.random() - customIcon.mouthColor = Color.random() + customWidget.bgColor = Color.random() + customWidget.innerColor = Color.random() + customWidget.bgOverlayColor = Color.random() + customWidget.circleStrokeColor = Color.random() + customWidget.leftEyeColor = Color.random() + customWidget.rightEyeColor = Color.random() + customWidget.mouthColor = Color.random() update(eye: .left, eyeOption: CustomWidgetEyeOptions.allCases.randomElement()!) update(eye: .right, eyeOption: CustomWidgetEyeOptions.allCases.randomElement()!) @@ -73,21 +63,11 @@ struct CreateWidgetView: View { } func update(mouthOption: CustomWidgetMouthOptions) { - customIcon.mouth = mouthOption + customWidget.mouth = mouthOption } func update(background: CustomWidgetBackGroundOptions) { - customIcon.background.removeAll() - - if background == .random { - for _ in 0...CustomWidgetModel.numberOfBGItems { - customIcon.background.append((CustomWidgetBackGroundOptions.selectable.randomElement()!, UUID())) - } - return - } - for _ in 0...CustomWidgetModel.numberOfBGItems { - customIcon.background.append((background, UUID())) - } + customWidget.background = background } var mixBG: some View { @@ -104,7 +84,7 @@ struct CreateWidgetView: View { } var widgetView: some View { - CustomWidgetView(customWidgetModel: customIcon) + CustomWidgetView(customWidgetModel: customWidget) } var body: some View { @@ -187,7 +167,7 @@ struct CreateWidgetView: View { update(background: .random) } - ColorPicker("", selection: $customIcon.bgOverlayColor) + ColorPicker("", selection: $customWidget.bgOverlayColor) } .padding() .background( @@ -203,21 +183,21 @@ struct CreateWidgetView: View { HStack(spacing: 0) { VStack(alignment: .center) { Text("background") - ColorPicker("", selection: $customIcon.bgColor) + ColorPicker("", selection: $customWidget.bgColor) .labelsHidden() } .frame(minWidth: 0, maxWidth: .infinity) VStack(alignment: .center) { Text("Inner") - ColorPicker("", selection: $customIcon.innerColor) + ColorPicker("", selection: $customWidget.innerColor) .labelsHidden() } .frame(minWidth: 0, maxWidth: .infinity) VStack(alignment: .center) { Text("Face Outline") - ColorPicker("", selection: $customIcon.circleStrokeColor) + ColorPicker("", selection: $customWidget.circleStrokeColor) .labelsHidden() } .frame(minWidth: 0, maxWidth: .infinity) @@ -226,21 +206,21 @@ struct CreateWidgetView: View { HStack(spacing: 0) { VStack(alignment: .center) { Text("Left Eye") - ColorPicker("", selection: $customIcon.leftEyeColor) + ColorPicker("", selection: $customWidget.leftEyeColor) .labelsHidden() } .frame(minWidth: 0, maxWidth: .infinity) VStack(alignment: .center) { Text("right eye") - ColorPicker("", selection: $customIcon.rightEyeColor) + ColorPicker("", selection: $customWidget.rightEyeColor) .labelsHidden() } .frame(minWidth: 0, maxWidth: .infinity) VStack(alignment: .center) { Text("mouth") - ColorPicker("", selection: $customIcon.mouthColor) + ColorPicker("", selection: $customWidget.mouthColor) .labelsHidden() } .frame(minWidth: 0, maxWidth: .infinity) @@ -269,16 +249,9 @@ struct CreateWidgetView: View { .background(.blue) Button(action: { - let bigIconView = CustomWidgetView(customWidgetModel: customIcon) - .frame(width: 512, height: 512, alignment: .center) - .aspectRatio(contentMode: .fill) - let icon = bigIconView.snapshot() - if let data = icon.pngData() { - savedCustomIcon = data - - let impactMed = UIImpactFeedbackGenerator(style: .heavy) - impactMed.impactOccurred() - } + UserDefaultsStore.saveCustomWidget(widgetModel: customWidget) + let impactMed = UIImpactFeedbackGenerator(style: .heavy) + impactMed.impactOccurred() }, label: { Text("Save") .font(.title) diff --git a/Shared/views/CustomWidget/CustomWidgetModel.swift b/Shared/views/CustomWidget/CustomWidgetModel.swift index 9ff8f0e..e4e0ba2 100644 --- a/Shared/views/CustomWidget/CustomWidgetModel.swift +++ b/Shared/views/CustomWidget/CustomWidgetModel.swift @@ -7,13 +7,13 @@ import SwiftUI -class CustomWidgetModel: ObservableObject { +class CustomWidgetModel: ObservableObject, Codable { static let numberOfBGItems = 109 - static let defaultCustomIcon = CustomWidgetModel(leftEye: CustomWidgetEyeOptions.defaultOption, + static let defaultCustomWidget = CustomWidgetModel(leftEye: CustomWidgetEyeOptions.defaultOption, rightEye: CustomWidgetEyeOptions.defaultOption, mouth: CustomWidgetMouthOptions.defaultOption, - background: WidgetView_Previews.backgrounds, + background: CustomWidgetBackGroundOptions.defaultOption, bgColor: .red, innerColor: .green, bgOverlayColor: .orange, @@ -26,7 +26,7 @@ class CustomWidgetModel: ObservableObject { init(leftEye: CustomWidgetEyeOptions, rightEye: CustomWidgetEyeOptions, mouth: CustomWidgetMouthOptions, - background: [(CustomWidgetBackGroundOptions, UUID)], + background: CustomWidgetBackGroundOptions, bgColor: Color, innerColor: Color, bgOverlayColor: Color, @@ -52,7 +52,7 @@ class CustomWidgetModel: ObservableObject { @Published var rightEye: CustomWidgetEyeOptions @Published var mouth: CustomWidgetMouthOptions - @Published var background: [(CustomWidgetBackGroundOptions, UUID)] + @Published var background: CustomWidgetBackGroundOptions @Published var bgColor: Color @Published var innerColor: Color @Published var bgOverlayColor: Color @@ -62,6 +62,66 @@ class CustomWidgetModel: ObservableObject { @Published var mouthColor: Color @Published var circleStrokeColor: Color + + public var backgroundImages : [(Image, String)] { + 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)) + } + return blah + } else { + var blah = [(Image, String)]() + for _ in 0...CustomWidgetModel.numberOfBGItems { + blah.append((background.image, UUID().uuidString)) + } + return blah + } + } + + enum CodingKeys: CodingKey { + case leftEye, rightEye, mouth, background, bgColor, innerColor, bgOverlayColor, leftEyeColor, rightEyeColor, mouthColor, circleStrokeColor + } + + 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) + } + + 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) + } + + func toData() -> Data { + if let data = try? JSONEncoder().encode(self) { + return data + } + return Data() + } } enum CustomWidgetBackGroundOptions: String, CaseIterable, Codable { diff --git a/Shared/views/CustomWidget/CustomWidgetView.swift b/Shared/views/CustomWidget/CustomWidgetView.swift index 0575309..481b56c 100644 --- a/Shared/views/CustomWidget/CustomWidgetView.swift +++ b/Shared/views/CustomWidget/CustomWidgetView.swift @@ -12,27 +12,6 @@ struct CustomWidgetView: View { private let facePercSize = 0.6 -// private var gridXOffset: CGFloat { -// if isPreview { -// return CGFloat(0) -// } -// return CGFloat(6) -// } -// -// private var gridYOffset: CGFloat { -// if isPreview { -// return CGFloat(0) -// } -// return CGFloat(-8) -// } -// -// private var entireFuckingViewOffset: CGFloat { -// if isPreview { -// return CGFloat(0) -// } -// return CGFloat(25) -// } - let columns = [ GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1), GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1), @@ -56,8 +35,8 @@ struct CustomWidgetView: View { .frame(maxWidth: .infinity, maxHeight: .infinity) LazyVGrid(columns: columns, alignment: .leading, spacing: 0) { - ForEach(customWidgetModel.background, id: \.self.1) { (bgOption, uuid) in - bgOption.image + ForEach(customWidgetModel.backgroundImages, id: \.self.1) { (bgOption, uuid) in + bgOption .resizable() .aspectRatio(1, contentMode: .fill) .foregroundColor(customWidgetModel.bgOverlayColor) @@ -114,16 +93,8 @@ struct CustomWidgetView: View { } struct WidgetView_Previews: PreviewProvider { - static var backgrounds: [(CustomWidgetBackGroundOptions, UUID)] = { - var blah = [(CustomWidgetBackGroundOptions, UUID)]() - for _ in 0...CustomWidgetModel.numberOfBGItems { - blah.append((CustomWidgetBackGroundOptions.selectable.randomElement()!, UUID())) - } - return blah - }() - static var previews: some View { - CustomWidgetView(customWidgetModel: CustomWidgetModel.defaultCustomIcon) + CustomWidgetView(customWidgetModel: CustomWidgetModel.defaultCustomWidget) .frame(width: 256, height: 256, alignment: .center) }