From eaeecbb180c53b883203527760abcd7ce2d53198 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 19 Nov 2020 07:04:08 +1100 Subject: [PATCH] Support Dialog in runtime --- v2/internal/runtime/js/core/dialog.js | 51 +++++++++++++++++++-- v2/internal/runtime/js/runtime/dialog.js | 46 +++++++++++++++++-- v2/internal/runtime/js/runtime/package.json | 2 +- v2/internal/runtime/js/runtime/runtime.d.ts | 30 +++++++++++- v2/internal/subsystem/call.go | 19 ++++++++ v2/pkg/options/dialog.go | 2 +- v2/test/kitchensink/dialog.go | 9 ++-- 7 files changed, 145 insertions(+), 14 deletions(-) diff --git a/v2/internal/runtime/js/core/dialog.js b/v2/internal/runtime/js/core/dialog.js index 3d09594d..70103b66 100644 --- a/v2/internal/runtime/js/core/dialog.js +++ b/v2/internal/runtime/js/core/dialog.js @@ -10,14 +10,57 @@ The lightweight framework for web-like apps /* jshint esversion: 6 */ -import { SendMessage } from 'ipc'; +import { SystemCall } from './calls'; /** - * Open a dialog with the given parameters + * @type {Object} OpenDialog + * @param {string} [DefaultDirectory=""] + * @param {string} [DefaultFilename=""] + * @param {string} [Title=""] + * @param {string} [Filters=""] + * @param {bool} [AllowFiles=false] + * @param {bool} [AllowDirectories=false] + * @param {bool} [AllowMultiple=false] + * @param {bool} [ShowHiddenFiles=false] + * @param {bool} [CanCreateDirectories=false] + * @param {bool} [ResolvesAliases=false] - Mac Only: Resolves aliases (symlinks) + * @param {bool} [TreatPackagesAsDirectories=false] - Mac Only: Show packages (EG Applications) as folders + */ + + + +/** + * Opens a dialog using the given paramaters, prompting the user to + * select files/folders. * * @export - * @param {object} options + * @param {OpenDialogOptions} options + * @returns {Promise>} - List of files/folders selected */ export function Open(options) { - SendMessage('DO'+JSON.stringify(options)); + return SystemCall('Dialog.Open', options); +} + +/** + * + * @type {Object} SaveDialogOptions + * @param {string} [DefaultDirectory=""] + * @param {string} [DefaultFilename=""] + * @param {string} [Title=""] + * @param {string} [Filters=""] + * @param {bool} [ShowHiddenFiles=false] + * @param {bool} [CanCreateDirectories=false] + * @param {bool} [TreatPackagesAsDirectories=false] + */ + +/** + * Opens a dialog using the given paramaters, prompting the user to + * select a single file/folder. + * + * @export + * @param {SaveDialogOptions} options + * @returns {Promise} + */ +export function Save(options) { + return SystemCall('Dialog.Save', options); } diff --git a/v2/internal/runtime/js/runtime/dialog.js b/v2/internal/runtime/js/runtime/dialog.js index 0a78346d..8d2267a2 100644 --- a/v2/internal/runtime/js/runtime/dialog.js +++ b/v2/internal/runtime/js/runtime/dialog.js @@ -10,13 +10,53 @@ The lightweight framework for web-like apps /* jshint esversion: 6 */ +/** + * @type {Object} OpenDialog + * @param {string} [DefaultDirectory=""] + * @param {string} [DefaultFilename=""] + * @param {string} [Title=""] + * @param {string} [Filters=""] + * @param {bool} [AllowFiles=false] + * @param {bool} [AllowDirectories=false] + * @param {bool} [AllowMultiple=false] + * @param {bool} [ShowHiddenFiles=false] + * @param {bool} [CanCreateDirectories=false] + * @param {bool} [ResolvesAliases=false] - Mac Only: Resolves aliases (symlinks) + * @param {bool} [TreatPackagesAsDirectories=false] - Mac Only: Show packages (EG Applications) as folders + */ /** - * Open a dialog with the given parameters + * Opens a dialog using the given paramaters, prompting the user to + * select files/folders. * * @export - * @param {object} options + * @param {OpenDialogOptions} options + * @returns {Promise>} - List of files/folders selected */ export function Open(options) { - window.wails.Dialog.Open(options); + return window.wails.Dialog.Open(options); +} + +/** + * + * @type {Object} SaveDialogOptions + * @param {string} [DefaultDirectory=""] + * @param {string} [DefaultFilename=""] + * @param {string} [Title=""] + * @param {string} [Filters=""] + * @param {bool} [ShowHiddenFiles=false] + * @param {bool} [CanCreateDirectories=false] + * @param {bool} [TreatPackagesAsDirectories=false] + */ + +/** + * Opens a dialog using the given paramaters, prompting the user to + * select a single file/folder. + * + * @export + * @param {SaveDialogOptions} options + * @returns {Promise} + */ +export function Save(options) { + return window.wails.Dialog.Save(options); } diff --git a/v2/internal/runtime/js/runtime/package.json b/v2/internal/runtime/js/runtime/package.json index acd4898f..cef50629 100644 --- a/v2/internal/runtime/js/runtime/package.json +++ b/v2/internal/runtime/js/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@wails/runtime", - "version": "1.2.11", + "version": "1.2.12", "description": "Wails V2 Javascript runtime library", "main": "main.js", "types": "runtime.d.ts", diff --git a/v2/internal/runtime/js/runtime/runtime.d.ts b/v2/internal/runtime/js/runtime/runtime.d.ts index 64699cf0..1c8ad7c7 100644 --- a/v2/internal/runtime/js/runtime/runtime.d.ts +++ b/v2/internal/runtime/js/runtime/runtime.d.ts @@ -53,6 +53,30 @@ interface Level { ERROR: 5, } +interface OpenDialogOptions { + DefaultDirectory: string; + DefaultFilename: string; + Title: string; + Filters: string; + AllowFiles: boolean; + AllowDirectories: boolean; + AllowMultiple: boolean; + ShowHiddenFiles: boolean; + CanCreateDirectories: boolean; + ResolvesAliases: boolean; + TreatPackagesAsDirectories: boolean; +} + +interface SaveDialogOptions { + DefaultDirectory: string; + DefaultFilename: string; + Title: string; + Filters: string; + ShowHiddenFiles: boolean; + CanCreateDirectories: boolean; + TreatPackagesAsDirectories: boolean; +} + declare const wailsapp__runtime: { Browser: { Open(target: string): Promise; @@ -82,7 +106,11 @@ declare const wailsapp__runtime: { }; Store: { New(name: string, defaultValue?: any): Store; - } + }; + Dialog: { + Open(options: OpenDialogOptions): Promise>; + Save(options: SaveDialogOptions): Promise>; + }; }; diff --git a/v2/internal/subsystem/call.go b/v2/internal/subsystem/call.go index 0ae86a9b..8bab2b97 100644 --- a/v2/internal/subsystem/call.go +++ b/v2/internal/subsystem/call.go @@ -10,6 +10,7 @@ import ( "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" "github.com/wailsapp/wails/v2/internal/runtime" "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/pkg/options" ) // Call is the Call subsystem. It manages all service bus messages @@ -129,6 +130,24 @@ func (c *Call) processSystemCall(payload *message.CallMessage, clientID string) case "IsDarkMode": darkModeEnabled := c.runtime.System.IsDarkMode() c.sendResult(darkModeEnabled, payload, clientID) + case "Dialog.Open": + dialogOptions := new(options.OpenDialog) + err := json.Unmarshal(payload.Args[0], dialogOptions) + if err != nil { + c.logger.Error("Error decoding: %s", err) + } + result := c.runtime.Dialog.Open(dialogOptions) + c.sendResult(result, payload, clientID) + case "Dialog.Save": + dialogOptions := new(options.SaveDialog) + err := json.Unmarshal(payload.Args[0], dialogOptions) + if err != nil { + c.logger.Error("Error decoding: %s", err) + } + result := c.runtime.Dialog.Save(dialogOptions) + c.sendResult(result, payload, clientID) + default: + c.logger.Error("Unknown system call: %+v", callName) } } diff --git a/v2/pkg/options/dialog.go b/v2/pkg/options/dialog.go index 7371a989..0d289ba3 100644 --- a/v2/pkg/options/dialog.go +++ b/v2/pkg/options/dialog.go @@ -11,7 +11,7 @@ type OpenDialog struct { AllowMultiple bool ShowHiddenFiles bool CanCreateDirectories bool - ResolveAliases bool + ResolvesAliases bool TreatPackagesAsDirectories bool } diff --git a/v2/test/kitchensink/dialog.go b/v2/test/kitchensink/dialog.go index 5893d385..0e0a667c 100644 --- a/v2/test/kitchensink/dialog.go +++ b/v2/test/kitchensink/dialog.go @@ -1,8 +1,6 @@ package main import ( - "fmt" - wails "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" ) @@ -21,7 +19,10 @@ func (l *Dialog) WailsInit(runtime *wails.Runtime) error { // Open Dialog func (l *Dialog) Open(options *options.OpenDialog) []string { - fmt.Printf("%#v\n", options) - // Perform your setup here return l.runtime.Dialog.Open(options) } + +// Save Dialog +func (l *Dialog) Save(options *options.SaveDialog) string { + return l.runtime.Dialog.Save(options) +}