mirror of
https://gitee.com/dromara/electron-egg.git
synced 2026-05-15 04:02:10 +08:00
325 lines
6.5 KiB
JavaScript
325 lines
6.5 KiB
JavaScript
'use strict';
|
||
|
||
const _ = require('lodash');
|
||
const path = require('path');
|
||
const {
|
||
app: electronApp, dialog, shell, Notification,
|
||
powerMonitor, screen, nativeTheme
|
||
} = require('electron');
|
||
// const { isProd, getBaseDir } = require('ee-core/ps');
|
||
// const { getConfig } = require('ee-core/config');
|
||
// const { isFileProtocol } = require('ee-core/utils/is');
|
||
const { windowService } = require('../service/os/window');
|
||
|
||
/**
|
||
* example
|
||
* @class
|
||
*/
|
||
class OsController {
|
||
|
||
/**
|
||
* 所有方法接收两个参数
|
||
* @param args 前端传的参数
|
||
* @param event - ipc通信时才有值。详情见:控制器文档
|
||
*/
|
||
|
||
/**
|
||
* 消息提示对话框
|
||
*/
|
||
messageShow() {
|
||
dialog.showMessageBoxSync({
|
||
type: 'info', // "none", "info", "error", "question" 或者 "warning"
|
||
title: '自定义标题-message',
|
||
message: '自定义消息内容',
|
||
detail: '其它的额外信息'
|
||
})
|
||
|
||
return '打开了消息框';
|
||
}
|
||
|
||
/**
|
||
* 消息提示与确认对话框
|
||
*/
|
||
messageShowConfirm() {
|
||
const res = dialog.showMessageBoxSync({
|
||
type: 'info',
|
||
title: '自定义标题-message',
|
||
message: '自定义消息内容',
|
||
detail: '其它的额外信息',
|
||
cancelId: 1, // 用于取消对话框的按钮的索引
|
||
defaultId: 0, // 设置默认选中的按钮
|
||
buttons: ['确认', '取消'], // 按钮及索引
|
||
})
|
||
let data = (res === 0) ? '点击确认按钮' : '点击取消按钮';
|
||
|
||
return data;
|
||
}
|
||
|
||
/**
|
||
* 选择目录
|
||
*/
|
||
selectFolder() {
|
||
const filePaths = dialog.showOpenDialogSync({
|
||
properties: ['openDirectory', 'createDirectory']
|
||
});
|
||
|
||
if (_.isEmpty(filePaths)) {
|
||
return null
|
||
}
|
||
|
||
return filePaths[0];
|
||
}
|
||
|
||
/**
|
||
* 打开目录
|
||
*/
|
||
openDirectory(args) {
|
||
const { id } = args;
|
||
if (!id) {
|
||
return false;
|
||
}
|
||
let dir = '';
|
||
if (path.isAbsolute(id)) {
|
||
dir = id;
|
||
} else {
|
||
dir = electronApp.getPath(id);
|
||
}
|
||
|
||
shell.openPath(dir);
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 选择图片
|
||
*/
|
||
selectPic() {
|
||
const filePaths = dialog.showOpenDialogSync({
|
||
title: 'select pic',
|
||
properties: ['openFile'],
|
||
filters: [
|
||
{ name: 'Images', extensions: ['jpg', 'png', 'gif'] },
|
||
]
|
||
});
|
||
if (_.isEmpty(filePaths)) {
|
||
return null
|
||
}
|
||
|
||
return filePaths[0];
|
||
}
|
||
|
||
/**
|
||
* 加载视图内容
|
||
*/
|
||
loadViewContent(args) {
|
||
const { type, content } = args;
|
||
let contentUrl = content;
|
||
if (type == 'html') {
|
||
contentUrl = path.join('file://', electronApp.getAppPath(), content);
|
||
}
|
||
|
||
Services.get('os').createBrowserView(contentUrl);
|
||
|
||
return true
|
||
}
|
||
|
||
/**
|
||
* 移除视图内容
|
||
*/
|
||
removeViewContent() {
|
||
Services.get('os').removeBrowserView();
|
||
return true
|
||
}
|
||
|
||
/**
|
||
* 打开新窗口
|
||
*/
|
||
createWindow(args) {
|
||
const wcid = windowService.createWindow(args);
|
||
return wcid;
|
||
}
|
||
|
||
/**
|
||
* Get Window contents id
|
||
*/
|
||
getWCid(args) {
|
||
const wcid = windowService.getWCid(args);
|
||
return wcid;
|
||
}
|
||
|
||
/**
|
||
* Realize communication between two windows through the transfer of the main process
|
||
*/
|
||
window1ToWindow2(args, event) {
|
||
windowService.communicate(args, event);
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* Realize communication between two windows through the transfer of the main process
|
||
*/
|
||
window2ToWindow1(args, event) {
|
||
windowService.communicate(args, event);
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* 创建系统通知
|
||
*/
|
||
sendNotification(args, event) {
|
||
const { title, subtitle, body, silent} = args;
|
||
|
||
if (!Notification.isSupported()) {
|
||
return '当前系统不支持通知';
|
||
}
|
||
|
||
let options = {};
|
||
if (!_.isEmpty(title)) {
|
||
options.title = title;
|
||
}
|
||
if (!_.isEmpty(subtitle)) {
|
||
options.subtitle = subtitle;
|
||
}
|
||
if (!_.isEmpty(body)) {
|
||
options.body = body;
|
||
}
|
||
if (!_.isEmpty(silent)) {
|
||
options.silent = silent;
|
||
}
|
||
|
||
Services.get('os').createNotification(options, event);
|
||
|
||
return true
|
||
}
|
||
|
||
/**
|
||
* 电源监控
|
||
*/
|
||
initPowerMonitor(args, event) {
|
||
const channel = 'controller.os.initPowerMonitor';
|
||
powerMonitor.on('on-ac', (e) => {
|
||
let data = {
|
||
type: 'on-ac',
|
||
msg: '接入了电源'
|
||
}
|
||
event.reply(`${channel}`, data)
|
||
});
|
||
|
||
powerMonitor.on('on-battery', (e) => {
|
||
let data = {
|
||
type: 'on-battery',
|
||
msg: '使用电池中'
|
||
}
|
||
event.reply(`${channel}`, data)
|
||
});
|
||
|
||
powerMonitor.on('lock-screen', (e) => {
|
||
let data = {
|
||
type: 'lock-screen',
|
||
msg: '锁屏了'
|
||
}
|
||
event.reply(`${channel}`, data)
|
||
});
|
||
|
||
powerMonitor.on('unlock-screen', (e) => {
|
||
let data = {
|
||
type: 'unlock-screen',
|
||
msg: '解锁了'
|
||
}
|
||
event.reply(`${channel}`, data)
|
||
});
|
||
|
||
return true
|
||
}
|
||
|
||
/**
|
||
* 获取屏幕信息
|
||
*/
|
||
getScreen(args) {
|
||
let data = [];
|
||
let res = {};
|
||
if (args == 0) {
|
||
let res = screen.getCursorScreenPoint();
|
||
data = [
|
||
{
|
||
title: '横坐标',
|
||
desc: res.x
|
||
},
|
||
{
|
||
title: '纵坐标',
|
||
desc: res.y
|
||
},
|
||
]
|
||
|
||
return data;
|
||
}
|
||
if (args == 1) {
|
||
res = screen.getPrimaryDisplay();
|
||
}
|
||
if (args == 2) {
|
||
let resArr = screen.getAllDisplays();
|
||
// 数组,只取一个吧
|
||
res = resArr[0];
|
||
}
|
||
// Log.info('[electron] [ipc] [example] [getScreen] res:', res);
|
||
data = [
|
||
{
|
||
title: '分辨率',
|
||
desc: res.bounds.width + ' x ' + res.bounds.height
|
||
},
|
||
{
|
||
title: '单色显示器',
|
||
desc: res.monochrome ? '是' : '否'
|
||
},
|
||
{
|
||
title: '色深',
|
||
desc: res. colorDepth
|
||
},
|
||
{
|
||
title: '色域',
|
||
desc: res.colorSpace
|
||
},
|
||
{
|
||
title: 'scaleFactor',
|
||
desc: res.scaleFactor
|
||
},
|
||
{
|
||
title: '加速器',
|
||
desc: res.accelerometerSupport
|
||
},
|
||
{
|
||
title: '触控',
|
||
desc: res.touchSupport == 'unknown' ? '不支持' : '支持'
|
||
},
|
||
]
|
||
|
||
return data;
|
||
}
|
||
|
||
/**
|
||
* 获取系统主题
|
||
*/
|
||
getTheme() {
|
||
let theme = 'system';
|
||
if (nativeTheme.shouldUseHighContrastColors) {
|
||
theme = 'light';
|
||
} else if (nativeTheme.shouldUseInvertedColorScheme) {
|
||
theme = 'dark';
|
||
}
|
||
|
||
return theme;
|
||
}
|
||
|
||
/**
|
||
* 设置系统主题
|
||
*/
|
||
setTheme(args) {
|
||
|
||
// TODO 好像没有什么明显效果
|
||
nativeTheme.themeSource = args;
|
||
|
||
return args;
|
||
}
|
||
}
|
||
|
||
OsController.toString = () => '[class OsController]';
|
||
module.exports = OsController;
|