Adds a new "setSheetOffset" API to the `dialog` module, which allows you to change the attachment point for sheets on Mac OS X. I put the API on the dialog module, even though Mac OS X requires that the native window hold and return the desired offset.
1. I was originally hoping to make this an argument on the actual dialog.show* calls, but it seems the parameter set is defined in `libchromiumcontent` and I wasn't sure it would be appropriate to add there?
2. The API could also be on the BrowserWindow (eg `BrowserWindow.setSheetOffset`). I don't have a strong preference, but I think it's more discoverable on the `dialog` module.
}
}
+void SetSheetOffset(atom::NativeWindow* window, const double offset) {
+ window->SetSheetOffset(offset);
+}
+
void ShowOpenDialog(const std::string& title,
const base::FilePath& default_path,
const file_dialog::Filters& filters,
dict.SetMethod("showMessageBox", &ShowMessageBox);
dict.SetMethod("showErrorBox", &atom::ShowErrorBox);
dict.SetMethod("showOpenDialog", &ShowOpenDialog);
+ dict.SetMethod("setSheetOffset", &SetSheetOffset);
dict.SetMethod("showSaveDialog", &ShowSaveDialog);
}
return WindowSizeToContentSize(GetSize());
}
+void NativeWindow::SetSheetOffset(const double offset) {
+ sheet_offset_ = offset;
+}
+
+double NativeWindow::GetSheetOffset() {
+ return sheet_offset_;
+}
+
void NativeWindow::SetSizeConstraints(
const extensions::SizeConstraints& window_constraints) {
extensions::SizeConstraints content_constraints;
gfx::Size GetAspectRatioExtraSize();
void SetAspectRatio(double aspect_ratio, const gfx::Size& extra_size);
+ void SetSheetOffset(const double offset);
+ double GetSheetOffset();
+
base::WeakPtr<NativeWindow> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
// it should be cancelled when we can prove that the window is responsive.
base::CancelableClosure window_unresposive_closure_;
+ // Used to display sheets at the appropriate vertical offset
+ double sheet_offset_;
+
// Used to maintain the aspect ratio of a view which is inside of the
// content view.
double aspect_ratio_;
return NO;
}
+- (NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect {
+ rect.origin.y = window.contentView.frame.size.height - shell_->GetSheetOffset();
+ return rect;
+}
+
+
@end
@interface AtomNSWindow : NSWindow {
const dialog = require('electron').remote.dialog;
```
-**Note for OS X**: If you want to present dialogs as sheets, the only thing you
-have to do is provide a `BrowserWindow` reference in the `browserWindow`
-parameter.
-
## Methods
The `dialog` module has the following methods:
it is usually used to report errors in early stage of startup. If called
before the app `ready`event on Linux, the message will be emitted to stderr,
and no GUI dialog will appear.
+
+
+## Sheets
+
+On Mac OS X, dialogs are presented as sheets attached to a window if you provide
+a `BrowserWindow` reference in the `browserWindow` parameter, or modals if no
+window is provided.
+
+### `dialog.setSheetOffset(browserWindow, offset)`
+
+* `browserWindow` BrowserWindow (optional)
+
+Changes the attachment point for sheets on Mac OS X. By default, sheets are attached
+just below the window frame, but you may want to display them beneath a HTML-rendered
+toolbar. For example:
+```
+const {remote} = require('electron');
+const browserWindow = remote.getCurrentWindow();
+
+var toolbarRect = document.getElementById('toolbar').getBoundingClientRect();
+remote.dialog.setSheetOffset(browserWindow, toolbarRect.height);
+
+... show dialog ...
+```
}
module.exports = {
- showOpenDialog: function (...args) {
+ setSheetOffset: function(window, offset) {
+ return binding.setSheetOffset(window, offset)
+ },
+
+ showOpenDialog: function(...args) {
var prop, properties, value, wrappedCallback
checkAppInitialized()
let [window, options, callback] = parseArgs.apply(null, args)