Browse Source

feat: allow partial setting of window bounds (#15699)

Shelley Vohr 6 years ago
parent
commit
6fdbfdb835
3 changed files with 40 additions and 1 deletions
  1. 12 1
      docs/api/browser-window.md
  2. 9 0
      lib/browser/api/browser-window.js
  3. 19 0
      spec/api-browser-window-spec.js

+ 12 - 1
docs/api/browser-window.md

@@ -895,7 +895,18 @@ Closes the currently open [Quick Look][quick-look] panel.
 * `bounds` [Rectangle](structures/rectangle.md)
 * `animate` Boolean (optional) _macOS_
 
-Resizes and moves the window to the supplied bounds
+Resizes and moves the window to the supplied bounds. Any properties that are not supplied will default to their current values.
+
+```javascript
+const { BrowserWindow } = require('electron')
+const win = new BrowserWindow()
+ // set all bounds properties
+win.setBounds({ x: 440, y: 225, width: 800, height: 600 })
+ // set a single bounds property
+win.setBounds({ width: 200 })
+ // { x: 440, y: 225, width: 200, height: 600 }
+console.log(win.getBounds())
+```
 
 #### `win.getBounds()`
 

+ 9 - 0
lib/browser/api/browser-window.js

@@ -18,6 +18,15 @@ BrowserWindow.prototype._init = function () {
   // Create WebContentsView.
   this.setContentView(new WebContentsView(this.webContents))
 
+  const nativeSetBounds = this.setBounds
+  this.setBounds = (bounds, ...opts) => {
+    bounds = {
+      ...this.getBounds(),
+      ...bounds
+    }
+    nativeSetBounds.call(this, bounds, ...opts)
+  }
+
   // Make new windows requested by links behave like "window.open"
   this.webContents.on('-new-window', (event, url, frameName, disposition,
     additionalFeatures, postData,

+ 19 - 0
spec/api-browser-window-spec.js

@@ -526,6 +526,25 @@ describe('BrowserWindow module', () => {
     })
   })
 
+  describe('BrowserWindow.setBounds(bounds[, animate])', () => {
+    it('sets the window bounds with full bounds', () => {
+      const fullBounds = { x: 440, y: 225, width: 500, height: 400 }
+      w.setBounds(fullBounds)
+      assertBoundsEqual(w.getBounds(), fullBounds)
+    })
+
+    it('sets the window bounds with partial bounds', () => {
+      const fullBounds = { x: 440, y: 225, width: 500, height: 400 }
+      w.setBounds(fullBounds)
+
+      const boundsUpdate = { width: 200 }
+      w.setBounds(boundsUpdate)
+
+      const expectedBounds = Object.assign(fullBounds, boundsUpdate)
+      assertBoundsEqual(w.getBounds(), expectedBounds)
+    })
+  })
+
   describe('BrowserWindow.setSize(width, height)', () => {
     it('sets the window size', async () => {
       const size = [300, 400]