From db8b862bf046bffbffc69d00c0ab09b0bc6d8186 Mon Sep 17 00:00:00 2001 From: Mattia Righetti Date: Sun, 5 Nov 2023 12:58:18 +0100 Subject: [PATCH] refactor: infoview + bgbutton --- HNReader.xcodeproj/project.pbxproj | 12 +++++ .../UserInterfaceState.xcuserstate | Bin 61311 -> 65180 bytes HNReader/Utils/+View.swift | 20 +++++++ HNReader/View/Components/BgButton.swift | 47 ++++++++++++++++ HNReader/View/InfoView.swift | 50 ++++++++++++++++++ HNReader/View/ItemCell.swift | 42 +++------------ HNReader/View/ItemList.swift | 5 ++ 7 files changed, 142 insertions(+), 34 deletions(-) create mode 100644 HNReader/Utils/+View.swift create mode 100644 HNReader/View/Components/BgButton.swift create mode 100644 HNReader/View/InfoView.swift diff --git a/HNReader.xcodeproj/project.pbxproj b/HNReader.xcodeproj/project.pbxproj index ffae84e..8cb8aec 100644 --- a/HNReader.xcodeproj/project.pbxproj +++ b/HNReader.xcodeproj/project.pbxproj @@ -20,6 +20,9 @@ 5F109D602AF704F700AE6AF3 /* IBMPlexSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5F109D5C2AF704F700AE6AF3 /* IBMPlexSerif-Bold.ttf */; }; 5F109D612AF704F700AE6AF3 /* IBMPlexSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5F109D5D2AF704F700AE6AF3 /* IBMPlexSerif-Regular.ttf */; }; 5F109D622AF704F700AE6AF3 /* IBMPlexSerif-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5F109D5E2AF704F700AE6AF3 /* IBMPlexSerif-SemiBold.ttf */; }; + 5FCE20A72AF7B25A00BF4097 /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FCE20A62AF7B25A00BF4097 /* InfoView.swift */; }; + 5FCE20A92AF7B47B00BF4097 /* BgButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FCE20A82AF7B47B00BF4097 /* BgButton.swift */; }; + 5FCE20AB2AF7B8EE00BF4097 /* +View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FCE20AA2AF7B8EE00BF4097 /* +View.swift */; }; C93F99B6267554F00046F870 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93F99B5267554F00046F870 /* ItemCell.swift */; }; C93F99B8267557FC0046F870 /* ItemList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93F99B7267557FC0046F870 /* ItemList.swift */; }; C93F99BA267580CE0046F870 /* HTMLText.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93F99B9267580CE0046F870 /* HTMLText.swift */; }; @@ -59,6 +62,9 @@ 5F109D5C2AF704F700AE6AF3 /* IBMPlexSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "IBMPlexSerif-Bold.ttf"; sourceTree = ""; }; 5F109D5D2AF704F700AE6AF3 /* IBMPlexSerif-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "IBMPlexSerif-Regular.ttf"; sourceTree = ""; }; 5F109D5E2AF704F700AE6AF3 /* IBMPlexSerif-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "IBMPlexSerif-SemiBold.ttf"; sourceTree = ""; }; + 5FCE20A62AF7B25A00BF4097 /* InfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoView.swift; sourceTree = ""; }; + 5FCE20A82AF7B47B00BF4097 /* BgButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BgButton.swift; sourceTree = ""; }; + 5FCE20AA2AF7B8EE00BF4097 /* +View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "+View.swift"; sourceTree = ""; }; C93F99B5267554F00046F870 /* ItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = ""; }; C93F99B7267557FC0046F870 /* ItemList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemList.swift; sourceTree = ""; }; C93F99B9267580CE0046F870 /* HTMLText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLText.swift; sourceTree = ""; }; @@ -101,6 +107,7 @@ isa = PBXGroup; children = ( 3307159309D438EFAA1259C7 /* +Date.swift */, + 5FCE20AA2AF7B8EE00BF4097 /* +View.swift */, ); path = Utils; sourceTree = ""; @@ -145,6 +152,7 @@ isa = PBXGroup; children = ( C93F99B9267580CE0046F870 /* HTMLText.swift */, + 5FCE20A82AF7B47B00BF4097 /* BgButton.swift */, ); path = Components; sourceTree = ""; @@ -213,6 +221,7 @@ C93F99B7267557FC0046F870 /* ItemList.swift */, C9926691267588B80035A88F /* Components */, 5F109D582AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift */, + 5FCE20A62AF7B25A00BF4097 /* InfoView.swift */, ); path = View; sourceTree = ""; @@ -358,6 +367,8 @@ C9D0938026741BBF002CC786 /* Persistence.swift in Sources */, C9D0937926741BBE002CC786 /* HomeView.swift in Sources */, C93F99B6267554F00046F870 /* ItemCell.swift in Sources */, + 5FCE20A92AF7B47B00BF4097 /* BgButton.swift in Sources */, + 5FCE20A72AF7B25A00BF4097 /* InfoView.swift in Sources */, 5F109D592AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift in Sources */, C93F99B8267557FC0046F870 /* ItemList.swift in Sources */, C9E9BCFD2674C80E001B4E19 /* AppState.swift in Sources */, @@ -369,6 +380,7 @@ 330713D3016ED410AFD53FDF /* ItemListViewModel.swift in Sources */, 330711A9216E762026AF98A0 /* +Date.swift in Sources */, 33071F1C64D4742E1F947FAA /* ItemDownloader.swift in Sources */, + 5FCE20AB2AF7B8EE00BF4097 /* +View.swift in Sources */, 3307147AB95F03650FC40B97 /* ItemCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/HNReader.xcodeproj/project.xcworkspace/xcuserdata/mattrighetti.xcuserdatad/UserInterfaceState.xcuserstate b/HNReader.xcodeproj/project.xcworkspace/xcuserdata/mattrighetti.xcuserdatad/UserInterfaceState.xcuserstate index be18bfca69e27fe8b18cdd8bc3d01b868d964f9c..9929683130d2912a97bf465d856aba51e00beaf1 100644 GIT binary patch delta 28005 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 delta 25868 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⪚ApXmT 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 diff --git a/HNReader/Utils/+View.swift b/HNReader/Utils/+View.swift new file mode 100644 index 0000000..3a00527 --- /dev/null +++ b/HNReader/Utils/+View.swift @@ -0,0 +1,20 @@ +// +// +View.swift +// HNReader +// +// Created by Mattia Righetti on 05/11/23. +// + +import SwiftUI + +extension View { + @discardableResult + func openInWindow(title: String, sender: Any?) -> NSWindow { + let controller = NSHostingController(rootView: self) + let win = NSWindow(contentViewController: controller) + win.contentViewController = controller + win.title = title + win.makeKeyAndOrderFront(sender) + return win + } +} diff --git a/HNReader/View/Components/BgButton.swift b/HNReader/View/Components/BgButton.swift new file mode 100644 index 0000000..872843b --- /dev/null +++ b/HNReader/View/Components/BgButton.swift @@ -0,0 +1,47 @@ +// +// BgButton.swift +// HNReader +// +// Created by Mattia Righetti on 05/11/23. +// + +import SwiftUI + +struct BgButton: View { + var text: String? = nil + var icon: String + var disabled: Bool = false + var minSize: CGSize + var onHover: ((Bool) -> Void)? = nil + var action: (() -> ())? = nil + + var body: some View { + ZStack { + RoundedRectangle(cornerRadius: 15) + .foregroundStyle(Color.gray.opacity(0.1)) + .frame(width: minSize.width, height: minSize.height) + + Label(title: { + if text != nil { + Text(text!) + .font(.custom("IBMPlexSerif-Regular", size: 13)) + } + }, icon: { + Image(systemName: icon) + }) + .foregroundStyle(disabled ? .tertiary : .primary) + .padding() + } + .frame(width: minSize.width, height: minSize.height) + .onHover { + onHover?($0) + } + .onTapGesture { + action?() + } + } +} + +#Preview { + BgButton(text: "Rate app", icon: "star", minSize: CGSize(width: 150, height: 50)).padding() +} diff --git a/HNReader/View/InfoView.swift b/HNReader/View/InfoView.swift new file mode 100644 index 0000000..c7bad67 --- /dev/null +++ b/HNReader/View/InfoView.swift @@ -0,0 +1,50 @@ +// +// InfoView.swift +// HNReader +// +// Created by Mattia Righetti on 05/11/23. +// + +import SwiftUI + +struct InfoView: View { + var body: some View { + VStack { + Text("HNReader v1.2") + .font(.title2) + .padding(.bottom) + + Text("This project is open source") + + BgButton(text: "Rate HNReader", icon: "star", minSize: CGSize(width: 200, height: 50), onHover: { h in + DispatchQueue.main.async { + if (h) { + NSCursor.pointingHand.push() + } else { + NSCursor.pop() + } + } + }, action: { + NSWorkspace.shared.open(URL(string: "https://github.com/mattrighetti/HNReader.git")!) + }) + + BgButton(text: "Open on GitHub", icon: "arrow.up.right", minSize: CGSize(width: 200, height: 50), onHover: { h in + DispatchQueue.main.async { + if (h) { + NSCursor.pointingHand.push() + } else { + NSCursor.pop() + } + } + }, action: { + NSWorkspace.shared.open(URL(string: "https://github.com/mattrighetti/HNReader.git")!) + }) + } + .padding() + .frame(minWidth: 300) + } +} + +#Preview { + InfoView() +} diff --git a/HNReader/View/ItemCell.swift b/HNReader/View/ItemCell.swift index 0c14a25..a5dd9a9 100644 --- a/HNReader/View/ItemCell.swift +++ b/HNReader/View/ItemCell.swift @@ -55,20 +55,7 @@ struct ItemCell: View { } HStack { - - ZStack { - RoundedRectangle(cornerRadius: 15) - .foregroundStyle(Color.gray.opacity(0.1)) - .frame(width: 50, height: 50) - - Label(title: {}, icon: { - Image(systemName: "bubble.left") - }) - .foregroundStyle(.primary) - .padding() - } - .frame(width: 50, height: 50) - .onHover { isHovered in + BgButton(icon: "bubble.left", minSize: CGSize(width: 50, height: 50), onHover: { isHovered in DispatchQueue.main.async { if (isHovered) { NSCursor.pointingHand.push() @@ -76,27 +63,14 @@ struct ItemCell: View { NSCursor.pop() } } - } - .onTapGesture { + }, action: { if let item = item { guard let url = URL(string: "https://news.ycombinator.com/item?id=\(item.id)") else { return } NSWorkspace.shared.open(url) } - } + }) - ZStack { - RoundedRectangle(cornerRadius: 15) - .foregroundStyle(Color.gray.opacity(0.1)) - .frame(width: 50, height: 50) - - Label(title: {}, icon: { - Image(systemName: "arrow.up.right") - }) - .foregroundStyle(item?.url != nil ? .primary : .tertiary) - .padding() - } - .frame(width: 50, height: 50) - .onHover { isHovered in + BgButton(icon: "arrow.up.right", disabled: item?.url == nil, minSize: CGSize(width: 50, height: 50), onHover: { isHovered in DispatchQueue.main.async { if (isHovered) { if item?.url == nil { @@ -108,12 +82,12 @@ struct ItemCell: View { NSCursor.pop() } } - } - .onTapGesture { + }, action: { guard let url = item?.url, let url = URL(string: url) else { return } NSWorkspace.shared.open(url) - } - }.padding(.leading) + }) + } + .padding(.leading) } .padding() .background(colorScheme == .dark ? Color.black.opacity(0.3) : Color.gray.opacity(0.1)) diff --git a/HNReader/View/ItemList.swift b/HNReader/View/ItemList.swift index 656ca75..767a845 100644 --- a/HNReader/View/ItemList.swift +++ b/HNReader/View/ItemList.swift @@ -32,6 +32,11 @@ struct ItemList: View { Button(action: viewModel.refreshStories) { Label("Refresh news", systemImage: "arrow.counterclockwise.circle") } + Button(action: { + InfoView().openInWindow(title: "Info", sender: nil) + }, label: { + Label("Info", systemImage: "info.circle") + }) } .navigationTitle("Hacker News") }