window-util.js 2.31 KB
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;