From 4efefcd6b3effcf2c97c761446ad70f4166aa14f Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 27 Aug 2023 03:09:33 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20UI=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?asset=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Box42.xcodeproj/project.pbxproj | 42 +++++++++--------- .../Bookmark.imageset/Bookmark icon.png | Bin 0 -> 539 bytes .../uibuttons/Bookmark.imageset/Contents.json | 21 +++++++++ .../Assets.xcassets/uibuttons/Pin icon.png | Bin 649 -> 0 bytes .../uibuttons/Star.imageset/Contents.json | 21 +++++++++ .../uibuttons/Star.imageset/Star 3.png | Bin 0 -> 926 bytes .../Contents.json | 0 .../Pin icon.png | Bin .../Contents.json | 0 .../Pin icon_45.png | Bin 10 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 Box42/Resources/Assets.xcassets/uibuttons/Bookmark.imageset/Bookmark icon.png create mode 100644 Box42/Resources/Assets.xcassets/uibuttons/Bookmark.imageset/Contents.json delete mode 100644 Box42/Resources/Assets.xcassets/uibuttons/Pin icon.png create mode 100644 Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Contents.json create mode 100644 Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Star 3.png rename Box42/Resources/Assets.xcassets/uibuttons/{Pin icon-1.imageset => pin-box-ver.imageset}/Contents.json (100%) rename Box42/Resources/Assets.xcassets/uibuttons/{Pin icon-1.imageset => pin-box-ver.imageset}/Pin icon.png (100%) rename Box42/Resources/Assets.xcassets/uibuttons/{Pin icon.imageset => pin-box.imageset}/Contents.json (100%) rename Box42/Resources/Assets.xcassets/uibuttons/{Pin icon.imageset => pin-box.imageset}/Pin icon_45.png (100%) diff --git a/Box42.xcodeproj/project.pbxproj b/Box42.xcodeproj/project.pbxproj index 309678c..7044783 100644 --- a/Box42.xcodeproj/project.pbxproj +++ b/Box42.xcodeproj/project.pbxproj @@ -69,19 +69,19 @@ DE874F572A591F2500FC3B77 /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F562A591F2500FC3B77 /* Icon.swift */; }; DE874F5F2A5935CC00FC3B77 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F5E2A5935CC00FC3B77 /* String.swift */; }; DE97CA692A9A6364001073DE /* PixelConversion+CGFloat.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA682A9A6364001073DE /* PixelConversion+CGFloat.swift */; }; + DE97CA792A9A6F6A001073DE /* QuickSlotHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */; }; + DE97CA7C2A9A7199001073DE /* QuickSlotGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */; }; + DE97CA7F2A9A73A9001073DE /* QuickSlotUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */; }; + DE97CA862A9A7404001073DE /* QuickSlotViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA6E2A9A6EFC001073DE /* QuickSlotViewModel.swift */; }; + DE97CA872A9A7407001073DE /* QuickSlotButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA712A9A6F0D001073DE /* QuickSlotButtonModel.swift */; }; DE98E83B2A98DB6000F8744A /* RotateImage+NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E83A2A98DB6000F8744A /* RotateImage+NSImage.swift */; }; DE98E8432A98DDFD00F8744A /* QuickSlotViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */; }; - DE98E8472A98DE6D00F8744A /* QuickSlotHorizontalStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8462A98DE6D00F8744A /* QuickSlotHorizontalStackView.swift */; }; - DE98E84B2A98E03800F8744A /* QuickSlotItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E84A2A98E03800F8744A /* QuickSlotItem.swift */; }; - DE98E8502A98E06300F8744A /* QuickSlotViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E84F2A98E06300F8744A /* QuickSlotViewModel.swift */; }; DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8542A98EA7900F8744A /* WindowButtonUI.swift */; }; DE9DA8142A97F20E001C0D3B /* ButtonGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9DA8132A97F20E001C0D3B /* ButtonGroupViewController.swift */; }; DEB862D42A85124500278FCD /* cleanCache.sh in Resources */ = {isa = PBXBuildFile; fileRef = DEB862D32A85124500278FCD /* cleanCache.sh */; }; DEB862D92A852C4500278FCD /* brewInGoinfre.sh in Resources */ = {isa = PBXBuildFile; fileRef = DEB862D82A852C4500278FCD /* brewInGoinfre.sh */; }; DEB862DC2A85347400278FCD /* Scripts.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB862DB2A85347400278FCD /* Scripts.swift */; }; DEB862EB2A853F7F00278FCD /* BoxWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB862E92A853F7F00278FCD /* BoxWindowController.swift */; }; - DEE0FA822A99FC1000085A65 /* QuickSlotCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEE0FA812A99FC1000085A65 /* QuickSlotCollectionView.swift */; }; - DEE0FA8B2A9A0BD500085A65 /* QuickSlotCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEE0FA842A99FD1100085A65 /* QuickSlotCollectionViewItem.swift */; }; DEE0FA962A9A554F00085A65 /* FunctionButtonUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEE0FA952A9A554F00085A65 /* FunctionButtonUI.swift */; }; DEF749322A85657600D987C8 /* NSScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF749312A85657600D987C8 /* NSScreen.swift */; }; /* End PBXBuildFile section */ @@ -151,19 +151,19 @@ DE874F562A591F2500FC3B77 /* Icon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; DE874F5E2A5935CC00FC3B77 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; DE97CA682A9A6364001073DE /* PixelConversion+CGFloat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PixelConversion+CGFloat.swift"; sourceTree = ""; }; + DE97CA6E2A9A6EFC001073DE /* QuickSlotViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotViewModel.swift; sourceTree = ""; }; + DE97CA712A9A6F0D001073DE /* QuickSlotButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonModel.swift; sourceTree = ""; }; + DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotHeaderView.swift; sourceTree = ""; }; + DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotGroupView.swift; sourceTree = ""; }; + DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotUI.swift; sourceTree = ""; }; DE98E83A2A98DB6000F8744A /* RotateImage+NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RotateImage+NSImage.swift"; sourceTree = ""; }; DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotViewController.swift; sourceTree = ""; }; - DE98E8462A98DE6D00F8744A /* QuickSlotHorizontalStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotHorizontalStackView.swift; sourceTree = ""; }; - DE98E84A2A98E03800F8744A /* QuickSlotItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotItem.swift; sourceTree = ""; }; - DE98E84F2A98E06300F8744A /* QuickSlotViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotViewModel.swift; sourceTree = ""; }; DE98E8542A98EA7900F8744A /* WindowButtonUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowButtonUI.swift; sourceTree = ""; }; DE9DA8132A97F20E001C0D3B /* ButtonGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonGroupViewController.swift; sourceTree = ""; }; DEB862D32A85124500278FCD /* cleanCache.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = cleanCache.sh; sourceTree = ""; }; DEB862D82A852C4500278FCD /* brewInGoinfre.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = brewInGoinfre.sh; sourceTree = ""; }; DEB862DB2A85347400278FCD /* Scripts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Scripts.swift; path = Box42/Scripts/Scripts.swift; sourceTree = SOURCE_ROOT; }; DEB862E92A853F7F00278FCD /* BoxWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxWindowController.swift; sourceTree = ""; }; - DEE0FA812A99FC1000085A65 /* QuickSlotCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotCollectionView.swift; sourceTree = ""; }; - DEE0FA842A99FD1100085A65 /* QuickSlotCollectionViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotCollectionViewItem.swift; sourceTree = ""; }; DEE0FA952A9A554F00085A65 /* FunctionButtonUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionButtonUI.swift; sourceTree = ""; }; DEF7492E2A85603700D987C8 /* nodeInstall.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = nodeInstall.sh; sourceTree = ""; }; DEF749312A85657600D987C8 /* NSScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSScreen.swift; sourceTree = ""; }; @@ -350,7 +350,6 @@ DE4407FC2A923E920091937A /* View */ = { isa = PBXGroup; children = ( - DE44081C2A928F760091937A /* TopDivider.swift */, DE4407FD2A923EA90091937A /* PreferenceButtonView.swift */, DE4408012A923EB60091937A /* PinButtonView.swift */, DE4408042A923EC00091937A /* QuitButtonView.swift */, @@ -405,8 +404,9 @@ DE98E8412A98DDEB00F8744A /* View */ = { isa = PBXGroup; children = ( - DE98E8462A98DE6D00F8744A /* QuickSlotHorizontalStackView.swift */, - DEE0FA812A99FC1000085A65 /* QuickSlotCollectionView.swift */, + DE44081C2A928F760091937A /* TopDivider.swift */, + DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */, + DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */, ); path = View; sourceTree = ""; @@ -414,8 +414,8 @@ DE98E8492A98E02400F8744A /* Model */ = { isa = PBXGroup; children = ( - DEE0FA842A99FD1100085A65 /* QuickSlotCollectionViewItem.swift */, - DE98E84A2A98E03800F8744A /* QuickSlotItem.swift */, + DE97CA712A9A6F0D001073DE /* QuickSlotButtonModel.swift */, + DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */, ); path = Model; sourceTree = ""; @@ -423,7 +423,7 @@ DE98E84E2A98E04F00F8744A /* ViewModel */ = { isa = PBXGroup; children = ( - DE98E84F2A98E06300F8744A /* QuickSlotViewModel.swift */, + DE97CA6E2A9A6EFC001073DE /* QuickSlotViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -598,37 +598,38 @@ DE4408082A9240300091937A /* BoxFunctionButtonView.swift in Sources */, DE3FF3742A978AB8009C88EF /* WindowMaximizeButton.swift in Sources */, DE3FF3A32A97D2A6009C88EF /* DisplayURLTextfield.swift in Sources */, + DE97CA872A9A7407001073DE /* QuickSlotButtonModel.swift in Sources */, DE77BA562A82637900713683 /* StateManager.swift in Sources */, DE1F1A1C2A8B50C500A88DD8 /* BoxBaseContainerViewController.swift in Sources */, DEE0FA962A9A554F00085A65 /* FunctionButtonUI.swift in Sources */, DE018BE72A509B1E00FF0AA3 /* WebViewController.swift in Sources */, DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */, DE4407FA2A923E860091937A /* BoxFunctionViewController.swift in Sources */, - DE98E8472A98DE6D00F8744A /* QuickSlotHorizontalStackView.swift in Sources */, DE4407FE2A923EA90091937A /* PreferenceButtonView.swift in Sources */, DEF749322A85657600D987C8 /* NSScreen.swift in Sources */, DE018BF02A509B2F00FF0AA3 /* MenubarViewController.swift in Sources */, DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */, DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */, + DE97CA7C2A9A7199001073DE /* QuickSlotGroupView.swift in Sources */, DE018BE42A509B1700FF0AA3 /* CPU.swift in Sources */, DE874F5F2A5935CC00FC3B77 /* String.swift in Sources */, - DEE0FA822A99FC1000085A65 /* QuickSlotCollectionView.swift in Sources */, DE0A91862A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift in Sources */, DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */, DE0A91832A8F889000D1D6F1 /* GoHomePageViaToolbar().swift in Sources */, DE018BB32A5099F900FF0AA3 /* AppDelegate.swift in Sources */, DE0A91632A8E6A5400D1D6F1 /* Constants.swift in Sources */, DE0A91902A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift in Sources */, - DEE0FA8B2A9A0BD500085A65 /* QuickSlotCollectionViewItem.swift in Sources */, DE018BF32A509B3300FF0AA3 /* MenubarModel.swift in Sources */, - DE98E8502A98E06300F8744A /* QuickSlotViewModel.swift in Sources */, DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */, DE24E63B2A8FE93900E29F5D /* NSImage.swift in Sources */, + DE97CA792A9A6F6A001073DE /* QuickSlotHeaderView.swift in Sources */, DE0A916D2A8E7DD700D1D6F1 /* HoverButton.swift in Sources */, + DE97CA862A9A7404001073DE /* QuickSlotViewModel.swift in Sources */, DE3FF3762A978AB8009C88EF /* WindowCloseButton.swift in Sources */, DE3FF3772A978AB8009C88EF /* WindowMinimizeButton.swift in Sources */, DE4408022A923EB60091937A /* PinButtonView.swift in Sources */, DE0A91672A8E6CA700D1D6F1 /* WebViewManager.swift in Sources */, + DE97CA7F2A9A73A9001073DE /* QuickSlotUI.swift in Sources */, DE4408152A92750D0091937A /* keyDown+BoxBaseContainerViewController.swift in Sources */, DE018BED2A509B2600FF0AA3 /* URLModel.swift in Sources */, DE97CA692A9A6364001073DE /* PixelConversion+CGFloat.swift in Sources */, @@ -647,7 +648,6 @@ DE2AD3292A824EEB00002D51 /* Accessibility.swift in Sources */, DE24E6382A8FE10400E29F5D /* BoxBaseSplitView.swift in Sources */, DE44081D2A928F760091937A /* TopDivider.swift in Sources */, - DE98E84B2A98E03800F8744A /* QuickSlotItem.swift in Sources */, DE98E8432A98DDFD00F8744A /* QuickSlotViewController.swift in Sources */, DE874F572A591F2500FC3B77 /* Icon.swift in Sources */, DE1F1A2E2A8BCC9800A88DD8 /* Storage.swift in Sources */, diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Bookmark.imageset/Bookmark icon.png b/Box42/Resources/Assets.xcassets/uibuttons/Bookmark.imageset/Bookmark icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fa00ba016b23664c6fe74784f4a56141f1adb01c GIT binary patch literal 539 zcmV+$0_6RPP)2-YtFwB*U3-F;|5*4ETV`qO-iQm_FnLf)^XM zLn)SX7R54~nSvLL*Dw3D#j?#(g$p5-rA{(AEsFd`97-evuR{5Ydz@Z9+fvII@EHS~ z`wJ||OmYs#JBtX10`LmG(ALr{uAkm<^YRf!dowEi^Cmg>uhAiwio$OWH{oBdu(fYuP)!QbrXN~S^(}PHCVzK}k zFeOW4bS+bESaW&OJVp|79>7GZcTF0iUbV*(LvP_Lb;c|)nj1T~M7G>;E!K}!o$LFn zCfj;bi3IH`OyhZQ8bcpyXRcGFX)Qgs(p{}bM#mVve27?yv!3fk9?I~F!1HFOT0gY>CrC_q8G-M(6_RxvLl=$RA>g~4*Uyzlq>3519RwOXx5 zHZk0jl*{GgPNy@0fFcAmo6QJ*#2BK*VsQZ>B0+Ftu^*xJ4k1J&s8}qD>|hJm(G)^N zg1X)An9UIW=s<|na$t44WRt)x6Z5^9RJk=Q5Dhq5QR2Al}hJu3}^fV3dEN4VYf9J+i7N~0Z(MHeK6K= zZnq6iAw*<3pLSa#wViZ^8t@FOov4C}1aWr6mav7JNKv&*WjT}AIC4i6WTMUy{4!?F zyJnlD$$8d-Jf8CGBu&n<%5o0#niP}srp$ToyE7 zWY5^9lda{{8!rdAD+*kU2^ZxDFAw%dLDM5ZJ*t^9`-WXs4?R00000NkvXXu0mjf+)5pS diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Contents.json b/Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Contents.json new file mode 100644 index 0000000..bad711e --- /dev/null +++ b/Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Star 3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Star 3.png b/Box42/Resources/Assets.xcassets/uibuttons/Star.imageset/Star 3.png new file mode 100644 index 0000000000000000000000000000000000000000..dcfda9c9b4650087fb48586781ccb22eef6d8f48 GIT binary patch literal 926 zcmV;P17ZA$P)3EFSy;2e$DbBqpr~j3=`O60YSRuzQol3rF$7axtDvP4wRS4?u4oG_1xG z9;DHTF`AYG#28~6dr+dWd~dqb4rRC9cDBGv-t4cL>C5|OzM0M-g@+jP4s()Opc8~F zv*vQ0P6$k9%@`l9#iBz}oJkrOpm1QJNTjqFpIchw}ddDQvFBqnOEY+3B zO~)}CMXOs9x~}!=Sd#e;H(qW@=(sl6;X9U@i&UTXbIb+iBJ&|WF5kUOso4v@jnAAO zpuN5Se2yER=ns<=@e;5QO6>L(sQ z+olEk;{j2)@ycV46!-ki4~j%0WL`f<{Qy$Py+@x9iSiS6K%BGjvoGQx3i-`TR6AjZ z#Dy8wPNIl{t(7)&8EFLTVz-I46(vrt@!8jHMFBx}7dF$uLY(Ibp^HK@)91-Y6jAVP zPX)!<=n(0m%o$$ZwyPIZn1Mn!jDV6GlkMsS6(%~7ONS1W^;cV1LsS@!VG=3g4AKy0 zh$6(DMxyDw=~pMnXzmzBY+110A>U#4;(q`(l75H>a4d+hgeZK3Az5Z}CAqH`fIu5b zl(*hq0+qge$63#z#D)%u5*geTKM^2_kJB#Z3cTo>#8`%d}8~rHlds^pUwGaY9ypXFM;z!c~`mkCBqAy(CcS-62 zLRbrtu@|X(SgODk literal 0 HcmV?d00001 diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Pin icon-1.imageset/Contents.json b/Box42/Resources/Assets.xcassets/uibuttons/pin-box-ver.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/uibuttons/Pin icon-1.imageset/Contents.json rename to Box42/Resources/Assets.xcassets/uibuttons/pin-box-ver.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Pin icon-1.imageset/Pin icon.png b/Box42/Resources/Assets.xcassets/uibuttons/pin-box-ver.imageset/Pin icon.png similarity index 100% rename from Box42/Resources/Assets.xcassets/uibuttons/Pin icon-1.imageset/Pin icon.png rename to Box42/Resources/Assets.xcassets/uibuttons/pin-box-ver.imageset/Pin icon.png diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Pin icon.imageset/Contents.json b/Box42/Resources/Assets.xcassets/uibuttons/pin-box.imageset/Contents.json similarity index 100% rename from Box42/Resources/Assets.xcassets/uibuttons/Pin icon.imageset/Contents.json rename to Box42/Resources/Assets.xcassets/uibuttons/pin-box.imageset/Contents.json diff --git a/Box42/Resources/Assets.xcassets/uibuttons/Pin icon.imageset/Pin icon_45.png b/Box42/Resources/Assets.xcassets/uibuttons/pin-box.imageset/Pin icon_45.png similarity index 100% rename from Box42/Resources/Assets.xcassets/uibuttons/Pin icon.imageset/Pin icon_45.png rename to Box42/Resources/Assets.xcassets/uibuttons/pin-box.imageset/Pin icon_45.png From b158979bb4a227b5bc3792eb7027579a39292a72 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 27 Aug 2023 03:09:48 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20UI=20frame=EC=9D=84=20=EA=B5=AC=EC=84=B1=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/BoxFunctionViewGroup.swift | 11 +-- .../Main/BoxBaseContainerViewController.swift | 18 ++--- .../Controller/QuickSlotViewController.swift | 40 +++++++++++ .../Model/QuickSlotButtonModel.swift | 14 ++++ Box42/QuickSlot/Model/QuickSlotUI.swift | 22 ++++++ Box42/QuickSlot/View/QuickSlotGroupView.swift | 47 +++++++++++++ .../QuickSlot/View/QuickSlotHeaderView.swift | 55 +++++++++++++++ .../View/TopDivider.swift | 0 .../ViewModel/QuickSlotViewModel.swift | 29 ++++++++ Box42/WebView/URL/URLModel.swift | 68 ++++++++++++++++++- 10 files changed, 284 insertions(+), 20 deletions(-) create mode 100644 Box42/QuickSlot/Controller/QuickSlotViewController.swift create mode 100644 Box42/QuickSlot/Model/QuickSlotButtonModel.swift create mode 100644 Box42/QuickSlot/Model/QuickSlotUI.swift create mode 100644 Box42/QuickSlot/View/QuickSlotGroupView.swift create mode 100644 Box42/QuickSlot/View/QuickSlotHeaderView.swift rename Box42/{FunctionButton => QuickSlot}/View/TopDivider.swift (100%) create mode 100644 Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift diff --git a/Box42/FunctionButton/View/BoxFunctionViewGroup.swift b/Box42/FunctionButton/View/BoxFunctionViewGroup.swift index a0e9d49..2e961a0 100644 --- a/Box42/FunctionButton/View/BoxFunctionViewGroup.swift +++ b/Box42/FunctionButton/View/BoxFunctionViewGroup.swift @@ -10,10 +10,9 @@ import SnapKit class BoxFunctionViewGroup: NSView { lazy var preferenceButton: PreferenceButtonView = PreferenceButtonView(image: NSImage(imageLiteralResourceName: "plus"), completion: { self.preferenceAction?() }) - lazy var pinButton: PinButtonView = PinButtonView(image: NSImage(imageLiteralResourceName: "Pin icon"), completion: { self.pinAction?() }) + lazy var pinButton: PinButtonView = PinButtonView(image: NSImage(imageLiteralResourceName: "pin-box"), completion: { self.pinAction?() }) lazy var quitButton: QuitButtonView = QuitButtonView(image: NSImage(imageLiteralResourceName: "figure.snowboarding"), completion: { self.quitAction?() }) lazy var boxButton: BoxFunctionButtonView = BoxFunctionButtonView(image: NSImage(imageLiteralResourceName: "shippingbox"), completion: { self.boxAction?() }) - lazy var divider: NSBox = TopDivider(completion: { self.dividerAction?() }) var preferenceAction: (() -> Void)? var pinAction: (() -> Void)? @@ -38,17 +37,11 @@ class BoxFunctionViewGroup: NSView { self.addSubview(pinButton) self.addSubview(quitButton) self.addSubview(boxButton) - self.addSubview(divider) } private func setupConstraints() { - divider.snp.makeConstraints { make in - make.top.equalToSuperview() - make.left.right.equalToSuperview() - } - pinButton.snp.makeConstraints { make in - make.top.equalTo(divider).offset(10) + make.top.equalToSuperview() make.bottom.equalToSuperview() make.left.equalToSuperview() make.width.equalTo(FunctionButtonUI.size.pinWidth) diff --git a/Box42/Main/BoxBaseContainerViewController.swift b/Box42/Main/BoxBaseContainerViewController.swift index 011e26c..de5f5c0 100644 --- a/Box42/Main/BoxBaseContainerViewController.swift +++ b/Box42/Main/BoxBaseContainerViewController.swift @@ -12,7 +12,7 @@ class BoxBaseContainerViewController: NSViewController { var splitView: BoxBaseSplitView = BoxBaseSplitView() var contentGroup: BoxContentsViewGroup = BoxContentsViewGroup() var toolbarGroupVC: ToolbarViewController = ToolbarViewController() - // var quickSlotGroupVC: QuickSlotViewController = QuickSlotViewController() + var quickSlotGroupVC: QuickSlotViewController = QuickSlotViewController() var functionGroupVC: BoxFunctionViewController = BoxFunctionViewController() let windowViewGroupVC: WindowButtonViewController = WindowButtonViewController() var leftContainer: MovableContainerView = MovableContainerView() @@ -76,7 +76,7 @@ class BoxBaseContainerViewController: NSViewController { leftContainer.addSubview(windowViewGroupVC.view) leftContainer.addSubview(buttonGroupVC.view) leftContainer.addSubview(toolbarGroupVC.view) -// leftContainer.addSubview(quickSlotGroupVC.view) + leftContainer.addSubview(quickSlotGroupVC.view) leftContainer.addSubview(functionGroupVC.view) leftContainerAutolayout() @@ -101,15 +101,15 @@ class BoxBaseContainerViewController: NSViewController { make.top.equalTo(toolbarGroupVC.view.snp.bottom).offset(Constants.UI.groupAutolayout) make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout) make.left.equalTo(leftContainer) - make.bottom.equalTo(functionGroupVC.view.snp.top).offset(-Constants.UI.groupAutolayout) + make.bottom.equalTo(quickSlotGroupVC.view.snp.top).offset(-Constants.UI.groupAutolayout) } -// quickSlotGroupVC.view.snp.makeConstraints { make in -// make.bottom.equalTo(functionGroupVC.view.snp.top).offset(-27) -// make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout) -// make.left.equalTo(leftContainer) -// make.height.equalTo(178) -// } + quickSlotGroupVC.view.snp.makeConstraints { make in + make.bottom.equalTo(functionGroupVC.view.snp.top).offset(-27) + make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout) + make.left.equalTo(leftContainer) + make.height.equalTo(178) + } functionGroupVC.view.snp.makeConstraints { make in make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout) diff --git a/Box42/QuickSlot/Controller/QuickSlotViewController.swift b/Box42/QuickSlot/Controller/QuickSlotViewController.swift new file mode 100644 index 0000000..898e56b --- /dev/null +++ b/Box42/QuickSlot/Controller/QuickSlotViewController.swift @@ -0,0 +1,40 @@ +// +// QuickSlotViewController.swift +// Box42 +// +// Created by Chanhee Kim on 8/25/23. +// + +import AppKit + +class QuickSlotViewController: NSViewController { + var viewModel: QuickSlotViewModel! + + override func loadView() { + super.viewDidLoad() + let quickSlotViewGroup = QuickSlotGroupView() + quickSlotViewGroup.quickslotAction = quickslotAction + + self.view = quickSlotViewGroup + } + + func setupHeader() { + // headerLabel을 뷰에 추가하고 레이아웃을 설정합니다. + } + + func setupGroupView() { + // groupView를 뷰에 추가하고 레이아웃을 설정합니다. + } + + func setupButtons() { + // 4x2 버튼을 groupView에 추가하고 레이아웃을 설정합니다. + } + + @objc func buttonTapped(sender: NSButton) { + // 버튼이 눌렸을 때의 처리 + } + + func quickslotAction() { + print("quick slot") + } +} diff --git a/Box42/QuickSlot/Model/QuickSlotButtonModel.swift b/Box42/QuickSlot/Model/QuickSlotButtonModel.swift new file mode 100644 index 0000000..e5fcf51 --- /dev/null +++ b/Box42/QuickSlot/Model/QuickSlotButtonModel.swift @@ -0,0 +1,14 @@ +// +// QuickSlotButtonModel.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import Foundation + +// Model +struct QuickSlotButtonModel { + let id: UUID + var title: String +} diff --git a/Box42/QuickSlot/Model/QuickSlotUI.swift b/Box42/QuickSlot/Model/QuickSlotUI.swift new file mode 100644 index 0000000..cefdbbf --- /dev/null +++ b/Box42/QuickSlot/Model/QuickSlotUI.swift @@ -0,0 +1,22 @@ +// +// QuickSlotUI.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import AppKit + +struct QuickSlotUI { + struct size { + static let font: CGFloat = CGFloat(16).pointsToPixels() + static let headerHeight: CGFloat = 22 + 13 + } + + struct animation { + } + + struct color { + static let pinText = NSColor(hex: "#696969") + } +} diff --git a/Box42/QuickSlot/View/QuickSlotGroupView.swift b/Box42/QuickSlot/View/QuickSlotGroupView.swift new file mode 100644 index 0000000..35497a7 --- /dev/null +++ b/Box42/QuickSlot/View/QuickSlotGroupView.swift @@ -0,0 +1,47 @@ +// +// QuickSlotGroupView.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import AppKit +import SnapKit + +class QuickSlotGroupView: NSView { + lazy var divider: NSBox = TopDivider(completion: { self.dividerAction?() }) + lazy var headerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { self.quickslotAction?() }) + + var dividerAction: (() -> Void)? + var quickslotAction: (() -> Void)? + + override init(frame: NSRect) { + super.init(frame: frame) + setupViews() + setupConstraints() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setupViews() + setupConstraints() + } + + private func setupViews() { + self.addSubview(divider) + self.addSubview(headerView) + } + + private func setupConstraints() { + divider.snp.makeConstraints { make in + make.top.equalToSuperview() + make.left.right.equalToSuperview() + } + + headerView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.left.right.equalToSuperview() + make.height.equalTo(QuickSlotUI.size.headerHeight) + } + } +} diff --git a/Box42/QuickSlot/View/QuickSlotHeaderView.swift b/Box42/QuickSlot/View/QuickSlotHeaderView.swift new file mode 100644 index 0000000..443ed69 --- /dev/null +++ b/Box42/QuickSlot/View/QuickSlotHeaderView.swift @@ -0,0 +1,55 @@ +// +// QuickSlotHeaderView.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import AppKit +import SnapKit + +class QuickSlotHeaderView: NSView { + + private var callback: (() -> Void)? + private var QuickSlotHeaderButton: NSButton! + private var QuickSlotHeaderLabel: NSTextField! + + init(image: NSImage, completion: @escaping () -> Void) { + super.init(frame: .zero) + + QuickSlotHeaderButton = NSButton(image: image, target: self, action: #selector(pin)) + QuickSlotHeaderButton.isBordered = false + QuickSlotHeaderButton.wantsLayer = true + QuickSlotHeaderButton.layer?.backgroundColor = NSColor.clear.cgColor + + self.addSubview(QuickSlotHeaderButton) + + QuickSlotHeaderLabel = NSTextField(labelWithString: "Quick Slot") + QuickSlotHeaderLabel.font = NSFont(name: "Inter", size: QuickSlotUI.size.font) + QuickSlotHeaderLabel.textColor = NSColor(hex: "#696969") + QuickSlotHeaderLabel.backgroundColor = NSColor.clear + QuickSlotHeaderLabel.isBordered = false + + self.addSubview(QuickSlotHeaderLabel) + + QuickSlotHeaderButton.snp.makeConstraints { make in + make.left.equalToSuperview() + make.top.equalToSuperview().offset(13) + } + + QuickSlotHeaderLabel.snp.makeConstraints { make in + make.left.equalTo(QuickSlotHeaderButton.snp.right).offset(4) + make.bottom.equalTo(QuickSlotHeaderButton.snp.bottom) + } + + self.callback = completion + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc func pin() { + callback?() + } +} diff --git a/Box42/FunctionButton/View/TopDivider.swift b/Box42/QuickSlot/View/TopDivider.swift similarity index 100% rename from Box42/FunctionButton/View/TopDivider.swift rename to Box42/QuickSlot/View/TopDivider.swift diff --git a/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift b/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift new file mode 100644 index 0000000..53c546e --- /dev/null +++ b/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift @@ -0,0 +1,29 @@ +// +// QuickSlotViewModel.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import AppKit + +// ViewModel +class QuickSlotViewModel { + var buttons: [QuickSlotButtonModel] = [ + // 초기 버튼 데이터 + ] + + func addButton(_ button: QuickSlotButtonModel) { + buttons.append(button) + } + + func removeButton(id: UUID) { + buttons.removeAll { $0.id == id } + } + + func updateButton(id: UUID, newTitle: String) { + if let index = buttons.firstIndex(where: { $0.id == id }) { + buttons[index].title = newTitle + } + } +} diff --git a/Box42/WebView/URL/URLModel.swift b/Box42/WebView/URL/URLModel.swift index 205a202..a7a0ff6 100644 --- a/Box42/WebView/URL/URLModel.swift +++ b/Box42/WebView/URL/URLModel.swift @@ -21,14 +21,49 @@ struct URLModel { } } +struct UserDataA: Codable { + var uuid: String + var nickname: String + var theme: Int + var icon: String + var urlList: [_URLModel] + var profileImage: String +} + +struct _URLModel: Codable { + var name: String + var url: String +} + struct URLModels { var info: [URLModel] - + let strData = """ + { + \"uuid\":\"8a8b9d71-3c10-4cbc-8b3a-ae1b5c215f40\", + \"nickname\":\"sechung\", + \"theme\":0, + \"icon\":\"fox\", + \"urlList\":[ + {\"name\":\"home\",\"url\":\"https://42box.kr/\"}, + {\"name\":\"23Coaltheme\",\"url\":\"https://42box.github.io/front-end/\"}, + {\"name\":\"loopback\",\"url\":\"http://127.0.0.1:3000/\"}, + {\"name\":\"Box42\",\"url\":\"https://42box.github.io/front-end/#/box\"}, + {\"name\":\"Intra 42\",\"url\":\"https://intra.42.fr\"}, + {\"name\":\"Jiphyeonjeon\",\"url\":\"https://42library.kr\"}, + {\"name\":\"42STAT\",\"url\":\"https://stat.42seoul.kr/home\"}, + {\"name\":\"24Hane\",\"url\":\"https://24hoursarenotenough.42seoul.kr\"}, + {\"name\":\"80kCoding\",\"url\":\"https://80000coding.oopy.io\"}, + {\"name\":\"where42\",\"url\":\"https://www.where42.kr\"}, + {\"name\":\"cabi\",\"url\":\"https://cabi.42seoul.io/\"}, + {\"name\":\"42gg\",\"url\":\"https://42gg.kr/\"} + ], + \"profileImage\":\"dummy-images.png\" + } + """ // Network logic api call 날려서 받아올 것. let URLstring: [nameUrl] = [ ("home", "https://42box.kr/"), ("23Coaltheme", "https://42box.github.io/front-end/"), - // ("home", "http://127.0.0.1:3000/"), ("Box 42", "https://42box.github.io/front-end/#/box"), ("Intra 42", "https://intra.42.fr"), ("Jiphyeonjeon", "https://42library.kr"), @@ -40,4 +75,33 @@ struct URLModels { ("42gg", "https://42gg.kr/"), ("textart", "https://textart.sh/"), ] + + +// let a = URLModel(name: "name", url: "url") +// var m = URLModels(info: [a]) +// var strData = m.strData +// var dicData : Dictionary = [String: String]() +// do { +// dicData = try JSONSerialization.jsonObject(with: Data(strData.utf8), options: []) as! Dictionary +// } catch { +// print(error.localizedDescription) +// } +// print(dicData["home"]) +// print(dicData) +// +// +// let jsonData = Data(strData.utf8) +// do { +// let userData = try JSONDecoder().decode(UserDataA.self, from: jsonData) +// for urlModel in userData.urlList { +// print(urlModel.name, urlModel.url) +// } +// +// +// if let homeURLModel = userData.urlList.first(where: { $0.name == "home" }) { +// print(homeURLModel.url) +// } +// } catch { +// print(error.localizedDescription) +// } } From f95ec59a3a6728b03dec4e0d230bf9f4c5138420 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Sun, 27 Aug 2023 06:02:29 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20collection=20view=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Box42.xcodeproj/project.pbxproj | 4 + Box42/Menubar/MenubarViewController.swift | 2 +- .../View/QuickSlotButtonGridView.swift | 90 +++++++++++++++++++ Box42/QuickSlot/View/QuickSlotGroupView.swift | 20 ++++- 4 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 Box42/QuickSlot/View/QuickSlotButtonGridView.swift diff --git a/Box42.xcodeproj/project.pbxproj b/Box42.xcodeproj/project.pbxproj index 7044783..8b1e6ae 100644 --- a/Box42.xcodeproj/project.pbxproj +++ b/Box42.xcodeproj/project.pbxproj @@ -74,6 +74,7 @@ DE97CA7F2A9A73A9001073DE /* QuickSlotUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */; }; DE97CA862A9A7404001073DE /* QuickSlotViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA6E2A9A6EFC001073DE /* QuickSlotViewModel.swift */; }; DE97CA872A9A7407001073DE /* QuickSlotButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA712A9A6F0D001073DE /* QuickSlotButtonModel.swift */; }; + DE97CA8A2A9A792F001073DE /* QuickSlotButtonGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA892A9A792F001073DE /* QuickSlotButtonGridView.swift */; }; DE98E83B2A98DB6000F8744A /* RotateImage+NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E83A2A98DB6000F8744A /* RotateImage+NSImage.swift */; }; DE98E8432A98DDFD00F8744A /* QuickSlotViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */; }; DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8542A98EA7900F8744A /* WindowButtonUI.swift */; }; @@ -156,6 +157,7 @@ DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotHeaderView.swift; sourceTree = ""; }; DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotGroupView.swift; sourceTree = ""; }; DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotUI.swift; sourceTree = ""; }; + DE97CA892A9A792F001073DE /* QuickSlotButtonGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonGridView.swift; sourceTree = ""; }; DE98E83A2A98DB6000F8744A /* RotateImage+NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RotateImage+NSImage.swift"; sourceTree = ""; }; DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotViewController.swift; sourceTree = ""; }; DE98E8542A98EA7900F8744A /* WindowButtonUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowButtonUI.swift; sourceTree = ""; }; @@ -406,6 +408,7 @@ children = ( DE44081C2A928F760091937A /* TopDivider.swift */, DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */, + DE97CA892A9A792F001073DE /* QuickSlotButtonGridView.swift */, DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */, ); path = View; @@ -619,6 +622,7 @@ DE018BB32A5099F900FF0AA3 /* AppDelegate.swift in Sources */, DE0A91632A8E6A5400D1D6F1 /* Constants.swift in Sources */, DE0A91902A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift in Sources */, + DE97CA8A2A9A792F001073DE /* QuickSlotButtonGridView.swift in Sources */, DE018BF32A509B3300FF0AA3 /* MenubarModel.swift in Sources */, DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */, DE24E63B2A8FE93900E29F5D /* NSImage.swift in Sources */, diff --git a/Box42/Menubar/MenubarViewController.swift b/Box42/Menubar/MenubarViewController.swift index e9b361c..c62e462 100644 --- a/Box42/Menubar/MenubarViewController.swift +++ b/Box42/Menubar/MenubarViewController.swift @@ -122,7 +122,7 @@ extension MenubarViewController: MenubarViewControllerDelegate { } window.level = .floating } - boxWindowController?.showWindow(sender) + boxWindowController?.showWindow(sender) } } } diff --git a/Box42/QuickSlot/View/QuickSlotButtonGridView.swift b/Box42/QuickSlot/View/QuickSlotButtonGridView.swift new file mode 100644 index 0000000..a429614 --- /dev/null +++ b/Box42/QuickSlot/View/QuickSlotButtonGridView.swift @@ -0,0 +1,90 @@ +// +// QuickSlotButtonGridView.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import Cocoa + +class QuickSlotButtonGridView: NSCollectionView, NSCollectionViewDelegate, NSCollectionViewDataSource { + + private var callback: (() -> Void)? + + init(frame frameRect: NSRect, completion: @escaping () -> Void) { + super.init(frame: frameRect) + self.callback = completion + self.frame = NSRect(x: 0, y: 0, width: 267, height: 134) + + let layout = NSCollectionViewFlowLayout() + let itemSize: CGFloat = 10 + layout.itemSize = NSSize(width: itemSize, height: itemSize) + layout.minimumInteritemSpacing = 10 + layout.minimumLineSpacing = 10 + layout.sectionInset = NSEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) + + self.collectionViewLayout = layout + self.delegate = self + self.dataSource = self + + self.register(MyCollectionViewItem.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyCollectionViewItem")) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { + return 4 + } + + func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { + let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyCollectionViewItem"), for: indexPath) + let customItem = item as? MyCollectionViewItem + + customItem?.view.wantsLayer = true + customItem?.button.title = "Button \(indexPath.item)" + customItem?.button.target = self + + if indexPath.item % 2 == 0 { + customItem?.view.layer?.backgroundColor = NSColor.red.cgColor + } else { + customItem?.view.layer?.backgroundColor = NSColor.blue.cgColor + } + + print(customItem) + return customItem ?? item + } +} + +class MyCollectionViewItem: NSCollectionViewItem { + var button = NSButton() + var uniqueID: String = UUID().uuidString + + override func awakeFromNib() { + super.awakeFromNib() + print("Unique ID: \(uniqueID)") + } + + override func loadView() { + self.view = NSView() + self.view.addSubview(button) + + self.view.frame = CGRect(x: 0, y: 0, width: 30, height: 30) + + button.snp.makeConstraints { make in + make.top.bottom.left.right.equalToSuperview() + } + } + + override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) { + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + print(nibName, nibBundle) + print("MyCollectionViewItem instance created.") + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + print("MyCollectionViewItem instance created.") + } +} diff --git a/Box42/QuickSlot/View/QuickSlotGroupView.swift b/Box42/QuickSlot/View/QuickSlotGroupView.swift index 35497a7..d476ec8 100644 --- a/Box42/QuickSlot/View/QuickSlotGroupView.swift +++ b/Box42/QuickSlot/View/QuickSlotGroupView.swift @@ -9,11 +9,14 @@ import AppKit import SnapKit class QuickSlotGroupView: NSView { - lazy var divider: NSBox = TopDivider(completion: { self.dividerAction?() }) - lazy var headerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { self.quickslotAction?() }) + lazy var divider: NSBox = TopDivider(completion: { [weak self] in self?.dividerAction?() }) + lazy var headerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { [weak self] in self?.quickslotAction?() }) + lazy var buttonGridView: QuickSlotButtonGridView = QuickSlotButtonGridView(frame: CGRect(x: 0, y: 0, width: 267, height: 134), completion: { [weak self] in self?.buttonAction?() }) + lazy var footerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { [weak self] in self?.quickslotAction?() }) var dividerAction: (() -> Void)? var quickslotAction: (() -> Void)? + var buttonAction: (() -> Void)? override init(frame: NSRect) { super.init(frame: frame) @@ -30,6 +33,9 @@ class QuickSlotGroupView: NSView { private func setupViews() { self.addSubview(divider) self.addSubview(headerView) + self.addSubview(buttonGridView) + self.addSubview(footerView) + } private func setupConstraints() { @@ -43,5 +49,15 @@ class QuickSlotGroupView: NSView { make.left.right.equalToSuperview() make.height.equalTo(QuickSlotUI.size.headerHeight) } + + buttonGridView.snp.makeConstraints { make in + make.top.equalTo(headerView.snp.bottom).offset(14) + make.left.right.equalToSuperview() + } + + footerView.snp.makeConstraints { make in + make.top.equalTo(buttonGridView.snp.bottom).offset(14) + make.left.right.bottom.equalToSuperview() + } } } From c7b0baebc1a02abb8db3c13b36f6b33598687cff Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 28 Aug 2023 03:28:26 +0900 Subject: [PATCH 4/9] =?UTF-8?q?refactor(const):=20=EC=83=81=EC=88=98?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20enum=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=ED=95=98=EC=98=80=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Box42.xcodeproj/project.pbxproj | 52 +++++++++-- Box42/BoxWindowController.swift | 6 +- .../Model/FunctionButtonUI.swift | 8 +- .../PreferencesViewController.swift | 1 - Box42/QuickSlot/Model/QuickSlotUI.swift | 14 +-- .../View/{TopDivider.swift => Divider.swift} | 4 +- .../View/QuickSlotButtonGridView.swift | 90 ------------------- Box42/Shared/Constants.swift | 6 +- Box42/Shared/NotifConst.swift | 16 ++++ Box42/WindowButton/Model/WindowButtonUI.swift | 8 +- 10 files changed, 82 insertions(+), 123 deletions(-) rename Box42/QuickSlot/View/{TopDivider.swift => Divider.swift} (90%) delete mode 100644 Box42/QuickSlot/View/QuickSlotButtonGridView.swift create mode 100644 Box42/Shared/NotifConst.swift diff --git a/Box42.xcodeproj/project.pbxproj b/Box42.xcodeproj/project.pbxproj index 8b1e6ae..6ef337a 100644 --- a/Box42.xcodeproj/project.pbxproj +++ b/Box42.xcodeproj/project.pbxproj @@ -60,10 +60,16 @@ DE4408082A9240300091937A /* BoxFunctionButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4408072A9240300091937A /* BoxFunctionButtonView.swift */; }; DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE44080B2A924B520091937A /* BoxFunctionViewGroup.swift */; }; DE4408152A92750D0091937A /* keyDown+BoxBaseContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4408142A92750D0091937A /* keyDown+BoxBaseContainerViewController.swift */; }; - DE44081D2A928F760091937A /* TopDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE44081C2A928F760091937A /* TopDivider.swift */; }; + DE44081D2A928F760091937A /* Divider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE44081C2A928F760091937A /* Divider.swift */; }; + DE62BE5A2A9BA31700D97E06 /* QuickSlotButtonCollectionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DE62BE582A9BA31700D97E06 /* QuickSlotButtonCollectionViewController.xib */; }; + DE62BE672A9BA92E00D97E06 /* QuickSlotButtonViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7F9D432A9B7A4700F8ACAE /* QuickSlotButtonViewItem.swift */; }; + DE6332E42A9BB8F800DCFAF6 /* QuickSlotButtonCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE62BE312A9B869900D97E06 /* QuickSlotButtonCollectionViewController.swift */; }; + DE6332E82A9BBEF800DCFAF6 /* NotifConst.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6332E72A9BBEF800DCFAF6 /* NotifConst.swift */; }; + DE6332F22A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */; }; DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA502A82580400713683 /* MenubarViewModel.swift */; }; DE77BA562A82637900713683 /* StateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE77BA552A82637900713683 /* StateManager.swift */; }; DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */; }; + DE7F9D462A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */; }; DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */; }; DE874F542A591F1400FC3B77 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F532A591F1400FC3B77 /* PreferencesView.swift */; }; DE874F572A591F2500FC3B77 /* Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE874F562A591F2500FC3B77 /* Icon.swift */; }; @@ -74,7 +80,6 @@ DE97CA7F2A9A73A9001073DE /* QuickSlotUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */; }; DE97CA862A9A7404001073DE /* QuickSlotViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA6E2A9A6EFC001073DE /* QuickSlotViewModel.swift */; }; DE97CA872A9A7407001073DE /* QuickSlotButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA712A9A6F0D001073DE /* QuickSlotButtonModel.swift */; }; - DE97CA8A2A9A792F001073DE /* QuickSlotButtonGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE97CA892A9A792F001073DE /* QuickSlotButtonGridView.swift */; }; DE98E83B2A98DB6000F8744A /* RotateImage+NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E83A2A98DB6000F8744A /* RotateImage+NSImage.swift */; }; DE98E8432A98DDFD00F8744A /* QuickSlotViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */; }; DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE98E8542A98EA7900F8744A /* WindowButtonUI.swift */; }; @@ -143,10 +148,16 @@ DE4408072A9240300091937A /* BoxFunctionButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxFunctionButtonView.swift; sourceTree = ""; }; DE44080B2A924B520091937A /* BoxFunctionViewGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxFunctionViewGroup.swift; sourceTree = ""; }; DE4408142A92750D0091937A /* keyDown+BoxBaseContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "keyDown+BoxBaseContainerViewController.swift"; path = "Main/keyDown+BoxBaseContainerViewController.swift"; sourceTree = ""; }; - DE44081C2A928F760091937A /* TopDivider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopDivider.swift; sourceTree = ""; }; + DE44081C2A928F760091937A /* Divider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Divider.swift; sourceTree = ""; }; + DE62BE312A9B869900D97E06 /* QuickSlotButtonCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonCollectionViewController.swift; sourceTree = ""; }; + DE62BE582A9BA31700D97E06 /* QuickSlotButtonCollectionViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QuickSlotButtonCollectionViewController.xib; sourceTree = ""; }; + DE6332E72A9BBEF800DCFAF6 /* NotifConst.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotifConst.swift; sourceTree = ""; }; + DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotScriptsLogicController.swift; sourceTree = ""; }; DE77BA502A82580400713683 /* MenubarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarViewModel.swift; sourceTree = ""; }; DE77BA552A82637900713683 /* StateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateManager.swift; sourceTree = ""; }; DE7A25792A6D8CA20043225A /* PreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = ""; }; + DE7F9D432A9B7A4700F8ACAE /* QuickSlotButtonViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonViewItem.swift; sourceTree = ""; }; + DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QuickSlotButtonViewItem.xib; sourceTree = ""; }; DE874F4D2A591DEA00FC3B77 /* Hotkey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hotkey.swift; sourceTree = ""; }; DE874F532A591F1400FC3B77 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; }; DE874F562A591F2500FC3B77 /* Icon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Icon.swift; sourceTree = ""; }; @@ -157,7 +168,6 @@ DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotHeaderView.swift; sourceTree = ""; }; DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotGroupView.swift; sourceTree = ""; }; DE97CA7E2A9A73A9001073DE /* QuickSlotUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotUI.swift; sourceTree = ""; }; - DE97CA892A9A792F001073DE /* QuickSlotButtonGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotButtonGridView.swift; sourceTree = ""; }; DE98E83A2A98DB6000F8744A /* RotateImage+NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RotateImage+NSImage.swift"; sourceTree = ""; }; DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSlotViewController.swift; sourceTree = ""; }; DE98E8542A98EA7900F8744A /* WindowButtonUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowButtonUI.swift; sourceTree = ""; }; @@ -370,16 +380,36 @@ path = View; sourceTree = ""; }; + DE62BE632A9BA8CC00D97E06 /* ButtonCollectionView */ = { + isa = PBXGroup; + children = ( + DE62BE312A9B869900D97E06 /* QuickSlotButtonCollectionViewController.swift */, + DE62BE582A9BA31700D97E06 /* QuickSlotButtonCollectionViewController.xib */, + DE7F9D482A9B7A4E00F8ACAE /* Vertical Item */, + ); + path = ButtonCollectionView; + sourceTree = ""; + }; DE77BA542A82636500713683 /* Shared */ = { isa = PBXGroup; children = ( DE1F1A282A8B50E200A88DD8 /* BoxSizeManager.swift */, DE77BA552A82637900713683 /* StateManager.swift */, DE0A91622A8E6A5400D1D6F1 /* Constants.swift */, + DE6332E72A9BBEF800DCFAF6 /* NotifConst.swift */, ); path = Shared; sourceTree = ""; }; + DE7F9D482A9B7A4E00F8ACAE /* Vertical Item */ = { + isa = PBXGroup; + children = ( + DE7F9D432A9B7A4700F8ACAE /* QuickSlotButtonViewItem.swift */, + DE7F9D442A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib */, + ); + path = "Vertical Item"; + sourceTree = ""; + }; DE874F512A591EC600FC3B77 /* Preferences */ = { isa = PBXGroup; children = ( @@ -406,10 +436,10 @@ DE98E8412A98DDEB00F8744A /* View */ = { isa = PBXGroup; children = ( - DE44081C2A928F760091937A /* TopDivider.swift */, + DE44081C2A928F760091937A /* Divider.swift */, DE97CA782A9A6F6A001073DE /* QuickSlotHeaderView.swift */, - DE97CA892A9A792F001073DE /* QuickSlotButtonGridView.swift */, DE97CA7B2A9A7199001073DE /* QuickSlotGroupView.swift */, + DE62BE632A9BA8CC00D97E06 /* ButtonCollectionView */, ); path = View; sourceTree = ""; @@ -484,6 +514,7 @@ isa = PBXGroup; children = ( DE98E8422A98DDFD00F8744A /* QuickSlotViewController.swift */, + DE6332F12A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift */, ); path = Controller; sourceTree = ""; @@ -578,7 +609,9 @@ DE1F1A152A8B506600A88DD8 /* exportMacOSInfo.sh in Resources */, DE1F1A162A8B506600A88DD8 /* keyMapping.sh in Resources */, DEB862D42A85124500278FCD /* cleanCache.sh in Resources */, + DE7F9D462A9B7A4700F8ACAE /* QuickSlotButtonViewItem.xib in Resources */, DEB862D92A852C4500278FCD /* brewInGoinfre.sh in Resources */, + DE62BE5A2A9BA31700D97E06 /* QuickSlotButtonCollectionViewController.xib in Resources */, DE018BE02A509B0600FF0AA3 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -594,6 +627,7 @@ DE0A91A72A8FC66600D1D6F1 /* SideBarLeading.swift in Sources */, DE0A917B2A8F0CA800D1D6F1 /* AppleScripts+ShowMessage.swift in Sources */, DE018BB82A5099F900FF0AA3 /* Box42.xcdatamodeld in Sources */, + DE62BE672A9BA92E00D97E06 /* QuickSlotButtonViewItem.swift in Sources */, DE874F542A591F1400FC3B77 /* PreferencesView.swift in Sources */, DE98E83B2A98DB6000F8744A /* RotateImage+NSImage.swift in Sources */, DE0A91982A8F977F00D1D6F1 /* ToolbarViewController.swift in Sources */, @@ -609,8 +643,10 @@ DE98E8552A98EA7900F8744A /* WindowButtonUI.swift in Sources */, DE4407FA2A923E860091937A /* BoxFunctionViewController.swift in Sources */, DE4407FE2A923EA90091937A /* PreferenceButtonView.swift in Sources */, + DE6332E82A9BBEF800DCFAF6 /* NotifConst.swift in Sources */, DEF749322A85657600D987C8 /* NSScreen.swift in Sources */, DE018BF02A509B2F00FF0AA3 /* MenubarViewController.swift in Sources */, + DE6332E42A9BB8F800DCFAF6 /* QuickSlotButtonCollectionViewController.swift in Sources */, DE77BA512A82580400713683 /* MenubarViewModel.swift in Sources */, DE44080C2A924B520091937A /* BoxFunctionViewGroup.swift in Sources */, DE97CA7C2A9A7199001073DE /* QuickSlotGroupView.swift in Sources */, @@ -619,10 +655,10 @@ DE0A91862A8F889F00D1D6F1 /* RefreshPageViaToolbar.swift in Sources */, DE874F4E2A591DEA00FC3B77 /* Hotkey.swift in Sources */, DE0A91832A8F889000D1D6F1 /* GoHomePageViaToolbar().swift in Sources */, + DE6332F22A9BCA2C00DCFAF6 /* QuickSlotScriptsLogicController.swift in Sources */, DE018BB32A5099F900FF0AA3 /* AppDelegate.swift in Sources */, DE0A91632A8E6A5400D1D6F1 /* Constants.swift in Sources */, DE0A91902A8F88CA00D1D6F1 /* DisplayURLInToolbar.swift in Sources */, - DE97CA8A2A9A792F001073DE /* QuickSlotButtonGridView.swift in Sources */, DE018BF32A509B3300FF0AA3 /* MenubarModel.swift in Sources */, DE7A257A2A6D8CA20043225A /* PreferencesViewController.swift in Sources */, DE24E63B2A8FE93900E29F5D /* NSImage.swift in Sources */, @@ -651,7 +687,7 @@ DE1F1A362A8BDDDF00A88DD8 /* StorageConfig.swift in Sources */, DE2AD3292A824EEB00002D51 /* Accessibility.swift in Sources */, DE24E6382A8FE10400E29F5D /* BoxBaseSplitView.swift in Sources */, - DE44081D2A928F760091937A /* TopDivider.swift in Sources */, + DE44081D2A928F760091937A /* Divider.swift in Sources */, DE98E8432A98DDFD00F8744A /* QuickSlotViewController.swift in Sources */, DE874F572A591F2500FC3B77 /* Icon.swift in Sources */, DE1F1A2E2A8BCC9800A88DD8 /* Storage.swift in Sources */, diff --git a/Box42/BoxWindowController.swift b/Box42/BoxWindowController.swift index fe74981..8acc892 100644 --- a/Box42/BoxWindowController.swift +++ b/Box42/BoxWindowController.swift @@ -18,16 +18,12 @@ class BoxWindowController: NSWindowController, NSWindowDelegate { windowInstance.title = "Box" windowInstance.titlebarAppearsTransparent = true windowInstance.titleVisibility = .hidden - windowInstance.isReleasedWhenClosed = false windowInstance.isMovableByWindowBackground = true + windowInstance.isReleasedWhenClosed = false windowInstance.standardWindowButton(.closeButton)?.isHidden = true windowInstance.standardWindowButton(.miniaturizeButton)?.isHidden = true windowInstance.standardWindowButton(.zoomButton)?.isHidden = true - if let zoomButton = windowInstance.standardWindowButton(.zoomButton) { - zoomButton.isHidden = true - } - let boxViewController = BoxBaseContainerViewController(nibName: nil, bundle: nil) windowInstance.contentViewController = boxViewController } diff --git a/Box42/FunctionButton/Model/FunctionButtonUI.swift b/Box42/FunctionButton/Model/FunctionButtonUI.swift index e5c9522..096fa6b 100644 --- a/Box42/FunctionButton/Model/FunctionButtonUI.swift +++ b/Box42/FunctionButton/Model/FunctionButtonUI.swift @@ -7,17 +7,17 @@ import AppKit -struct FunctionButtonUI { - struct size { +enum FunctionButtonUI { + enum size { static let font: CGFloat = 14 static let pinWidth: CGFloat = 89 static let pinHeight: CGFloat = 27 } - struct animation { + enum animation { } - struct color { + enum color { static let pinText = NSColor(hex: "#696969") } } diff --git a/Box42/Preferences/PreferencesViewController.swift b/Box42/Preferences/PreferencesViewController.swift index 6604203..5a6c36d 100644 --- a/Box42/Preferences/PreferencesViewController.swift +++ b/Box42/Preferences/PreferencesViewController.swift @@ -141,7 +141,6 @@ class PreferencesViewController: NSViewController { print("Error: \(error)") } } - } } diff --git a/Box42/QuickSlot/Model/QuickSlotUI.swift b/Box42/QuickSlot/Model/QuickSlotUI.swift index cefdbbf..c61c2cf 100644 --- a/Box42/QuickSlot/Model/QuickSlotUI.swift +++ b/Box42/QuickSlot/Model/QuickSlotUI.swift @@ -7,16 +7,18 @@ import AppKit -struct QuickSlotUI { - struct size { +enum QuickSlotUI { + enum size { static let font: CGFloat = CGFloat(16).pointsToPixels() - static let headerHeight: CGFloat = 22 + 13 + static let headerHeight: CGFloat = 35 + static let button: CGFloat = 59 + static let lineSpacing: CGFloat = 12 } - struct animation { + enum animation { } - struct color { - static let pinText = NSColor(hex: "#696969") + enum color { +// static let pinText = NSColor(hex: "#696969") } } diff --git a/Box42/QuickSlot/View/TopDivider.swift b/Box42/QuickSlot/View/Divider.swift similarity index 90% rename from Box42/QuickSlot/View/TopDivider.swift rename to Box42/QuickSlot/View/Divider.swift index 81a39de..a3dfdb0 100644 --- a/Box42/QuickSlot/View/TopDivider.swift +++ b/Box42/QuickSlot/View/Divider.swift @@ -1,5 +1,5 @@ // -// TopDivider.swift +// Divider.swift // Box42 // // Created by Chanhee Kim on 8/21/23. @@ -7,7 +7,7 @@ import AppKit -class TopDivider: NSBox { +class Divider: NSBox { private var callback: (() -> Void)? diff --git a/Box42/QuickSlot/View/QuickSlotButtonGridView.swift b/Box42/QuickSlot/View/QuickSlotButtonGridView.swift deleted file mode 100644 index a429614..0000000 --- a/Box42/QuickSlot/View/QuickSlotButtonGridView.swift +++ /dev/null @@ -1,90 +0,0 @@ -// -// QuickSlotButtonGridView.swift -// Box42 -// -// Created by Chanhee Kim on 8/27/23. -// - -import Cocoa - -class QuickSlotButtonGridView: NSCollectionView, NSCollectionViewDelegate, NSCollectionViewDataSource { - - private var callback: (() -> Void)? - - init(frame frameRect: NSRect, completion: @escaping () -> Void) { - super.init(frame: frameRect) - self.callback = completion - self.frame = NSRect(x: 0, y: 0, width: 267, height: 134) - - let layout = NSCollectionViewFlowLayout() - let itemSize: CGFloat = 10 - layout.itemSize = NSSize(width: itemSize, height: itemSize) - layout.minimumInteritemSpacing = 10 - layout.minimumLineSpacing = 10 - layout.sectionInset = NSEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) - - self.collectionViewLayout = layout - self.delegate = self - self.dataSource = self - - self.register(MyCollectionViewItem.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyCollectionViewItem")) - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { - return 4 - } - - func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { - let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MyCollectionViewItem"), for: indexPath) - let customItem = item as? MyCollectionViewItem - - customItem?.view.wantsLayer = true - customItem?.button.title = "Button \(indexPath.item)" - customItem?.button.target = self - - if indexPath.item % 2 == 0 { - customItem?.view.layer?.backgroundColor = NSColor.red.cgColor - } else { - customItem?.view.layer?.backgroundColor = NSColor.blue.cgColor - } - - print(customItem) - return customItem ?? item - } -} - -class MyCollectionViewItem: NSCollectionViewItem { - var button = NSButton() - var uniqueID: String = UUID().uuidString - - override func awakeFromNib() { - super.awakeFromNib() - print("Unique ID: \(uniqueID)") - } - - override func loadView() { - self.view = NSView() - self.view.addSubview(button) - - self.view.frame = CGRect(x: 0, y: 0, width: 30, height: 30) - - button.snp.makeConstraints { make in - make.top.bottom.left.right.equalToSuperview() - } - } - - override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) { - super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) - print(nibName, nibBundle) - print("MyCollectionViewItem instance created.") - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - print("MyCollectionViewItem instance created.") - } -} diff --git a/Box42/Shared/Constants.swift b/Box42/Shared/Constants.swift index 5e6347d..e0af4fc 100644 --- a/Box42/Shared/Constants.swift +++ b/Box42/Shared/Constants.swift @@ -5,14 +5,14 @@ // Created by Chanhee Kim on 8/17/23. // -struct Constants { - struct url { +enum Constants { + enum url { static let initialName = "home" // static let initialPage = "https://42box.kr" static let initialPage = "https://profile.intra.42.fr/" } - struct UI { + enum UI { static let groupAutolayout = 16 static let topWindow = 64 - 16 static let leadingWindow = 14 diff --git a/Box42/Shared/NotifConst.swift b/Box42/Shared/NotifConst.swift new file mode 100644 index 0000000..fb42e6a --- /dev/null +++ b/Box42/Shared/NotifConst.swift @@ -0,0 +1,16 @@ +// +// ConstantsNotificationCenter.swift +// Box42 +// +// Created by Chanhee Kim on 8/28/23. +// + +enum NotifConst { // NotificationCenter Constants + enum object { + static let collectionButtonTapped = "collectionButtonTapped" + } + + enum userInfo { + + } +} diff --git a/Box42/WindowButton/Model/WindowButtonUI.swift b/Box42/WindowButton/Model/WindowButtonUI.swift index a9e3bdc..66252be 100644 --- a/Box42/WindowButton/Model/WindowButtonUI.swift +++ b/Box42/WindowButton/Model/WindowButtonUI.swift @@ -7,18 +7,18 @@ import AppKit -struct WindowButtonUI { - struct size { +enum WindowButtonUI { + enum size { static let diameter = 15 static let cornerRadius = CGFloat(diameter / 2) static let offset = 8 } - struct animation { + enum animation { static let duration = TimeInterval(0.2) } - struct color { + enum color { static let maximize = NSColor(hex: "#76DF7A").cgColor static let minimize = NSColor(hex: "#FFCE51").cgColor static let close = NSColor(hex: "#F36161").cgColor From 3206686cd14f24b3cbe44cd5d7cd62c75a139fdf Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 28 Aug 2023 03:29:14 +0900 Subject: [PATCH 5/9] =?UTF-8?q?style:=20=F0=9F=A6=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Box42/Menubar/MenubarViewModel.swift | 1 + .../42pack_icon/sitting_fox/Contents.json | 6 +++++ .../sitting_fox0.imageset/Contents.json | 21 ++++++++++++++++++ .../sitting_fox0.imageset/sitting_fox0.png | Bin 0 -> 3816 bytes .../sitting_fox1.imageset/Contents.json | 21 ++++++++++++++++++ .../sitting_fox1.imageset/sitting_fox1.png | Bin 0 -> 3673 bytes .../sitting_fox2.imageset/Contents.json | 21 ++++++++++++++++++ .../sitting_fox2.imageset/sitting_fox2.png | Bin 0 -> 3765 bytes .../sitting_fox3.imageset/Contents.json | 21 ++++++++++++++++++ .../sitting_fox3.imageset/sitting_fox3.png | Bin 0 -> 3673 bytes 10 files changed, 91 insertions(+) create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/sitting_fox0.png create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/Contents.json create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox1.imageset/sitting_fox1.png create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/sitting_fox2.png create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/Contents.json create mode 100644 Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox3.imageset/sitting_fox3.png diff --git a/Box42/Menubar/MenubarViewModel.swift b/Box42/Menubar/MenubarViewModel.swift index b1daf88..9946f07 100644 --- a/Box42/Menubar/MenubarViewModel.swift +++ b/Box42/Menubar/MenubarViewModel.swift @@ -32,6 +32,7 @@ class StatusBarViewModel { case "lee": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "lee_\(i)"))} case "box": for i in (1...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_\(i)"))} case "fox": for i in (1...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "fox_page\(i)"))} + case "sitting_fox": for i in (0...3) {statusBar.frames.append(NSImage(imageLiteralResourceName: "sitting_fox\(i)"))} case "box_oc": for i in (1...2) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_oc\(i)"))} default : for i in (1...11) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42flip_0\(i)"))} } diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json new file mode 100644 index 0000000..44e39c0 --- /dev/null +++ b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sitting_fox0.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/sitting_fox0.png b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox0.imageset/sitting_fox0.png new file mode 100644 index 0000000000000000000000000000000000000000..61410e0272cc73b2503e760d0a37ef62831d9dc8 GIT binary patch literal 3816 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600Z<%L_t(oh27X&h}2~m$MMg* zr!tc;gXln%bg;0ZuA&R+rXW!yq3|lgpscH)6G0Fm1riZfU}a?nEiv5^WXo@?9T4a!q5+fng9EL56|~KJkRq^iU|K#rDkv`rTI7> z5kHUFIHi8vi&^+2BKA&;m6OycxRlajtj0NbHzJ;B**K*e@k8`WE-#0CX$d`PhruMbQ^{AR>OL)Vm%Z;fkW@S1gQ( zohhZBh^S4g(zrIfmL<>uf!%)>Bh=$8T4 zVh|7GnMz+ru>@PX0gUEw=V1$ODvE08DSrQse{hNHaLTITO}rctyQa(FiKrP|!uwb@ z$v&UO>-Z}oPE5_bsi_%Uuj~OIZKHi4Ret}5{rE%P!uw8xA#8-tK9RaMuJ&(tYUZJ{%`D>3t4TN&|8xawV?8Tp4s87U1j- z7~e{#<*?BsZ~wYyZsn!lj)?oKg)QMY6ZbBa4?5XfF2Ls|=XlytO=D~JV`fo4R!rT8 zYpWSiJ8<=m`s7(#iua~u{@6NzHP|Ds+Pc!aR$loiZmH(9W5SK7*vMY)!iI_4+_u(5 z#PVXy+wiH;Njf7ze~O5!s}&{!*CU^~Wpc>qREAR44lIv|ZN+5Xj*m4wbgMJBDI%7P zvU!4VvoRlw1by9ZoCp5fZJ>lLI5qpa92IOEqcO27(@N`71s=jC& zZdAiOvmH@6%}Oct;bQq_GS;=LzAd-ok$PS_!p1JSG@nsQ=?2_^7g|&adBuCNOFpA7 zHtlOV;i{|KP9mIAS}FglR*j>>a_ZGzyc?8n{jDaUyH+lx^pt!_F6XyZ_kT+Eplc%H z%Q5@w7PyqsOnfFM33Uz2ac{eP=i4e@jSfV_(71he3ml}BuEK?~2RtTcDTn2o!l{Y= e7ur>Doz{QBJhs#^hiQHQ0000f6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600U)7L_t(oh3(i)Xk1ko#_``t z()a;d+6q!Fq9RyI#Sd_!(4}HYkQS7#R1~zjwdztt5L}h&My(4K)QuGsEuvthy3r~K zw)oY6wlRLRQjIN1Y%;Hlb0@vMxk)FJnUY8!xMc3hIp;qAdCz;^b09&cP`y!#%hN??uGHuDEPdGvHE6gV=!!@mfSYKI`C=uE*EK?Mo5yP)ey6jaURr zq7H5|b``fru{9!g%@~+c54PdiqUlrIjo)Fh!mY$XtSFj3#Dfv>bEV&Pcn4P%O^2~D zBKD`0dLp9HRp%{eHn=aHG7T?aM?`#A^jU|UxTVzR4-7=azLZj0tdU!V&#)F#XkeKP zxD&&81W#7xI*vQBXEA_L54Rk9aAVQbKu_`cH~fRkzer(6XmA;ectF$$N%8+IKi}A|eF&SP0Gt{bSw4X~aFcw}FRS^G{tlY2 zQxw;Ha{7C0iimH^jdi8qO5BHyGGuT2J{P2^;@OSjDns|0nFjlDdqj*h8*1O@Af?nV zC-XIOf?r)sx)vL7eg{E1rOz=K5l5HND(IoAhpvz+5~WoHy$$p!uWh}fG_S{)I;PJ5mw+zPD6pnMGD)Y($$zOOJ; z_XSMI1$bQE1)F0=@NPu>P5j7iiwCgS?jsoGitF+JECsA+_nw3 r6x3C?YIM)`&kyG!w^VfwZmH@&e9C*&3(olA00000NkvXXu0mjfEj9Gi literal 0 HcmV?d00001 diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json new file mode 100644 index 0000000..dd0f044 --- /dev/null +++ b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "sitting_fox2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/sitting_fox2.png b/Box42/Resources/Assets.xcassets/42pack_icon/sitting_fox/sitting_fox2.imageset/sitting_fox2.png new file mode 100644 index 0000000000000000000000000000000000000000..050be9b79d32377a2957abfa9f1a4277602f9a6b GIT binary patch literal 3765 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600Y5EL_t(oh3(f{h*nh;2k_sX z87I4%+Djx+(Z$S&q8=*nO(Ii5q3|g}u*|p83WDfr5IvOj(8Zt|-7JeBA|g^M3A#W~ zL6}jRSn61LDMy=`)x$ocr|*6~9l`JqhwnT4tiAU7@3q(3Yo&KTUZ07Gn^Q`?7>SBUBBhiH zdq!Hw^tAe3C*OeFJgh2S2e2q2R@F^RsRv8(a53}=uE!SWl-#JnDWy|z8TyOoBpie7 zSc_jHVmPJL8xh0ZlADC}m{<&bfSV#>Lyg>pcn4<|L%(2FM0{I$hf_Kk_hJDCkkWxyWY+f^RUzUu9r?5OCzAt2^VFj)z$!x{!i1?z@#Y=0B$6dI)jp#Z# z#y{_t++=);sTjrx#>oU%U=tSOo*G@daV=I?jkjXmNmz*6Fd4l~M8Cnzh}hCrX9IE* zuo@Q^LnHDLf#0wTr^yMYj1fGG$0Opqb_>@Tk`u~!T#Bc0eiP9VEQyH6+UjgTF5wl- zuWDd{`wHX!h={?elT%84cpI}@h`kpP*R<8ufLyPf0he@OOUS`r{=XR;u}wb0Kg$_( z06S&R@5T=N84>@KV>G37JYK@w7VG{H5$9GSS9q--kK&dZ*&*~bAy+0@#y&awm4EjX z?ZMC_Rd4*G_Hlt(o^aLCAOOGPxLd(}9H629ck+bJuPn~mq?JEj)3#_yF&qp`p` zv`QAca8*Qn)=p9FvAh#k;}W^jFJriP`m0)75v}5R5D!MgvQ88=x(d#~jhH2qY*r~8 zZv2j=5%FB76B_n&kW%WGGuGKS4`<0lr(%X&O&l)l#DYfMNh>rZ$Nqb7ihKc+v*irD zue-$4EuM^s#Z@PDLT)sX^vSU>4=;CPVHemSw?Zo;;_u4cMyIl+>SZoo?ZVJbu}5xB zSIa%zR}rzd8%0&f^~fD6EPignFTkZkMVa!#bP0om(8!LxO|#P&0H*?nuCxlB@OZSb3=F`bRx? fgyJZf6 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600U)7L_t(oh3(i)Xk1ko#_``t z()a;d+6q!Fq9RyI#Sd_!(4}HYkQS7#R1~zjwdztt5L}h&My(4K)QuGsEuvthy3r~K zw)oY6wlRLRQjIN1Y%;Hlb0@vMxk)FJnUY8!xMc3hIp;qAdCz;^b09&cP`y!#%hN??uGHuDEPdGvHE6gV=!!@mfSYKI`C=uE*EK?Mo5yP)ey6jaURr zq7H5|b``fru{9!g%@~+c54PdiqUlrIjo)Fh!mY$XtSFj3#Dfv>bEV&Pcn4P%O^2~D zBKD`0dLp9HRp%{eHn=aHG7T?aM?`#A^jU|UxTVzR4-7=azLZj0tdU!V&#)F#XkeKP zxD&&81W#7xI*vQBXEA_L54Rk9aAVQbKu_`cH~fRkzer(6XmA;ectF$$N%8+IKi}A|eF&SP0Gt{bSw4X~aFcw}FRS^G{tlY2 zQxw;Ha{7C0iimH^jdi8qO5BHyGGuT2J{P2^;@OSjDns|0nFjlDdqj*h8*1O@Af?nV zC-XIOf?r)sx)vL7eg{E1rOz=K5l5HND(IoAhpvz+5~WoHy$$p!uWh}fG_S{)I;PJ5mw+zPD6pnMGD)Y($$zOOJ; z_XSMI1$bQE1)F0=@NPu>P5j7iiwCgS?jsoGitF+JECsA+_nw3 r6x3C?YIM)`&kyG!w^VfwZmH@&e9C*&3(olA00000NkvXXu0mjfEj9Gi literal 0 HcmV?d00001 From 9cb68a38065ace1c1330e708a20d19fd870786db Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 28 Aug 2023 03:30:22 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat(collectionView):=20xib=EB=A1=9C=20coll?= =?UTF-8?q?ection=20view=EB=A5=BC=20=EC=A7=84=ED=96=89=ED=95=A9=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ckSlotButtonCollectionViewController.swift | 110 ++++++++++++++++++ ...uickSlotButtonCollectionViewController.xib | 57 +++++++++ .../QuickSlotButtonViewItem.swift | 14 +++ .../Vertical Item/QuickSlotButtonViewItem.xib | 23 ++++ 4 files changed, 204 insertions(+) create mode 100644 Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.swift create mode 100644 Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.xib create mode 100644 Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.swift create mode 100644 Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.xib diff --git a/Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.swift b/Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.swift new file mode 100644 index 0000000..edfaf7f --- /dev/null +++ b/Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.swift @@ -0,0 +1,110 @@ +// +// QuickSlotButtonCollectionViewController.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import Cocoa +import Combine + +class QuickSlotButtonCollectionViewController: NSViewController { + @IBOutlet weak var quickSlotButtonCollectionView: NSCollectionView! + var viewModel: QuickSlotViewModel = QuickSlotViewModel() + var cancellables: Set = [] + + override func viewDidLoad() { + super.viewDidLoad() + initializeCombine() + + quickSlotButtonCollectionView.delegate = self + quickSlotButtonCollectionView.dataSource = self + + quickSlotButtonCollectionView.register(NSNib(nibNamed: NSNib.Name("QuickSlotButtonViewItem"), bundle: nil), forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "QuickSlotButtonViewItem")) + + initializeView() + } + + override func viewDidLayout() { + super.viewDidLayout() + constraintsView() + } + + override func awakeFromNib() { + super.awakeFromNib() + } + + init() { + super.init(nibName: "QuickSlotButtonCollectionViewController", bundle: nil) + } + + func initializeCombine() { + viewModel.$buttons + .sink { [weak self] _ in + self?.quickSlotButtonCollectionView.reloadData() + } + .store(in: &cancellables) + } + + func initializeView() { + // MARK: - Setup FlowLayout View + let flowLayout: NSCollectionViewFlowLayout = NSCollectionViewFlowLayout() + flowLayout.itemSize = CGSize(width: QuickSlotUI.size.button, height: QuickSlotUI.size.button) + flowLayout.scrollDirection = .horizontal + flowLayout.minimumLineSpacing = QuickSlotUI.size.lineSpacing + flowLayout.sectionInset = NSEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) + quickSlotButtonCollectionView.collectionViewLayout = flowLayout + + // MARK: - Setup Collection View + quickSlotButtonCollectionView.wantsLayer = true + quickSlotButtonCollectionView.layer?.borderWidth = 0 + quickSlotButtonCollectionView.layer?.borderColor = NSColor.clear.cgColor + quickSlotButtonCollectionView.backgroundColors = [NSColor.clear] + + if let scrollView = quickSlotButtonCollectionView.enclosingScrollView { +// scrollView.hasVerticalScroller = false +// scrollView.hasHorizontalScroller = false + scrollView.backgroundColor = NSColor.clear + scrollView.drawsBackground = false + } + } + + func constraintsView() { + quickSlotButtonCollectionView.frame = self.view.bounds + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } +} + +extension QuickSlotButtonCollectionViewController: NSCollectionViewDelegate, NSCollectionViewDataSource { + + func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { + return viewModel.buttons.count + } + + func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { + let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "QuickSlotButtonViewItem"), for: indexPath) + + if let customItem = item as? QuickSlotButtonViewItem { + let buttonModel = viewModel.buttons[indexPath.item] + let btn = NSButton() +// btn.title = "\(indexPath)" + btn.title = buttonModel.title + btn.action = #selector(collectionButtonTapped) + btn.target = self + btn.wantsLayer = true + btn.layer?.backgroundColor = NSColor.red.cgColor + customItem.view.addSubview(btn) + btn.frame = CGRect(x: 0, y: 0, width: QuickSlotUI.size.button, height: QuickSlotUI.size.button) + } + return item + } +} + +extension QuickSlotButtonCollectionViewController { + @objc func collectionButtonTapped(_ sender: NSButton) { + NotificationCenter.default.post(name: NSNotification.Name(NotifConst.object.collectionButtonTapped), object: sender) + } +} diff --git a/Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.xib b/Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.xib new file mode 100644 index 0000000..0fda14b --- /dev/null +++ b/Box42/QuickSlot/View/ButtonCollectionView/QuickSlotButtonCollectionViewController.xib @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.swift b/Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.swift new file mode 100644 index 0000000..b3cc217 --- /dev/null +++ b/Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.swift @@ -0,0 +1,14 @@ +// +// QuickSlotButtonViewItem.swift +// Box42 +// +// Created by Chanhee Kim on 8/27/23. +// + +import Cocoa + +class QuickSlotButtonViewItem: NSCollectionViewItem { + override func viewDidLoad() { + super.viewDidLoad() + } +} diff --git a/Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.xib b/Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.xib new file mode 100644 index 0000000..346e9c3 --- /dev/null +++ b/Box42/QuickSlot/View/ButtonCollectionView/Vertical Item/QuickSlotButtonViewItem.xib @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + From 172d06f42d8d5b1a07b6120abdad1f9500e82f16 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 28 Aug 2023 03:31:51 +0900 Subject: [PATCH 7/9] =?UTF-8?q?feat:=20NotificationCenter=EB=A1=9C=20Quick?= =?UTF-8?q?Slot=EC=9D=98=20Button=20Action=EC=9D=84=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QuickSlotScriptsLogicController.swift | 57 +++++ .../Controller/QuickSlotViewController.swift | 30 +-- Box42/Resources/AppDelegate.swift | 238 +++++++++--------- 3 files changed, 188 insertions(+), 137 deletions(-) create mode 100644 Box42/QuickSlot/Controller/QuickSlotScriptsLogicController.swift diff --git a/Box42/QuickSlot/Controller/QuickSlotScriptsLogicController.swift b/Box42/QuickSlot/Controller/QuickSlotScriptsLogicController.swift new file mode 100644 index 0000000..1038e76 --- /dev/null +++ b/Box42/QuickSlot/Controller/QuickSlotScriptsLogicController.swift @@ -0,0 +1,57 @@ +// +// QuickSlotScriptsLogicController.swift +// Box42 +// +// Created by Chanhee Kim on 8/28/23. +// + +import AppKit + +class ScriptsLogicController { + + static let shared = ScriptsLogicController() + + private init() { + NotificationCenter.default.addObserver(self, selector: #selector(handleButtonTapped), name: NSNotification.Name(NotifConst.object.collectionButtonTapped), object: nil) + } + + @objc func handleButtonTapped(notification: NSNotification) { + if let button = notification.object as? NSButton { + let buttonTitle = button.title // 메인 스레드에서 타이틀을 캡쳐 + print("Button with title \(buttonTitle) was tapped") + + DispatchQueue.global(qos: .background).async { [weak self] in + if buttonTitle == "clean" { + self?.executeCleanScript() + } + } + } + } + + private func executeCleanScript() { + if let scriptPath = Bundle.main.path(forResource: "cleanCache", ofType: "sh") { + let task = Process() + task.launchPath = "/bin/sh" + task.arguments = [scriptPath] + + let outputPipe = Pipe() + task.standardOutput = outputPipe + task.standardError = outputPipe + + task.launch() + task.waitUntilExit() + + let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() + let output = String(data: outputData, encoding: .utf8) ?? "" + + DispatchQueue.main.async { + print("Output: \(output)") + } + } else { + DispatchQueue.main.async { + print("Script not found") + } + } + } + +} diff --git a/Box42/QuickSlot/Controller/QuickSlotViewController.swift b/Box42/QuickSlot/Controller/QuickSlotViewController.swift index 898e56b..177b5f9 100644 --- a/Box42/QuickSlot/Controller/QuickSlotViewController.swift +++ b/Box42/QuickSlot/Controller/QuickSlotViewController.swift @@ -9,32 +9,24 @@ import AppKit class QuickSlotViewController: NSViewController { var viewModel: QuickSlotViewModel! + var buttonCollectionView: QuickSlotButtonCollectionViewController! override func loadView() { - super.viewDidLoad() let quickSlotViewGroup = QuickSlotGroupView() - quickSlotViewGroup.quickslotAction = quickslotAction + quickSlotViewGroup.headerAction = headerAction + NotificationCenter.default.addObserver(self, selector: #selector(handleButtonTapped), name: NSNotification.Name(NotifConst.object.collectionButtonTapped), object: nil) + self.view = quickSlotViewGroup } - func setupHeader() { - // headerLabel을 뷰에 추가하고 레이아웃을 설정합니다. + func headerAction() { + print("quick slot header") } - - func setupGroupView() { - // groupView를 뷰에 추가하고 레이아웃을 설정합니다. - } - - func setupButtons() { - // 4x2 버튼을 groupView에 추가하고 레이아웃을 설정합니다. - } - - @objc func buttonTapped(sender: NSButton) { - // 버튼이 눌렸을 때의 처리 - } - - func quickslotAction() { - print("quick slot") + + @objc func handleButtonTapped(notification: NSNotification) { + if let button = notification.object as? NSButton { + print("Button with title \(button.title) was tapped") + } } } diff --git a/Box42/Resources/AppDelegate.swift b/Box42/Resources/AppDelegate.swift index 9bde3d6..65fb651 100644 --- a/Box42/Resources/AppDelegate.swift +++ b/Box42/Resources/AppDelegate.swift @@ -9,125 +9,127 @@ import Cocoa @main class AppDelegate: NSObject, NSApplicationDelegate { - var menubarController = MenubarViewController() + var menubarController = MenubarViewController() lazy var storage = Storage() - - func applicationWillFinishLaunching(_ notification: Notification) { - menubarController.menubarViewControllerInit() - } - - func applicationDidFinishLaunching(_ aNotification: Notification) { - menubarController.menubarViewControllerStart() -// alertAccessibility() -// hotkey() - -// storage.storageTimerEvent() + + func applicationWillFinishLaunching(_ notification: Notification) { + menubarController.menubarViewControllerInit() } - - func applicationWillTerminate(_ aNotification: Notification) { - // Insert code here to tear down your application - } - - func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { - return true - } - - // MARK: - Core Data stack - - lazy var persistentContainer: NSPersistentContainer = { - /* - The persistent container for the application. This implementation - creates and returns a container, having loaded the store for the - application to it. This property is optional since there are legitimate - error conditions that could cause the creation of the store to fail. - */ - let container = NSPersistentContainer(name: "Box42") - container.loadPersistentStores(completionHandler: { (storeDescription, error) in - if let error = error { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - - /* - Typical reasons for an error here include: - * The parent directory does not exist, cannot be created, or disallows writing. - * The persistent store is not accessible, due to permissions or data protection when the device is locked. - * The device is out of space. - * The store could not be migrated to the current model version. - Check the error message to determine what the actual problem was. - */ - fatalError("Unresolved error \(error)") - } - }) - return container - }() - - // MARK: - Core Data Saving and Undo support - - @IBAction func saveAction(_ sender: AnyObject?) { - // Performs the save action for the application, which is to send the save: message to the application's managed object context. Any encountered errors are presented to the user. - let context = persistentContainer.viewContext - - if !context.commitEditing() { - NSLog("\(NSStringFromClass(type(of: self))) unable to commit editing before saving") - } - if context.hasChanges { - do { - try context.save() - } catch { - // Customize this code block to include application-specific recovery steps. - let nserror = error as NSError - NSApplication.shared.presentError(nserror) - } - } - } - - func windowWillReturnUndoManager(window: NSWindow) -> UndoManager? { - // Returns the NSUndoManager for the application. In this case, the manager returned is that of the managed object context for the application. - return persistentContainer.viewContext.undoManager - } - - func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { - // Save changes in the application's managed object context before the application terminates. - let context = persistentContainer.viewContext - - if !context.commitEditing() { - NSLog("\(NSStringFromClass(type(of: self))) unable to commit editing to terminate") - return .terminateCancel - } - - if !context.hasChanges { - return .terminateNow - } - - do { - try context.save() - } catch { - let nserror = error as NSError - - // Customize this code block to include application-specific recovery steps. - let result = sender.presentError(nserror) - if (result) { - return .terminateCancel - } - - let question = NSLocalizedString("Could not save changes while quitting. Quit anyway?", comment: "Quit without saves error question message") - let info = NSLocalizedString("Quitting now will lose any changes you have made since the last successful save", comment: "Quit without saves error question info"); - let quitButton = NSLocalizedString("Quit anyway", comment: "Quit anyway button title") - let cancelButton = NSLocalizedString("Cancel", comment: "Cancel button title") - let alert = NSAlert() - alert.messageText = question - alert.informativeText = info - alert.addButton(withTitle: quitButton) - alert.addButton(withTitle: cancelButton) - - let answer = alert.runModal() - if answer == .alertSecondButtonReturn { - return .terminateCancel - } - } - // If we got here, it is time to quit. - return .terminateNow - } - + + func applicationDidFinishLaunching(_ aNotification: Notification) { + menubarController.menubarViewControllerStart() + // alertAccessibility() + // hotkey() + + // storage.storageTimerEvent() + _ = ScriptsLogicController.shared + + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } + + func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } + + // MARK: - Core Data stack + + lazy var persistentContainer: NSPersistentContainer = { + /* + The persistent container for the application. This implementation + creates and returns a container, having loaded the store for the + application to it. This property is optional since there are legitimate + error conditions that could cause the creation of the store to fail. + */ + let container = NSPersistentContainer(name: "Box42") + container.loadPersistentStores(completionHandler: { (storeDescription, error) in + if let error = error { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + + /* + Typical reasons for an error here include: + * The parent directory does not exist, cannot be created, or disallows writing. + * The persistent store is not accessible, due to permissions or data protection when the device is locked. + * The device is out of space. + * The store could not be migrated to the current model version. + Check the error message to determine what the actual problem was. + */ + fatalError("Unresolved error \(error)") + } + }) + return container + }() + + // MARK: - Core Data Saving and Undo support + + @IBAction func saveAction(_ sender: AnyObject?) { + // Performs the save action for the application, which is to send the save: message to the application's managed object context. Any encountered errors are presented to the user. + let context = persistentContainer.viewContext + + if !context.commitEditing() { + NSLog("\(NSStringFromClass(type(of: self))) unable to commit editing before saving") + } + if context.hasChanges { + do { + try context.save() + } catch { + // Customize this code block to include application-specific recovery steps. + let nserror = error as NSError + NSApplication.shared.presentError(nserror) + } + } + } + + func windowWillReturnUndoManager(window: NSWindow) -> UndoManager? { + // Returns the NSUndoManager for the application. In this case, the manager returned is that of the managed object context for the application. + return persistentContainer.viewContext.undoManager + } + + func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { + // Save changes in the application's managed object context before the application terminates. + let context = persistentContainer.viewContext + + if !context.commitEditing() { + NSLog("\(NSStringFromClass(type(of: self))) unable to commit editing to terminate") + return .terminateCancel + } + + if !context.hasChanges { + return .terminateNow + } + + do { + try context.save() + } catch { + let nserror = error as NSError + + // Customize this code block to include application-specific recovery steps. + let result = sender.presentError(nserror) + if (result) { + return .terminateCancel + } + + let question = NSLocalizedString("Could not save changes while quitting. Quit anyway?", comment: "Quit without saves error question message") + let info = NSLocalizedString("Quitting now will lose any changes you have made since the last successful save", comment: "Quit without saves error question info"); + let quitButton = NSLocalizedString("Quit anyway", comment: "Quit anyway button title") + let cancelButton = NSLocalizedString("Cancel", comment: "Cancel button title") + let alert = NSAlert() + alert.messageText = question + alert.informativeText = info + alert.addButton(withTitle: quitButton) + alert.addButton(withTitle: cancelButton) + + let answer = alert.runModal() + if answer == .alertSecondButtonReturn { + return .terminateCancel + } + } + // If we got here, it is time to quit. + return .terminateNow + } + } From e4b9a7560f6c296b09f8bc21b4bb221daf1a2fa4 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 28 Aug 2023 03:32:23 +0900 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20QuickSlotGroup=EC=9D=98=20=EB=B7=B0?= =?UTF-8?q?=EB=A5=BC=20=EA=B5=AC=EC=84=B1=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Box42/QuickSlot/View/QuickSlotGroupView.swift | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Box42/QuickSlot/View/QuickSlotGroupView.swift b/Box42/QuickSlot/View/QuickSlotGroupView.swift index d476ec8..228c26b 100644 --- a/Box42/QuickSlot/View/QuickSlotGroupView.swift +++ b/Box42/QuickSlot/View/QuickSlotGroupView.swift @@ -9,14 +9,13 @@ import AppKit import SnapKit class QuickSlotGroupView: NSView { - lazy var divider: NSBox = TopDivider(completion: { [weak self] in self?.dividerAction?() }) - lazy var headerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { [weak self] in self?.quickslotAction?() }) - lazy var buttonGridView: QuickSlotButtonGridView = QuickSlotButtonGridView(frame: CGRect(x: 0, y: 0, width: 267, height: 134), completion: { [weak self] in self?.buttonAction?() }) - lazy var footerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { [weak self] in self?.quickslotAction?() }) + + lazy var divider: NSBox = Divider(completion: { [weak self] in self?.dividerAction?() }) + lazy var headerView: QuickSlotHeaderView = QuickSlotHeaderView(image: NSImage(imageLiteralResourceName: "star"), completion: { [weak self] in self?.headerAction?() }) + lazy var buttonCollectionView: QuickSlotButtonCollectionViewController = QuickSlotButtonCollectionViewController() var dividerAction: (() -> Void)? - var quickslotAction: (() -> Void)? - var buttonAction: (() -> Void)? + var headerAction: (() -> Void)? override init(frame: NSRect) { super.init(frame: frame) @@ -33,8 +32,7 @@ class QuickSlotGroupView: NSView { private func setupViews() { self.addSubview(divider) self.addSubview(headerView) - self.addSubview(buttonGridView) - self.addSubview(footerView) + self.addSubview(buttonCollectionView.view) } @@ -50,13 +48,8 @@ class QuickSlotGroupView: NSView { make.height.equalTo(QuickSlotUI.size.headerHeight) } - buttonGridView.snp.makeConstraints { make in + buttonCollectionView.view.snp.makeConstraints { make in make.top.equalTo(headerView.snp.bottom).offset(14) - make.left.right.equalToSuperview() - } - - footerView.snp.makeConstraints { make in - make.top.equalTo(buttonGridView.snp.bottom).offset(14) make.left.right.bottom.equalToSuperview() } } From 466ed6cde0fde2978e61b102597a80874f39e108 Mon Sep 17 00:00:00 2001 From: chanhihi Date: Mon, 28 Aug 2023 03:32:52 +0900 Subject: [PATCH 9/9] =?UTF-8?q?feat(mvvm):=20quick=20slot=20view=EC=99=80?= =?UTF-8?q?=20view=20model=EC=9D=84=20mvvm=EA=B5=AC=EC=A1=B0=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EC=84=B1=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Box42/QuickSlot/Model/QuickSlotButtonModel.swift | 5 +++++ Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Box42/QuickSlot/Model/QuickSlotButtonModel.swift b/Box42/QuickSlot/Model/QuickSlotButtonModel.swift index e5fcf51..8049fc7 100644 --- a/Box42/QuickSlot/Model/QuickSlotButtonModel.swift +++ b/Box42/QuickSlot/Model/QuickSlotButtonModel.swift @@ -11,4 +11,9 @@ import Foundation struct QuickSlotButtonModel { let id: UUID var title: String + + init(title: String = "Default") { + self.id = UUID() + self.title = title + } } diff --git a/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift b/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift index 53c546e..fe3e1da 100644 --- a/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift +++ b/Box42/QuickSlot/ViewModel/QuickSlotViewModel.swift @@ -6,13 +6,19 @@ // import AppKit +import Combine -// ViewModel class QuickSlotViewModel { - var buttons: [QuickSlotButtonModel] = [ - // 초기 버튼 데이터 - ] + @Published var buttons: [QuickSlotButtonModel] = [] + init() { + let button1 = QuickSlotButtonModel(title: "clean") + let button2 = QuickSlotButtonModel(title: "icons") + let button3 = QuickSlotButtonModel(title: "scripts") + + buttons = [button1, button2, button3] + } + func addButton(_ button: QuickSlotButtonModel) { buttons.append(button) }