window-util.js 2.31 KB
Newer Older
liujiangnan's avatar
liujiangnan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
const { BrowserWindow } = require('electron');

/**
 * 窗口工具(主进程)
 * @author 陈皮皮 (ifaswind)
 * @version 20210825
 */
const WindowUtil = {

    /**
     * 最先打开的窗口
     * @returns {BrowserWindow}
     */
    getFirstWindow() {
        const wins = BrowserWindow.getAllWindows();
        return wins[wins.length - 1];
    },

    /**
     * 获取当前聚焦的窗口
     * @returns {BrowserWindow}
     */
    getFocusedWindow() {
        return BrowserWindow.getFocusedWindow();
    },

    /**
     * 计算窗口位置(相对于最先打开的窗口)
     * @param {[number, number]} size 窗口尺寸
     * @param {'top' | 'center'} anchor 锚点
     * @returns {[number, number]}
     */
    calcWindowPosition(size, anchor) {
        const win = WindowUtil.getFirstWindow();
        return WindowUtil.calcWindowPositionByTarget(size, anchor, win);
    },

    /**
     * 计算窗口位置(相对于当前聚焦的窗口)
     * @param {[number, number]} size 窗口尺寸
     * @param {'top' | 'center'} anchor 锚点
     * @returns {[number, number]}
     */
    calcWindowPositionByFocused(size, anchor) {
        const win = WindowUtil.getFocusedWindow();
        return WindowUtil.calcWindowPositionByTarget(size, anchor, win);
    },

    /**
     * 计算窗口位置(相对于当前聚焦的窗口)
     * @param {[number, number]} size 窗口尺寸
     * @param {'top' | 'center'} anchor 锚点
     * @param {BrowserWindow} win 目标窗口
     * @returns {[number, number]}
     */
    calcWindowPositionByTarget(size, anchor, win) {
        // 根据目标窗口的位置和尺寸来计算
        const winSize = win.getSize(),
            winPos = win.getPosition();
        // 注意:原点 (0, 0) 在屏幕左上角
        // 另外,窗口的位置值必须是整数,否则修改无效(像素的最小粒度为 1)
        const x = Math.floor(winPos[0] + (winSize[0] / 2) - (size[0] / 2));
        let y;
        switch (anchor) {
            case 'top': {
                y = Math.floor(winPos[1]);
                break;
            }
            default:
            case 'center': {
                y = Math.floor(winPos[1] + (winSize[1] / 2) - (size[1] / 2));
                break;
            }
        }
        return [x, y];
    },

};

module.exports = WindowUtil;