Skip to content

Commit 9c020e6

Browse files
committed
better save dialogs
1 parent 8b0281f commit 9c020e6

File tree

1 file changed

+61
-16
lines changed

1 file changed

+61
-16
lines changed

haxe/ui/backend/SaveFileDialogImpl.hx

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package haxe.ui.backend;
22

33
#if !js
4+
import haxe.ui.containers.dialogs.Dialogs.FileDialogExtensionInfo;
5+
import haxe.ui.containers.dialogs.Dialogs.SelectedFileInfo;
46
import openfl.events.Event;
7+
import openfl.filesystem.File;
58
import openfl.net.FileFilter;
69
import openfl.net.FileReference;
710
import openfl.utils.ByteArray;
11+
12+
using StringTools;
813
#end
914

1015
class SaveFileDialogImpl extends SaveFileDialogBase {
@@ -34,26 +39,66 @@ class SaveFileDialogImpl extends SaveFileDialogBase {
3439

3540
#else
3641

37-
private var _fr:FileReference = null;
42+
private var _file:File;
3843

3944
public override function show() {
40-
if (fileInfo == null || (fileInfo.text == null && fileInfo.bytes == null)) {
41-
throw "Nothing to write";
45+
var extensions = null;
46+
if (options != null) {
47+
extensions = options.extensions;
4248
}
43-
44-
var data:Dynamic = fileInfo.text;
45-
if (data == null) {
46-
data = ByteArray.fromBytes(fileInfo.bytes);
49+
var data:Dynamic = null;
50+
var defaultFilename = null;
51+
if (fileInfo != null) {
52+
defaultFilename = fileInfo.name;
53+
if (fileInfo.text != null) {
54+
data = fileInfo.text;
55+
} else if (fileInfo.bytes != null) {
56+
data = ByteArray.fromBytes(fileInfo.bytes);
57+
}
58+
}
59+
60+
_file = new File();
61+
_file.addEventListener(Event.SELECT, onSelect, false, 0, true);
62+
_file.addEventListener(Event.CANCEL, onCancel, false, 0, true);
63+
if (data != null) {
64+
_file.save(data, defaultFilename);
65+
} else {
66+
_file.browse(buildFileFilters(extensions));
4767
}
48-
_fr = new FileReference();
49-
_fr.addEventListener(Event.SELECT, onSelect, false, 0, true);
50-
_fr.addEventListener(Event.CANCEL, onCancel, false, 0, true);
51-
_fr.save(data, fileInfo.name);
5268
}
5369

70+
private function buildFileFilters(extensions:Array<FileDialogExtensionInfo>):Array<FileFilter> {
71+
if (extensions == null) {
72+
return null;
73+
}
74+
75+
var fileFilters:Array<FileFilter> = [];
76+
for (extension in extensions) {
77+
var extensionList = extension.extension.split(",");
78+
var fileFilterExtensions = "";
79+
for (extensionItem in extensionList) {
80+
extensionItem = extensionItem.trim();
81+
if (extensionItem.length == 0) {
82+
continue;
83+
}
84+
85+
fileFilterExtensions += "*." + extensionItem + ";";
86+
}
87+
if (fileFilterExtensions.length != 0) {
88+
fileFilters.push(new FileFilter(extension.label, fileFilterExtensions));
89+
}
90+
91+
}
92+
return fileFilters;
93+
}
94+
5495
private function onSelect(e:Event) {
96+
var selectedFileInfo:SelectedFileInfo = {
97+
name: _file.name,
98+
fullPath: _file.nativePath
99+
}
55100
destroyFileRef();
56-
dialogConfirmed();
101+
dialogConfirmed(selectedFileInfo);
57102
}
58103

59104
private function onCancel(e:Event) {
@@ -62,13 +107,13 @@ class SaveFileDialogImpl extends SaveFileDialogBase {
62107
}
63108

64109
private function destroyFileRef() {
65-
if (_fr == null) {
110+
if (_file == null) {
66111
return;
67112
}
68113

69-
_fr.removeEventListener(Event.SELECT, onSelect);
70-
_fr.removeEventListener(Event.CANCEL, onCancel);
71-
_fr = null;
114+
_file.removeEventListener(Event.SELECT, onSelect);
115+
_file.removeEventListener(Event.CANCEL, onCancel);
116+
_file = null;
72117
}
73118

74119
#end

0 commit comments

Comments
 (0)