feat: add property customization to save dialogs (#19672)
This commit is contained in:
		
					parent
					
						
							
								e1824c00a9
							
						
					
				
			
			
				commit
				
					
						28466a39d8
					
				
			
		
					 8 changed files with 119 additions and 50 deletions
				
			
		| 
						 | 
					@ -171,6 +171,13 @@ dialog.showOpenDialog(mainWindow, {
 | 
				
			||||||
    displayed in front of the filename text field.
 | 
					    displayed in front of the filename text field.
 | 
				
			||||||
  * `showsTagField` Boolean (optional) _macOS_ - Show the tags input box,
 | 
					  * `showsTagField` Boolean (optional) _macOS_ - Show the tags input box,
 | 
				
			||||||
    defaults to `true`.
 | 
					    defaults to `true`.
 | 
				
			||||||
 | 
					  * `properties` String[] (optional)
 | 
				
			||||||
 | 
					    * `showHiddenFiles` - Show hidden files in dialog.
 | 
				
			||||||
 | 
					    * `createDirectory` _macOS_ - Allow creating new directories from dialog.
 | 
				
			||||||
 | 
					    * `treatPackageAsDirectory` _macOS_ - Treat packages, such as `.app` folders,
 | 
				
			||||||
 | 
					      as a directory instead of a file.
 | 
				
			||||||
 | 
					    * `showOverwriteConfirmation` _Linux_ - Sets whether the user will be presented a confirmation dialog if the user types a file name that already exists.
 | 
				
			||||||
 | 
					    * `dontAddToRecent` _Windows_ - Do not add the item being saved to the recent documents list.
 | 
				
			||||||
  * `securityScopedBookmarks` Boolean (optional) _macOS_ _mas_ - Create a [security scoped bookmark](https://developer.apple.com/library/content/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW16) when packaged for the Mac App Store. If this option is enabled and the file doesn't already exist a blank file will be created at the chosen path.
 | 
					  * `securityScopedBookmarks` Boolean (optional) _macOS_ _mas_ - Create a [security scoped bookmark](https://developer.apple.com/library/content/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW16) when packaged for the Mac App Store. If this option is enabled and the file doesn't already exist a blank file will be created at the chosen path.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Returns `String | undefined`, the path of the file chosen by the user; if the dialog is cancelled it returns `undefined`.
 | 
					Returns `String | undefined`, the path of the file chosen by the user; if the dialog is cancelled it returns `undefined`.
 | 
				
			||||||
| 
						 | 
					@ -193,8 +200,14 @@ The `filters` specifies an array of file types that can be displayed, see
 | 
				
			||||||
  * `message` String (optional) _macOS_ - Message to display above text fields.
 | 
					  * `message` String (optional) _macOS_ - Message to display above text fields.
 | 
				
			||||||
  * `nameFieldLabel` String (optional) _macOS_ - Custom label for the text
 | 
					  * `nameFieldLabel` String (optional) _macOS_ - Custom label for the text
 | 
				
			||||||
    displayed in front of the filename text field.
 | 
					    displayed in front of the filename text field.
 | 
				
			||||||
  * `showsTagField` Boolean (optional) _macOS_ - Show the tags input box,
 | 
					  * `showsTagField` Boolean (optional) _macOS_ - Show the tags input box, defaults to `true`.
 | 
				
			||||||
    defaults to `true`.
 | 
					  * `properties` String[] (optional)
 | 
				
			||||||
 | 
					    * `showHiddenFiles` - Show hidden files in dialog.
 | 
				
			||||||
 | 
					    * `createDirectory` _macOS_ - Allow creating new directories from dialog.
 | 
				
			||||||
 | 
					    * `treatPackageAsDirectory` _macOS_ - Treat packages, such as `.app` folders,
 | 
				
			||||||
 | 
					      as a directory instead of a file.
 | 
				
			||||||
 | 
					    * `showOverwriteConfirmation` _Linux_ - Sets whether the user will be presented a confirmation dialog if the user types a file name that already exists.
 | 
				
			||||||
 | 
					    * `dontAddToRecent` _Windows_ - Do not add the item being saved to the recent documents list.
 | 
				
			||||||
  * `securityScopedBookmarks` Boolean (optional) _macOS_ _mas_ - Create a [security scoped bookmark](https://developer.apple.com/library/content/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW16) when packaged for the Mac App Store. If this option is enabled and the file doesn't already exist a blank file will be created at the chosen path.
 | 
					  * `securityScopedBookmarks` Boolean (optional) _macOS_ _mas_ - Create a [security scoped bookmark](https://developer.apple.com/library/content/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW16) when packaged for the Mac App Store. If this option is enabled and the file doesn't already exist a blank file will be created at the chosen path.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Returns `Promise<Object>` - Resolve with an object containing the following:
 | 
					Returns `Promise<Object>` - Resolve with an object containing the following:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,20 @@ const { app, BrowserWindow, deprecate } = require('electron')
 | 
				
			||||||
const binding = process.electronBinding('dialog')
 | 
					const binding = process.electronBinding('dialog')
 | 
				
			||||||
const v8Util = process.electronBinding('v8_util')
 | 
					const v8Util = process.electronBinding('v8_util')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const fileDialogProperties = {
 | 
					const DialogType = {
 | 
				
			||||||
 | 
					  OPEN: 'OPEN',
 | 
				
			||||||
 | 
					  SAVE: 'SAVE'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const saveFileDialogProperties = {
 | 
				
			||||||
 | 
					  createDirectory: 1 << 0,
 | 
				
			||||||
 | 
					  showHiddenFiles: 1 << 1,
 | 
				
			||||||
 | 
					  treatPackageAsDirectory: 1 << 2,
 | 
				
			||||||
 | 
					  showOverwriteConfirmation: 1 << 3,
 | 
				
			||||||
 | 
					  dontAddToRecent: 1 << 4
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const openFileDialogProperties = {
 | 
				
			||||||
  openFile: 1 << 0,
 | 
					  openFile: 1 << 0,
 | 
				
			||||||
  openDirectory: 1 << 1,
 | 
					  openDirectory: 1 << 1,
 | 
				
			||||||
  multiSelections: 1 << 2,
 | 
					  multiSelections: 1 << 2,
 | 
				
			||||||
| 
						 | 
					@ -45,6 +58,16 @@ const checkAppInitialized = function () {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const setupDialogProperties = (type, properties) => {
 | 
				
			||||||
 | 
					  const dialogPropertiesTypes = (type === DialogType.OPEN) ? openFileDialogProperties : saveFileDialogProperties
 | 
				
			||||||
 | 
					  let dialogProperties = 0
 | 
				
			||||||
 | 
					  for (const prop in dialogPropertiesTypes) {
 | 
				
			||||||
 | 
					    if (properties.includes(prop)) {
 | 
				
			||||||
 | 
					      dialogProperties |= dialogPropertiesTypes[prop]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const saveDialog = (sync, window, options) => {
 | 
					const saveDialog = (sync, window, options) => {
 | 
				
			||||||
  checkAppInitialized()
 | 
					  checkAppInitialized()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +82,7 @@ const saveDialog = (sync, window, options) => {
 | 
				
			||||||
    buttonLabel = '',
 | 
					    buttonLabel = '',
 | 
				
			||||||
    defaultPath = '',
 | 
					    defaultPath = '',
 | 
				
			||||||
    filters = [],
 | 
					    filters = [],
 | 
				
			||||||
 | 
					    properties = [],
 | 
				
			||||||
    title = '',
 | 
					    title = '',
 | 
				
			||||||
    message = '',
 | 
					    message = '',
 | 
				
			||||||
    securityScopedBookmarks = false,
 | 
					    securityScopedBookmarks = false,
 | 
				
			||||||
| 
						 | 
					@ -73,6 +97,8 @@ const saveDialog = (sync, window, options) => {
 | 
				
			||||||
  if (typeof nameFieldLabel !== 'string') throw new TypeError('Name field label must be a string')
 | 
					  if (typeof nameFieldLabel !== 'string') throw new TypeError('Name field label must be a string')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const settings = { buttonLabel, defaultPath, filters, title, message, securityScopedBookmarks, nameFieldLabel, showsTagField, window }
 | 
					  const settings = { buttonLabel, defaultPath, filters, title, message, securityScopedBookmarks, nameFieldLabel, showsTagField, window }
 | 
				
			||||||
 | 
					  settings.properties = setupDialogProperties(DialogType.SAVE, properties)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (sync) ? binding.showSaveDialogSync(settings) : binding.showSaveDialog(settings)
 | 
					  return (sync) ? binding.showSaveDialogSync(settings) : binding.showSaveDialog(settings)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,20 +129,13 @@ const openDialog = (sync, window, options) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!Array.isArray(properties)) throw new TypeError('Properties must be an array')
 | 
					  if (!Array.isArray(properties)) throw new TypeError('Properties must be an array')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let dialogProperties = 0
 | 
					 | 
				
			||||||
  for (const prop in fileDialogProperties) {
 | 
					 | 
				
			||||||
    if (properties.includes(prop)) {
 | 
					 | 
				
			||||||
      dialogProperties |= fileDialogProperties[prop]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (typeof title !== 'string') throw new TypeError('Title must be a string')
 | 
					  if (typeof title !== 'string') throw new TypeError('Title must be a string')
 | 
				
			||||||
  if (typeof buttonLabel !== 'string') throw new TypeError('Button label must be a string')
 | 
					  if (typeof buttonLabel !== 'string') throw new TypeError('Button label must be a string')
 | 
				
			||||||
  if (typeof defaultPath !== 'string') throw new TypeError('Default path must be a string')
 | 
					  if (typeof defaultPath !== 'string') throw new TypeError('Default path must be a string')
 | 
				
			||||||
  if (typeof message !== 'string') throw new TypeError('Message must be a string')
 | 
					  if (typeof message !== 'string') throw new TypeError('Message must be a string')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const settings = { title, buttonLabel, defaultPath, filters, message, securityScopedBookmarks, window }
 | 
					  const settings = { title, buttonLabel, defaultPath, filters, message, securityScopedBookmarks, window }
 | 
				
			||||||
  settings.properties = dialogProperties
 | 
					  settings.properties = setupDialogProperties(DialogType.OPEN, properties)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (sync) ? binding.showOpenDialogSync(settings) : binding.showOpenDialog(settings)
 | 
					  return (sync) ? binding.showOpenDialogSync(settings) : binding.showOpenDialog(settings)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -455,7 +455,7 @@ void CommonWebContentsDelegate::DevToolsAddFileSystem(
 | 
				
			||||||
    file_dialog::DialogSettings settings;
 | 
					    file_dialog::DialogSettings settings;
 | 
				
			||||||
    settings.parent_window = owner_window();
 | 
					    settings.parent_window = owner_window();
 | 
				
			||||||
    settings.force_detached = offscreen_;
 | 
					    settings.force_detached = offscreen_;
 | 
				
			||||||
    settings.properties = file_dialog::FILE_DIALOG_OPEN_DIRECTORY;
 | 
					    settings.properties = file_dialog::OPEN_DIALOG_OPEN_DIRECTORY;
 | 
				
			||||||
    if (!file_dialog::ShowOpenDialogSync(settings, &paths))
 | 
					    if (!file_dialog::ShowOpenDialogSync(settings, &paths))
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,18 +24,26 @@ namespace file_dialog {
 | 
				
			||||||
typedef std::pair<std::string, std::vector<std::string>> Filter;
 | 
					typedef std::pair<std::string, std::vector<std::string>> Filter;
 | 
				
			||||||
typedef std::vector<Filter> Filters;
 | 
					typedef std::vector<Filter> Filters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FileDialogProperty {
 | 
					enum OpenFileDialogProperty {
 | 
				
			||||||
  FILE_DIALOG_OPEN_FILE = 1 << 0,
 | 
					  OPEN_DIALOG_OPEN_FILE = 1 << 0,
 | 
				
			||||||
  FILE_DIALOG_OPEN_DIRECTORY = 1 << 1,
 | 
					  OPEN_DIALOG_OPEN_DIRECTORY = 1 << 1,
 | 
				
			||||||
  FILE_DIALOG_MULTI_SELECTIONS = 1 << 2,
 | 
					  OPEN_DIALOG_MULTI_SELECTIONS = 1 << 2,
 | 
				
			||||||
  FILE_DIALOG_CREATE_DIRECTORY = 1 << 3,  // macOS
 | 
					  OPEN_DIALOG_CREATE_DIRECTORY = 1 << 3,  // macOS
 | 
				
			||||||
  FILE_DIALOG_SHOW_HIDDEN_FILES = 1 << 4,
 | 
					  OPEN_DIALOG_SHOW_HIDDEN_FILES = 1 << 4,
 | 
				
			||||||
  FILE_DIALOG_PROMPT_TO_CREATE = 1 << 5,                // Windows
 | 
					  OPEN_DIALOG_PROMPT_TO_CREATE = 1 << 5,                // Windows
 | 
				
			||||||
  FILE_DIALOG_NO_RESOLVE_ALIASES = 1 << 6,              // macOS
 | 
					  OPEN_DIALOG_NO_RESOLVE_ALIASES = 1 << 6,              // macOS
 | 
				
			||||||
  FILE_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY = 1 << 7,  // macOS
 | 
					  OPEN_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY = 1 << 7,  // macOS
 | 
				
			||||||
  FILE_DIALOG_DONT_ADD_TO_RECENT = 1 << 8,              // Windows
 | 
					  FILE_DIALOG_DONT_ADD_TO_RECENT = 1 << 8,              // Windows
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum SaveFileDialogProperty {
 | 
				
			||||||
 | 
					  SAVE_DIALOG_CREATE_DIRECTORY = 1 << 0,
 | 
				
			||||||
 | 
					  SAVE_DIALOG_SHOW_HIDDEN_FILES = 1 << 1,
 | 
				
			||||||
 | 
					  SAVE_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY = 1 << 2,  // macOS
 | 
				
			||||||
 | 
					  SAVE_DIALOG_SHOW_OVERWRITE_CONFIRMATION = 1 << 3,     // Linux
 | 
				
			||||||
 | 
					  SAVE_DIALOG_DONT_ADD_TO_RECENT = 1 << 4,              // Windows
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct DialogSettings {
 | 
					struct DialogSettings {
 | 
				
			||||||
  electron::NativeWindow* parent_window = nullptr;
 | 
					  electron::NativeWindow* parent_window = nullptr;
 | 
				
			||||||
  std::string title;
 | 
					  std::string title;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,15 +103,26 @@ class FileChooserDialog {
 | 
				
			||||||
      parent_->SetEnabled(true);
 | 
					      parent_->SetEnabled(true);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void SetupProperties(int properties) {
 | 
					  void SetupOpenProperties(int properties) {
 | 
				
			||||||
    const auto hasProp = [properties](FileDialogProperty prop) {
 | 
					    const auto hasProp = [properties](OpenFileDialogProperty prop) {
 | 
				
			||||||
      return gboolean((properties & prop) != 0);
 | 
					      return gboolean((properties & prop) != 0);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    auto* file_chooser = GTK_FILE_CHOOSER(dialog());
 | 
					    auto* file_chooser = GTK_FILE_CHOOSER(dialog());
 | 
				
			||||||
    gtk_file_chooser_set_select_multiple(file_chooser,
 | 
					    gtk_file_chooser_set_select_multiple(file_chooser,
 | 
				
			||||||
                                         hasProp(FILE_DIALOG_MULTI_SELECTIONS));
 | 
					                                         hasProp(OPEN_DIALOG_MULTI_SELECTIONS));
 | 
				
			||||||
    gtk_file_chooser_set_show_hidden(file_chooser,
 | 
					    gtk_file_chooser_set_show_hidden(file_chooser,
 | 
				
			||||||
                                     hasProp(FILE_DIALOG_SHOW_HIDDEN_FILES));
 | 
					                                     hasProp(OPEN_DIALOG_SHOW_HIDDEN_FILES));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetupSaveProperties(int properties) {
 | 
				
			||||||
 | 
					    const auto hasProp = [properties](SaveFileDialogProperty prop) {
 | 
				
			||||||
 | 
					      return gboolean((properties & prop) != 0);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    auto* file_chooser = GTK_FILE_CHOOSER(dialog());
 | 
				
			||||||
 | 
					    gtk_file_chooser_set_show_hidden(file_chooser,
 | 
				
			||||||
 | 
					                                     hasProp(SAVE_DIALOG_SHOW_HIDDEN_FILES));
 | 
				
			||||||
 | 
					    gtk_file_chooser_set_do_overwrite_confirmation(
 | 
				
			||||||
 | 
					        file_chooser, hasProp(SAVE_DIALOG_SHOW_OVERWRITE_CONFIRMATION));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void RunAsynchronous() {
 | 
					  void RunAsynchronous() {
 | 
				
			||||||
| 
						 | 
					@ -267,10 +278,10 @@ void FileChooserDialog::OnUpdatePreview(GtkWidget* chooser) {
 | 
				
			||||||
bool ShowOpenDialogSync(const DialogSettings& settings,
 | 
					bool ShowOpenDialogSync(const DialogSettings& settings,
 | 
				
			||||||
                        std::vector<base::FilePath>* paths) {
 | 
					                        std::vector<base::FilePath>* paths) {
 | 
				
			||||||
  GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
 | 
					  GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_OPEN_DIRECTORY)
 | 
					  if (settings.properties & OPEN_DIALOG_OPEN_DIRECTORY)
 | 
				
			||||||
    action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
 | 
					    action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
 | 
				
			||||||
  FileChooserDialog open_dialog(action, settings);
 | 
					  FileChooserDialog open_dialog(action, settings);
 | 
				
			||||||
  open_dialog.SetupProperties(settings.properties);
 | 
					  open_dialog.SetupOpenProperties(settings.properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gtk_widget_show_all(open_dialog.dialog());
 | 
					  gtk_widget_show_all(open_dialog.dialog());
 | 
				
			||||||
  int response = gtk_dialog_run(GTK_DIALOG(open_dialog.dialog()));
 | 
					  int response = gtk_dialog_run(GTK_DIALOG(open_dialog.dialog()));
 | 
				
			||||||
| 
						 | 
					@ -284,15 +295,17 @@ bool ShowOpenDialogSync(const DialogSettings& settings,
 | 
				
			||||||
void ShowOpenDialog(const DialogSettings& settings,
 | 
					void ShowOpenDialog(const DialogSettings& settings,
 | 
				
			||||||
                    electron::util::Promise promise) {
 | 
					                    electron::util::Promise promise) {
 | 
				
			||||||
  GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
 | 
					  GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_OPEN_DIRECTORY)
 | 
					  if (settings.properties & OPEN_DIALOG_OPEN_DIRECTORY)
 | 
				
			||||||
    action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
 | 
					    action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
 | 
				
			||||||
  FileChooserDialog* open_dialog = new FileChooserDialog(action, settings);
 | 
					  FileChooserDialog* open_dialog = new FileChooserDialog(action, settings);
 | 
				
			||||||
  open_dialog->SetupProperties(settings.properties);
 | 
					  open_dialog->SetupOpenProperties(settings.properties);
 | 
				
			||||||
  open_dialog->RunOpenAsynchronous(std::move(promise));
 | 
					  open_dialog->RunOpenAsynchronous(std::move(promise));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool ShowSaveDialogSync(const DialogSettings& settings, base::FilePath* path) {
 | 
					bool ShowSaveDialogSync(const DialogSettings& settings, base::FilePath* path) {
 | 
				
			||||||
  FileChooserDialog save_dialog(GTK_FILE_CHOOSER_ACTION_SAVE, settings);
 | 
					  FileChooserDialog save_dialog(GTK_FILE_CHOOSER_ACTION_SAVE, settings);
 | 
				
			||||||
 | 
					  save_dialog.SetupSaveProperties(settings.properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gtk_widget_show_all(save_dialog.dialog());
 | 
					  gtk_widget_show_all(save_dialog.dialog());
 | 
				
			||||||
  int response = gtk_dialog_run(GTK_DIALOG(save_dialog.dialog()));
 | 
					  int response = gtk_dialog_run(GTK_DIALOG(save_dialog.dialog()));
 | 
				
			||||||
  if (response == GTK_RESPONSE_ACCEPT) {
 | 
					  if (response == GTK_RESPONSE_ACCEPT) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,19 +191,28 @@ void SetupDialog(NSSavePanel* dialog, const DialogSettings& settings) {
 | 
				
			||||||
    [dialog setNameFieldStringValue:default_filename];
 | 
					    [dialog setNameFieldStringValue:default_filename];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SetupDialogForProperties(NSOpenPanel* dialog, int properties) {
 | 
					void SetupOpenDialogForProperties(NSOpenPanel* dialog, int properties) {
 | 
				
			||||||
  [dialog setCanChooseFiles:(properties & FILE_DIALOG_OPEN_FILE)];
 | 
					  [dialog setCanChooseFiles:(properties & OPEN_DIALOG_OPEN_FILE)];
 | 
				
			||||||
  if (properties & FILE_DIALOG_OPEN_DIRECTORY)
 | 
					  if (properties & OPEN_DIALOG_OPEN_DIRECTORY)
 | 
				
			||||||
    [dialog setCanChooseDirectories:YES];
 | 
					    [dialog setCanChooseDirectories:YES];
 | 
				
			||||||
  if (properties & FILE_DIALOG_CREATE_DIRECTORY)
 | 
					  if (properties & OPEN_DIALOG_CREATE_DIRECTORY)
 | 
				
			||||||
    [dialog setCanCreateDirectories:YES];
 | 
					    [dialog setCanCreateDirectories:YES];
 | 
				
			||||||
  if (properties & FILE_DIALOG_MULTI_SELECTIONS)
 | 
					  if (properties & OPEN_DIALOG_MULTI_SELECTIONS)
 | 
				
			||||||
    [dialog setAllowsMultipleSelection:YES];
 | 
					    [dialog setAllowsMultipleSelection:YES];
 | 
				
			||||||
  if (properties & FILE_DIALOG_SHOW_HIDDEN_FILES)
 | 
					  if (properties & OPEN_DIALOG_SHOW_HIDDEN_FILES)
 | 
				
			||||||
    [dialog setShowsHiddenFiles:YES];
 | 
					    [dialog setShowsHiddenFiles:YES];
 | 
				
			||||||
  if (properties & FILE_DIALOG_NO_RESOLVE_ALIASES)
 | 
					  if (properties & OPEN_DIALOG_NO_RESOLVE_ALIASES)
 | 
				
			||||||
    [dialog setResolvesAliases:NO];
 | 
					    [dialog setResolvesAliases:NO];
 | 
				
			||||||
  if (properties & FILE_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY)
 | 
					  if (properties & OPEN_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY)
 | 
				
			||||||
 | 
					    [dialog setTreatsFilePackagesAsDirectories:YES];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SetupSaveDialogForProperties(NSSavePanel* dialog, int properties) {
 | 
				
			||||||
 | 
					  if (properties & SAVE_DIALOG_CREATE_DIRECTORY)
 | 
				
			||||||
 | 
					    [dialog setCanCreateDirectories:YES];
 | 
				
			||||||
 | 
					  if (properties & SAVE_DIALOG_SHOW_HIDDEN_FILES)
 | 
				
			||||||
 | 
					    [dialog setShowsHiddenFiles:YES];
 | 
				
			||||||
 | 
					  if (properties & SAVE_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY)
 | 
				
			||||||
    [dialog setTreatsFilePackagesAsDirectories:YES];
 | 
					    [dialog setTreatsFilePackagesAsDirectories:YES];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -278,7 +287,7 @@ bool ShowOpenDialogSync(const DialogSettings& settings,
 | 
				
			||||||
  NSOpenPanel* dialog = [NSOpenPanel openPanel];
 | 
					  NSOpenPanel* dialog = [NSOpenPanel openPanel];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SetupDialog(dialog, settings);
 | 
					  SetupDialog(dialog, settings);
 | 
				
			||||||
  SetupDialogForProperties(dialog, settings.properties);
 | 
					  SetupOpenDialogForProperties(dialog, settings.properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int chosen = RunModalDialog(dialog, settings);
 | 
					  int chosen = RunModalDialog(dialog, settings);
 | 
				
			||||||
  if (chosen == NSFileHandlingPanelCancelButton)
 | 
					  if (chosen == NSFileHandlingPanelCancelButton)
 | 
				
			||||||
| 
						 | 
					@ -324,7 +333,7 @@ void ShowOpenDialog(const DialogSettings& settings,
 | 
				
			||||||
  NSOpenPanel* dialog = [NSOpenPanel openPanel];
 | 
					  NSOpenPanel* dialog = [NSOpenPanel openPanel];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SetupDialog(dialog, settings);
 | 
					  SetupDialog(dialog, settings);
 | 
				
			||||||
  SetupDialogForProperties(dialog, settings.properties);
 | 
					  SetupOpenDialogForProperties(dialog, settings.properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Capture the value of the security_scoped_bookmarks settings flag
 | 
					  // Capture the value of the security_scoped_bookmarks settings flag
 | 
				
			||||||
  // and pass it to the completion handler.
 | 
					  // and pass it to the completion handler.
 | 
				
			||||||
| 
						 | 
					@ -355,6 +364,7 @@ bool ShowSaveDialogSync(const DialogSettings& settings, base::FilePath* path) {
 | 
				
			||||||
  NSSavePanel* dialog = [NSSavePanel savePanel];
 | 
					  NSSavePanel* dialog = [NSSavePanel savePanel];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SetupDialog(dialog, settings);
 | 
					  SetupDialog(dialog, settings);
 | 
				
			||||||
 | 
					  SetupSaveDialogForProperties(dialog, settings.properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int chosen = RunModalDialog(dialog, settings);
 | 
					  int chosen = RunModalDialog(dialog, settings);
 | 
				
			||||||
  if (chosen == NSFileHandlingPanelCancelButton || ![[dialog URL] isFileURL])
 | 
					  if (chosen == NSFileHandlingPanelCancelButton || ![[dialog URL] isFileURL])
 | 
				
			||||||
| 
						 | 
					@ -395,6 +405,7 @@ void ShowSaveDialog(const DialogSettings& settings,
 | 
				
			||||||
  NSSavePanel* dialog = [NSSavePanel savePanel];
 | 
					  NSSavePanel* dialog = [NSSavePanel savePanel];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SetupDialog(dialog, settings);
 | 
					  SetupDialog(dialog, settings);
 | 
				
			||||||
 | 
					  SetupSaveDialogForProperties(dialog, settings.properties);
 | 
				
			||||||
  [dialog setCanSelectHiddenExtension:YES];
 | 
					  [dialog setCanSelectHiddenExtension:YES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Capture the value of the security_scoped_bookmarks settings flag
 | 
					  // Capture the value of the security_scoped_bookmarks settings flag
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -226,13 +226,13 @@ bool ShowOpenDialogSync(const DialogSettings& settings,
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DWORD options = FOS_FORCEFILESYSTEM | FOS_FILEMUSTEXIST;
 | 
					  DWORD options = FOS_FORCEFILESYSTEM | FOS_FILEMUSTEXIST;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_OPEN_DIRECTORY)
 | 
					  if (settings.properties & OPEN_DIALOG_OPEN_DIRECTORY)
 | 
				
			||||||
    options |= FOS_PICKFOLDERS;
 | 
					    options |= FOS_PICKFOLDERS;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_MULTI_SELECTIONS)
 | 
					  if (settings.properties & OPEN_DIALOG_MULTI_SELECTIONS)
 | 
				
			||||||
    options |= FOS_ALLOWMULTISELECT;
 | 
					    options |= FOS_ALLOWMULTISELECT;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_SHOW_HIDDEN_FILES)
 | 
					  if (settings.properties & OPEN_DIALOG_SHOW_HIDDEN_FILES)
 | 
				
			||||||
    options |= FOS_FORCESHOWHIDDEN;
 | 
					    options |= FOS_FORCESHOWHIDDEN;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_PROMPT_TO_CREATE)
 | 
					  if (settings.properties & OPEN_DIALOG_PROMPT_TO_CREATE)
 | 
				
			||||||
    options |= FOS_CREATEPROMPT;
 | 
					    options |= FOS_CREATEPROMPT;
 | 
				
			||||||
  if (settings.properties & FILE_DIALOG_DONT_ADD_TO_RECENT)
 | 
					  if (settings.properties & FILE_DIALOG_DONT_ADD_TO_RECENT)
 | 
				
			||||||
    options |= FOS_DONTADDTORECENT;
 | 
					    options |= FOS_DONTADDTORECENT;
 | 
				
			||||||
| 
						 | 
					@ -294,8 +294,13 @@ bool ShowSaveDialogSync(const DialogSettings& settings, base::FilePath* path) {
 | 
				
			||||||
  if (FAILED(hr))
 | 
					  if (FAILED(hr))
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  file_save_dialog->SetOptions(FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST |
 | 
					  DWORD options = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT;
 | 
				
			||||||
                               FOS_OVERWRITEPROMPT);
 | 
					  if (settings.properties & SAVE_DIALOG_SHOW_HIDDEN_FILES)
 | 
				
			||||||
 | 
					    options |= FOS_FORCESHOWHIDDEN;
 | 
				
			||||||
 | 
					  if (settings.properties & SAVE_DIALOG_DONT_ADD_TO_RECENT)
 | 
				
			||||||
 | 
					    options |= FOS_DONTADDTORECENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  file_save_dialog->SetOptions(options);
 | 
				
			||||||
  ApplySettings(file_save_dialog, settings);
 | 
					  ApplySettings(file_save_dialog, settings);
 | 
				
			||||||
  hr = ShowFileDialog(file_save_dialog, settings);
 | 
					  hr = ShowFileDialog(file_save_dialog, settings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,17 +301,17 @@ void WebDialogHelper::RunFileChooser(
 | 
				
			||||||
    settings.default_path = params.default_file_name;
 | 
					    settings.default_path = params.default_file_name;
 | 
				
			||||||
    file_select_helper->ShowSaveDialog(settings);
 | 
					    file_select_helper->ShowSaveDialog(settings);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    int flags = file_dialog::FILE_DIALOG_CREATE_DIRECTORY;
 | 
					    int flags = file_dialog::OPEN_DIALOG_CREATE_DIRECTORY;
 | 
				
			||||||
    switch (params.mode) {
 | 
					    switch (params.mode) {
 | 
				
			||||||
      case FileChooserParams::Mode::kOpenMultiple:
 | 
					      case FileChooserParams::Mode::kOpenMultiple:
 | 
				
			||||||
        flags |= file_dialog::FILE_DIALOG_MULTI_SELECTIONS;
 | 
					        flags |= file_dialog::OPEN_DIALOG_MULTI_SELECTIONS;
 | 
				
			||||||
        FALLTHROUGH;
 | 
					        FALLTHROUGH;
 | 
				
			||||||
      case FileChooserParams::Mode::kOpen:
 | 
					      case FileChooserParams::Mode::kOpen:
 | 
				
			||||||
        flags |= file_dialog::FILE_DIALOG_OPEN_FILE;
 | 
					        flags |= file_dialog::OPEN_DIALOG_OPEN_FILE;
 | 
				
			||||||
        flags |= file_dialog::FILE_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY;
 | 
					        flags |= file_dialog::OPEN_DIALOG_TREAT_PACKAGE_APP_AS_DIRECTORY;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case FileChooserParams::Mode::kUploadFolder:
 | 
					      case FileChooserParams::Mode::kUploadFolder:
 | 
				
			||||||
        flags |= file_dialog::FILE_DIALOG_OPEN_DIRECTORY;
 | 
					        flags |= file_dialog::OPEN_DIALOG_OPEN_DIRECTORY;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        NOTREACHED();
 | 
					        NOTREACHED();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue