blob: 641a53474d8daa0c7124ffe76bfaf9c9f14b98f1 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
//
// ContentView.swift
// LibreEdit
//
// Created by Christian Cleberg on 2024-01-13.
//
import SwiftUI
import UniformTypeIdentifiers
struct TextFile: FileDocument {
// tell the system we support only plain text
static var readableContentTypes = [UTType.plainText]
// by default our document is empty
var text = ""
// a simple initializer that creates new, empty documents
init(initialText: String = "") {
text = initialText
}
// this initializer loads data that has been saved previously
init(configuration: ReadConfiguration) throws {
if let data = configuration.file.regularFileContents {
text = String(decoding: data, as: UTF8.self)
} else {
throw CocoaError(.fileReadCorruptFile)
}
}
// this will be called when the system wants to write our data to disk
func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
let data = Data(text.utf8)
return FileWrapper(regularFileWithContents: data)
}
}
func countWords(text: String) -> Int {
let words = text.split { $0 == " " || $0.isNewline }
return words.count
}
struct ContentView: View {
@Binding var document: TextFile
@State private var showingPopover = false
@State private var wordCount: Int = 0
var body: some View {
Text("\(wordCount) words")
.foregroundColor(Color.white)
.font(.headline)
.padding(.trailing)
.frame(maxWidth: .infinity, maxHeight: 50)
.background(Color.gray.opacity(0.3))
.padding(.top, 20)
TextEditor(text: $document.text)
.onAppear {
self.wordCount = countWords(text: document.text)
}
.onChange(of: document.text) {
self.wordCount = countWords(text: document.text)
}
.toolbar {
ToolbarItemGroup(placement: .secondaryAction) {
Button {
showingPopover = true
} label: {
Text("More Info")
}.popover(isPresented: $showingPopover) {
VStack(alignment: .leading) {
Text("More Info")
.font(.largeTitle)
Text("")
Text("Instructions")
.font(.title)
Text("")
Text("LibreEdit provides a direct interface with the Apple Files app on your iPhone. Simply navigate to your preferred directory, edit existing files, or create new files!")
Text("")
Text("Developer")
.font(.title)
Text("")
Text("LibreEdit is a free and open source text editor for iOS built by [Christian Cleberg](https://cleberg.net).")
Text("")
Text("Visit the [GitHub Repository](https://github.com/ccleberg/ios-edit) to view the source code.")
Text("")
Text("This project was developed under the [GNU GPL v3 license](https://github.com/ccleberg/ios-edit/LICENSE).")
Spacer()
}
.padding()
}
}
}
}
}
|