From f106068257311c901a0bb0175f28ae240d13fc58 Mon Sep 17 00:00:00 2001 From: Robert Brune Date: Fri, 1 Dec 2023 05:09:55 +0100 Subject: [PATCH 1/2] # Shared files: `wled#native` # Exclusive iOS files: `wled#native#iOS` # Exclusuve OSX files: `wled#native#osx` --- ExampleImages/Example-01.png | Bin 0 -> 71644 bytes README.md | 25 ++ .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/wled-icon-gray.png | Bin .../Assets.xcassets/Contents.json | 0 .../wled_logo_akemi.imageset/Contents.json | 0 .../wled_logo_akemi.png | Bin {wled-native => wled-native-ios}/Info.plist | 0 .../Launch Screen.storyboard | 0 .../Persistence.swift | 0 .../WLEDNativeApp.swift | 0 wled-native-ios/wled-native-ios.md | 4 + .../012_rip.imageset/012_rip.png | Bin 0 -> 2797 bytes .../012_rip.imageset/Contents.json | 21 + .../AccentColor.colorset/Contents.json | 11 + .../AppIconMac.appiconset/Contents.json | 68 +++ .../AppIconMac.appiconset/mac-128x128.png | Bin 0 -> 8313 bytes .../AppIconMac.appiconset/mac-128x128@2x.png | Bin 0 -> 14450 bytes .../AppIconMac.appiconset/mac-16x16.png | Bin 0 -> 1689 bytes .../AppIconMac.appiconset/mac-16x16@2x.png | Bin 0 -> 2422 bytes .../AppIconMac.appiconset/mac-256x256.png | Bin 0 -> 14450 bytes .../AppIconMac.appiconset/mac-256x256@2x.png | Bin 0 -> 22668 bytes .../AppIconMac.appiconset/mac-32x32.png | Bin 0 -> 2422 bytes .../AppIconMac.appiconset/mac-32x32@2x.png | Bin 0 -> 4217 bytes .../AppIconMac.appiconset/mac-512x512.png | Bin 0 -> 22668 bytes .../AppIconMac.appiconset/mac-512x512@2x.png | Bin 0 -> 39489 bytes wled-native-osx/Assets.xcassets/Contents.json | 6 + .../wled_logo_akemi.imageset/Contents.json | 21 + .../wled_logo_akemi.png | Bin 0 -> 24315 bytes .../Documentation.docc/Collections/Model.md | 22 + .../Documentation.docc/Collections/View.md | 19 + .../Collections/ViewProtocols.md | 8 + .../Documentation.docc/Documentation.md | 24 + wled-native-osx/Model/DeviceActor.swift | 119 +++++ wled-native-osx/Model/DeviceCollection.swift | 81 ++++ wled-native-osx/View/ContentView.swift | 66 +++ wled-native-osx/View/DeviceView.swift | 103 +++++ wled-native-osx/View/Main.swift | 21 + .../DeviceProviderExtension.swift | 13 + .../WledDeviceExtension.swift | 81 ++++ .../ViewProtocolls/CollectionProvider.swift | 15 + .../ViewProtocolls/DeviceProvider.swift | 22 + wled-native-osx/wled-native-osx.md | 6 + wled-native-osx/wled-osx.entitlements | 12 + wled-native.xcodeproj/project.pbxproj | 413 +++++++++++++++--- .../xcschemes/wled-native.xcscheme | 12 +- wled-native/wled-native.md | 3 + 48 files changed, 1123 insertions(+), 73 deletions(-) create mode 100644 ExampleImages/Example-01.png rename {wled-native => wled-native-ios}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {wled-native => wled-native-ios}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {wled-native => wled-native-ios}/Assets.xcassets/AppIcon.appiconset/wled-icon-gray.png (100%) rename {wled-native => wled-native-ios}/Assets.xcassets/Contents.json (100%) rename {wled-native => wled-native-ios}/Assets.xcassets/wled_logo_akemi.imageset/Contents.json (100%) rename {wled-native => wled-native-ios}/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png (100%) rename {wled-native => wled-native-ios}/Info.plist (100%) rename {wled-native => wled-native-ios}/Launch Screen.storyboard (100%) rename {wled-native => wled-native-ios}/Persistence.swift (100%) rename {wled-native => wled-native-ios}/WLEDNativeApp.swift (100%) create mode 100644 wled-native-ios/wled-native-ios.md create mode 100644 wled-native-osx/Assets.xcassets/012_rip.imageset/012_rip.png create mode 100644 wled-native-osx/Assets.xcassets/012_rip.imageset/Contents.json create mode 100644 wled-native-osx/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/Contents.json create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128@2x.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16@2x.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png create mode 100644 wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png create mode 100644 wled-native-osx/Assets.xcassets/Contents.json create mode 100644 wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/Contents.json create mode 100644 wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png create mode 100644 wled-native-osx/Documentation.docc/Collections/Model.md create mode 100644 wled-native-osx/Documentation.docc/Collections/View.md create mode 100644 wled-native-osx/Documentation.docc/Collections/ViewProtocols.md create mode 100644 wled-native-osx/Documentation.docc/Documentation.md create mode 100644 wled-native-osx/Model/DeviceActor.swift create mode 100644 wled-native-osx/Model/DeviceCollection.swift create mode 100644 wled-native-osx/View/ContentView.swift create mode 100644 wled-native-osx/View/DeviceView.swift create mode 100644 wled-native-osx/View/Main.swift create mode 100644 wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift create mode 100644 wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift create mode 100644 wled-native-osx/ViewProtocolls/CollectionProvider.swift create mode 100644 wled-native-osx/ViewProtocolls/DeviceProvider.swift create mode 100644 wled-native-osx/wled-native-osx.md create mode 100644 wled-native-osx/wled-osx.entitlements create mode 100644 wled-native/wled-native.md diff --git a/ExampleImages/Example-01.png b/ExampleImages/Example-01.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1721ad3f2c05e6810366ecbf420267f9548d58 GIT binary patch literal 71644 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 z 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 literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/012_rip.imageset/Contents.json b/wled-native-osx/Assets.xcassets/012_rip.imageset/Contents.json new file mode 100644 index 0000000..f3e2c25 --- /dev/null +++ b/wled-native-osx/Assets.xcassets/012_rip.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "012_rip.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/wled-native-osx/Assets.xcassets/AccentColor.colorset/Contents.json b/wled-native-osx/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/wled-native-osx/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/Contents.json b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/Contents.json new file mode 100644 index 0000000..6adbbd7 --- /dev/null +++ b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "filename" : "mac-16x16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "mac-16x16@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "mac-32x32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "mac-32x32@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "mac-128x128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "mac-128x128@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "mac-256x256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "mac-256x256@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "mac-512x512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "mac-512x512@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..d54c7a6abd403c4742488fdaa676e4d1ae37ecf7 GIT binary patch literal 8313 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℞>H~b~Xyf;0QOSFjy2wlu` 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 literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e8543589c9fffa4803df89bda0bfb267dafe35ea GIT binary patch literal 1689 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 literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..dff7e15e71ec4d61bcdde6c9159f55fd0f824698 GIT binary patch literal 14450 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 literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f41699716f6c5d357972ca680a542a33906c645f GIT binary patch literal 22668 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�ww#2(u+KC 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 A9RL6T literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d7fd743be5fe0aa1294161859849fe73a488d744 GIT binary patch literal 2422 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 literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1961f69a3257f8c0a620df477fbdcd42c0639e88 GIT binary patch literal 4217 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 P00000NkvXXu0mjfG?oZg literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..f41699716f6c5d357972ca680a542a33906c645f GIT binary patch literal 22668 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�ww#2(u+KC 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 A9RL6T literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png b/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..54129e0816cf9e321d23884113fcbb58dbd1cbe2 GIT binary patch literal 39489 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%0A%_HPruOYQxq9iJ8hdix7o2(LrV!nqvwv{GLAZ>4 za}FKY8kkp=nnO$Er&nk`Dkipm z|4F6J`XgCS%iNsAFJCt-E6Tj4ozOS##=pO~9@CM#FTWENQky`pdKSyK_a#8KzFZ@rWjqZ{wcUg!S0f48<#})w8}FWe5@Fb zowP>}=-hc}nIb$%!VB=k`~30Wg7)_dga;5LJ)T~sc#=d7U{Z~N2oLTXKw`h&+HS@Z z+3!erpm)M#csAs`01!qiYY{BC+WHnXkoxy%@j|{me--O-NaCXX#Tg*=Kk<;@4)MMW zP_?>A&IMOwv)_Odum{|s!W}}@4jdSd@bE=Ek^KyeL6*vnJ4DJDAkqda+aR9ErUhfr z-n@c0L^W3G|8EnTOYJSmZ_)|SGhD}Hi`t!v-slQ0smD0Q@;$K4>;Ks**1WW(o@!QU z7;ZH8Kj({Rg#9BG1h~QQZo_hBOdo!Aj5Gx(8O;X^5~SE2Le} zy-;VV*u8bODd*G1{c5Qv<*j$J$|atZ5308?@oG_42p!3a{MtqJ>|E@bnVr-1()6%d zJNvU}ATb5FV<9eut)U3X2q}}=NM@mkJHKmy7#_oyjnJph@|?x;<>Hl;*Y6(G#_Be- zhTXkO$!$BUOJJ%KwZXTtmY1J*H&V~}rhh!S^B^`i>yGZIPWEtIYl*&7 zpf%6r%R%$sVPke}_C3X-k;UtH$R+#-jfcZHi2qJB{x2PS#dp`Ke;;HuqRrgnUl2OQ zvDeI0AKc~^wHA8&=!?fbxJXo{p8lo&XOgdghvj&k7w^JR^=n#n#K{Si0bfpgw#ZUu zQCG5xZt1)a^Xpw)maEEa-dc@l`PH20#$*aiiD{1s^6Y6#$B~jC*UcV}xy6=aRU^`> zGZ{uNm@dA}{nZhjZI#hI`B#cU5?et1vAhUq}BOswhVCP2LG_;Xdzc&E+DJs?{$7^@LBfW|4cM#2m3z!QcvYx=%H0FWPSos&3lXOP~zuJGGl97Kz zLp^h3PD6BUWlY52cD_VY3R=Ou=#;x*Y?V*@%~DJBoq~uZ(+tJ7W3$alVnH7bxD5@a zWtg%af8BUBXjXTH_OVBzTN0he7L$D44*;-gsuRC zsR3S0mJABRT@HIE3`n<=6h(q~(JLaT33oYE76>5T$%*gMbw0k*cLP_!{C_9sEBNmbm#BYS*UlDoIu#x4xTC-(;O{vj z@;N3>$o<|R%0@ZSW1=<5Aicv#N%Z~W+-mQdUs0))S>=U!vGZDE7lPh*3)M!_+jDf) zw`QffsCbOLA$)#qb2>j+P!97UmJz*Jab+h_)=;pu#pDv*-Mn`XJfw9t&r3d`#i|GR zIiRt0FE2_cfs$9EEccaN`=Z6Ou}~j9yp8Zfd98cv;JX+S{W7 z*umaMfO8y5e2ovhc2hIvvQ?T^-py+WgTcA?#4t6d>%C5V3VnsipojWWQwkXFXh*tp zpXsk|IUi6dsH(J=z4kGZ;sVoJU!;lFcgI%RYqwNyfnh&r025hPV)Y|#WcjeO`N!1z zpaB4xb|iloM?iE60zA5emW|f$O+RI3r6x9!D<#9E!7yqr+OpC(89TZ5k< zbTqni_Uu_gtY(U~qM2Xz;!b?a$LE~xIO#Hb=IiNw(YdX?X>dtwj`%Z~xU8&fbmyI- z;PMKSzHqk;j`@bE=YhhZRWaXtv$YjUE}32S+P3#0VBexD4=56GZwpuv|q7jScAALIdcl~Qx_aj~llu=~%z zSekVHSCGQ^tx{qy_MXSZn`Zm?c$R+ge?b+ac?3A$A- zLXXKN7IcaWHU8`-Do!}uW*Y+TK7cwHib-uBJ%J5ueb__T=#j(=Yxd}KKgPZ*$K@EV znhSPE%sQi=n9p}5$9T&Avb$|wkQ8Tgx0dmHjM_Crau<~qPlbvV&#oi+xg9Tir%vf= zYPsu0(<#3!>G7&{%Q8Z{Sk^Dp`AlwYMH}rm?CdvdM&$C9atdk^jGO!3|5&xD8GI#M zHNtB4jq)68hf=wxQJM4c8BE?>LMtZm1^@3@tu8OHnZDfX2T?3bA=Lwyv8ZITve)|^ zGd031iZ|LuF1M6~x$bFy`8AR0MlQ8uFg>l-Cp0^}sUnC?>Wyf@5&Izfp zc%G=^TWU_#Cv!xC{7;Kni)yS$*JypAsc?|pi1V3KiS3H-2=!drx`KXj<86iev)?sr zmtl#ZzJ7bb{I^*vLF)C>s=w9u=c9!=UKY;+?U}8#K!L=$R~u99cNBt8JaWAx+h4?e zzulZ$?~7ce|9ae1i)rtkZ^h=~dWDazs6~NGd5$+462w?(eu!z0irmQu0`W{iSQ@1@#WJ@nA$I}VD5HLFR!1~scqvWd)^ztbNB znSLUW3!jBARy@hG`%;#yQChC&Og(*QPC}}EI*@A9qs=Su3ipG^>Zx-7Ao`U~tvBki z_sYj^*)tRdI`eB(4bp7TPo)#}Se;R$nFJ7S3s( zdc9oc$k^7XH2p=&$kdp1#08#YhN&j+4||d8``bdUgWANNTd`fqw~y`ZDA!7@eJbgB zrCG4?GwoOVyFh`15Qh;%Wf^;puXQgsE;K&~x@J{CYqfs5Z**8-)O)A2-zRW7knVTj zzy+H(xdyNND-cqg*d_g%t>WimP`tj*`xy?a>R0bLGb&H4wKu$z@Z9mL-#2yX4B9&C zzp?&pW8VuCI3^Y&BxKk8wS0HMS6IxHZYh`iU|l89ek3oMCAvh&l_~u^uWvfG)qh z1Mb`KP+;L(N{OrC#VGHB7{=X5{F?}j*yy^OJ>HET!Xltwiq1CRMb|~K(e<_QTX<=7 zQ*g7~RQ?%WDWWCFhpJB2MKI!qNSZ;EN$ zR_qZM!w#HM0$W%cb~lr#-3y_1t&U}KmHuSFOz}n6cA$uMO{V|USvi5}pJu8uNo=KF zGWQLcuY&CMzS_?8I>Iziyqq{Zx+_jTbg!aae@;>66=N}3->8^6m&eaJhkox28ha(M_{wLOpYvE@Dx&5 z?^$mfKH2Ux@s)F)VY*8D9oKsnVaWS!Y+-WuPJ8a?6Efc%af-0g{LpMThQdsC9;iAF zyxNH&FXU3mIvS`DHxQp-)x$eO89la0HPPslBblsE9Wu7XoeC8sNUF2d)8wer5v5YS zsBq4h436<)(AY6(6&1PjS6KZ9@OJ-6=KLGD|M!H?|Ch36uWkjOAwdu#v}<>JN$=Pm z1IM{?Ov(Eq|ItC_BFWA6I~EfkD}c~9yxumKR| zn zf@|{NW$(zA4zbmF)1M1ws?y(2#2QWwRdZvION%YxaRWAQu$TOjJePUHWp*v*HayC_ zy|`U#7C?P>%kn1Y3lQ^uag(=GnTXYG9Fh3cZ3qntUZ*=S`yF&p64zwdM{K!&tM$kF7jkHNMs zM=)ks{kAztM^MXL5C|KM_KKhEbL2)Q@<19l{FHlaFT~n1!>+~Ucm~8>R=gj2%h=K~ zi&@eoM^X6!CXM;dQE=0Q239dWr*zSR=HK}Emq0cC1eScgz_|MS)n*+08nKT~RTmHeiMQy8!@!4|q6_Xw|%-1$tkBp5z z*xSlzvQbQNHtCHOn?lWN#7G*T$81!B%N4S(@WuUGTYUk%{ zYbEMnxobtc_L~49M73tYkAx(&p%K9pQefMw}CcJWguPs z>rxUV9%X@kZ;xp7R?u9aM*|4Pdd~%qICV%*gS)nK4nq3noeaaj+U*DvM#XrJE_a0c zOkGwtTN%;t7_T$UaE?sPyID2Yo?@yU-OsU{bj7iVIuFGXovpb#l@@6rALcHtzae=~ z;_|vFZ(_x-@q+?$(Yi-L^$@-7<3tTxy8YB77$#mNWOE(13kJhyxO zLBY^#+4w5V5AW%_f$QhU>94w8zFW?=*4{{KBXHSPvs9ACp*Z#&wf%WXi+a6N&I+0o zEk=|;Ccu!_6}^(_L>3n1H>{^T_>+xQl@uvwnwA!i`|qPd(==|x^Aw#G^50mzpy&9Q zgJdg0?7-h~MhqqMIA(sh-g|3QyJq5C&D$DM8O~zYs!5jV?X^jjivDm=G8W@kd$y7@ z-vC$f310;kJ@tL7XSn`7cp8SZZLz|+%MNZos)D+>Cj+m~{LXCtt>!9$XHlTH{-0ND zL0#PG(sW#B0cnfvofT8%f)|A&0iM>)pj=+u^%dv=z5LIz4|AuIQ@Bv?*l*TMvKO38 zEWhw1EMZxn-)g#eE~4W`eYV*P#xk~V?bn;XoN>xrmx@1S&(Y_&?|C_PTz9IZOW;7~ zXKWhDkG(T*;; z{RDfb3&O`-RnYaPdDJ<7h4Yz)inG#^4A%+RT`LSBhIjN(R_q&kC-v%+Hlpa-NLkbK z=NB4vm2!$>Z=d$OaLN~5sd?|-1+l?8Yu<$&nxL*=c@J*Pj(x6|7{jMKmq>=M*nWGU zN@pc;^nO)jh@yXR*IiVUC-e0WC2oRku20vzZmDP@k0G+P^J5ws_GjgyITMjO7ki% zj(2ZsMWti!Zik1~WtT-Aj}g#DEgEzN=qb0dvYJk1JFvKGXs8@2nPcoEcXWC+b_&C| zq#WCoIR7rg`&Wfr>tansPr2qw_BUOXP~9&LA+fF8GP^sGxst9HHT+U;XD<)`z@%hl z&V~<~%erLo8&$ndu$vl;3w~9xa-^+oNua}L`$kK}&8)=C3k-|$;hytCDlZi>gwmS4 z`+lNz<3{5TDyt+)({G=eVl{~s)aT)rU5j(}j{}&c{Jvv97mm`40h!5PUV+pFyYcAN z&&OkfgM)ik!Nq=-FQ{KCUK2FaQOWzJmU)^5KW96{X6!sXW{J+KUPFwaZiz0YM1#n0 z%IjY~-^q<`skj4M?s}n+w5_Jjd&6;4!IyOzvIldGRXRFS-*|h6qRn<+{5= zAIk3*x$Qbvtk*@IUuzX0Sgdxf8QE%f>iWr|g;ZaWRToTVx_O1a%uRd4cOL2CKCTcL zVMX`zzQkJEao_R;6?Ee8ob#7DdZCxs0x8pGC7=6oD<|+IW4dLPj(cA|qh%Ez3!2xh z@6XE09;{3iC}s!m3LE-UoHKGDr5Z?r+s^rVUdHbyL&X5f^^q?S0eF{M9)Sv`_n z@h%xqfSUlu&B#wUDOAuv22?Ti+@qbs)morUEVikl@poKB1ZM%^x_MzT$HVy$Ab+oc zcpbxqg4MsZ-tQMFlt4c{Vj#MFC<=~^CY}baAjK&iH(YI|dK73|iRX`*aRm?Z1&}*W zDfsd3tiAUKVKtVUSMcsH8#jX~uMwY2I;<2xA@CJAK?-FmJKm*2VeA!#(?`fva82ZS zP~D^oI_e(54JiH>kz29nH0f`Oz@3Obj@rg0Cks^@3YE~bwzg)jJ!P?WaVc$UYkMaa z1#Z2Jlfbm{UfOM5kd{tlakN;=noRLX((EW}Gjnh_FOs0cL8Wu|F7IcCvh;&?7J?Ek zlILjv5;~OG%0L_&JHrx{GqAp3aPWvMuVx#UKrf+-{Xk zYZCL%)BmSwg1pXA9CMKXrgs7hj*yTLy&-cErj^0s3`NB$G$Sa=FasFN$0ovzX#@;9Tnt~C}mFhVMBlLP~tgYAbLnY_HxwVt!Du14MLiGCL;&v{ED zQ|)$id8~ic6PVOeRIg{9IjK9+_OQrsqZZ}8 zw|Q*TZ8DU;4SFO0xb%86N402I=hz%ZOvrmq0c=k~<6(H_i$otGt%J(7%#0*P zkL~Y)=R!qAW1i8m5|U7W?!n0M@IngGguP@B7L17zX!E>({OPa2f$i;W)!owUFLJw2 zB@Wg`V&o)>&Ro_wxV5BpAfWB2gkny!lLj{#8M5}7P^PcZqv@n(y|t~~D?^}Tm4=M9 zCWbO!3aNQ49d&PR%chrd4ik|H*WIAD$uvOqF+l1QbfBT$<`_7Wq_yq{$E)1z&8!KU65Xb%Mvv(mfBO)SnDdwMPR{|#d09Q^@=%x37U&DyF_{OI<+pzbw+XC6I zG0znikNM1uc}qj^T+dn1+(Y(PGe@|_*e+;P(3vFd$!8~~gf?1zOs_GPM~nqliWor# z^y@#XPRIarwJ4(4alr?-1GuUFk0kO3Y+{}6^I2?_<00&H#sf&&`E26dQ_IDceK!b` zV)Md>p8o|x_MP#+>*x;|Nbqw2?Yid`ALEs2R|D_;pJn4x8yPm{QYJ%>GB3DA|Mb7JCtT8(*oLgokQP-=EnY=-sjq<|jmB^fj5Z^R>@DWgVU z44SrH16`~&FAaYz?P3cBo!TE7jKDw&(g5}_a(8<&T$}aRr%#_cYrOaP?8=mmB}qJ* zPq67F^1E~@=p}^MC;TG#bw-T!%$Y-s2jD2d+RLA^@M^MO#DX;#PM&5w3?AT3hk&;Q zav1UMe7ggjOo_6-#mjpCGxUE8K^B|OF@FQR_z3z~obp&KY^`uoED2W?{) z7Z)A@ppHS&M691Ww9a@OOmP?~2wm`1%X_^%IP!$58CyG$zeaTo_wDys>3LEs6fbF3 z1;+Si=szME@ee`%LCC+H^?#1cKQiQBQ20lv{-b67WwZme>(bMeb@MM50Wm??o+K^# z>qlz1R?^nMz<{c5mXD%}iuUNczdFvs`+)Co_jvgDZ=)6NNeEgEKTUF*2;L;*SNmEtHuMBAGvEP7UtTW4@njI6fXVRBa{qr#-CIO{ z%J(iS;N_pAxjN;E{L;FLV(_|+@+cb11E^8sL5&s*wW$IHT&Ufq(NUCx_+w&9yl|lH z2fqiK4TG>a?7_of18IUJY~0%6p#ok{&uC8jONlTrOJ7PWZjJmG8gXstm4J}lDZGfx zTS9Q}5h8icLbx^I`_gk(!z+ zN8V=e1xI$kQy37h_Sh8UARdTTWa;^$uqhy-~cFQ)>hmw3%ic(lex5>V7oLs)G+E@!C_nJX9_Ngik6&nK|5GmmgT7Pg0F&+g8WLlM*0j>Kj@IUE}SF}Xq5EVl8Y8HT+X zH)BPtH||AXJblS;wkuSRpuPUfw0~kHe%}^qSjNOjKkXdTkGmv(zs7dHAioeN;m{U% zuv%pL!c9hckXyk^UQ*n%PC}(~&c2Qr^B4vnVI9x5D%-^W+#(q{bQw(qd%GG4-dANk{lg#^sleM#96mrdX{<_VqU_O*_q-d6~WK}%m}uk{~0D!GTo z`0X^?(7Jt)Y?5W$19L4`DjyN=F!}SxCV!*ygWC9Ar#*8zC?+;`#m3C?F^&`f>uM*} zxBee(U3XZM*Y|%Dp$dqysmdx;KxAlTgCq_Js0?v{fPgqa836-?9a8H+mS|-!*@^@r zdk1A%1q4Jk#2_Ft!jhTsyYy-OCh5=T;VcP(p$j&3d zvST&iWm)F;@83`J$s=(G`h#cz8*#23C>lv-WN?SJ0*C+I6%i4({}rgnA{kCDi>pA& zs;VQHw-auxv4gFp*A)JF9spmo$la0azy6C1`-YK@a(KC69eQzDr3*~PU37A%HZS>- z-3Z5y*LfT57{$|uDUNxrZYamh zO4_^;zuB2HS<_HZhtc2~$9#Q(*5hP!ZcYy2lG82xmLd}N2Ki-f}`_Vt!B!ni;A*A_*%>Mk!@*d=S?sLBLXzg1LEDKDcq_V1?XiN&_peKwkUV=4+&6$C9mF6if2 zBj94`*p2yaDh`Q>i5ZCPv0Kc5o8EY?#?B@{)>&c+bq9V2>j0|O(LE|5zUK-CIHpzz zl!$NUlwGHJ8b#Laj8n}ZzPOagsXq$dFUwzt_MrC_dVSPrs8N%!4y zF5{@@;0h2j#w@6qGtNbW0q{FjR8)qgHq~;C{-dh~xMQm^3+_H8vv3k9A-MYH&6`!X zd@DUpacB$PH?J-}+GUonIpPb>sB_ADr1*sjNbs>SH4;D;v^SIo3X-0B`!+X0X%XU9 z1vQ^JM1w${9ogEBrgr%OE~Hvz)td|XO?%g|wXs=W4+O_Sk-Ol-m8)e6%;)#*`JfXZ zHC=9~H&_M#oPDl@n_WIC+NXD?1g>&*Vqh|=$a%k$o>t~(`#68v+MG<78w#xL(E1+I z!5!+MR$u*m#O)*pce`Ckf2@No6o=_cdxNR_4Srt3>sl|_J{4T2T3&q-ac1Dz!pJOo zzAjv*^n!_@ti~5kxt=VX=SH}E3Ff#uH!L0TA!jG&Od*Rf(s?Z5vdPt_q7Xobz3mI| z3XeWLnayc9R3HNkUR_D$!yl#iSEjj81IJ5A-_@L*V01}YkXJao!?|J}A1_+q>UZt<2-9afLCj%~+2E5PiPOjP&ZUYAKeb}+_Nf-V}o}B@HK9AR( z>?#$7GMu~|xEKq^BtZdQY~O z=2!&6Ko`xohP-PulY&bw9B3#d=VjUwx`!&~=I>9>$&}Uupchw^k&#qbPm1YsF2}In z4?_5LK-t$7Yonj5#tP^=LjOdb`c-Lfc~45j3cFYYQ!l#gD#PC5e!KZ)N9f1Sk=nrB zvqP0joz}JbwJRLD@-AO;VpR&hKA1V1o_0dGD zsVU=$;Z?v5?S$Hufdx>7aa1C|<8&d%1Z3nhxOwAUrv1;Ai0<=@NJ-cup{>lE-FfYi zk@L5=^3AN)kPff+WOF2V^RY}6kl|yp!m2P`ghJ0Cl+oZX8q1UcyD+Rgzt^;wQLs#KpuIjH&Kig(PZ~IiSYLbFYCk zrG796^=79Foeg&a5W35MAyz2QSiWn!5~36{pr;n|0>!f$%%IN2I~YtLv^&#c309(zY`}ei9?_+!@Q+Q*kf01wi`D$J4{eE zpK^AkYvP-UoiVcqpo10go!>ly|corjxX9@y3l-Q5#Yc4V|GpF*_ z$`j@vA7kMpi}UBB8o5P7Ks&J+K9F6<;thC}b9HVd=C2&Sr{a@B*MKfMAJNm>Yz2i& z*TMDDdKogxA-i2HWmGp-^#GvZ9r?|f(!w&kZH_*va$ZM6t0|FIg(2OX>y61r0FI97 za?j1Y`cqXm+YUhauVw){0?n=_#HlCnB8My$hMRj&W)&pT6yi0-pnJfo4VG;$^$Tu9 z^frF|#vvg8AlW5`=jhzrr(xs6AKF6#yFgP1N~Z@GMqI7x(J8DVZ>!Q}K2})4Ea+8E znJc=i6wD&U05s1{0GEz+`o1xc?aeMD_w&)tCa*G++<$TzGlY5rs1f1t5n*&)(Cl_j ze&Xe-6L`Y3GSXWTE$JzjxAEr>)v&n`~jWKQNlWyO?Ab#0-9OkH~ zbQmQYm*nJimZbiIU5Q)V1t!VJ#}v%PPJ4&JpC7=HLJ_caJN;paceev(ISioy0b|U& zq-so?RN`Cb-ir=go+?-EMCP9@EG+bc+77Ei`g`_(_ZEN-KvZ)`NKFl)-Y7@E@!fU- zGA0AQ#et%txyi;CdfQ4qD_BIZUiH>9GIi%e%!8Jg`3ZM>Fxq!K#Y4k?iD*uNG4u`A z!oq{U9%Z*Ni=s%m0N3l>LVuTTTKUQ>9!S_kLF>JelJo>W>Ot3$RgMaumkRSw=j?8i zfdv12>?oW(ZTwZH^jhhuYw-kn*=aE zYEesC45f=|Xr|{|HvPwSOF&yxoL>El>IN3a@9y0FB|R1HDW%QtD8c=xeN;P;VS14D zt7VX6J-BmsveyR%=7Ao(8kF^`IY0w5*RNHLU0)vHWJ_eCTpdBrS;Fs;EH89ZWK1av zCzuPTxxG}~Maw(Ij#;C+zbJmr4tM;AU@O_yx4fkWa=tzG!It;@=SlA3S z0f!7~iGduVWJzaU*5#DI;@AW!ulU;Tg*K-2pDq^Hz+1gVUqyb}e#Xw0+JaIp(ARCbXK%Zc04TxcT7Q`GN3HxK{^DU zc^3((#R0#-Ydt7-ag=@(9uBsgbgHIj)aXPORAi(8RwDtORsF)+U&82`&A8e!F}e?gs&Xvt=w35q`Z_H_4B^TW3*7d*A08Re2^Z#>(3NB$$}c zpuL4E{8Ua(4kwjlSJ!aEfUVpK&)`e`=B+j%&_HFKLGL)N(&V=lxl7h#Dk~Y{g1c~BnrxJ^^D{Yr9 zm*=CnLro)kzkK;p4$PtM7$|M1aYB>Lki_5MGDw)Xb+i4`8SLy_(}g)Losi<<;w7&n z((V>XIN{-C!sr(dc4QFzUM|WhCN(UaJ}iMLb-v{iB9n9;>KiChMG2B|k1C6f?#U;s9YIyq}v(!aNT=YYVPB67`cG)-B-Ogl4%Y+cCIV zlFQ=P>Q%~8M!&3R+M-B6rQrK1gQvZ`Naiy@XT9yCwp{HeHqqT#Sr!Ht=gnH8kAm*$ z(TK@xKE&cJJ$Mw<7d7zHrUVd+*Fgd!llXQ?v+q5M{mbh}!hnei(~^^GuyoU)R~JAg zwBVt;6M(B*xvZn9xspqq%GV-RnzC6M4ktNFH-cO>p*;3 zTJ#Zkdx%R=P|)Q3{Csp{3$Kc6L=CI;P1=he_oKA~gIcXI`Ic{+v;9RGM<*K?#mKbr z01P3S%TW-VznB7>q3@SvASN!cKFm^ zjPmA2=4eyUP5DXW_WhbDNL~N&_FWQdF%_z$?U{qF`{r!0tW<0@Bzq=PahPN(6Nll+ z`$IcOcz9khS9)H%e7vdCy-GEd4esTXupcf_IDw{xn2Ca1Mrc9NR`&kmrVEs^ydX(k zW)54JY-c)Bf+twNt7^P4Oc=Y%F`&TstsoREk+XaUp{u)b;w&`3J3V?VomFRl1Exc& z`s(5J!rpbu0+8dgJkB31h2>rA|N3q9s!pFpTovp6L=MBBbT-(I9mh!%s^w-KY)F?O zRrimrVqQJ(wr9%v1}cy4lVmu`rF{E)Q1-u!@SP{fFC>Ja;C$moowb9w&B#NLKr74W z`A{}B0C_!lU!7U)y7!x<7AvLlPLYiPl{D{fS~Xp|tQQ4P!Ct+JrMQINU!Cb+8c~GL zgc%h^Hh56;lxXlM8&=m#Tdm=O0e)WL^WAMLGUOehQuB#@-?w1iY;A0+RFquQ z+%pittSZehAHFa?9yjJaVGC?>>hQO^GPD`c06Nq50ed66;f!EfW|hWXoe!r^tgxo& zkaywT3)jc>DEpX*2u+aLl-k3m%`G$5a7lFFcCy%f6A0+ksJ*!L9GZV@ErPxXyTtNz z`dPf$^2!L9sFnnz74n8z?h{p^wKw$0lT;S^h$zml zYj-f+y(*Y-yzgs!4jhC^uxt0W+@!)W&m^oNZ-*;-uPjTP5n#KUH{N`UPD@Q?qzM+H zX|}()G1(hW zn6W#D1`dJP{l%>8LJ%bjba8W=k@PxAQi*xp9-H%v8_Sc6g7MK|V56zbg1?s@FPkjtcYgbf$#&Z6TVvuKO2&r<3dJV!14sCRWC))|gw};0t?y6?|ekLNY zkXqXvhvq7G{aNw99jYq`EHTETTNc~3KQikks(Q}VbDiPZ+&`Kdk|{91dn`2t9X&TH z@XjUe^@lA`mw%t63tK-VPytRR^O{0O7vd{I{nLc7>n@@i35YS<__r(}AVcIl$X96~+az{n(hB`bH zAWWb8xr&upb@BI|D9pgXm6>%asI}Iyy=ekcd3zbhmoXPof^V`| zH274msHV;uoW$hnsMzExV&vRuUny&FFnGy{TR`=?o+@XDKAM_UD;5%(8uNIoPK-*7=R=Y-kyF|!x^P2u;q-RT0*^<`9BYYA>+c%TlrI89!X5b^#MSc543<+JX}345&hGR(QL>y#j9B@Uv4sHe zkE1EFzeuD%L{pxQZH#l1)(PHNzIL|%blF8fFdP4O9{Qr&KwY#4@7>;(#SW)E2W?NT z{9s8gRiz?;T28e#s46P*%r#*eM%G-~nk&!!AhDtZIb=wFsI5fSAkwa#KZ288saWg^ z?En3TJ4_<+CO@c;M2O<{;bdd0DN2kZ+mfC)z5?(ktv3`O@?KNtg%>^;r_mE9CtPG}?~74oq35{Goq@1TvqS zV%|R9LP580Qr1rsgFe4{r@Cn=(Z%%6FBS^&g3F(2;$L@^51J=81Ot)AR8&=7d%Six zSygE*!sBP za{*y;WBovZpN+R}r^H1Q_v4N;U>0?6^Vw~q;)4d|)j`x3-zOV4M2Y{ikxR@S<&TFb z#VS<4)3W+BHb`rUmPUkV+p9HFj-@Mt7iHYDePt_Bp&TVsp=5TjLYJ4@s%7a}-Y#mi zX1fY8M5X}MI#MqRgB^}imBsxd?Dd1-G%Dg9wZk+9sl#KgK7huW;S>vqb;!{crN zQT6rhjZ1IWHeGd(VtdV-uWYnjb;7BqMmKA%wNU8JP79#3Hj>2LKC}1K$M~Z6p%D0I NVrX`faNP0t{{sUZ07?J= literal 0 HcmV?d00001 diff --git a/wled-native-osx/Assets.xcassets/Contents.json b/wled-native-osx/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/wled-native-osx/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/Contents.json b/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/Contents.json new file mode 100644 index 0000000..a0f6e95 --- /dev/null +++ b/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "wled_logo_akemi.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png b/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd598486259de8bc6a5b9de96cb706bf5b7573e GIT binary patch literal 24315 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 V)!FwV{<5Rj)iTihtZx6}{{UoluMhwL literal 0 HcmV?d00001 diff --git a/wled-native-osx/Documentation.docc/Collections/Model.md b/wled-native-osx/Documentation.docc/Collections/Model.md new file mode 100644 index 0000000..a92ac39 --- /dev/null +++ b/wled-native-osx/Documentation.docc/Collections/Model.md @@ -0,0 +1,22 @@ +# Model WLED strips + +The data model representing the WLED strips + +## Topics + +### Device Collection + +- ``DeviceCollection`` + +### Device + +- ``DeviceActor`` +- ``DeviceIdentifier`` + +### Error + +- ``DeviceError`` + +### Extensions + +- ``Swift/String`` diff --git a/wled-native-osx/Documentation.docc/Collections/View.md b/wled-native-osx/Documentation.docc/Collections/View.md new file mode 100644 index 0000000..8f44638 --- /dev/null +++ b/wled-native-osx/Documentation.docc/Collections/View.md @@ -0,0 +1,19 @@ +# View + +The Views of the + +## Overview + +## Topics + +### Main + +- ``WLEDNativeBar`` + +### Content +- ``ContentView`` +- ``DeviceView`` + +### Extensions +- ``AppKit/NSImage`` +- ``DeveloperToolsSupport/ImageResource`` diff --git a/wled-native-osx/Documentation.docc/Collections/ViewProtocols.md b/wled-native-osx/Documentation.docc/Collections/ViewProtocols.md new file mode 100644 index 0000000..209742e --- /dev/null +++ b/wled-native-osx/Documentation.docc/Collections/ViewProtocols.md @@ -0,0 +1,8 @@ +# View Protocols + +Protocols defining the data interface for the views. + +## Topics + +- ``CollectionProvider`` +- ``DeviceProvider`` diff --git a/wled-native-osx/Documentation.docc/Documentation.md b/wled-native-osx/Documentation.docc/Documentation.md new file mode 100644 index 0000000..047bbf6 --- /dev/null +++ b/wled-native-osx/Documentation.docc/Documentation.md @@ -0,0 +1,24 @@ +# ``WLED_OSX`` + +Menu bar for macOS to interact with WLED strips. + +## Topics + +### Model + +The data model of the application. + +- + +### View Protocols + +The interface for the data model for the View. + +- + +### View + +The views of the applications. + +- + diff --git a/wled-native-osx/Model/DeviceActor.swift b/wled-native-osx/Model/DeviceActor.swift new file mode 100644 index 0000000..72861f3 --- /dev/null +++ b/wled-native-osx/Model/DeviceActor.swift @@ -0,0 +1,119 @@ +// +// Device-Actor.swift +// wled-osx +// +// Created by Robert Brune on 21.11.23. +// + +import Foundation +import CoreData +import OSLog +import Combine +import WledLib + +struct DeviceIdentifier: Codable, Hashable { + let domain: String + let name: String + + var address: String { + var d = domain + d.removeLast() + return name + "." + d + } +} + +extension String: WledHost { + public var hostname: String { + return self + } +} + + + +actor DeviceActor:Identifiable, ObservableObject { + + let id:UUID + + @MainActor let identifier:DeviceIdentifier + @MainActor private var webSocketTask: URLSessionWebSocketTask? = nil + + @MainActor @Published var ds:Device? = nil + @MainActor @Published var presets:Presets? = nil + + + @MainActor + init(device: DeviceIdentifier) { + self.id = UUID() + self.identifier = device + + createWebSocket() + fetchPresets() + } + + nonisolated func createWebSocket() { + DispatchQueue.main.async { + do { + self.webSocketTask = try self.address.getWebsocketReceiver( + handleData: self.receiveData(stateData:), + handleError: self.error(error:) + ) + } catch { + Logger().error("\(error.localizedDescription)") + } + } + } + + nonisolated func fetchPresets() { + do { + try identifier.address.get { data in + DispatchQueue.main.async { + self.presets = data + Logger().log("Presets loaded: \(String(reflecting: data))") + } + } + handleError: { error in + self.error(error: error) + } + } catch { + self.error(error: error) + } + } + + nonisolated func post(state: State) { + do { + try identifier.address.send(data: state) { (message: SuccessMessage) in + guard message.success else { + self.error(error: DeviceError.invalidUpdate) + return + } + Logger().info("Update successful.") + } + handleError: { error in + self.error(error: error) + } + } catch { + self.error(error: error) + } + } + + + nonisolated func error(error: Error) { + Logger().error("Device Error: \(error.localizedDescription)") + DispatchQueue.main.async { + self.ds = nil + self.webSocketTask?.cancel() + self.createWebSocket() + } + } + + nonisolated func receiveData(stateData: Device) { + Logger().debug("Data receive: \(String(reflecting: stateData))") + DispatchQueue.main.async { + self.ds = stateData + } + } +} + +enum DeviceError : Error { + case invalidUpdate +} diff --git a/wled-native-osx/Model/DeviceCollection.swift b/wled-native-osx/Model/DeviceCollection.swift new file mode 100644 index 0000000..1b9ad86 --- /dev/null +++ b/wled-native-osx/Model/DeviceCollection.swift @@ -0,0 +1,81 @@ +// +// DeviceManager.swift +// wled-osx +// +// Created by Robert Brune on 24.11.23. +// + +import Foundation +import Network +import OSLog + + +class DeviceCollection: ObservableObject { + @Published var devices:[DeviceActor] = [] + + var browser: NWBrowser + + init() { + let bonjourTCP = NWBrowser.Descriptor.bonjour(type: "_wled._tcp" , domain: "local") + + let bonjourParms = NWParameters.init() + bonjourParms.allowLocalEndpointReuse = true + bonjourParms.acceptLocalOnly = true + bonjourParms.allowFastOpen = true + + browser = NWBrowser(for: bonjourTCP, using: bonjourParms) + + browser.stateUpdateHandler = {newState in + switch newState { + case .failed(let error): + Logger().error("NW Browser: now in Error state: \(error)") + self.browser.cancel() + case .ready: + Logger().info("NW Browser: new bonjour discovery - ready") + case .setup: + Logger().info("NW Browser: in SETUP state") + case .cancelled: + Logger().info("NW Browser: canclled") + case .waiting(_): + Logger().info("NW Browser: waiting") + @unknown default: + Logger().info("NW Browser: unnown status change") + } + } + + browser.browseResultsChangedHandler = { ( results, changes ) in + Logger().info("NW Browser: Scan results found:") + + for result in results { + Logger().info("\(result.endpoint.debugDescription))") + } + + for change in changes { + if case .added(let added) = change { + Logger().info("NW Browser: added") + + if case .service(let name, _, let domain, _) = added.endpoint { + DispatchQueue.main.async { + let deviceID = DeviceIdentifier(domain: domain, name: name) + let actor = DeviceActor(device: deviceID) + self.devices.append(actor) + } + } + } + if case .removed(let removed) = change { + if case .service(let name, _, let domain, _) = removed.endpoint { + DispatchQueue.main.async { + Logger().log("Lose connection to \(name) \(domain)") + } + } + } + } + } + + self.browser.start(queue: DispatchQueue.main) + } + + func close() { + self.browser.cancel() + } +} diff --git a/wled-native-osx/View/ContentView.swift b/wled-native-osx/View/ContentView.swift new file mode 100644 index 0000000..efe5142 --- /dev/null +++ b/wled-native-osx/View/ContentView.swift @@ -0,0 +1,66 @@ +// +// ContentView.swift +// wled-osx +// +// Created by Robert Brune on 15.11.23. +// + +import SwiftUI +import OSLog + +struct ContentView: View { + + @ObservedObject var deviceManager:P + + var body: some View { + VStack { + header + deviceLists + } + } + + var header: some View { + HStack { + Image(.wledLogoAkemi) + .resizable() + .scaledToFit() + .padding() + + Spacer() + quitButton + + + } + .padding() + } + + var deviceLists: some View { + List { + Section(header: Text("Devices")) { + ForEach(deviceManager.devices) { device in + DeviceView(device: device) + } + } + Spacer() + } + + .listStyle(PlainListStyle()) + } + + var quitButton: some View { + Button(action: { + exit(EXIT_SUCCESS) + }) { + Image(systemName: "power.circle") + .font(.title) + } + .buttonStyle(BorderlessButtonStyle()) + .padding() + } +} + + +#Preview { + ContentView(deviceManager: DeviceCollection()) + .frame(width: 100, height: 300) +} diff --git a/wled-native-osx/View/DeviceView.swift b/wled-native-osx/View/DeviceView.swift new file mode 100644 index 0000000..12f2230 --- /dev/null +++ b/wled-native-osx/View/DeviceView.swift @@ -0,0 +1,103 @@ +// +// DeviceView.swift +// wled-osx +// +// Created by Robert Brune on 15.11.23. +// + +import SwiftUI +import Foundation +import OSLog + +struct DeviceView: View { + + + @State var slider:Double + @StateObject var device:D + + + init(device: D) { + self._device = StateObject(wrappedValue: device) + self.slider = Double(device.brightness) + } + + + var body: some View { + VStack { + HStack { + if (device.isConnected) { + onSwitch + } else { + loadingView + } + VStack { + Text(device.name).font(.title) + Text(device.address).font(.subheadline) + } + Spacer() + presetPicker + } + brigthnessSlider + } + } + + var loadingView: some View { + ProgressView() + .padding() + .frame(alignment: .trailing) + } + + var onSwitch: some View { + Toggle("Turn On/Off", isOn: $device.isOn) + .toggleStyle(SwitchToggleStyle()) + .labelsHidden() + .frame(alignment: .trailing) + } + + @State var test:Int64 = 0 + + var presetPicker: some View { + Picker(selection: $device.activePreset) { + ForEach(device.availablePresets, id: \.0) { (tag, name) in + Text(name).tag(tag) + } + } label: { + } + } + + var brigthnessSlider: some View { + Slider( + value: $slider, + in: 1...255) { value in + if (!value) { + device.brightness = slider + } + } + .onChange(of: device.brightness) { o, n in + slider = n + } + } +} + + +#if DEBUG + +private class TestDevice: DeviceProvider { + @MainActor var availablePresets: [(Int64, String)] = [(1, "Eins"), (2, "Zwei")] + + @MainActor var activePreset: Int64 = -1 + @MainActor var brightness: Double = 0.0 + @MainActor var isOn: Bool = false + @MainActor var isConnected: Bool = false + @MainActor var name: String = "WLED" + @MainActor var address: String = "WLED.local" + @MainActor var id: String { + name + } +} + +#endif + +#Preview { + DeviceView(device: TestDevice()) +} diff --git a/wled-native-osx/View/Main.swift b/wled-native-osx/View/Main.swift new file mode 100644 index 0000000..7029592 --- /dev/null +++ b/wled-native-osx/View/Main.swift @@ -0,0 +1,21 @@ +// +// Main.swift +// wled-osx +// +// Created by Robert Brune on 15.11.23. +// + +import SwiftUI + +@main +struct WLEDNativeBar: App { + + let deviceManager = DeviceCollection() + + var body: some Scene { + MenuBarExtra("WLED", systemImage: "lamp.table.fill") { + ContentView(deviceManager: deviceManager) + } + .menuBarExtraStyle(.window) + } +} diff --git a/wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift b/wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift new file mode 100644 index 0000000..ff1fa36 --- /dev/null +++ b/wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift @@ -0,0 +1,13 @@ +// +// DeviceProviderExtension.swift +// wled-osx +// +// Created by Robert Brune on 26.11.23. +// + +import Foundation +import SwiftUI + +extension DeviceCollection: CollectionProvider { + typealias T = DeviceActor +} diff --git a/wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift b/wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift new file mode 100644 index 0000000..4f45ce8 --- /dev/null +++ b/wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift @@ -0,0 +1,81 @@ +// +// WledDeviceExtension.swift +// wled-osx +// +// Created by Robert Brune on 26.11.23. +// + +import Foundation +import WledLib + +extension DeviceActor: DeviceProvider { + + @MainActor + var availablePresets: [(Int64, String)] { + guard var presets = presets?.presets else { + return [(-1, "–")] + } + if (activePreset == -1) { + presets.insert((-1, "–"), at: 0) + return presets + } + return presets + } + + + @MainActor + var activePreset: Int64 { + get { + ds?.state.selectedPresetId ?? -1 + } + set { + ds?.state.selectedPresetId = newValue + + let state = State(selectedPresetId: newValue) + post(state: state) + } + } + + + @MainActor + var isOn:Bool { + get { + ds?.state.isOn ?? false + } + set { + ds?.state.isOn = newValue + + let state = State(isOn: newValue) + post(state: state) + } + } + + @MainActor + var brightness:Double { + get { + Double(ds?.state.brightness ?? 0) + } + set { + let newBrightness = UInt8(newValue) + ds?.state.brightness = newBrightness + + let state = State(isOn: true, brightness: newBrightness) + post(state: state) + } + } + + @MainActor + var name: String { + self.identifier.name + } + + @MainActor + var address: String { + self.identifier.address + } + + @MainActor + var isConnected: Bool { + self.ds != nil + } +} diff --git a/wled-native-osx/ViewProtocolls/CollectionProvider.swift b/wled-native-osx/ViewProtocolls/CollectionProvider.swift new file mode 100644 index 0000000..6351307 --- /dev/null +++ b/wled-native-osx/ViewProtocolls/CollectionProvider.swift @@ -0,0 +1,15 @@ +// +// CollectionProvider.swift +// wled-osx +// +// Created by Robert Brune on 26.11.23. +// + +import Foundation +import SwiftUI + +@MainActor +protocol CollectionProvider: ObservableObject { + associatedtype T: DeviceProvider + var devices:[T] { get set } +} diff --git a/wled-native-osx/ViewProtocolls/DeviceProvider.swift b/wled-native-osx/ViewProtocolls/DeviceProvider.swift new file mode 100644 index 0000000..e0d1622 --- /dev/null +++ b/wled-native-osx/ViewProtocolls/DeviceProvider.swift @@ -0,0 +1,22 @@ +// +// DeviceProvider.swift +// wled-osx +// +// Created by Robert Brune on 26.11.23. +// + +import Foundation + +protocol DeviceProvider: ObservableObject, Identifiable { + + @MainActor var brightness: Double { get set } + @MainActor var isOn: Bool { get set } + @MainActor var isConnected: Bool { get } + + @MainActor var name: String { get } + @MainActor var address: String { get } + + @MainActor var activePreset: Int64 { get set } + + @MainActor var availablePresets:[(Int64, String)] { get } +} diff --git a/wled-native-osx/wled-native-osx.md b/wled-native-osx/wled-native-osx.md new file mode 100644 index 0000000..539ac20 --- /dev/null +++ b/wled-native-osx/wled-native-osx.md @@ -0,0 +1,6 @@ +# wled native osx + +This directory should only contain files used by the wled native OSX app. + + + diff --git a/wled-native-osx/wled-osx.entitlements b/wled-native-osx/wled-osx.entitlements new file mode 100644 index 0000000..625af03 --- /dev/null +++ b/wled-native-osx/wled-osx.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + + diff --git a/wled-native.xcodeproj/project.pbxproj b/wled-native.xcodeproj/project.pbxproj index 3978b87..b62e0c7 100644 --- a/wled-native.xcodeproj/project.pbxproj +++ b/wled-native.xcodeproj/project.pbxproj @@ -10,20 +10,12 @@ C93470AC29D904C20085D9D5 /* errorPage.en.html in Resources */ = {isa = PBXBuildFile; fileRef = C93470AB29D904C20085D9D5 /* errorPage.en.html */; }; C93470AE29D905BD0085D9D5 /* 012_rip.png in Resources */ = {isa = PBXBuildFile; fileRef = C93470AD29D905BD0085D9D5 /* 012_rip.png */; }; C96440E22AEF6B6000C51204 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C96440E12AEF6B6000C51204 /* Persistence.swift */; }; - C96440E82AF095B500C51204 /* DeviceListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C96440E72AF095B500C51204 /* DeviceListItemView.swift */; }; C96827212B01AF5900A5DDEC /* errorPage.css in Resources */ = {isa = PBXBuildFile; fileRef = C96827202B01AF5900A5DDEC /* errorPage.css */; }; C96827232B01AFB900A5DDEC /* errorPage.fr.html in Resources */ = {isa = PBXBuildFile; fileRef = C96827222B01AFB900A5DDEC /* errorPage.fr.html */; }; C96BF40029302EE50011BC3B /* CoreData.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = C96BF3FE29302EE50011BC3B /* CoreData.xcdatamodeld */; }; - C9767DDE2AF9F435002F3EA9 /* DeviceAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9767DDD2AF9F435002F3EA9 /* DeviceAddView.swift */; }; - C9767DE02AFA04E0002F3EA9 /* DeviceEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9767DDF2AFA04E0002F3EA9 /* DeviceEditView.swift */; }; - C9767DE32AFAE65C002F3EA9 /* FetchedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9767DE22AFAE65C002F3EA9 /* FetchedObjects.swift */; }; - C9865AF62AEF1902000B2714 /* DeviceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9865AF52AEF1902000B2714 /* DeviceListView.swift */; }; C99BEF552AF49513001AD80A /* DiscoveryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C99BEF542AF49513001AD80A /* DiscoveryService.swift */; }; - C99BEF572AF8B926001AD80A /* DeviceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C99BEF562AF8B926001AD80A /* DeviceView.swift */; }; - C99BEF592AF8BA79001AD80A /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C99BEF582AF8BA79001AD80A /* WebView.swift */; }; C9A9E5C12918D1C3005B5C22 /* WLEDNativeApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A9E5C02918D1C3005B5C22 /* WLEDNativeApp.swift */; }; C9A9E5CA2918D1C4005B5C22 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9A9E5C92918D1C4005B5C22 /* Assets.xcassets */; }; - C9AF21592AFB47BB00E03749 /* DeviceListFilterAndSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AF21582AFB47BB00E03749 /* DeviceListFilterAndSort.swift */; }; C9AF215B2AFDCF7500E03749 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C9AF215A2AFDCF7500E03749 /* Launch Screen.storyboard */; }; C9AF21662AFDE94300E03749 /* Model1to2.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = C9AF21652AFDE94300E03749 /* Model1to2.xcmappingmodel */; }; C9AF21682AFDEB6900E03749 /* Migration1to2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AF21672AFDEB6900E03749 /* Migration1to2.swift */; }; @@ -40,28 +32,40 @@ C9FCC3A3293DBD2200DEDDEA /* Info.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9FCC3A0293DBD2200DEDDEA /* Info.swift */; }; C9FCC3A4293DBD2200DEDDEA /* Leds.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9FCC39C293DBD2200DEDDEA /* Leds.swift */; }; C9FCC3A5293DBD2200DEDDEA /* Segment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9FCC398293DBD2200DEDDEA /* Segment.swift */; }; + E1067B5F2B190F0F00FF7D33 /* CollectionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B4F2B190F0E00FF7D33 /* CollectionProvider.swift */; }; + E1067B602B190F0F00FF7D33 /* DeviceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B502B190F0E00FF7D33 /* DeviceProvider.swift */; }; + E1067B612B190F0F00FF7D33 /* DeviceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B532B190F0E00FF7D33 /* DeviceView.swift */; }; + E1067B622B190F0F00FF7D33 /* Main.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B542B190F0E00FF7D33 /* Main.swift */; }; + E1067B632B190F0F00FF7D33 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B552B190F0E00FF7D33 /* ContentView.swift */; }; + E1067B642B190F0F00FF7D33 /* DeviceProviderExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B572B190F0F00FF7D33 /* DeviceProviderExtension.swift */; }; + E1067B652B190F0F00FF7D33 /* WledDeviceExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B582B190F0F00FF7D33 /* WledDeviceExtension.swift */; }; + E1067B662B190F0F00FF7D33 /* DeviceCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B5A2B190F0F00FF7D33 /* DeviceCollection.swift */; }; + E1067B672B190F0F00FF7D33 /* DeviceActor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B5B2B190F0F00FF7D33 /* DeviceActor.swift */; }; + E1067B752B19104900FF7D33 /* DeviceEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B6C2B19104900FF7D33 /* DeviceEditView.swift */; }; + E1067B762B19104900FF7D33 /* DeviceAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B6D2B19104900FF7D33 /* DeviceAddView.swift */; }; + E1067B772B19104900FF7D33 /* DeviceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B6E2B19104900FF7D33 /* DeviceView.swift */; }; + E1067B782B19104900FF7D33 /* DeviceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B6F2B19104900FF7D33 /* DeviceListView.swift */; }; + E1067B792B19104900FF7D33 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B702B19104900FF7D33 /* WebView.swift */; }; + E1067B7A2B19104900FF7D33 /* DeviceListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B712B19104900FF7D33 /* DeviceListItemView.swift */; }; + E1067B7B2B19104900FF7D33 /* FetchedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B732B19104900FF7D33 /* FetchedObjects.swift */; }; + E1067B7C2B19104900FF7D33 /* DeviceListFilterAndSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B742B19104900FF7D33 /* DeviceListFilterAndSort.swift */; }; + E1283D8D2B198D0C00FC68EF /* WledLib in Frameworks */ = {isa = PBXBuildFile; productRef = E1283D8C2B198D0C00FC68EF /* WledLib */; }; + E1283D902B198E1D00FC68EF /* WledLib in Frameworks */ = {isa = PBXBuildFile; productRef = E1283D8F2B198E1D00FC68EF /* WledLib */; }; + E1283D932B198F8800FC68EF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E1283D922B198F7D00FC68EF /* Assets.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ C93470AB29D904C20085D9D5 /* errorPage.en.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = errorPage.en.html; sourceTree = ""; }; C93470AD29D905BD0085D9D5 /* 012_rip.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 012_rip.png; sourceTree = ""; }; C96440E12AEF6B6000C51204 /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; - C96440E72AF095B500C51204 /* DeviceListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceListItemView.swift; sourceTree = ""; }; C96827202B01AF5900A5DDEC /* errorPage.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = errorPage.css; sourceTree = ""; }; C96827222B01AFB900A5DDEC /* errorPage.fr.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorPage.fr.html; sourceTree = ""; }; C96BF3FF29302EE50011BC3B /* CoreData.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = CoreData.xcdatamodel; sourceTree = ""; }; - C9767DDD2AF9F435002F3EA9 /* DeviceAddView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceAddView.swift; sourceTree = ""; }; - C9767DDF2AFA04E0002F3EA9 /* DeviceEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceEditView.swift; sourceTree = ""; }; - C9767DE22AFAE65C002F3EA9 /* FetchedObjects.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchedObjects.swift; sourceTree = ""; }; - C9865AF52AEF1902000B2714 /* DeviceListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceListView.swift; sourceTree = ""; }; C99BEF542AF49513001AD80A /* DiscoveryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryService.swift; sourceTree = ""; }; - C99BEF562AF8B926001AD80A /* DeviceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceView.swift; sourceTree = ""; }; - C99BEF582AF8BA79001AD80A /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; - C9A9E5BD2918D1C3005B5C22 /* wled-native.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + C9A9E5BD2918D1C3005B5C22 /* wled-native-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C9A9E5C02918D1C3005B5C22 /* WLEDNativeApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WLEDNativeApp.swift; sourceTree = ""; }; C9A9E5C92918D1C4005B5C22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; C9A9E5CE2918D1C4005B5C22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C9AF21582AFB47BB00E03749 /* DeviceListFilterAndSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceListFilterAndSort.swift; sourceTree = ""; }; C9AF215A2AFDCF7500E03749 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; C9AF21632AFDE8A200E03749 /* CoreData 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "CoreData 2.xcdatamodel"; sourceTree = ""; }; C9AF21652AFDE94300E03749 /* Model1to2.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = Model1to2.xcmappingmodel; sourceTree = ""; }; @@ -81,6 +85,31 @@ C9FCC398293DBD2200DEDDEA /* Segment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Segment.swift; sourceTree = ""; }; C9FCC39C293DBD2200DEDDEA /* Leds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Leds.swift; sourceTree = ""; }; C9FCC3A0293DBD2200DEDDEA /* Info.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Info.swift; sourceTree = ""; }; + E1067B3F2B190E6F00FF7D33 /* wled-native-osx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native-osx.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E1067B4A2B190E7000FF7D33 /* wled-osx.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "wled-osx.entitlements"; sourceTree = ""; }; + E1067B4F2B190F0E00FF7D33 /* CollectionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionProvider.swift; sourceTree = ""; }; + E1067B502B190F0E00FF7D33 /* DeviceProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceProvider.swift; sourceTree = ""; }; + E1067B532B190F0E00FF7D33 /* DeviceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceView.swift; sourceTree = ""; }; + E1067B542B190F0E00FF7D33 /* Main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Main.swift; sourceTree = ""; }; + E1067B552B190F0E00FF7D33 /* ContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + E1067B572B190F0F00FF7D33 /* DeviceProviderExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceProviderExtension.swift; sourceTree = ""; }; + E1067B582B190F0F00FF7D33 /* WledDeviceExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WledDeviceExtension.swift; sourceTree = ""; }; + E1067B5A2B190F0F00FF7D33 /* DeviceCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceCollection.swift; sourceTree = ""; }; + E1067B5B2B190F0F00FF7D33 /* DeviceActor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceActor.swift; sourceTree = ""; }; + E1067B5E2B190F0F00FF7D33 /* Documentation.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = Documentation.docc; sourceTree = ""; }; + E1067B6C2B19104900FF7D33 /* DeviceEditView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceEditView.swift; sourceTree = ""; }; + E1067B6D2B19104900FF7D33 /* DeviceAddView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceAddView.swift; sourceTree = ""; }; + E1067B6E2B19104900FF7D33 /* DeviceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceView.swift; sourceTree = ""; }; + E1067B6F2B19104900FF7D33 /* DeviceListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceListView.swift; sourceTree = ""; }; + E1067B702B19104900FF7D33 /* WebView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; + E1067B712B19104900FF7D33 /* DeviceListItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceListItemView.swift; sourceTree = ""; }; + E1067B732B19104900FF7D33 /* FetchedObjects.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchedObjects.swift; sourceTree = ""; }; + E1067B742B19104900FF7D33 /* DeviceListFilterAndSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceListFilterAndSort.swift; sourceTree = ""; }; + E1067B802B1910F100FF7D33 /* Example-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Example-01.png"; sourceTree = ""; }; + E1067B872B19396700FF7D33 /* wled-native-osx.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native-osx.md"; sourceTree = ""; }; + E1067B882B1939D900FF7D33 /* wled-native.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native.md"; sourceTree = ""; }; + E1067B892B193AD500FF7D33 /* wled-native-ios.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native-ios.md"; sourceTree = ""; }; + E1283D922B198F7D00FC68EF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -88,6 +117,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E1283D8D2B198D0C00FC68EF /* WledLib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E1067B3C2B190E6F00FF7D33 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1283D902B198E1D00FC68EF /* WledLib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -102,41 +140,24 @@ path = Model; sourceTree = ""; }; - C9767DE12AFAE64A002F3EA9 /* Tool */ = { - isa = PBXGroup; - children = ( - C9767DE22AFAE65C002F3EA9 /* FetchedObjects.swift */, - C9AF21582AFB47BB00E03749 /* DeviceListFilterAndSort.swift */, - ); - path = Tool; - sourceTree = ""; - }; - C9865AF42AEF18E7000B2714 /* View */ = { - isa = PBXGroup; - children = ( - C9767DE12AFAE64A002F3EA9 /* Tool */, - C9865AF52AEF1902000B2714 /* DeviceListView.swift */, - C96440E72AF095B500C51204 /* DeviceListItemView.swift */, - C99BEF562AF8B926001AD80A /* DeviceView.swift */, - C99BEF582AF8BA79001AD80A /* WebView.swift */, - C9767DDD2AF9F435002F3EA9 /* DeviceAddView.swift */, - C9767DDF2AFA04E0002F3EA9 /* DeviceEditView.swift */, - ); - path = View; - sourceTree = ""; - }; C9A9E5B42918D1C3005B5C22 = { isa = PBXGroup; children = ( + C9C4B47E2AC0050500791D20 /* README.md */, + E1067B7F2B1910F100FF7D33 /* ExampleImages */, + E1067B852B19129800FF7D33 /* wled-native-ios */, C9A9E5BF2918D1C3005B5C22 /* wled-native */, + E1067B402B190E6F00FF7D33 /* wled-native-osx */, C9A9E5BE2918D1C3005B5C22 /* Products */, + E1283D8E2B198E1D00FC68EF /* Frameworks */, ); sourceTree = ""; }; C9A9E5BE2918D1C3005B5C22 /* Products */ = { isa = PBXGroup; children = ( - C9A9E5BD2918D1C3005B5C22 /* wled-native.app */, + C9A9E5BD2918D1C3005B5C22 /* wled-native-ios.app */, + E1067B3F2B190E6F00FF7D33 /* wled-native-osx.app */, ); name = Products; sourceTree = ""; @@ -144,13 +165,11 @@ C9A9E5BF2918D1C3005B5C22 /* wled-native */ = { isa = PBXGroup; children = ( - C9865AF42AEF18E7000B2714 /* View */, + E1067B882B1939D900FF7D33 /* wled-native.md */, C9FCC37E293DAF8300DEDDEA /* Service */, C96BF3F7291FFDC90011BC3B /* Model */, C9AF21642AFDE91D00E03749 /* Migration */, - C96440E12AEF6B6000C51204 /* Persistence.swift */, - C9A9E5C02918D1C3005B5C22 /* WLEDNativeApp.swift */, - C9A9E5C92918D1C4005B5C22 /* Assets.xcassets */, + E1067B6B2B19104900FF7D33 /* View */, C96BF3FE29302EE50011BC3B /* CoreData.xcdatamodeld */, C9D43A7D29BAE3BA005A71C2 /* Localizable.strings */, C9F82F2429BBD0E100B8A5EE /* InfoPlist.strings */, @@ -158,9 +177,6 @@ C93470AB29D904C20085D9D5 /* errorPage.en.html */, C96827222B01AFB900A5DDEC /* errorPage.fr.html */, C96827202B01AF5900A5DDEC /* errorPage.css */, - C9A9E5CE2918D1C4005B5C22 /* Info.plist */, - C9AF215A2AFDCF7500E03749 /* Launch Screen.storyboard */, - C9C4B47E2AC0050500791D20 /* README.md */, ); path = "wled-native"; sourceTree = ""; @@ -199,12 +215,115 @@ path = wledapi; sourceTree = ""; }; + E1067B402B190E6F00FF7D33 /* wled-native-osx */ = { + isa = PBXGroup; + children = ( + E1067B872B19396700FF7D33 /* wled-native-osx.md */, + E1067B5E2B190F0F00FF7D33 /* Documentation.docc */, + E1067B592B190F0F00FF7D33 /* Model */, + E1067B522B190F0E00FF7D33 /* View */, + E1067B562B190F0F00FF7D33 /* ViewProtocolExtensions */, + E1067B4E2B190F0E00FF7D33 /* ViewProtocolls */, + E1067B4A2B190E7000FF7D33 /* wled-osx.entitlements */, + E1283D922B198F7D00FC68EF /* Assets.xcassets */, + ); + path = "wled-native-osx"; + sourceTree = ""; + }; + E1067B4E2B190F0E00FF7D33 /* ViewProtocolls */ = { + isa = PBXGroup; + children = ( + E1067B4F2B190F0E00FF7D33 /* CollectionProvider.swift */, + E1067B502B190F0E00FF7D33 /* DeviceProvider.swift */, + ); + path = ViewProtocolls; + sourceTree = ""; + }; + E1067B522B190F0E00FF7D33 /* View */ = { + isa = PBXGroup; + children = ( + E1067B532B190F0E00FF7D33 /* DeviceView.swift */, + E1067B542B190F0E00FF7D33 /* Main.swift */, + E1067B552B190F0E00FF7D33 /* ContentView.swift */, + ); + path = View; + sourceTree = ""; + }; + E1067B562B190F0F00FF7D33 /* ViewProtocolExtensions */ = { + isa = PBXGroup; + children = ( + E1067B572B190F0F00FF7D33 /* DeviceProviderExtension.swift */, + E1067B582B190F0F00FF7D33 /* WledDeviceExtension.swift */, + ); + path = ViewProtocolExtensions; + sourceTree = ""; + }; + E1067B592B190F0F00FF7D33 /* Model */ = { + isa = PBXGroup; + children = ( + E1067B5A2B190F0F00FF7D33 /* DeviceCollection.swift */, + E1067B5B2B190F0F00FF7D33 /* DeviceActor.swift */, + ); + path = Model; + sourceTree = ""; + }; + E1067B6B2B19104900FF7D33 /* View */ = { + isa = PBXGroup; + children = ( + E1067B6C2B19104900FF7D33 /* DeviceEditView.swift */, + E1067B6D2B19104900FF7D33 /* DeviceAddView.swift */, + E1067B6E2B19104900FF7D33 /* DeviceView.swift */, + E1067B6F2B19104900FF7D33 /* DeviceListView.swift */, + E1067B702B19104900FF7D33 /* WebView.swift */, + E1067B712B19104900FF7D33 /* DeviceListItemView.swift */, + E1067B722B19104900FF7D33 /* Tool */, + ); + path = View; + sourceTree = ""; + }; + E1067B722B19104900FF7D33 /* Tool */ = { + isa = PBXGroup; + children = ( + E1067B732B19104900FF7D33 /* FetchedObjects.swift */, + E1067B742B19104900FF7D33 /* DeviceListFilterAndSort.swift */, + ); + path = Tool; + sourceTree = ""; + }; + E1067B7F2B1910F100FF7D33 /* ExampleImages */ = { + isa = PBXGroup; + children = ( + E1067B802B1910F100FF7D33 /* Example-01.png */, + ); + path = ExampleImages; + sourceTree = ""; + }; + E1067B852B19129800FF7D33 /* wled-native-ios */ = { + isa = PBXGroup; + children = ( + E1067B892B193AD500FF7D33 /* wled-native-ios.md */, + C96440E12AEF6B6000C51204 /* Persistence.swift */, + C9A9E5C02918D1C3005B5C22 /* WLEDNativeApp.swift */, + C9A9E5C92918D1C4005B5C22 /* Assets.xcassets */, + C9AF215A2AFDCF7500E03749 /* Launch Screen.storyboard */, + C9A9E5CE2918D1C4005B5C22 /* Info.plist */, + ); + path = "wled-native-ios"; + sourceTree = ""; + }; + E1283D8E2B198E1D00FC68EF /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - C9A9E5BC2918D1C3005B5C22 /* wled-native */ = { + C9A9E5BC2918D1C3005B5C22 /* wled-native-ios */ = { isa = PBXNativeTarget; - buildConfigurationList = C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native" */; + buildConfigurationList = C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native-ios" */; buildPhases = ( C9A9E5B92918D1C3005B5C22 /* Sources */, C9A9E5BA2918D1C3005B5C22 /* Frameworks */, @@ -214,9 +333,32 @@ ); dependencies = ( ); - name = "wled-native"; + name = "wled-native-ios"; + packageProductDependencies = ( + E1283D8C2B198D0C00FC68EF /* WledLib */, + ); productName = "wled-native"; - productReference = C9A9E5BD2918D1C3005B5C22 /* wled-native.app */; + productReference = C9A9E5BD2918D1C3005B5C22 /* wled-native-ios.app */; + productType = "com.apple.product-type.application"; + }; + E1067B3E2B190E6F00FF7D33 /* wled-native-osx */ = { + isa = PBXNativeTarget; + buildConfigurationList = E1067B4B2B190E7000FF7D33 /* Build configuration list for PBXNativeTarget "wled-native-osx" */; + buildPhases = ( + E1067B3B2B190E6F00FF7D33 /* Sources */, + E1067B3C2B190E6F00FF7D33 /* Frameworks */, + E1067B3D2B190E6F00FF7D33 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "wled-native-osx"; + packageProductDependencies = ( + E1283D8F2B198E1D00FC68EF /* WledLib */, + ); + productName = "WLED-OSX"; + productReference = E1067B3F2B190E6F00FF7D33 /* wled-native-osx.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -226,12 +368,15 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1410; + LastSwiftUpdateCheck = 1500; LastUpgradeCheck = 1500; TargetAttributes = { C9A9E5BC2918D1C3005B5C22 = { CreatedOnToolsVersion = 14.1; }; + E1067B3E2B190E6F00FF7D33 = { + CreatedOnToolsVersion = 15.0.1; + }; }; }; buildConfigurationList = C9A9E5B82918D1C3005B5C22 /* Build configuration list for PBXProject "wled-native" */; @@ -244,11 +389,15 @@ "fr-CA", ); mainGroup = C9A9E5B42918D1C3005B5C22; + packageReferences = ( + E1283D8B2B198D0C00FC68EF /* XCRemoteSwiftPackageReference "WledLib" */, + ); productRefGroup = C9A9E5BE2918D1C3005B5C22 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - C9A9E5BC2918D1C3005B5C22 /* wled-native */, + C9A9E5BC2918D1C3005B5C22 /* wled-native-ios */, + E1067B3E2B190E6F00FF7D33 /* wled-native-osx */, ); }; /* End PBXProject section */ @@ -270,6 +419,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E1067B3D2B190E6F00FF7D33 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E1283D932B198F8800FC68EF /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -277,30 +434,46 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E1067B762B19104900FF7D33 /* DeviceAddView.swift in Sources */, C96BF40029302EE50011BC3B /* CoreData.xcdatamodeld in Sources */, - C9AF21592AFB47BB00E03749 /* DeviceListFilterAndSort.swift in Sources */, + E1067B782B19104900FF7D33 /* DeviceListView.swift in Sources */, C9FCC389293DB86900DEDDEA /* FileSystem.swift in Sources */, C9FCC391293DB95500DEDDEA /* Wifi.swift in Sources */, C9FCC385293DB69F00DEDDEA /* WledState.swift in Sources */, - C9767DE02AFA04E0002F3EA9 /* DeviceEditView.swift in Sources */, - C9767DE32AFAE65C002F3EA9 /* FetchedObjects.swift in Sources */, + E1067B792B19104900FF7D33 /* WebView.swift in Sources */, C9FCC3A4293DBD2200DEDDEA /* Leds.swift in Sources */, + E1067B752B19104900FF7D33 /* DeviceEditView.swift in Sources */, C9FCC38B293DB8A000DEDDEA /* JsonPost.swift in Sources */, C9AF21662AFDE94300E03749 /* Model1to2.xcmappingmodel in Sources */, + E1067B7B2B19104900FF7D33 /* FetchedObjects.swift in Sources */, C96440E22AEF6B6000C51204 /* Persistence.swift in Sources */, - C9865AF62AEF1902000B2714 /* DeviceListView.swift in Sources */, C9FCC393293DB9A500DEDDEA /* Nightlight.swift in Sources */, C9FCC380293DAF9500DEDDEA /* DeviceApi.swift in Sources */, C9AF21682AFDEB6900E03749 /* Migration1to2.swift in Sources */, C99BEF552AF49513001AD80A /* DiscoveryService.swift in Sources */, C9FCC397293DBD1800DEDDEA /* DeviceStateInfo.swift in Sources */, - C96440E82AF095B500C51204 /* DeviceListItemView.swift in Sources */, C9FCC3A5293DBD2200DEDDEA /* Segment.swift in Sources */, - C9767DDE2AF9F435002F3EA9 /* DeviceAddView.swift in Sources */, + E1067B772B19104900FF7D33 /* DeviceView.swift in Sources */, + E1067B7A2B19104900FF7D33 /* DeviceListItemView.swift in Sources */, + E1067B7C2B19104900FF7D33 /* DeviceListFilterAndSort.swift in Sources */, C9A9E5C12918D1C3005B5C22 /* WLEDNativeApp.swift in Sources */, - C99BEF592AF8BA79001AD80A /* WebView.swift in Sources */, C9FCC3A3293DBD2200DEDDEA /* Info.swift in Sources */, - C99BEF572AF8B926001AD80A /* DeviceView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E1067B3B2B190E6F00FF7D33 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E1067B642B190F0F00FF7D33 /* DeviceProviderExtension.swift in Sources */, + E1067B672B190F0F00FF7D33 /* DeviceActor.swift in Sources */, + E1067B662B190F0F00FF7D33 /* DeviceCollection.swift in Sources */, + E1067B622B190F0F00FF7D33 /* Main.swift in Sources */, + E1067B632B190F0F00FF7D33 /* ContentView.swift in Sources */, + E1067B5F2B190F0F00FF7D33 /* CollectionProvider.swift in Sources */, + E1067B652B190F0F00FF7D33 /* WledDeviceExtension.swift in Sources */, + E1067B612B190F0F00FF7D33 /* DeviceView.swift in Sources */, + E1067B602B190F0F00FF7D33 /* DeviceProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -381,6 +554,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MACOSX_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -437,6 +611,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MACOSX_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -453,9 +628,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 2; - DEVELOPMENT_TEAM = RWLNCUSDCJ; + DEVELOPMENT_TEAM = 9R6M6A9AUJ; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "wled-native/Info.plist"; + INFOPLIST_FILE = "wled-native-iOS/Info.plist"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_NSLocalNetworkUsageDescription = "WLED uses the local network to connect to WLED devices around you."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -484,9 +659,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 2; - DEVELOPMENT_TEAM = RWLNCUSDCJ; + DEVELOPMENT_TEAM = 9R6M6A9AUJ; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "wled-native/Info.plist"; + INFOPLIST_FILE = "wled-native-iOS/Info.plist"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_NSLocalNetworkUsageDescription = "WLED uses the local network to connect to WLED devices around you."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -508,6 +683,77 @@ }; name = Release; }; + E1067B4C2B190E7000FF7D33 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIconMac; + "ASSETCATALOG_COMPILER_APPICON_NAME[sdk=macosx*]" = AppIconMac; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = "wled-native-osx/wled-osx.entitlements"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = 9R6M6A9AUJ; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "ca.cgagnier.wled-native"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + E1067B4D2B190E7000FF7D33 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIconMac; + "ASSETCATALOG_COMPILER_APPICON_NAME[sdk=macosx*]" = AppIconMac; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CODE_SIGN_ENTITLEMENTS = "wled-native-osx/wled-osx.entitlements"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = 9R6M6A9AUJ; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "ca.cgagnier.wled-native"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -520,7 +766,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native" */ = { + C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( C9A9E5D22918D1C4005B5C22 /* Debug */, @@ -529,8 +775,41 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + E1067B4B2B190E7000FF7D33 /* Build configuration list for PBXNativeTarget "wled-native-osx" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E1067B4C2B190E7000FF7D33 /* Debug */, + E1067B4D2B190E7000FF7D33 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ +/* Begin XCRemoteSwiftPackageReference section */ + E1283D8B2B198D0C00FC68EF /* XCRemoteSwiftPackageReference "WledLib" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sqrt0b1000/WledLib"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.1.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + E1283D8C2B198D0C00FC68EF /* WledLib */ = { + isa = XCSwiftPackageProductDependency; + package = E1283D8B2B198D0C00FC68EF /* XCRemoteSwiftPackageReference "WledLib" */; + productName = WledLib; + }; + E1283D8F2B198E1D00FC68EF /* WledLib */ = { + isa = XCSwiftPackageProductDependency; + package = E1283D8B2B198D0C00FC68EF /* XCRemoteSwiftPackageReference "WledLib" */; + productName = WledLib; + }; +/* End XCSwiftPackageProductDependency section */ + /* Begin XCVersionGroup section */ C96BF3FE29302EE50011BC3B /* CoreData.xcdatamodeld */ = { isa = XCVersionGroup; diff --git a/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme b/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme index 8eac1b3..dfefb90 100644 --- a/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme +++ b/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme @@ -15,8 +15,8 @@ @@ -44,8 +44,8 @@ @@ -61,8 +61,8 @@ diff --git a/wled-native/wled-native.md b/wled-native/wled-native.md new file mode 100644 index 0000000..878a925 --- /dev/null +++ b/wled-native/wled-native.md @@ -0,0 +1,3 @@ +# wled native + +This directory should only contain files shared by the OSX and the iOS app. From a00895b31ac35760c4acabe9b933d182589c5e97 Mon Sep 17 00:00:00 2001 From: Robert Brune Date: Fri, 1 Dec 2023 05:22:36 +0100 Subject: [PATCH 2/2] Add OSX version and restructre project - Add files from the OSX version and its depencency to WledLib - Split directory `wled-native-iOS`: - Shared files: `wled-native` - Exclusive iOS files: `wled-native-iOS` - Exclusuve OSX files: `wled-native-osx` - Resolve setup issues from move of files - Extend `README.md` with the OSX content --- wled-native-macOS/API-Extensions/String.swift | 15 ++++ .../012_rip.imageset/012_rip.png | Bin .../012_rip.imageset/Contents.json | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIconMac.appiconset/Contents.json | 0 .../AppIconMac.appiconset/mac-128x128.png | Bin .../AppIconMac.appiconset/mac-128x128@2x.png | Bin .../AppIconMac.appiconset/mac-16x16.png | Bin .../AppIconMac.appiconset/mac-16x16@2x.png | Bin .../AppIconMac.appiconset/mac-256x256.png | Bin .../AppIconMac.appiconset/mac-256x256@2x.png | Bin .../AppIconMac.appiconset/mac-32x32.png | Bin .../AppIconMac.appiconset/mac-32x32@2x.png | Bin .../AppIconMac.appiconset/mac-512x512.png | Bin .../AppIconMac.appiconset/mac-512x512@2x.png | Bin .../Assets.xcassets/Contents.json | 0 .../wled_logo_akemi.imageset/Contents.json | 0 .../wled_logo_akemi.png | Bin .../Documentation.docc/Collections/Model.md | 2 +- .../Documentation.docc/Collections/View.md | 2 +- .../Collections/ViewProtocols.md | 0 .../Documentation.docc/Documentation.md | 2 +- .../Model/DeviceActor.swift | 21 +---- .../Model/DeviceCollection.swift | 2 +- .../Model/DeviceIdentifier.swift | 20 +++++ .../View/ContentView.swift | 2 +- .../View/DeviceView.swift | 2 +- .../View/Main.swift | 2 +- .../DeviceProviderExtension.swift | 2 +- .../WledDeviceExtension.swift | 2 +- .../ViewProtocolls/CollectionProvider.swift | 2 +- .../ViewProtocolls/DeviceProvider.swift | 2 +- .../wled-macOS.entitlements | 0 .../wled-native-macOS.md | 4 +- wled-native.xcodeproj/project.pbxproj | 78 ++++++++++-------- .../xcschemes/wled-native.xcscheme | 12 +-- 36 files changed, 100 insertions(+), 72 deletions(-) create mode 100644 wled-native-macOS/API-Extensions/String.swift rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/012_rip.imageset/012_rip.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/012_rip.imageset/Contents.json (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/Contents.json (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-128x128@2x.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-16x16@2x.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/Contents.json (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/wled_logo_akemi.imageset/Contents.json (100%) rename {wled-native-osx => wled-native-macOS}/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png (100%) rename {wled-native-osx => wled-native-macOS}/Documentation.docc/Collections/Model.md (81%) rename {wled-native-osx => wled-native-macOS}/Documentation.docc/Collections/View.md (84%) rename {wled-native-osx => wled-native-macOS}/Documentation.docc/Collections/ViewProtocols.md (100%) rename {wled-native-osx => wled-native-macOS}/Documentation.docc/Documentation.md (91%) rename {wled-native-osx => wled-native-macOS}/Model/DeviceActor.swift (89%) rename {wled-native-osx => wled-native-macOS}/Model/DeviceCollection.swift (99%) create mode 100644 wled-native-macOS/Model/DeviceIdentifier.swift rename {wled-native-osx => wled-native-macOS}/View/ContentView.swift (98%) rename {wled-native-osx => wled-native-macOS}/View/DeviceView.swift (99%) rename {wled-native-osx => wled-native-macOS}/View/Main.swift (94%) rename {wled-native-osx => wled-native-macOS}/ViewProtocolExtensions/DeviceProviderExtension.swift (90%) rename {wled-native-osx => wled-native-macOS}/ViewProtocolExtensions/WledDeviceExtension.swift (98%) rename {wled-native-osx => wled-native-macOS}/ViewProtocolls/CollectionProvider.swift (91%) rename {wled-native-osx => wled-native-macOS}/ViewProtocolls/DeviceProvider.swift (95%) rename wled-native-osx/wled-osx.entitlements => wled-native-macOS/wled-macOS.entitlements (100%) rename wled-native-osx/wled-native-osx.md => wled-native-macOS/wled-native-macOS.md (67%) diff --git a/wled-native-macOS/API-Extensions/String.swift b/wled-native-macOS/API-Extensions/String.swift new file mode 100644 index 0000000..d3105ed --- /dev/null +++ b/wled-native-macOS/API-Extensions/String.swift @@ -0,0 +1,15 @@ +// +// String.swift +// wled-native-macOS +// +// Created by Robert Brune on 01.12.23. +// + +import Foundation +import WledLib + +extension String: WledHost { + public var hostname: String { + return self + } +} diff --git a/wled-native-osx/Assets.xcassets/012_rip.imageset/012_rip.png b/wled-native-macOS/Assets.xcassets/012_rip.imageset/012_rip.png similarity index 100% rename from wled-native-osx/Assets.xcassets/012_rip.imageset/012_rip.png rename to wled-native-macOS/Assets.xcassets/012_rip.imageset/012_rip.png diff --git a/wled-native-osx/Assets.xcassets/012_rip.imageset/Contents.json b/wled-native-macOS/Assets.xcassets/012_rip.imageset/Contents.json similarity index 100% rename from wled-native-osx/Assets.xcassets/012_rip.imageset/Contents.json rename to wled-native-macOS/Assets.xcassets/012_rip.imageset/Contents.json diff --git a/wled-native-osx/Assets.xcassets/AccentColor.colorset/Contents.json b/wled-native-macOS/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from wled-native-osx/Assets.xcassets/AccentColor.colorset/Contents.json rename to wled-native-macOS/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/Contents.json b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/Contents.json similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/Contents.json rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/Contents.json diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-128x128.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128@2x.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-128x128@2x.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-128x128@2x.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-128x128@2x.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-16x16.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16@2x.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-16x16@2x.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-16x16@2x.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-16x16@2x.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-256x256.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-256x256@2x.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-32x32.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-32x32@2x.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-512x512.png diff --git a/wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png b/wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png similarity index 100% rename from wled-native-osx/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png rename to wled-native-macOS/Assets.xcassets/AppIconMac.appiconset/mac-512x512@2x.png diff --git a/wled-native-osx/Assets.xcassets/Contents.json b/wled-native-macOS/Assets.xcassets/Contents.json similarity index 100% rename from wled-native-osx/Assets.xcassets/Contents.json rename to wled-native-macOS/Assets.xcassets/Contents.json diff --git a/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/Contents.json b/wled-native-macOS/Assets.xcassets/wled_logo_akemi.imageset/Contents.json similarity index 100% rename from wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/Contents.json rename to wled-native-macOS/Assets.xcassets/wled_logo_akemi.imageset/Contents.json diff --git a/wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png b/wled-native-macOS/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png similarity index 100% rename from wled-native-osx/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png rename to wled-native-macOS/Assets.xcassets/wled_logo_akemi.imageset/wled_logo_akemi.png diff --git a/wled-native-osx/Documentation.docc/Collections/Model.md b/wled-native-macOS/Documentation.docc/Collections/Model.md similarity index 81% rename from wled-native-osx/Documentation.docc/Collections/Model.md rename to wled-native-macOS/Documentation.docc/Collections/Model.md index a92ac39..9fb79ec 100644 --- a/wled-native-osx/Documentation.docc/Collections/Model.md +++ b/wled-native-macOS/Documentation.docc/Collections/Model.md @@ -1,6 +1,6 @@ # Model WLED strips -The data model representing the WLED strips +The data model representing the WLED strips. ## Topics diff --git a/wled-native-osx/Documentation.docc/Collections/View.md b/wled-native-macOS/Documentation.docc/Collections/View.md similarity index 84% rename from wled-native-osx/Documentation.docc/Collections/View.md rename to wled-native-macOS/Documentation.docc/Collections/View.md index 8f44638..9342bc3 100644 --- a/wled-native-osx/Documentation.docc/Collections/View.md +++ b/wled-native-macOS/Documentation.docc/Collections/View.md @@ -1,6 +1,6 @@ # View -The Views of the +The Views of the macOS application. ## Overview diff --git a/wled-native-osx/Documentation.docc/Collections/ViewProtocols.md b/wled-native-macOS/Documentation.docc/Collections/ViewProtocols.md similarity index 100% rename from wled-native-osx/Documentation.docc/Collections/ViewProtocols.md rename to wled-native-macOS/Documentation.docc/Collections/ViewProtocols.md diff --git a/wled-native-osx/Documentation.docc/Documentation.md b/wled-native-macOS/Documentation.docc/Documentation.md similarity index 91% rename from wled-native-osx/Documentation.docc/Documentation.md rename to wled-native-macOS/Documentation.docc/Documentation.md index 047bbf6..395a532 100644 --- a/wled-native-osx/Documentation.docc/Documentation.md +++ b/wled-native-macOS/Documentation.docc/Documentation.md @@ -1,4 +1,4 @@ -# ``WLED_OSX`` +# ``wled native macOS`` Menu bar for macOS to interact with WLED strips. diff --git a/wled-native-osx/Model/DeviceActor.swift b/wled-native-macOS/Model/DeviceActor.swift similarity index 89% rename from wled-native-osx/Model/DeviceActor.swift rename to wled-native-macOS/Model/DeviceActor.swift index 72861f3..4fdd923 100644 --- a/wled-native-osx/Model/DeviceActor.swift +++ b/wled-native-macOS/Model/DeviceActor.swift @@ -1,6 +1,6 @@ // // Device-Actor.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 21.11.23. // @@ -11,25 +11,6 @@ import OSLog import Combine import WledLib -struct DeviceIdentifier: Codable, Hashable { - let domain: String - let name: String - - var address: String { - var d = domain - d.removeLast() - return name + "." + d - } -} - -extension String: WledHost { - public var hostname: String { - return self - } -} - - - actor DeviceActor:Identifiable, ObservableObject { let id:UUID diff --git a/wled-native-osx/Model/DeviceCollection.swift b/wled-native-macOS/Model/DeviceCollection.swift similarity index 99% rename from wled-native-osx/Model/DeviceCollection.swift rename to wled-native-macOS/Model/DeviceCollection.swift index 1b9ad86..183e8f7 100644 --- a/wled-native-osx/Model/DeviceCollection.swift +++ b/wled-native-macOS/Model/DeviceCollection.swift @@ -1,6 +1,6 @@ // // DeviceManager.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 24.11.23. // diff --git a/wled-native-macOS/Model/DeviceIdentifier.swift b/wled-native-macOS/Model/DeviceIdentifier.swift new file mode 100644 index 0000000..5a89b32 --- /dev/null +++ b/wled-native-macOS/Model/DeviceIdentifier.swift @@ -0,0 +1,20 @@ +// +// DeviceIdentifier.swift +// wled-native-macOS +// +// Created by Robert Brune on 01.12.23. +// + +import Foundation + + +struct DeviceIdentifier: Codable, Hashable { + let domain: String + let name: String + + var address: String { + var d = domain + d.removeLast() + return name + "." + d + } +} diff --git a/wled-native-osx/View/ContentView.swift b/wled-native-macOS/View/ContentView.swift similarity index 98% rename from wled-native-osx/View/ContentView.swift rename to wled-native-macOS/View/ContentView.swift index efe5142..157fce2 100644 --- a/wled-native-osx/View/ContentView.swift +++ b/wled-native-macOS/View/ContentView.swift @@ -1,6 +1,6 @@ // // ContentView.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 15.11.23. // diff --git a/wled-native-osx/View/DeviceView.swift b/wled-native-macOS/View/DeviceView.swift similarity index 99% rename from wled-native-osx/View/DeviceView.swift rename to wled-native-macOS/View/DeviceView.swift index 12f2230..5256eaa 100644 --- a/wled-native-osx/View/DeviceView.swift +++ b/wled-native-macOS/View/DeviceView.swift @@ -1,6 +1,6 @@ // // DeviceView.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 15.11.23. // diff --git a/wled-native-osx/View/Main.swift b/wled-native-macOS/View/Main.swift similarity index 94% rename from wled-native-osx/View/Main.swift rename to wled-native-macOS/View/Main.swift index 7029592..3b7b929 100644 --- a/wled-native-osx/View/Main.swift +++ b/wled-native-macOS/View/Main.swift @@ -1,6 +1,6 @@ // // Main.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 15.11.23. // diff --git a/wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift b/wled-native-macOS/ViewProtocolExtensions/DeviceProviderExtension.swift similarity index 90% rename from wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift rename to wled-native-macOS/ViewProtocolExtensions/DeviceProviderExtension.swift index ff1fa36..0f90ec9 100644 --- a/wled-native-osx/ViewProtocolExtensions/DeviceProviderExtension.swift +++ b/wled-native-macOS/ViewProtocolExtensions/DeviceProviderExtension.swift @@ -1,6 +1,6 @@ // // DeviceProviderExtension.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 26.11.23. // diff --git a/wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift b/wled-native-macOS/ViewProtocolExtensions/WledDeviceExtension.swift similarity index 98% rename from wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift rename to wled-native-macOS/ViewProtocolExtensions/WledDeviceExtension.swift index 4f45ce8..3ef6b14 100644 --- a/wled-native-osx/ViewProtocolExtensions/WledDeviceExtension.swift +++ b/wled-native-macOS/ViewProtocolExtensions/WledDeviceExtension.swift @@ -1,6 +1,6 @@ // // WledDeviceExtension.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 26.11.23. // diff --git a/wled-native-osx/ViewProtocolls/CollectionProvider.swift b/wled-native-macOS/ViewProtocolls/CollectionProvider.swift similarity index 91% rename from wled-native-osx/ViewProtocolls/CollectionProvider.swift rename to wled-native-macOS/ViewProtocolls/CollectionProvider.swift index 6351307..c0955ba 100644 --- a/wled-native-osx/ViewProtocolls/CollectionProvider.swift +++ b/wled-native-macOS/ViewProtocolls/CollectionProvider.swift @@ -1,6 +1,6 @@ // // CollectionProvider.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 26.11.23. // diff --git a/wled-native-osx/ViewProtocolls/DeviceProvider.swift b/wled-native-macOS/ViewProtocolls/DeviceProvider.swift similarity index 95% rename from wled-native-osx/ViewProtocolls/DeviceProvider.swift rename to wled-native-macOS/ViewProtocolls/DeviceProvider.swift index e0d1622..86dc332 100644 --- a/wled-native-osx/ViewProtocolls/DeviceProvider.swift +++ b/wled-native-macOS/ViewProtocolls/DeviceProvider.swift @@ -1,6 +1,6 @@ // // DeviceProvider.swift -// wled-osx +// wled-native-macOS // // Created by Robert Brune on 26.11.23. // diff --git a/wled-native-osx/wled-osx.entitlements b/wled-native-macOS/wled-macOS.entitlements similarity index 100% rename from wled-native-osx/wled-osx.entitlements rename to wled-native-macOS/wled-macOS.entitlements diff --git a/wled-native-osx/wled-native-osx.md b/wled-native-macOS/wled-native-macOS.md similarity index 67% rename from wled-native-osx/wled-native-osx.md rename to wled-native-macOS/wled-native-macOS.md index 539ac20..4897b4f 100644 --- a/wled-native-osx/wled-native-osx.md +++ b/wled-native-macOS/wled-native-macOS.md @@ -1,6 +1,6 @@ -# wled native osx +# wled native macOS -This directory should only contain files used by the wled native OSX app. +This directory should only contain files used by the wled native macOS app. diff --git a/wled-native.xcodeproj/project.pbxproj b/wled-native.xcodeproj/project.pbxproj index b62e0c7..ff8eb52 100644 --- a/wled-native.xcodeproj/project.pbxproj +++ b/wled-native.xcodeproj/project.pbxproj @@ -49,9 +49,10 @@ E1067B7A2B19104900FF7D33 /* DeviceListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B712B19104900FF7D33 /* DeviceListItemView.swift */; }; E1067B7B2B19104900FF7D33 /* FetchedObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B732B19104900FF7D33 /* FetchedObjects.swift */; }; E1067B7C2B19104900FF7D33 /* DeviceListFilterAndSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1067B742B19104900FF7D33 /* DeviceListFilterAndSort.swift */; }; - E1283D8D2B198D0C00FC68EF /* WledLib in Frameworks */ = {isa = PBXBuildFile; productRef = E1283D8C2B198D0C00FC68EF /* WledLib */; }; E1283D902B198E1D00FC68EF /* WledLib in Frameworks */ = {isa = PBXBuildFile; productRef = E1283D8F2B198E1D00FC68EF /* WledLib */; }; E1283D932B198F8800FC68EF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E1283D922B198F7D00FC68EF /* Assets.xcassets */; }; + E1283D962B1995B500FC68EF /* DeviceIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1283D952B1995B500FC68EF /* DeviceIdentifier.swift */; }; + E1283D992B1995FD00FC68EF /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1283D982B1995FD00FC68EF /* String.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -62,7 +63,7 @@ C96827222B01AFB900A5DDEC /* errorPage.fr.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = errorPage.fr.html; sourceTree = ""; }; C96BF3FF29302EE50011BC3B /* CoreData.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = CoreData.xcdatamodel; sourceTree = ""; }; C99BEF542AF49513001AD80A /* DiscoveryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryService.swift; sourceTree = ""; }; - C9A9E5BD2918D1C3005B5C22 /* wled-native-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + C9A9E5BD2918D1C3005B5C22 /* wled-native-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C9A9E5C02918D1C3005B5C22 /* WLEDNativeApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WLEDNativeApp.swift; sourceTree = ""; }; C9A9E5C92918D1C4005B5C22 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; C9A9E5CE2918D1C4005B5C22 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -85,8 +86,8 @@ C9FCC398293DBD2200DEDDEA /* Segment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Segment.swift; sourceTree = ""; }; C9FCC39C293DBD2200DEDDEA /* Leds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Leds.swift; sourceTree = ""; }; C9FCC3A0293DBD2200DEDDEA /* Info.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Info.swift; sourceTree = ""; }; - E1067B3F2B190E6F00FF7D33 /* wled-native-osx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native-osx.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - E1067B4A2B190E7000FF7D33 /* wled-osx.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "wled-osx.entitlements"; sourceTree = ""; }; + E1067B3F2B190E6F00FF7D33 /* wled-native-macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wled-native-macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E1067B4A2B190E7000FF7D33 /* wled-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "wled-macOS.entitlements"; sourceTree = ""; }; E1067B4F2B190F0E00FF7D33 /* CollectionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionProvider.swift; sourceTree = ""; }; E1067B502B190F0E00FF7D33 /* DeviceProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceProvider.swift; sourceTree = ""; }; E1067B532B190F0E00FF7D33 /* DeviceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceView.swift; sourceTree = ""; }; @@ -106,10 +107,12 @@ E1067B732B19104900FF7D33 /* FetchedObjects.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchedObjects.swift; sourceTree = ""; }; E1067B742B19104900FF7D33 /* DeviceListFilterAndSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceListFilterAndSort.swift; sourceTree = ""; }; E1067B802B1910F100FF7D33 /* Example-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Example-01.png"; sourceTree = ""; }; - E1067B872B19396700FF7D33 /* wled-native-osx.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native-osx.md"; sourceTree = ""; }; + E1067B872B19396700FF7D33 /* wled-native-macOS.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native-macOS.md"; sourceTree = ""; }; E1067B882B1939D900FF7D33 /* wled-native.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native.md"; sourceTree = ""; }; E1067B892B193AD500FF7D33 /* wled-native-ios.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "wled-native-ios.md"; sourceTree = ""; }; E1283D922B198F7D00FC68EF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E1283D952B1995B500FC68EF /* DeviceIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceIdentifier.swift; sourceTree = ""; }; + E1283D982B1995FD00FC68EF /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -117,7 +120,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E1283D8D2B198D0C00FC68EF /* WledLib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -147,7 +149,7 @@ E1067B7F2B1910F100FF7D33 /* ExampleImages */, E1067B852B19129800FF7D33 /* wled-native-ios */, C9A9E5BF2918D1C3005B5C22 /* wled-native */, - E1067B402B190E6F00FF7D33 /* wled-native-osx */, + E1067B402B190E6F00FF7D33 /* wled-native-macOS */, C9A9E5BE2918D1C3005B5C22 /* Products */, E1283D8E2B198E1D00FC68EF /* Frameworks */, ); @@ -156,8 +158,8 @@ C9A9E5BE2918D1C3005B5C22 /* Products */ = { isa = PBXGroup; children = ( - C9A9E5BD2918D1C3005B5C22 /* wled-native-ios.app */, - E1067B3F2B190E6F00FF7D33 /* wled-native-osx.app */, + C9A9E5BD2918D1C3005B5C22 /* wled-native-iOS.app */, + E1067B3F2B190E6F00FF7D33 /* wled-native-macOS.app */, ); name = Products; sourceTree = ""; @@ -215,19 +217,20 @@ path = wledapi; sourceTree = ""; }; - E1067B402B190E6F00FF7D33 /* wled-native-osx */ = { + E1067B402B190E6F00FF7D33 /* wled-native-macOS */ = { isa = PBXGroup; children = ( - E1067B872B19396700FF7D33 /* wled-native-osx.md */, + E1283D972B1995E200FC68EF /* API-Extensions */, + E1067B872B19396700FF7D33 /* wled-native-macOS.md */, E1067B5E2B190F0F00FF7D33 /* Documentation.docc */, E1067B592B190F0F00FF7D33 /* Model */, E1067B522B190F0E00FF7D33 /* View */, E1067B562B190F0F00FF7D33 /* ViewProtocolExtensions */, E1067B4E2B190F0E00FF7D33 /* ViewProtocolls */, - E1067B4A2B190E7000FF7D33 /* wled-osx.entitlements */, + E1067B4A2B190E7000FF7D33 /* wled-macOS.entitlements */, E1283D922B198F7D00FC68EF /* Assets.xcassets */, ); - path = "wled-native-osx"; + path = "wled-native-macOS"; sourceTree = ""; }; E1067B4E2B190F0E00FF7D33 /* ViewProtocolls */ = { @@ -263,6 +266,7 @@ children = ( E1067B5A2B190F0F00FF7D33 /* DeviceCollection.swift */, E1067B5B2B190F0F00FF7D33 /* DeviceActor.swift */, + E1283D952B1995B500FC68EF /* DeviceIdentifier.swift */, ); path = Model; sourceTree = ""; @@ -318,12 +322,20 @@ name = Frameworks; sourceTree = ""; }; + E1283D972B1995E200FC68EF /* API-Extensions */ = { + isa = PBXGroup; + children = ( + E1283D982B1995FD00FC68EF /* String.swift */, + ); + path = "API-Extensions"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - C9A9E5BC2918D1C3005B5C22 /* wled-native-ios */ = { + C9A9E5BC2918D1C3005B5C22 /* wled-native-iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native-ios" */; + buildConfigurationList = C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native-iOS" */; buildPhases = ( C9A9E5B92918D1C3005B5C22 /* Sources */, C9A9E5BA2918D1C3005B5C22 /* Frameworks */, @@ -333,17 +345,16 @@ ); dependencies = ( ); - name = "wled-native-ios"; + name = "wled-native-iOS"; packageProductDependencies = ( - E1283D8C2B198D0C00FC68EF /* WledLib */, ); productName = "wled-native"; - productReference = C9A9E5BD2918D1C3005B5C22 /* wled-native-ios.app */; + productReference = C9A9E5BD2918D1C3005B5C22 /* wled-native-iOS.app */; productType = "com.apple.product-type.application"; }; - E1067B3E2B190E6F00FF7D33 /* wled-native-osx */ = { + E1067B3E2B190E6F00FF7D33 /* wled-native-macOS */ = { isa = PBXNativeTarget; - buildConfigurationList = E1067B4B2B190E7000FF7D33 /* Build configuration list for PBXNativeTarget "wled-native-osx" */; + buildConfigurationList = E1067B4B2B190E7000FF7D33 /* Build configuration list for PBXNativeTarget "wled-native-macOS" */; buildPhases = ( E1067B3B2B190E6F00FF7D33 /* Sources */, E1067B3C2B190E6F00FF7D33 /* Frameworks */, @@ -353,12 +364,12 @@ ); dependencies = ( ); - name = "wled-native-osx"; + name = "wled-native-macOS"; packageProductDependencies = ( E1283D8F2B198E1D00FC68EF /* WledLib */, ); productName = "WLED-OSX"; - productReference = E1067B3F2B190E6F00FF7D33 /* wled-native-osx.app */; + productReference = E1067B3F2B190E6F00FF7D33 /* wled-native-macOS.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -396,8 +407,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - C9A9E5BC2918D1C3005B5C22 /* wled-native-ios */, - E1067B3E2B190E6F00FF7D33 /* wled-native-osx */, + C9A9E5BC2918D1C3005B5C22 /* wled-native-iOS */, + E1067B3E2B190E6F00FF7D33 /* wled-native-macOS */, ); }; /* End PBXProject section */ @@ -466,7 +477,9 @@ buildActionMask = 2147483647; files = ( E1067B642B190F0F00FF7D33 /* DeviceProviderExtension.swift in Sources */, + E1283D992B1995FD00FC68EF /* String.swift in Sources */, E1067B672B190F0F00FF7D33 /* DeviceActor.swift in Sources */, + E1283D962B1995B500FC68EF /* DeviceIdentifier.swift in Sources */, E1067B662B190F0F00FF7D33 /* DeviceCollection.swift in Sources */, E1067B622B190F0F00FF7D33 /* Main.swift in Sources */, E1067B632B190F0F00FF7D33 /* ContentView.swift in Sources */, @@ -631,6 +644,7 @@ DEVELOPMENT_TEAM = 9R6M6A9AUJ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "wled-native-iOS/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = WLED; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_NSLocalNetworkUsageDescription = "WLED uses the local network to connect to WLED devices around you."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -662,6 +676,7 @@ DEVELOPMENT_TEAM = 9R6M6A9AUJ; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "wled-native-iOS/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = WLED; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_NSLocalNetworkUsageDescription = "WLED uses the local network to connect to WLED devices around you."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -691,7 +706,7 @@ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; - CODE_SIGN_ENTITLEMENTS = "wled-native-osx/wled-osx.entitlements"; + CODE_SIGN_ENTITLEMENTS = "wled-native-macOS/wled-macOS.entitlements"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -702,6 +717,7 @@ ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = WLED; INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -727,7 +743,7 @@ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; - CODE_SIGN_ENTITLEMENTS = "wled-native-osx/wled-osx.entitlements"; + CODE_SIGN_ENTITLEMENTS = "wled-native-macOS/wled-macOS.entitlements"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; @@ -738,6 +754,7 @@ ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = WLED; INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -766,7 +783,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native-ios" */ = { + C9A9E5D12918D1C4005B5C22 /* Build configuration list for PBXNativeTarget "wled-native-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( C9A9E5D22918D1C4005B5C22 /* Debug */, @@ -775,7 +792,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E1067B4B2B190E7000FF7D33 /* Build configuration list for PBXNativeTarget "wled-native-osx" */ = { + E1067B4B2B190E7000FF7D33 /* Build configuration list for PBXNativeTarget "wled-native-macOS" */ = { isa = XCConfigurationList; buildConfigurations = ( E1067B4C2B190E7000FF7D33 /* Debug */, @@ -798,11 +815,6 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - E1283D8C2B198D0C00FC68EF /* WledLib */ = { - isa = XCSwiftPackageProductDependency; - package = E1283D8B2B198D0C00FC68EF /* XCRemoteSwiftPackageReference "WledLib" */; - productName = WledLib; - }; E1283D8F2B198E1D00FC68EF /* WledLib */ = { isa = XCSwiftPackageProductDependency; package = E1283D8B2B198D0C00FC68EF /* XCRemoteSwiftPackageReference "WledLib" */; diff --git a/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme b/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme index dfefb90..d829efd 100644 --- a/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme +++ b/wled-native.xcodeproj/xcshareddata/xcschemes/wled-native.xcscheme @@ -15,8 +15,8 @@ @@ -44,8 +44,8 @@ @@ -61,8 +61,8 @@