Skip to content

Commit f1fea63

Browse files
committed
move release notes to ReleaseNotesView.swift
- narrow down interfaces of some functions
1 parent 03eb166 commit f1fea63

5 files changed

Lines changed: 73 additions & 28 deletions

File tree

Xcodes.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
536CFDD4263C9A8000026CE0 /* XcodesSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */; };
1414
53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CBAB2B263DCC9100410495 /* XcodesAlert.swift */; };
1515
63EAA4EB259944450046AB8F /* ProgressButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EAA4EA259944450046AB8F /* ProgressButton.swift */; };
16+
B0403CF02AD92D7B00137C09 /* ReleaseNotesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0403CEF2AD92D7B00137C09 /* ReleaseNotesView.swift */; };
1617
B0C6AD042AD6E65700E64698 /* ReleaseDateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */; };
1718
B0C6AD0B2AD9178E00E64698 /* IdenticalBuildView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */; };
1819
B0C6AD0D2AD91D7900E64698 /* IconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C6AD0C2AD91D7900E64698 /* IconView.swift */; };
@@ -195,6 +196,7 @@
195196
A0187D39285792D1002F46F9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
196197
AAB037D32839BD4700017680 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; };
197198
AB4EB0DE28541FA000FF3B1D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; };
199+
B0403CEF2AD92D7B00137C09 /* ReleaseNotesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesView.swift; sourceTree = "<group>"; };
198200
B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseDateView.swift; sourceTree = "<group>"; };
199201
B0C6AD0A2AD9178E00E64698 /* IdenticalBuildView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdenticalBuildView.swift; sourceTree = "<group>"; };
200202
B0C6AD0C2AD91D7900E64698 /* IconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconView.swift; sourceTree = "<group>"; };
@@ -621,6 +623,7 @@
621623
E8E98A9425D863B100EC89A0 /* InfoPane */ = {
622624
isa = PBXGroup;
623625
children = (
626+
B0403CEF2AD92D7B00137C09 /* ReleaseNotesView.swift */,
624627
CAFBDC67259A308B003DCC5A /* InfoPane.swift */,
625628
E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */,
626629
B0C6AD032AD6E65700E64698 /* ReleaseDateView.swift */,
@@ -877,6 +880,7 @@
877880
CA61A6E0259835580008926E /* Xcode.swift in Sources */,
878881
CAE4247F259A666100B8B246 /* MainWindow.swift in Sources */,
879882
CA452BB0259FD9770072DFA4 /* ProgressIndicator.swift in Sources */,
883+
B0403CF02AD92D7B00137C09 /* ReleaseNotesView.swift in Sources */,
880884
CAFE4AB425B7D3AF0064FE51 /* AdvancedPreferencePane.swift in Sources */,
881885
CA9FF84E2595079F00E47BAF /* ScrollingTextView.swift in Sources */,
882886
CABFA9C12592EEEA00380FEE /* Version+.swift in Sources */,

Xcodes/Backend/AppState.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,8 +630,8 @@ class AppState: ObservableObject {
630630
NSPasteboard.general.setString(installedXcodePath.string, forType: .string)
631631
}
632632

633-
func copyReleaseNote(xcode: Xcode) {
634-
guard let url = xcode.releaseNotesURL else { return }
633+
func copyReleaseNote(from url: URL?) {
634+
guard let url = url else { return }
635635
NSPasteboard.general.declareTypes([.URL, .string], owner: nil)
636636
NSPasteboard.general.writeObjects([url as NSURL])
637637
NSPasteboard.general.setString(url.absoluteString, forType: .string)

Xcodes/Backend/XcodeCommands.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,9 @@ struct CopyPathButton: View {
173173
}
174174

175175
struct CopyReleaseNoteButton: View {
176+
let url: URL?
177+
176178
@EnvironmentObject var appState: AppState
177-
let xcode: Xcode?
178179

179180
var body: some View {
180181
Button(action: copyReleaseNote) {
@@ -184,8 +185,8 @@ struct CopyReleaseNoteButton: View {
184185
}
185186

186187
private func copyReleaseNote() {
187-
guard let xcode = xcode else { return }
188-
appState.copyReleaseNote(xcode: xcode)
188+
guard let url = url else { return }
189+
appState.copyReleaseNote(from: url)
189190
}
190191
}
191192

Xcodes/Frontend/InfoPane/InfoPane.swift

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ struct InfoPane: View {
5454
Divider()
5555

5656
Group{
57-
releaseNotes(for: xcode)
57+
ReleaseNotesView(url: xcode.releaseNotesURL)
5858
ReleaseDateView(date: xcode.releaseDate)
5959
.frame(maxWidth: .infinity, alignment: .leading)
6060
IdenticalBuildsView(builds: xcode.identicalBuilds)
@@ -74,28 +74,6 @@ struct InfoPane: View {
7474
}
7575
}
7676

77-
@ViewBuilder
78-
private func releaseNotes(for xcode: Xcode) -> some View {
79-
if let releaseNotesURL = xcode.releaseNotesURL {
80-
Button(action: { openURL(releaseNotesURL) }) {
81-
Label("ReleaseNotes", systemImage: "link")
82-
}
83-
.buttonStyle(LinkButtonStyle())
84-
.contextMenu(menuItems: {
85-
releaseNotesMenu(for: xcode)
86-
})
87-
.frame(maxWidth: .infinity, alignment: .leading)
88-
.help("ReleaseNotes.help")
89-
} else {
90-
EmptyView()
91-
}
92-
}
93-
94-
@ViewBuilder
95-
private func releaseNotesMenu(for xcode: Xcode) -> some View {
96-
CopyReleaseNoteButton(xcode: xcode)
97-
}
98-
9977
@ViewBuilder
10078
private func compatibility(for xcode: Xcode) -> some View {
10179
if let requiredMacOSVersion = xcode.requiredMacOSVersion {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// ReleaseNotesView.swift
3+
// Xcodes
4+
//
5+
// Created by Duong Thai on 13/10/2023.
6+
// Copyright © 2023 Robots and Pencils. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
11+
struct ReleaseNotesView: View {
12+
let url: URL?
13+
14+
@SwiftUI.Environment(\.openURL) var openURL: OpenURLAction
15+
16+
var body: some View {
17+
if let url = url {
18+
Button(action: { openURL(url) }) {
19+
Label("ReleaseNotes", systemImage: "link")
20+
}
21+
.buttonStyle(LinkButtonStyle())
22+
.contextMenu(menuItems: {
23+
CopyReleaseNoteButton(url: url)
24+
})
25+
.frame(maxWidth: .infinity, alignment: .leading)
26+
.help("ReleaseNotes.help")
27+
} else {
28+
EmptyView()
29+
}
30+
}
31+
}
32+
33+
struct ReleaseNotesView_Preview: PreviewProvider {
34+
static var previews: some View {
35+
WrapperView()
36+
}
37+
}
38+
39+
private struct WrapperView: View {
40+
@State var hasURL = false
41+
var url: URL? {
42+
hasURL
43+
? nil
44+
: URL(string: "https://developer.apple.com/documentation/xcode-release-notes/xcode-12_3-release-notes/")!
45+
}
46+
47+
var body: some View {
48+
VStack {
49+
HStack {
50+
ReleaseNotesView(url: url)
51+
.border(.red)
52+
}
53+
Spacer()
54+
Toggle(isOn: $hasURL) {
55+
Text("Has URL?")
56+
}
57+
}
58+
.animation(.default)
59+
.frame(width: 300, height: 100)
60+
.padding()
61+
}
62+
}

0 commit comments

Comments
 (0)