diff --git a/lib/interfaces/renderer.go b/lib/interfaces/renderer.go index b487d2e38..1e83def2f 100644 --- a/lib/interfaces/renderer.go +++ b/lib/interfaces/renderer.go @@ -17,9 +17,9 @@ type Renderer interface { NotifyEvent(eventData *messages.EventData) error // Dialog Runtime - SelectFile(filter string) string + SelectFile(title string, filter string) string SelectDirectory() string - SelectSaveFile(filter string) string + SelectSaveFile(title string, filter string) string // Window Runtime SetColour(string) error diff --git a/lib/renderer/bridge/bridge.go b/lib/renderer/bridge/bridge.go index af827f25f..521e4bf00 100644 --- a/lib/renderer/bridge/bridge.go +++ b/lib/renderer/bridge/bridge.go @@ -114,7 +114,7 @@ func (h *Bridge) NewBinding(methodName string) error { // SelectFile is unsupported for Bridge but required // for the Renderer interface -func (h *Bridge) SelectFile(filter string) string { +func (h *Bridge) SelectFile(title string, filter string) string { h.log.Warn("SelectFile() unsupported in bridge mode") return "" } @@ -128,7 +128,7 @@ func (h *Bridge) SelectDirectory() string { // SelectSaveFile is unsupported for Bridge but required // for the Renderer interface -func (h *Bridge) SelectSaveFile(filter string) string { +func (h *Bridge) SelectSaveFile(title string, filter string) string { h.log.Warn("SelectSaveFile() unsupported in bridge mode") return "" } diff --git a/lib/renderer/webview.go b/lib/renderer/webview.go index 583f58cbb..6a27cdfef 100644 --- a/lib/renderer/webview.go +++ b/lib/renderer/webview.go @@ -245,7 +245,7 @@ func (w *WebView) NewBinding(methodName string) error { } // SelectFile opens a dialog that allows the user to select a file -func (w *WebView) SelectFile(filter string) string { +func (w *WebView) SelectFile(title string, filter string) string { var result string // We need to run this on the main thread, however Dispatch is @@ -255,7 +255,7 @@ func (w *WebView) SelectFile(filter string) string { wg.Add(1) go func() { w.window.Dispatch(func() { - result = w.window.Dialog(wv.DialogTypeOpen, 0, "Select File", "", filter) + result = w.window.Dialog(wv.DialogTypeOpen, 0, title, "", filter) wg.Done() }) }() @@ -282,7 +282,7 @@ func (w *WebView) SelectDirectory() string { } // SelectSaveFile opens a dialog that allows the user to select a file to save -func (w *WebView) SelectSaveFile(filter string) string { +func (w *WebView) SelectSaveFile(title string, filter string) string { var result string // We need to run this on the main thread, however Dispatch is // non-blocking so we launch this in a goroutine and wait for @@ -291,7 +291,7 @@ func (w *WebView) SelectSaveFile(filter string) string { wg.Add(1) go func() { w.window.Dispatch(func() { - result = w.window.Dialog(wv.DialogTypeSave, 0, "Save file", "", filter) + result = w.window.Dialog(wv.DialogTypeSave, 0, title, "", filter) wg.Done() }) }() diff --git a/lib/renderer/webview/webview.h b/lib/renderer/webview/webview.h index 1d5af3fd8..0a87cec58 100644 --- a/lib/renderer/webview/webview.h +++ b/lib/renderer/webview/webview.h @@ -1838,7 +1838,7 @@ struct webview_priv int i=0; char* token; char* filter_dup = strdup(filter); - for (count=1; filter[count]; filter[count]==',' ? count++ : *filter++); + for (count=1; filter[count]; filter[count]==',' ? count++ : *filter++); COMDLG_FILTERSPEC rgSpec[count]; char* filters[count]; token = strtok(filter_dup, ","); @@ -1976,7 +1976,7 @@ struct webview_priv (struct webview *)objc_getAssociatedObject(self, "webview"); webview_dialog(w, WEBVIEW_DIALOG_TYPE_OPEN, WEBVIEW_DIALOG_FLAG_FILE, "", "", - filename, 255); + filename, 255, ""); filename[255] = '\0'; if (strlen(filename) > 0) { @@ -2239,12 +2239,16 @@ struct webview_priv WEBVIEW_API void webview_dialog(struct webview *w, enum webview_dialog_type dlgtype, int flags, const char *title, const char *arg, - char *result, size_t resultsz) + char *result, size_t resultsz, char *filter) { if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN || dlgtype == WEBVIEW_DIALOG_TYPE_SAVE) { NSSavePanel *panel; + NSString *filter_str = [NSString stringWithUTF8String:filter]; + filter_str = [filter_str stringByReplacingOccurrencesOfString:@"*." + withString:@""]; + NSArray *fileTypes = [filter_str componentsSeparatedByString:@","]; if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN) { NSOpenPanel *openPanel = [NSOpenPanel openPanel]; @@ -2257,6 +2261,10 @@ struct webview_priv { [openPanel setCanChooseFiles:YES]; [openPanel setCanChooseDirectories:NO]; + if(filter[0] != NULL) + { + [openPanel setAllowedFileTypes:fileTypes]; + } } [openPanel setResolvesAliases:NO]; [openPanel setAllowsMultipleSelection:NO]; @@ -2270,6 +2278,10 @@ struct webview_priv [panel setShowsHiddenFiles:YES]; [panel setExtensionHidden:NO]; [panel setCanSelectHiddenExtension:NO]; + if(filter[0] != NULL) + { + [panel setAllowedFileTypes:fileTypes]; + } [panel setTreatsFilePackagesAsDirectories:YES]; [panel beginSheetModalForWindow:w->priv.window completionHandler:^(NSInteger result) { diff --git a/runtime/dialog.go b/runtime/dialog.go index 642b55d2c..f835af776 100644 --- a/runtime/dialog.go +++ b/runtime/dialog.go @@ -16,11 +16,15 @@ func NewDialog(renderer interfaces.Renderer) *Dialog { // SelectFile prompts the user to select a file func (r *Dialog) SelectFile(params ...string) string { + title := "Select File" filter := "" if len(params) > 0 { - filter = params[0] + title = params[0] } - return r.renderer.SelectFile(filter) + if len(params) > 1 { + filter = params[1] + } + return r.renderer.SelectFile(title, filter) } // SelectDirectory prompts the user to select a directory @@ -30,9 +34,13 @@ func (r *Dialog) SelectDirectory() string { // SelectSaveFile prompts the user to select a file for saving func (r *Dialog) SelectSaveFile(params ...string) string { + title := "Select Save" filter := "" if len(params) > 0 { - filter = params[0] + title = params[0] } - return r.renderer.SelectSaveFile(filter) + if len(params) > 1 { + filter = params[1] + } + return r.renderer.SelectSaveFile(title, filter) }