diff --git a/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj b/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj index dadb65a..846e2fd 100644 --- a/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj +++ b/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ 171BFDFA24D4AF8300888236 /* CollectionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BFDF924D4AF8300888236 /* CollectionListView.swift */; }; 171BFDFB24D4AF8300888236 /* CollectionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BFDF924D4AF8300888236 /* CollectionListView.swift */; }; 173E19D1254318F600440F0F /* RemoteChangePromptView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173E19D0254318F600440F0F /* RemoteChangePromptView.swift */; }; + 173E19E3254329CC00440F0F /* PostTextEditingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173E19E2254329CC00440F0F /* PostTextEditingView.swift */; }; 17480CA5251272EE00EB7765 /* Bundle+AppVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17480CA4251272EE00EB7765 /* Bundle+AppVersion.swift */; }; 17480CA6251272EE00EB7765 /* Bundle+AppVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17480CA4251272EE00EB7765 /* Bundle+AppVersion.swift */; }; 174D313224EC2831006CA9EE /* WriteFreelyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 174D313124EC2831006CA9EE /* WriteFreelyModel.swift */; }; @@ -44,7 +45,6 @@ 1756DC0224FEE18400207AB8 /* WFACollection+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1756DBFF24FEE18400207AB8 /* WFACollection+CoreDataClass.swift */; }; 1756DC0324FEE18400207AB8 /* WFACollection+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1756DC0024FEE18400207AB8 /* WFACollection+CoreDataProperties.swift */; }; 1756DC0424FEE18400207AB8 /* WFACollection+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1756DC0024FEE18400207AB8 /* WFACollection+CoreDataProperties.swift */; }; - 17582194251A4E53004FC441 /* UITextView+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17582193251A4E53004FC441 /* UITextView+Appearance.swift */; }; 1765F62A24E18EA200C9EBF0 /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1765F62924E18EA200C9EBF0 /* SidebarView.swift */; }; 1765F62B24E18EA200C9EBF0 /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1765F62924E18EA200C9EBF0 /* SidebarView.swift */; }; 17681E412519410E00D394AE /* UINavigationController+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17681E402519410E00D394AE /* UINavigationController+Appearance.swift */; }; @@ -119,6 +119,7 @@ 17120DB124E1E19C002B9F6C /* SettingsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsHeaderView.swift; sourceTree = ""; }; 171BFDF924D4AF8300888236 /* CollectionListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionListView.swift; sourceTree = ""; }; 173E19D0254318F600440F0F /* RemoteChangePromptView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteChangePromptView.swift; sourceTree = ""; }; + 173E19E2254329CC00440F0F /* PostTextEditingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostTextEditingView.swift; sourceTree = ""; }; 17480CA4251272EE00EB7765 /* Bundle+AppVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+AppVersion.swift"; sourceTree = ""; }; 174D313124EC2831006CA9EE /* WriteFreelyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteFreelyModel.swift; sourceTree = ""; }; 1753F6AB24E431CC00309365 /* MacPreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacPreferencesView.swift; sourceTree = ""; }; @@ -132,7 +133,6 @@ 1756DBB924FED45500207AB8 /* LocalStorageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalStorageManager.swift; sourceTree = ""; }; 1756DBFF24FEE18400207AB8 /* WFACollection+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WFACollection+CoreDataClass.swift"; sourceTree = SOURCE_ROOT; }; 1756DC0024FEE18400207AB8 /* WFACollection+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WFACollection+CoreDataProperties.swift"; sourceTree = SOURCE_ROOT; }; - 17582193251A4E53004FC441 /* UITextView+Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextView+Appearance.swift"; sourceTree = ""; }; 1765F62924E18EA200C9EBF0 /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = ""; }; 17681E402519410E00D394AE /* UINavigationController+Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+Appearance.swift"; sourceTree = ""; }; 17A5388724DDA31F00DEFF9A /* MacAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacAccountView.swift; sourceTree = ""; }; @@ -273,7 +273,6 @@ children = ( 1756AE8024CB844500FD7257 /* View+Keyboard.swift */, 17681E402519410E00D394AE /* UINavigationController+Appearance.swift */, - 17582193251A4E53004FC441 /* UITextView+Appearance.swift */, ); path = Extensions; sourceTree = ""; @@ -292,6 +291,7 @@ children = ( 1756AE7624CB2EDD00FD7257 /* PostEditorView.swift */, 173E19D0254318F600440F0F /* RemoteChangePromptView.swift */, + 173E19E2254329CC00440F0F /* PostTextEditingView.swift */, ); path = PostEditor; sourceTree = ""; @@ -699,7 +699,6 @@ 17B996DA2502D23E0017B536 /* WFAPost+CoreDataProperties.swift in Sources */, 1756AE7724CB2EDD00FD7257 /* PostEditorView.swift in Sources */, 17DF32D524C8CA3400BCE2E3 /* PostStatusBadgeView.swift in Sources */, - 17582194251A4E53004FC441 /* UITextView+Appearance.swift in Sources */, 17D435E824E3128F0036B539 /* PreferencesModel.swift in Sources */, 1765F62A24E18EA200C9EBF0 /* SidebarView.swift in Sources */, 1756AE7A24CB65DF00FD7257 /* PostListView.swift in Sources */, @@ -711,6 +710,7 @@ 17120DA224E1985C002B9F6C /* AccountModel.swift in Sources */, 17120DA324E19A42002B9F6C /* PreferencesView.swift in Sources */, 1756AE6E24CB255B00FD7257 /* PostListModel.swift in Sources */, + 173E19E3254329CC00440F0F /* PostTextEditingView.swift in Sources */, 174D313224EC2831006CA9EE /* WriteFreelyModel.swift in Sources */, 17C42E70250AA12300072984 /* NSManagedObjectContext+ExecuteAndMergeChanges.swift in Sources */, 17120DA124E19839002B9F6C /* AccountView.swift in Sources */, diff --git a/iOS/Extensions/UITextView+Appearance.swift b/iOS/Extensions/UITextView+Appearance.swift deleted file mode 100644 index 7c0553b..0000000 --- a/iOS/Extensions/UITextView+Appearance.swift +++ /dev/null @@ -1,9 +0,0 @@ -import UIKit - -extension UITextView { - override open func draw(_ rect: CGRect) { - super.draw(rect) - let appearance = UITextView.appearance() - appearance.backgroundColor = .clear - } -} diff --git a/iOS/PostEditor/PostEditorView.swift b/iOS/PostEditor/PostEditorView.swift index 34f583c..818d4bd 100644 --- a/iOS/PostEditor/PostEditorView.swift +++ b/iOS/PostEditor/PostEditorView.swift @@ -1,7 +1,6 @@ import SwiftUI struct PostEditorView: View { - private let bodyLineSpacing: CGFloat = 17 * 0.5 @EnvironmentObject var model: WriteFreelyModel @Environment(\.managedObjectContext) var moc @Environment(\.horizontalSizeClass) var horizontalSizeClass @@ -36,104 +35,11 @@ struct PostEditorView: View { } ) } - switch post.appearance { - case "sans": - TextField("Title (optional)", text: $post.title) - .padding(.horizontal, 4) - .font(.custom("OpenSans-Regular", size: 26, relativeTo: Font.TextStyle.largeTitle)) - .onChange(of: post.title) { _ in - if post.status == PostStatus.published.rawValue && !updatingTitleFromServer { - post.status = PostStatus.edited.rawValue - } - if updatingTitleFromServer { - updatingTitleFromServer = false - } - } - ZStack(alignment: .topLeading) { - if post.body.count == 0 { - Text("Write...") - .foregroundColor(Color(UIColor.placeholderText)) - .padding(.horizontal, 4) - .padding(.vertical, 8) - .font(.custom("OpenSans-Regular", size: 17, relativeTo: Font.TextStyle.body)) - } - TextEditor(text: $post.body) - .font(.custom("OpenSans-Regular", size: 17, relativeTo: Font.TextStyle.body)) - .lineSpacing(bodyLineSpacing) - .onChange(of: post.body) { _ in - if post.status == PostStatus.published.rawValue && !updatingBodyFromServer { - post.status = PostStatus.edited.rawValue - } - if updatingBodyFromServer { - updatingBodyFromServer = false - } - } - } - case "wrap", "mono", "code": - TextField("Title (optional)", text: $post.title) - .padding(.horizontal, 4) - .font(.custom("Hack", size: 26, relativeTo: Font.TextStyle.largeTitle)) - .onChange(of: post.title) { _ in - if post.status == PostStatus.published.rawValue && !updatingTitleFromServer { - post.status = PostStatus.edited.rawValue - } - if updatingTitleFromServer { - updatingTitleFromServer = false - } - } - ZStack(alignment: .topLeading) { - if post.body.count == 0 { - Text("Write...") - .foregroundColor(Color(UIColor.placeholderText)) - .padding(.horizontal, 4) - .padding(.vertical, 8) - .font(.custom("Hack", size: 17, relativeTo: Font.TextStyle.body)) - } - TextEditor(text: $post.body) - .font(.custom("Hack", size: 17, relativeTo: Font.TextStyle.body)) - .lineSpacing(bodyLineSpacing) - .onChange(of: post.body) { _ in - if post.status == PostStatus.published.rawValue && !updatingBodyFromServer { - post.status = PostStatus.edited.rawValue - } - if updatingBodyFromServer { - updatingBodyFromServer = false - } - } - } - default: - TextField("Title (optional)", text: $post.title) - .padding(.horizontal, 4) - .font(.custom("Lora", size: 26, relativeTo: Font.TextStyle.largeTitle)) - .onChange(of: post.title) { _ in - if post.status == PostStatus.published.rawValue && !updatingTitleFromServer { - post.status = PostStatus.edited.rawValue - } - if updatingTitleFromServer { - updatingTitleFromServer = false - } - } - ZStack(alignment: .topLeading) { - if post.body.count == 0 { - Text("Write...") - .foregroundColor(Color(UIColor.placeholderText)) - .padding(.horizontal, 4) - .padding(.vertical, 8) - .font(.custom("Lora", size: 17, relativeTo: Font.TextStyle.body)) - } - TextEditor(text: $post.body) - .font(.custom("Lora", size: 17, relativeTo: Font.TextStyle.body)) - .lineSpacing(bodyLineSpacing) - .onChange(of: post.body) { _ in - if post.status == PostStatus.published.rawValue && !updatingBodyFromServer { - post.status = PostStatus.edited.rawValue - } - if updatingBodyFromServer { - updatingBodyFromServer = false - } - } - } - } + PostTextEditingView( + post: _post, + updatingTitleFromServer: $updatingTitleFromServer, + updatingBodyFromServer: $updatingBodyFromServer + ) } .navigationBarTitleDisplayMode(.inline) .padding() diff --git a/iOS/PostEditor/PostTextEditingView.swift b/iOS/PostEditor/PostTextEditingView.swift new file mode 100644 index 0000000..d6770fb --- /dev/null +++ b/iOS/PostEditor/PostTextEditingView.swift @@ -0,0 +1,69 @@ +import SwiftUI + +enum PostAppearance: String { + case sans = "OpenSans-Regular" + case mono = "Hack" + case serif = "Lora" +} + +struct PostTextEditingView: View { + @ObservedObject var post: WFAPost + @Binding var updatingTitleFromServer: Bool + @Binding var updatingBodyFromServer: Bool + @State private var appearance: PostAppearance = .serif + private let bodyLineSpacingMultiplier: CGFloat = 0.5 + + init( + post: ObservedObject, + updatingTitleFromServer: Binding, + updatingBodyFromServer: Binding + ) { + self._post = post + self._updatingTitleFromServer = updatingTitleFromServer + self._updatingBodyFromServer = updatingBodyFromServer + UITextView.appearance().backgroundColor = .clear + } + + var body: some View { + VStack { + TextField("Title (optional)", text: $post.title) + .font(.custom(appearance.rawValue, size: 26, relativeTo: .largeTitle)) + .padding(.horizontal, 4) + .onChange(of: post.title) { _ in + if post.status == PostStatus.published.rawValue && !updatingTitleFromServer { + post.status = PostStatus.edited.rawValue + } + } + ZStack(alignment: .topLeading) { + if post.body.count == 0 { + Text("Write…") + .font(.custom(appearance.rawValue, size: 17, relativeTo: .body)) + .foregroundColor(Color(UIColor.placeholderText)) + .padding(.horizontal, 4) + .padding(.vertical, 8) + } + TextEditor(text: $post.body) + .font(.custom(appearance.rawValue, size: 17, relativeTo: .body)) + .lineSpacing(17 * bodyLineSpacingMultiplier) + .onChange(of: post.body) { _ in + if post.status == PostStatus.published.rawValue && !updatingBodyFromServer { + post.status = PostStatus.edited.rawValue + } + if updatingBodyFromServer { + updatingBodyFromServer = false + } + } + } + } + .onAppear(perform: { + switch post.appearance { + case "sans": + self.appearance = .sans + case "wrap", "mono", "code": + self.appearance = .mono + default: + self.appearance = .serif + } + }) + } +} diff --git a/iOS/PostEditor/RemoteChangePromptView.swift b/iOS/PostEditor/RemoteChangePromptView.swift index 0490330..0807155 100644 --- a/iOS/PostEditor/RemoteChangePromptView.swift +++ b/iOS/PostEditor/RemoteChangePromptView.swift @@ -6,7 +6,6 @@ enum RemotePostChangeType { } struct RemoteChangePromptView: View { - @EnvironmentObject var model: WriteFreelyModel @Environment(\.horizontalSizeClass) var horizontalSizeClass @State private var promptText: String = "This is placeholder prompt text. Replace it?" @State private var promptIcon: Image = Image(systemName: "questionmark.square.dashed")