Merge pull request #28 from clouDr-f2e/dev

Dev
This commit is contained in:
木偶 2021-08-23 11:16:34 +08:00 committed by GitHub
commit ee2a23a421
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 173 additions and 5 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "rubick2", "name": "rubick2",
"version": "0.0.3-beta.4", "version": "0.0.3-beta.5",
"author": "muwoo <2424880409@qq.com>", "author": "muwoo <2424880409@qq.com>",
"description": "An electron-vue project", "description": "An electron-vue project",
"license": null, "license": null,
@ -81,6 +81,7 @@
"robotjs": "git+https://github.com/Toinane/robotjs.git", "robotjs": "git+https://github.com/Toinane/robotjs.git",
"semver": "^7.3.5", "semver": "^7.3.5",
"sudo-prompt": "^9.2.1", "sudo-prompt": "^9.2.1",
"systeminformation": "^5.8.0",
"unzip": "^0.1.11", "unzip": "^0.1.11",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"vue": "^2.5.16", "vue": "^2.5.16",

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -6,6 +6,7 @@ import ioHook from 'iohook';
import {throttle, commonConst} from './utils'; import {throttle, commonConst} from './utils';
import path from 'path'; import path from 'path';
import fs from "fs"; import fs from "fs";
import mito from './monitor';
const browsers = require("../browsers")(); const browsers = require("../browsers")();
const {picker, separator, superPanel} = browsers; const {picker, separator, superPanel} = browsers;
@ -85,7 +86,13 @@ class Listener {
init(mainWindow) { init(mainWindow) {
this.fn = throttle(({x, y}, picker) => { this.fn = throttle(({x, y}, picker) => {
const img = robot.screen.capture(parseInt(x) - 5, parseInt(y) - 5, 9, 9); const { scaleFactor } = screen.getDisplayNearestPoint({x, y});
const img = robot.screen.capture(
x - parseInt(5 / scaleFactor),
y - parseInt(5 / scaleFactor),
10,
10
);
const colors = {} const colors = {}
@ -233,10 +240,21 @@ class Listener {
showCloseButton: true showCloseButton: true
}); });
const monitor = new TouchBarPopover({
items: mito.touchBar,
label: '系统监控',
showCloseButton: true
});
const touchBar = new TouchBar({ const touchBar = new TouchBar({
items: [plugin, ...system] items: [
plugin,
monitor,
...system
]
}); });
mainWindow.setTouchBar(touchBar); mainWindow.setTouchBar(touchBar);
mito.start(mainWindow);
}); });
} }

124
src/main/common/monitor.js Normal file
View File

@ -0,0 +1,124 @@
const {TouchBar} = require('electron')
const path = require('path')
const si = require('systeminformation');
const spawn = require('child_process').spawn;
const {TouchBarButton, TouchBarSpacer} = TouchBar;
const LOAD_NORMAL = "#2ecc71";
const LOAD_MEDIUM = "#f1c40f";
const LOAD_HIGH = "#d35400";
const LOAD_SEVERE = "#e74c3c";
const cpu = new TouchBarButton({
label: '',
backgroundColor: "#bdc3c7",
icon: path.join(__dirname, 'icons/chip.png'),
iconPosition: "left",
click: () => {
spawn("/System/Applications/Utilities/Activity Monitor.app/Contents/MacOS/Activity\ Monitor", []);
}
});
const memory = new TouchBarButton({
label: '',
backgroundColor: "#bdc3c7",
icon: path.join(__dirname, 'icons/ram.png'),
iconPosition: "left"
});
const network = new TouchBarButton({
label: '',
backgroundColor: '#3498db',
icon: path.join(__dirname, 'icons/internet.png'),
iconPosition: "left"
});
const battery = new TouchBarButton({
label: '',
backgroundColor: "#bdc3c7",
icon: path.join(__dirname, 'icons/power.png'),
iconPosition: "left"
});
const updateData = () => {
si.currentLoad(function(data) {
if (typeof data !== 'undefined' && data){
const load = data.currentLoad.toFixed(0)
cpu.label = load+"%"
if (load <= 20) cpu.backgroundColor = LOAD_NORMAL;
else if (load > 20 && load <= 40) cpu.backgroundColor = LOAD_MEDIUM;
else if (load > 40 && load <= 80) cpu.backgroundColor = LOAD_HIGH;
else if (load > 80 && load <= 100) cpu.backgroundColor = LOAD_SEVERE;
}
})
si.mem(function(data) {
if (typeof data !== 'undefined' && data){
const load = ((100* data.active ) / data.total).toFixed(0)
memory.label = load+"%"
if (load <= 20) memory.backgroundColor = LOAD_NORMAL;
else if (load > 20 && load <= 40) memory.backgroundColor = LOAD_MEDIUM;
else if (load > 40 && load <= 80) memory.backgroundColor = LOAD_HIGH;
else if (load > 80 && load <= 100) memory.backgroundColor = LOAD_SEVERE;
}
})
si.networkStats("", function(data) {
if (typeof data !== 'undefined' && data){
const kbtx = (data[0].tx_sec * 0.001).toFixed(0)
const kbrx = (data[0].rx_sec * 0.001).toFixed(0)
const l = (kbtx+kbrx).toString().length
network.label = "⇡"+ (kbtx*0.001).toFixed(2)
+" ⇣"+ (kbrx*0.001).toFixed(2) +" MB/s"
}
})
si.battery( function(data) {
if (typeof data !== 'undefined' && data){
if (data.ischarging){
battery.icon = path.join(__dirname, 'icons/charger.png')
}else{
battery.icon = path.join(__dirname, 'icons/power.png')
}
const load = data.percent.toFixed(0)
battery.label = load+"%"
if (load <= 20) battery.backgroundColor = LOAD_SEVERE;
else if (load > 20 && load <= 40) battery.backgroundColor = LOAD_HIGH;
else if (load > 40 && load <= 80) battery.backgroundColor = LOAD_MEDIUM;
else if (load > 80 && load <= 100) battery.backgroundColor = LOAD_NORMAL
}
})
}
const touchBar = new TouchBar({
items: [
cpu,
new TouchBarSpacer({size: 'small'}),
memory,
new TouchBarSpacer({size: 'small'}),
network,
new TouchBarSpacer({size: 'small'}),
battery,
]
})
let intervalObj;
const start = (window) => {
window.on('blur', () => {
clearInterval(intervalObj);
});
window.on('focus', () => {
intervalObj = setInterval(() => {
updateData();
}, 1000);
});
updateData();
}
export default {
start,
touchBar,
}

View File

@ -4,6 +4,7 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const { spawn } = require ('child_process'); const { spawn } = require ('child_process');
const mineType = require("mime-types"); const mineType = require("mime-types");
const {extend} = require('../../utils');
new Vue({ new Vue({
el: '#app', el: '#app',
@ -116,7 +117,8 @@ new Vue({
this.targetOptions = this.options.common; this.targetOptions = this.options.common;
} else { } else {
// 有文件选择 // 有文件选择
this.targetOptions = JSON.parse(JSON.stringify(this.options.selected)); this.targetOptions = [];
extend(this.targetOptions, this.options.selected, true);
// 检测上传 // 检测上传
(this.selectData.optionPlugin || []).forEach(plugin => { (this.selectData.optionPlugin || []).forEach(plugin => {
plugin.features.forEach(fe => { plugin.features.forEach(fe => {

View File

@ -20,8 +20,31 @@ function getData(path, defaultValue) {
} }
} }
const isArray = Array.isArray ||
function(object){ return object instanceof Array }
function isPlainObject(obj) {
return isObject(obj) && Object.getPrototypeOf(obj) == Object.prototype
}
function isObject(obj) { return typeof obj == "object" }
function extend(target, source, deep) {
for (let key in source)
if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
if (isPlainObject(source[key]) && !isPlainObject(target[key]))
target[key] = {}
if (isArray(source[key]) && !isArray(target[key]))
target[key] = []
extend(target[key], source[key], deep)
}
else if (source[key] !== undefined) target[key] = source[key]
}
module.exports = { module.exports = {
getlocalDataFile, getlocalDataFile,
saveData, saveData,
getData getData,
extend
} }