Skip to content

Commit 76af65e

Browse files
authored
Merge pull request #29 from dteoh/28-enable-io
Enable preferences import + export
2 parents 63cba93 + bb94b9e commit 76af65e

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

devdocs-macos/DocumentationViewController.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class DocumentationViewController: NSViewController {
1818
case ready
1919
}
2020

21+
weak var delegate: DocumentationViewDelegate?
2122
private var webView: WKWebView!
2223
private var searchCVC: SearchControlViewController?
2324

@@ -140,6 +141,10 @@ class DocumentationViewController: NSViewController {
140141
}
141142
}
142143

144+
func overridePreferencesExport() {
145+
webView.evaluateJavaScript("overridePreferencesExport();")
146+
}
147+
143148
private func addFeatureScripts(_ controller: WKUserContentController) {
144149
if let pageObserverScript = readUserScript("page-observer") {
145150
let pageObserver = WKUserScript(source: pageObserverScript,
@@ -201,6 +206,19 @@ class DocumentationViewController: NSViewController {
201206
private func handleAppReboot() {
202207
webView.reload()
203208
}
209+
210+
private func handleExportPreferences(_ args: [AnyHashable: Any]) {
211+
guard let preferences = args["preferences"] as! String? else {
212+
return
213+
}
214+
delegate?.savePreferencesToFile(preferences)
215+
}
216+
}
217+
218+
protocol DocumentationViewDelegate: class {
219+
typealias OpenPanelParameters = WKOpenPanelParameters
220+
func selectFileToOpen(_ parameters: OpenPanelParameters, completionHandler: @escaping ([URL]?) -> Void)
221+
func savePreferencesToFile(_ preferences: String)
204222
}
205223

206224
// MARK:- WKUIDelegate
@@ -229,6 +247,13 @@ extension DocumentationViewController: WKUIDelegate {
229247

230248
return nil
231249
}
250+
251+
func webView(_ webView: WKWebView,
252+
runOpenPanelWith parameters: WKOpenPanelParameters,
253+
initiatedByFrame frame: WKFrameInfo,
254+
completionHandler: @escaping ([URL]?) -> Void) {
255+
delegate?.selectFileToOpen(parameters, completionHandler: completionHandler)
256+
}
232257
}
233258

234259
// MARK:- WKNavigationDelegate
@@ -264,6 +289,11 @@ extension DocumentationViewController: WKScriptMessageHandler {
264289
handleLocationNotification(args)
265290
case "appReboot":
266291
handleAppReboot()
292+
case "exportPreferences":
293+
guard let args = msg["args"] as? [AnyHashable: Any] else {
294+
return
295+
}
296+
handleExportPreferences(args)
267297
default:
268298
return
269299
}

devdocs-macos/DocumentationWindowController.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class DocumentationWindowController: NSWindowController {
1414

1515
override func awakeFromNib() {
1616
guard let dvc = documentationViewController else { return }
17+
dvc.delegate = self
1718
dvc.documentURL = documentation.url
1819
}
1920

@@ -56,6 +57,7 @@ class DocumentationWindowController: NSWindowController {
5657
return
5758
}
5859

60+
dvc.overridePreferencesExport()
5961
dvc.useNativeScrollbars(true)
6062

6163
guard let window = self.window else { return }
@@ -110,3 +112,40 @@ class DocumentationWindowController: NSWindowController {
110112
)
111113
}
112114
}
115+
116+
// MARK:- DocumentationViewDelegate
117+
extension DocumentationWindowController: DocumentationViewDelegate {
118+
func selectFileToOpen(_ parameters: OpenPanelParameters, completionHandler: @escaping ([URL]?) -> Void) {
119+
let panel = NSOpenPanel()
120+
panel.canChooseFiles = true
121+
panel.canChooseDirectories = parameters.allowsDirectories
122+
panel.allowsMultipleSelection = parameters.allowsMultipleSelection
123+
panel.allowedFileTypes = ["json"]
124+
panel.allowsOtherFileTypes = false
125+
panel.resolvesAliases = true
126+
127+
panel.beginSheetModal(for: self.window!) { modalResponse in
128+
if modalResponse == NSApplication.ModalResponse.OK, let url = panel.url {
129+
completionHandler([url])
130+
}
131+
}
132+
}
133+
134+
func savePreferencesToFile(_ preferences: String) {
135+
let panel = NSSavePanel()
136+
panel.nameFieldStringValue = "devdocs-preferences.json"
137+
panel.allowedFileTypes = ["json"]
138+
panel.allowsOtherFileTypes = false
139+
panel.isExtensionHidden = false
140+
141+
panel.beginSheetModal(for: self.window!) { modalResponse in
142+
if modalResponse == NSApplication.ModalResponse.OK, let url = panel.url {
143+
do {
144+
try preferences.write(to: url, atomically: true, encoding: .utf8)
145+
} catch {
146+
NSApplication.shared.presentError(error)
147+
}
148+
}
149+
}
150+
}
151+
}

devdocs-macos/user-scripts/ui-settings.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,17 @@ window.useNativeScrollbars = function (enable) {
2020
sp.toggleLayout('_native-scrollbars', enable)
2121
})
2222
}
23+
24+
window.overridePreferencesExport = function () {
25+
requestAnimationFrame(() => {
26+
app.document.content.settingsPage.export = () => {
27+
const preferences = JSON.stringify(app.settings.export())
28+
window.webkit.messageHandlers.vcBus.postMessage({
29+
type: 'exportPreferences',
30+
args: {
31+
preferences
32+
}
33+
})
34+
}
35+
})
36+
}

0 commit comments

Comments
 (0)