Skip to content

Commit e464603

Browse files
KihronFastestMolasses
authored andcommitted
Fix Getting Stuck in Sub-View within Settings (#2038)
### Description This pull request resolves several navigation related bugs within Settings. The most important being that it resolves getting suck within sub views. Additionally, I've improved how hiding the sidebar toggle works which is now consistently hidden regardless of macOS 13+. It now no longer makes unexpected returns or cameos. ### Related Issues * closes #1923 ### Checklist - [X] I read and understood the [contributing guide](https://github.com/CodeEditApp/CodeEdit/blob/main/CONTRIBUTING.md) as well as the [code of conduct](https://github.com/CodeEditApp/CodeEdit/blob/main/CODE_OF_CONDUCT.md) - [X] The issues this PR addresses are related to each other - [X] My changes generate no new warnings - [X] My code builds and runs on my machine - [X] My changes are all related to the related issue above - [X] I documented my code ### Screenshots https://github.com/user-attachments/assets/f92bcc49-b397-4e33-85c5-06d0873e6b10
1 parent 89c6cc5 commit e464603

File tree

4 files changed

+41
-37
lines changed

4 files changed

+41
-37
lines changed

CodeEdit/Features/Settings/SettingsView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,11 @@ struct SettingsView: View {
193193
}
194194
}
195195
.navigationSplitViewColumnWidth(500)
196-
.hideSidebarToggle()
197196
.onAppear {
198197
model.backButtonVisible = false
199198
}
200199
}
200+
.hideSidebarToggle()
201201
.navigationTitle(selectedPage.name.rawValue)
202202
.toolbar {
203203
ToolbarItem(placement: .navigation) {

CodeEdit/Features/Settings/Views/SettingsForm.swift

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,41 @@ struct SettingsForm<Content: View>: View {
1717
@ViewBuilder var content: Content
1818

1919
var body: some View {
20-
Form {
21-
Section {
22-
EmptyView()
23-
} footer: {
24-
Rectangle()
25-
.frame(height: 0)
26-
.background(
27-
GeometryReader {
28-
Color.clear.preference(
29-
key: ViewOffsetKey.self,
30-
value: -$0.frame(in: .named("scroll")).origin.y
31-
)
32-
}
33-
)
34-
.onPreferenceChange(ViewOffsetKey.self) {
35-
if $0 <= -20.0 && !model.scrolledToTop {
36-
withAnimation {
37-
model.scrolledToTop = true
20+
NavigationStack {
21+
Form {
22+
Section {
23+
EmptyView()
24+
} footer: {
25+
Rectangle()
26+
.frame(height: 0)
27+
.background(
28+
GeometryReader {
29+
Color.clear.preference(
30+
key: ViewOffsetKey.self,
31+
value: -$0.frame(in: .named("scroll")).origin.y
32+
)
3833
}
39-
} else if $0 > -20.0 && model.scrolledToTop {
40-
withAnimation {
41-
model.scrolledToTop = false
34+
)
35+
.onPreferenceChange(ViewOffsetKey.self) {
36+
if $0 <= -20.0 && !model.scrolledToTop {
37+
withAnimation {
38+
model.scrolledToTop = true
39+
}
40+
} else if $0 > -20.0 && model.scrolledToTop {
41+
withAnimation {
42+
model.scrolledToTop = false
43+
}
4244
}
4345
}
44-
}
46+
}
47+
content
4548
}
46-
content
47-
}
48-
.introspect(.scrollView, on: .macOS(.v10_15, .v11, .v12, .v13, .v14, .v15)) {
49-
$0.scrollerInsets.top = 50
49+
.introspect(.scrollView, on: .macOS(.v10_15, .v11, .v12, .v13, .v14, .v15)) {
50+
$0.scrollerInsets.top = 50
51+
}
52+
.formStyle(.grouped)
53+
.coordinateSpace(name: "scroll")
5054
}
51-
.formStyle(.grouped)
52-
.coordinateSpace(name: "scroll")
5355
.safeAreaInset(edge: .top, spacing: -50) {
5456
EffectView(.menu)
5557
.opacity(!model.scrolledToTop ? 1 : 0)

CodeEdit/Features/Settings/Views/View+HideSidebarToggle.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import SwiftUI
9+
import SwiftUIIntrospect
910

1011
extension View {
1112
func hideSidebarToggle() -> some View {
@@ -16,12 +17,11 @@ extension View {
1617
struct HideSidebarToggleViewModifier: ViewModifier {
1718
func body(content: Content) -> some View {
1819
content
19-
.task {
20-
let window = NSApp.windows.first { $0.identifier?.rawValue == SceneID.settings.rawValue }!
21-
let sidebaritem = "com.apple.SwiftUI.navigationSplitView.toggleSidebar"
22-
let index = window.toolbar?.items.firstIndex { $0.itemIdentifier.rawValue == sidebaritem }
23-
if let index {
24-
window.toolbar?.removeItem(at: index)
20+
.introspect(.window, on: .macOS(.v13, .v14, .v15)) { window in
21+
if let toolbar = window.toolbar {
22+
let sidebarItem = "com.apple.SwiftUI.navigationSplitView.toggleSidebar"
23+
let sidebarToggle = toolbar.items.first(where: { $0.itemIdentifier.rawValue == sidebarItem })
24+
sidebarToggle?.view?.isHidden = true
2525
}
2626
}
2727
}

CodeEdit/Features/Settings/Views/View+NavigationBarBackButtonVisible.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,20 @@ struct NavigationBarBackButtonVisible: ViewModifier {
1717
.toolbar {
1818
ToolbarItem(placement: .navigation) {
1919
Button {
20-
print(self.presentationMode.wrappedValue)
2120
self.presentationMode.wrappedValue.dismiss()
2221
} label: {
2322
Image(systemName: "chevron.left")
2423
.frame(width: 23)
2524
}
2625
}
2726
}
28-
.hideSidebarToggle()
27+
.navigationBarBackButtonHidden()
2928
.onAppear {
3029
model.backButtonVisible = true
3130
}
31+
.onDisappear {
32+
model.backButtonVisible = false
33+
}
3234
}
3335
}
3436

0 commit comments

Comments
 (0)