Skip to content

Commit 531221c

Browse files
Feat/contributors window (#1002)
* start implementation of Contributors View * update CodeEditSymbols to 0.1.1 * add buttons for github and website * refactoring, link up button in about window * add dividers * implement offsettable scrollview, adjust paddings * Update CodeEdit/Features/Contributors/ContributorsView.swift Co-authored-by: Austin Condiff <austin.condiff@gmail.com> * Update CodeEdit/Features/Contributors/ContributorsView.swift Co-authored-by: Austin Condiff <austin.condiff@gmail.com> * Update CodeEdit/Features/Contributors/ContributorsView.swift Co-authored-by: Austin Condiff <austin.condiff@gmail.com> * Update CodeEdit/Features/Contributors/ContributorsView.swift Co-authored-by: Austin Condiff <austin.condiff@gmail.com> Co-authored-by: Austin Condiff <austin.condiff@gmail.com>
1 parent 0f471ba commit 531221c

9 files changed

Lines changed: 387 additions & 5 deletions

File tree

CodeEdit.xcodeproj/project.pbxproj

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,22 @@
4747
20EBB50D280C383700F3A5DA /* LanguageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB50C280C383700F3A5DA /* LanguageType.swift */; };
4848
20EBB50F280C389300F3A5DA /* FileInspectorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB50E280C389300F3A5DA /* FileInspectorModel.swift */; };
4949
2801BB8A290D5A8E00EBF552 /* CodeEditKit in Frameworks */ = {isa = PBXBuildFile; productRef = 2801BB89290D5A8E00EBF552 /* CodeEditKit */; };
50+
2806E9022979588B000040F4 /* Contributor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2806E9012979588B000040F4 /* Contributor.swift */; };
51+
2806E904297958B9000040F4 /* ContributorRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2806E903297958B9000040F4 /* ContributorRowView.swift */; };
5052
2813F93827ECC4AA00E305E4 /* FindNavigatorResultList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E201B327E9989900CB86D0 /* FindNavigatorResultList.swift */; };
5153
2813F93927ECC4C300E305E4 /* NavigatorSidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 287776E627E3413200D46668 /* NavigatorSidebarView.swift */; };
5254
2816F594280CF50500DD548B /* CodeEditSymbols in Frameworks */ = {isa = PBXBuildFile; productRef = 2816F593280CF50500DD548B /* CodeEditSymbols */; };
5355
283BDCBD2972EEBD002AFF81 /* Package.resolved in Resources */ = {isa = PBXBuildFile; fileRef = 283BDCBC2972EEBD002AFF81 /* Package.resolved */; };
5456
283BDCC52972F236002AFF81 /* AcknowledgementsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */; };
5557
2847019E27FDDF7600F87B6B /* OutlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2847019D27FDDF7600F87B6B /* OutlineView.swift */; };
58+
284DC84D2978B61400BF2770 /* ContributorsWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 284DC84C2978B61400BF2770 /* ContributorsWindowController.swift */; };
59+
284DC84F2978B7B400BF2770 /* ContributorsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 284DC84E2978B7B400BF2770 /* ContributorsView.swift */; };
60+
284DC8512978BA2600BF2770 /* .all-contributorsrc in Resources */ = {isa = PBXBuildFile; fileRef = 284DC8502978BA2600BF2770 /* .all-contributorsrc */; };
5661
285FEC7027FE4B9800E57D53 /* OutlineTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC6F27FE4B9800E57D53 /* OutlineTableViewCell.swift */; };
5762
286471AB27ED51FD0039369D /* ProjectNavigatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 286471AA27ED51FD0039369D /* ProjectNavigatorView.swift */; };
5863
287776E927E34BC700D46668 /* TabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 287776E827E34BC700D46668 /* TabBarView.swift */; };
5964
287776EF27E3515300D46668 /* TabBarItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 287776EE27E3515300D46668 /* TabBarItemView.swift */; };
65+
2897E1C72979A29200741E32 /* OffsettableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2897E1C62979A29200741E32 /* OffsettableScrollView.swift */; };
6066
28A51001281673530087B0CC /* codeedit-xcode-dark.json in Resources */ = {isa = PBXBuildFile; fileRef = 28A50FFF281673530087B0CC /* codeedit-xcode-dark.json */; };
6167
28A51002281673530087B0CC /* codeedit-xcode-light.json in Resources */ = {isa = PBXBuildFile; fileRef = 28A51000281673530087B0CC /* codeedit-xcode-light.json */; };
6268
28A51005281701B40087B0CC /* codeedit-github-light.json in Resources */ = {isa = PBXBuildFile; fileRef = 28A51003281701B40087B0CC /* codeedit-github-light.json */; };
@@ -430,16 +436,22 @@
430436
28052DFC29730DF600F4F90A /* Alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Alpha.xcconfig; sourceTree = "<group>"; };
431437
28052DFD29730E0300F4F90A /* Beta.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Beta.xcconfig; sourceTree = "<group>"; };
432438
28052DFE29730E0B00F4F90A /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
439+
2806E9012979588B000040F4 /* Contributor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contributor.swift; sourceTree = "<group>"; };
440+
2806E903297958B9000040F4 /* ContributorRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorRowView.swift; sourceTree = "<group>"; };
433441
283BDCBC2972EEBD002AFF81 /* Package.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; name = Package.resolved; path = CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; sourceTree = "<group>"; };
434442
283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementsTests.swift; sourceTree = "<group>"; };
435443
2847019D27FDDF7600F87B6B /* OutlineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineView.swift; sourceTree = "<group>"; };
444+
284DC84C2978B61400BF2770 /* ContributorsWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorsWindowController.swift; sourceTree = "<group>"; };
445+
284DC84E2978B7B400BF2770 /* ContributorsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorsView.swift; sourceTree = "<group>"; };
446+
284DC8502978BA2600BF2770 /* .all-contributorsrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ".all-contributorsrc"; sourceTree = "<group>"; };
436447
285FEC6D27FE4B4A00E57D53 /* OutlineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineViewController.swift; sourceTree = "<group>"; };
437448
285FEC6F27FE4B9800E57D53 /* OutlineTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineTableViewCell.swift; sourceTree = "<group>"; };
438449
285FEC7127FE4EEF00E57D53 /* OutlineMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineMenu.swift; sourceTree = "<group>"; };
439450
286471AA27ED51FD0039369D /* ProjectNavigatorView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = ProjectNavigatorView.swift; sourceTree = "<group>"; tabWidth = 4; };
440451
287776E627E3413200D46668 /* NavigatorSidebarView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = NavigatorSidebarView.swift; sourceTree = "<group>"; tabWidth = 4; };
441452
287776E827E34BC700D46668 /* TabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarView.swift; sourceTree = "<group>"; };
442453
287776EE27E3515300D46668 /* TabBarItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarItemView.swift; sourceTree = "<group>"; };
454+
2897E1C62979A29200741E32 /* OffsettableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OffsettableScrollView.swift; sourceTree = "<group>"; };
443455
28A50FFF281673530087B0CC /* codeedit-xcode-dark.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "codeedit-xcode-dark.json"; sourceTree = "<group>"; };
444456
28A51000281673530087B0CC /* codeedit-xcode-light.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "codeedit-xcode-light.json"; sourceTree = "<group>"; };
445457
28A51003281701B40087B0CC /* codeedit-github-light.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "codeedit-github-light.json"; sourceTree = "<group>"; };
@@ -905,6 +917,14 @@
905917
path = DefaultThemes;
906918
sourceTree = "<group>";
907919
};
920+
2806E8FE2979587A000040F4 /* Model */ = {
921+
isa = PBXGroup;
922+
children = (
923+
2806E9012979588B000040F4 /* Contributor.swift */,
924+
);
925+
path = Model;
926+
sourceTree = "<group>";
927+
};
908928
283BDCC22972F211002AFF81 /* Acknowledgements */ = {
909929
isa = PBXGroup;
910930
children = (
@@ -913,6 +933,17 @@
913933
path = Acknowledgements;
914934
sourceTree = "<group>";
915935
};
936+
284DC84B2978B5EB00BF2770 /* Contributors */ = {
937+
isa = PBXGroup;
938+
children = (
939+
2806E8FE2979587A000040F4 /* Model */,
940+
284DC84E2978B7B400BF2770 /* ContributorsView.swift */,
941+
2806E903297958B9000040F4 /* ContributorRowView.swift */,
942+
284DC84C2978B61400BF2770 /* ContributorsWindowController.swift */,
943+
);
944+
path = Contributors;
945+
sourceTree = "<group>";
946+
};
916947
285FEC6C27FE4AC700E57D53 /* OutlineView */ = {
917948
isa = PBXGroup;
918949
children = (
@@ -1024,6 +1055,7 @@
10241055
5831E3C52933E6CB00D5A6D2 /* Features */ = {
10251056
isa = PBXGroup;
10261057
children = (
1058+
284DC84B2978B5EB00BF2770 /* Contributors */,
10271059
582213EE2918345500EFE361 /* About */,
10281060
5878DA7D291862BC00DD95A3 /* Acknowledgements */,
10291061
58F2EA9E292FB2B0004A9BDE /* AppPreferences */,
@@ -1495,6 +1527,7 @@
14951527
587B9D8829300ABD00AC7927 /* SegmentedControl.swift */,
14961528
587B9D8C29300ABD00AC7927 /* SettingsTextEditor.swift */,
14971529
587B9D8F29300ABD00AC7927 /* ToolbarBranchPicker.swift */,
1530+
2897E1C62979A29200741E32 /* OffsettableScrollView.swift */,
14981531
);
14991532
path = Views;
15001533
sourceTree = "<group>";
@@ -2190,6 +2223,7 @@
21902223
children = (
21912224
28052E0129730F2F00F4F90A /* Configs */,
21922225
283BDCBC2972EEBD002AFF81 /* Package.resolved */,
2226+
284DC8502978BA2600BF2770 /* .all-contributorsrc */,
21932227
58F2EACE292FB2B0004A9BDE /* Documentation.docc */,
21942228
B658FB2E27DA9E0F00EA4DBD /* CodeEdit */,
21952229
587B60F329340A8000D5CD8F /* CodeEditTests */,
@@ -2450,6 +2484,7 @@
24502484
D7211D4727E06BFE008F2ED7 /* Localizable.strings in Resources */,
24512485
28F43DE2297388C5008BBA45 /* codeedit-solarized-light.json in Resources */,
24522486
28A51001281673530087B0CC /* codeedit-xcode-dark.json in Resources */,
2487+
284DC8512978BA2600BF2770 /* .all-contributorsrc in Resources */,
24532488
B658FB3427DA9E1000EA4DBD /* Assets.xcassets in Resources */,
24542489
474397C52893AC4B00518C8C /* codeedit-midnight.json in Resources */,
24552490
043C321A27E32295006AE443 /* MainMenu.xib in Resources */,
@@ -2571,6 +2606,7 @@
25712606
587B9E5B29301D8F00AC7927 /* GitCheckoutBranchView.swift in Sources */,
25722607
2813F93827ECC4AA00E305E4 /* FindNavigatorResultList.swift in Sources */,
25732608
587B9E8829301D8F00AC7927 /* GitHubFiles.swift in Sources */,
2609+
284DC84D2978B61400BF2770 /* ContributorsWindowController.swift in Sources */,
25742610
201169D92837B31200F92B46 /* SourceControlSearchToolbar.swift in Sources */,
25752611
0483E35027FDB17700354AC0 /* ExtensionNavigatorView.swift in Sources */,
25762612
587B9DA729300ABD00AC7927 /* HelpButton.swift in Sources */,
@@ -2722,6 +2758,7 @@
27222758
58822531292C280D00E83CDE /* View+isHovering.swift in Sources */,
27232759
587B9E9929301D8F00AC7927 /* GitChangedFile.swift in Sources */,
27242760
58F2EAF2292FB2B0004A9BDE /* EditorThemeView.swift in Sources */,
2761+
2897E1C72979A29200741E32 /* OffsettableScrollView.swift in Sources */,
27252762
58F2EB0E292FB2B0004A9BDE /* SoftwareUpdater.swift in Sources */,
27262763
587B9E9529301D8F00AC7927 /* BitBucketUser.swift in Sources */,
27272764
587B9E7C29301D8F00AC7927 /* GitHubRepositoryRouter.swift in Sources */,
@@ -2734,6 +2771,7 @@
27342771
04C3254B27FF23B000C8DA2D /* ExtensionNavigatorData.swift in Sources */,
27352772
58798261292EC4080085B254 /* ExtensionsManager.swift in Sources */,
27362773
287776EF27E3515300D46668 /* TabBarItemView.swift in Sources */,
2774+
2806E9022979588B000040F4 /* Contributor.swift in Sources */,
27372775
58D01C98293167DC00C5B6B4 /* String+RemoveOccurrences.swift in Sources */,
27382776
5878DAA8291AE76700DD95A3 /* QuickOpenItem.swift in Sources */,
27392777
58FD7608291EA1CB0051D6E4 /* CommandPaletteViewModel.swift in Sources */,
@@ -2755,6 +2793,7 @@
27552793
58F2EB07292FB2B0004A9BDE /* GeneralPreferences.swift in Sources */,
27562794
587B9E9A29301D8F00AC7927 /* GitType.swift in Sources */,
27572795
58D01C97293167DC00C5B6B4 /* String+SHA256.swift in Sources */,
2796+
2806E904297958B9000040F4 /* ContributorRowView.swift in Sources */,
27582797
587B9E7629301D8F00AC7927 /* GitTime.swift in Sources */,
27592798
2072FA16280D83A500C7F8D4 /* FileTypeList.swift in Sources */,
27602799
587B9E5D29301D8F00AC7927 /* GitLabUserRouter.swift in Sources */,
@@ -2766,6 +2805,7 @@
27662805
B6EE989027E8879A00CDD8AB /* InspectorSidebarView.swift in Sources */,
27672806
587B9DA229300ABD00AC7927 /* EffectView.swift in Sources */,
27682807
6C97EBCC2978760400302F95 /* AcknowledgementsWindowController.swift in Sources */,
2808+
284DC84F2978B7B400BF2770 /* ContributorsView.swift in Sources */,
27692809
58798250292E78D80085B254 /* CodeFile.swift in Sources */,
27702810
5878DAA5291AE76700DD95A3 /* QuickOpenView.swift in Sources */,
27712811
201169D72837B2E300F92B46 /* SourceControlNavigatorView.swift in Sources */,
@@ -3702,7 +3742,7 @@
37023742
repositoryURL = "https://github.com/CodeEditApp/CodeEditSymbols";
37033743
requirement = {
37043744
kind = exactVersion;
3705-
version = 0.1.0;
3745+
version = 0.1.1;
37063746
};
37073747
};
37083748
287136B1292A407E00E9F5F4 /* XCRemoteSwiftPackageReference "SwiftLintPlugin" */ = {

CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CodeEdit/Features/About/Views/AboutView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public struct AboutView: View {
4646

4747
VStack {
4848
Button {
49-
49+
ContributorsView().showWindow(width: 300, height: 400)
5050
} label: {
5151
Text("Contributors")
5252
.foregroundColor(.primary)

CodeEdit/Features/About/Views/AboutWindowController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class AboutViewWindowController: NSWindowController {
3838
return nil
3939
}
4040

41-
window?.collectionBehavior = [.transient, .ignoresCycle]
41+
window?.collectionBehavior = [.managed, .ignoresCycle]
4242
window?.isMovableByWindowBackground = true
4343
window?.titlebarAppearsTransparent = true
4444
window?.titleVisibility = .hidden
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//
2+
// OffsettableScrollView.swift
3+
// CodeEdit
4+
//
5+
// Created by Lukas Pistrol on 19.01.23.
6+
//
7+
8+
import SwiftUI
9+
10+
private struct ScrollViewOffsetPreferenceKey: PreferenceKey {
11+
12+
static var defaultValue: CGPoint = .zero
13+
14+
static func reduce(value: inout CGPoint, nextValue: () -> CGPoint) { }
15+
}
16+
17+
struct OffsettableScrollView<T: View>: View {
18+
19+
let axes: Axis.Set
20+
let showsIndicator: Bool
21+
let onOffsetChanged: (CGPoint) -> Void
22+
let content: T
23+
24+
init(
25+
axes: Axis.Set = .vertical,
26+
showsIndicator: Bool = true,
27+
onOffsetChanged: @escaping (CGPoint) -> Void = { _ in },
28+
@ViewBuilder content: () -> T
29+
) {
30+
self.axes = axes
31+
self.showsIndicator = showsIndicator
32+
self.onOffsetChanged = onOffsetChanged
33+
self.content = content()
34+
}
35+
36+
var body: some View {
37+
ScrollView(axes, showsIndicators: showsIndicator) {
38+
GeometryReader { proxy in
39+
Color.clear.preference(
40+
key: ScrollViewOffsetPreferenceKey.self,
41+
value: proxy.frame(
42+
in: .named("ScrollViewOrigin")
43+
).origin
44+
)
45+
}
46+
.frame(width: 0, height: 0)
47+
content
48+
.padding(.top, -8)
49+
.padding(.bottom, -1)
50+
}
51+
.coordinateSpace(name: "ScrollViewOrigin")
52+
.onPreferenceChange(
53+
ScrollViewOffsetPreferenceKey.self,
54+
perform: onOffsetChanged
55+
)
56+
}
57+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
//
2+
// ContributorRowView.swift
3+
// CodeEdit
4+
//
5+
// Created by Lukas Pistrol on 19.01.23.
6+
//
7+
8+
import SwiftUI
9+
10+
struct ContributorRowView: View {
11+
12+
let contributor: Contributor
13+
14+
var body: some View {
15+
HStack {
16+
userImage
17+
VStack(alignment: .leading, spacing: 2) {
18+
HStack {
19+
Text(contributor.name)
20+
.font(.headline)
21+
}
22+
HStack(spacing: 3) {
23+
ForEach(contributor.contributions, id: \.self) { item in
24+
tag(item)
25+
}
26+
}
27+
}
28+
Spacer()
29+
HStack(alignment: .top) {
30+
if let profileURL = contributor.profileURL, profileURL != contributor.gitHubURL {
31+
ActionButton(url: profileURL, image: .init(systemName: "globe"))
32+
}
33+
if let gitHubURL = contributor.gitHubURL {
34+
ActionButton(url: gitHubURL, image: .github)
35+
}
36+
}
37+
}
38+
.padding(.horizontal)
39+
.padding(.vertical, 8)
40+
}
41+
42+
private var userImage: some View {
43+
AsyncImage(url: contributor.avatarURL) { image in
44+
image
45+
.resizable()
46+
.frame(width: 32, height: 32)
47+
.clipShape(Circle())
48+
} placeholder: {
49+
Image(systemName: "person.circle.fill")
50+
.resizable()
51+
.frame(width: 32, height: 32)
52+
}
53+
}
54+
55+
private func tag(_ item: Contributor.Contribution) -> some View {
56+
Text(item.rawValue.capitalized)
57+
.font(.caption)
58+
.padding(.horizontal, 6)
59+
.padding(.vertical, 1)
60+
.foregroundColor(item.color)
61+
.background {
62+
Capsule(style: .continuous)
63+
.strokeBorder(lineWidth: 1)
64+
.foregroundStyle(item.color)
65+
.opacity(0.8)
66+
}
67+
}
68+
69+
private struct ActionButton: View {
70+
@Environment(\.openURL) private var openURL
71+
@State private var hovering = false
72+
73+
let url: URL
74+
let image: Image
75+
76+
var body: some View {
77+
Button {
78+
openURL(url)
79+
} label: {
80+
image
81+
.imageScale(.large)
82+
.foregroundColor(hovering ? .primary : .secondary)
83+
}
84+
.buttonStyle(.plain)
85+
.onHover { hover in
86+
hovering = hover
87+
}
88+
}
89+
}
90+
}
91+
92+
struct ContributorRowView_Previews: PreviewProvider {
93+
static var previews: some View {
94+
let contributor = Contributor(
95+
login: "lukepistrol",
96+
name: "Lukas Pistrol",
97+
avatarURLString: "https://avatars.githubusercontent.com/u/9460130?v=4",
98+
profile: "http://lukaspistrol.com",
99+
contributions: [.infra, .test, .code]
100+
)
101+
ContributorRowView(contributor: contributor)
102+
.frame(width: 350)
103+
}
104+
}

0 commit comments

Comments
 (0)