merge changes
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 15 KiB |
@ -75,7 +75,7 @@ rubick 更多支持 API 能力参考:[rubick 全局API](https://github.com/clo
|
|||||||
复制 `plugin.json` 文件,在 `rubick` 主窗口执行 `ctrl/command + v` 即可唤起安装插件的功能,选择`新建rubick插件`,进入插件主界面,
|
复制 `plugin.json` 文件,在 `rubick` 主窗口执行 `ctrl/command + v` 即可唤起安装插件的功能,选择`新建rubick插件`,进入插件主界面,
|
||||||
开启插件后,在插件主窗口即可通过命令打开插件:
|
开启插件后,在插件主窗口即可通过命令打开插件:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
本小节所有代码:[rubcik-plugin-demo](https://github.com/clouDr-f2e/rubick-plugin-demo)
|
本小节所有代码:[rubcik-plugin-demo](https://github.com/clouDr-f2e/rubick-plugin-demo)
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
安装完成后打开 rubick 即可看到主搜索界面:
|
安装完成后打开 rubick 即可看到主搜索界面:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
目前支持 windows 和 macos。linux 小伙伴正在开发中
|
目前支持 windows 和 macos。linux 小伙伴正在开发中
|
||||||
|
|
||||||
@ -21,7 +21,7 @@
|
|||||||
```
|
```
|
||||||
也就是说只要当前系统软件安装到这些目录才会被检索到。支持中文搜索和拼音、拼音首字母搜索:
|
也就是说只要当前系统软件安装到这些目录才会被检索到。支持中文搜索和拼音、拼音首字母搜索:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
`Windows` 内由于安装目录太多不确定,有的在 C盘,有的在D盘,还有的在自定义其他位置,所以该功能还在设计中,如果您有好的方案也欢迎提供:[issues](https://github.com/clouDr-f2e/rubick/issues)
|
`Windows` 内由于安装目录太多不确定,有的在 C盘,有的在D盘,还有的在自定义其他位置,所以该功能还在设计中,如果您有好的方案也欢迎提供:[issues](https://github.com/clouDr-f2e/rubick/issues)
|
||||||
|
|
||||||
@ -42,13 +42,13 @@
|
|||||||
点击搜索框右侧 rubick 图标,进入插件市场,选择所需插件,点击下载按钮即可下载,下载完成后在已安装 tab 下可以找到安装插件。
|
点击搜索框右侧 rubick 图标,进入插件市场,选择所需插件,点击下载按钮即可下载,下载完成后在已安装 tab 下可以找到安装插件。
|
||||||
安装完成后,输入插件呼起命令即可使用对应插件:
|
安装完成后,输入插件呼起命令即可使用对应插件:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 4. 右击增强
|
### 4. 右击增强
|
||||||
通常我们需要使用鼠标右击来对桌面属性进行拓展,`Rubick` 支持对右击属性进行增强功能,长按鼠标右键即可呼起。如果安装的插件支持
|
通常我们需要使用鼠标右击来对桌面属性进行拓展,`Rubick` 支持对右击属性进行增强功能,长按鼠标右键即可呼起。如果安装的插件支持
|
||||||
特殊类型的文件操作,还可以在右键中唤起插件:
|
特殊类型的文件操作,还可以在右键中唤起插件:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 更多功能
|
### 更多功能
|
||||||
如果您还需要更多功能,欢迎来这里给我们提建议:[issues](https://github.com/clouDr-f2e/rubick/issues/20)
|
如果您还需要更多功能,欢迎来这里给我们提建议:[issues](https://github.com/clouDr-f2e/rubick/issues/20)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rubick2",
|
"name": "rubick2",
|
||||||
"version": "0.0.3-beta.1",
|
"version": "0.0.3-beta.2",
|
||||||
"author": "muwoo <2424880409@qq.com>",
|
"author": "muwoo <2424880409@qq.com>",
|
||||||
"description": "An electron-vue project",
|
"description": "An electron-vue project",
|
||||||
"license": null,
|
"license": null,
|
||||||
@ -68,6 +68,7 @@
|
|||||||
"bplist-parser": "^0.3.0",
|
"bplist-parser": "^0.3.0",
|
||||||
"download": "^8.0.0",
|
"download": "^8.0.0",
|
||||||
"download-git-repo": "^3.0.2",
|
"download-git-repo": "^3.0.2",
|
||||||
|
"electron-is-dev": "^2.0.0",
|
||||||
"electron-store": "^8.0.0",
|
"electron-store": "^8.0.0",
|
||||||
"iohook": "^0.9.3",
|
"iohook": "^0.9.3",
|
||||||
"is-chinese": "^1.4.2",
|
"is-chinese": "^1.4.2",
|
||||||
@ -117,7 +118,7 @@
|
|||||||
"file-loader": "^1.1.11",
|
"file-loader": "^1.1.11",
|
||||||
"html-webpack-plugin": "^3.2.0",
|
"html-webpack-plugin": "^3.2.0",
|
||||||
"iconv-lite": "^0.6.3",
|
"iconv-lite": "^0.6.3",
|
||||||
"less": "^4.1.1",
|
"less": "^2.7.3",
|
||||||
"less-loader": "^5.0.0",
|
"less-loader": "^5.0.0",
|
||||||
"listr": "^0.14.3",
|
"listr": "^0.14.3",
|
||||||
"mini-css-extract-plugin": "0.4.0",
|
"mini-css-extract-plugin": "0.4.0",
|
||||||
|
@ -18,6 +18,7 @@ module.exports = () => {
|
|||||||
frame: false,
|
frame: false,
|
||||||
title: '拉比克',
|
title: '拉比克',
|
||||||
show: false,
|
show: false,
|
||||||
|
skipTaskbar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
webSecurity: false,
|
webSecurity: false,
|
||||||
enableRemoteModule: true,
|
enableRemoteModule: true,
|
||||||
|
@ -9,13 +9,6 @@ export default function init(mainWindow) {
|
|||||||
listener.registerShortCut(mainWindow);
|
listener.registerShortCut(mainWindow);
|
||||||
listener.init(mainWindow);
|
listener.init(mainWindow);
|
||||||
|
|
||||||
// 设置开机启动
|
|
||||||
const config = global.opConfig.get();
|
|
||||||
app.setLoginItemSettings({
|
|
||||||
openAtLogin: config.perf.common.start,
|
|
||||||
openAsHidden: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
mainWindow.once("ready-to-show", () => {
|
mainWindow.once("ready-to-show", () => {
|
||||||
// 非隐藏式启动需要显示主窗口
|
// 非隐藏式启动需要显示主窗口
|
||||||
if (!app.getLoginItemSettings().wasOpenedAsHidden) {
|
if (!app.getLoginItemSettings().wasOpenedAsHidden) {
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import {BrowserWindow, clipboard, globalShortcut, ipcMain, Notification, screen} from "electron";
|
import {app, BrowserWindow, clipboard, globalShortcut, ipcMain, Notification, screen} from "electron";
|
||||||
import {exec, spawn} from "child_process";
|
import {exec, spawn} from "child_process";
|
||||||
import robot from "robotjs";
|
import robot from "robotjs";
|
||||||
import Api from "./api";
|
import Api from "./api";
|
||||||
import ioHook from 'iohook';
|
import ioHook from 'iohook';
|
||||||
import {throttle} from './utils';
|
import {throttle, commonConst} from './utils';
|
||||||
|
|
||||||
const browsers = require("../browsers")();
|
const browsers = require("../browsers")();
|
||||||
const {picker, separator, superPanel} = browsers;
|
const {picker, separator, superPanel} = browsers;
|
||||||
@ -21,8 +21,7 @@ class Listener {
|
|||||||
clipboard.clear();
|
clipboard.clear();
|
||||||
|
|
||||||
// 复制选中文案
|
// 复制选中文案
|
||||||
const platform = process.platform;
|
if (commonConst.macOS()) {
|
||||||
if (platform === 'darwin') {
|
|
||||||
robot.keyTap('c', 'command');
|
robot.keyTap('c', 'command');
|
||||||
} else {
|
} else {
|
||||||
robot.keyTap('c', 'control');
|
robot.keyTap('c', 'control');
|
||||||
@ -55,9 +54,11 @@ class Listener {
|
|||||||
const currentDisplay = screen.getDisplayNearestPoint({ x, y });
|
const currentDisplay = screen.getDisplayNearestPoint({ x, y });
|
||||||
const wx = parseInt(currentDisplay.workArea.x + currentDisplay.workArea.width / 2 - 400);
|
const wx = parseInt(currentDisplay.workArea.x + currentDisplay.workArea.width / 2 - 400);
|
||||||
const wy = parseInt(currentDisplay.workArea.y + currentDisplay.workArea.height / 2 - 200);
|
const wy = parseInt(currentDisplay.workArea.y + currentDisplay.workArea.height / 2 - 200);
|
||||||
mainWindow.setVisibleOnAllWorkspaces(true);
|
|
||||||
|
mainWindow.setAlwaysOnTop(true)
|
||||||
|
mainWindow.setVisibleOnAllWorkspaces(true, {visibleOnFullScreen: true});
|
||||||
mainWindow.focus();
|
mainWindow.focus();
|
||||||
mainWindow.setVisibleOnAllWorkspaces(false);
|
mainWindow.setVisibleOnAllWorkspaces(false, {visibleOnFullScreen: true});
|
||||||
mainWindow.setPosition(wx, wy);
|
mainWindow.setPosition(wx, wy);
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
});
|
});
|
||||||
@ -95,6 +96,7 @@ class Listener {
|
|||||||
picker.getWindow().webContents.send("updatePicker", colors);
|
picker.getWindow().webContents.send("updatePicker", colors);
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|
||||||
|
this.setAutoLogin();
|
||||||
this.colorPicker();
|
this.colorPicker();
|
||||||
this.initPlugin();
|
this.initPlugin();
|
||||||
this.lockScreen();
|
this.lockScreen();
|
||||||
@ -231,10 +233,21 @@ class Listener {
|
|||||||
|
|
||||||
reRegisterShortCut(mainWindow) {
|
reRegisterShortCut(mainWindow) {
|
||||||
ipcMain.on('re-register', (event, arg) => {
|
ipcMain.on('re-register', (event, arg) => {
|
||||||
|
this.setAutoLogin();
|
||||||
this.registerShortCut(mainWindow);
|
this.registerShortCut(mainWindow);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setAutoLogin() {
|
||||||
|
// 设置开机启动
|
||||||
|
const config = global.opConfig.get();
|
||||||
|
app.setLoginItemSettings({
|
||||||
|
openAtLogin: config.perf.common.start,
|
||||||
|
openAsHidden: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
changeSize(mainWindow) {
|
changeSize(mainWindow) {
|
||||||
// 修改窗口尺寸
|
// 修改窗口尺寸
|
||||||
ipcMain.on('changeWindowSize-rubick', (event, arg) => {
|
ipcMain.on('changeWindowSize-rubick', (event, arg) => {
|
||||||
|
@ -53,3 +53,22 @@ export function throttle (func, wait, options) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const commonConst = {
|
||||||
|
linux: function () {
|
||||||
|
return process.platform === 'linux'
|
||||||
|
},
|
||||||
|
macOS () {
|
||||||
|
return process.platform === 'darwin';
|
||||||
|
},
|
||||||
|
windows () {
|
||||||
|
return process.platform === 'win32'
|
||||||
|
},
|
||||||
|
production: function () {
|
||||||
|
return process.env.NODE_ENV !== 'development';
|
||||||
|
},
|
||||||
|
dev: function () {
|
||||||
|
return process.env.NODE_ENV === 'development';
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,40 +1,105 @@
|
|||||||
import { app } from 'electron'
|
import { app, globalShortcut } from 'electron'
|
||||||
import '../renderer/store'
|
import '../renderer/store'
|
||||||
import init from './common/common';
|
import init from './common/common';
|
||||||
import {autoUpdate} from './common/autoUpdate';
|
import {autoUpdate} from './common/autoUpdate';
|
||||||
import createTray from './tray';
|
import createTray from './tray';
|
||||||
|
import {commonConst} from './common/utils';
|
||||||
|
|
||||||
const {main} = require("./browsers")();
|
const {main} = require("./browsers")();
|
||||||
/**
|
|
||||||
* Set `__static` path to static files in production
|
if (commonConst.production()) {
|
||||||
* https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
|
|
||||||
*/
|
|
||||||
if (process.env.NODE_ENV !== 'development') {
|
|
||||||
global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
|
global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
|
||||||
}
|
}
|
||||||
// to fix https://github.com/electron/electron/issues/18397
|
// to fix https://github.com/electron/electron/issues/18397
|
||||||
app.allowRendererProcessReuse = false;
|
app.allowRendererProcessReuse = false;
|
||||||
if (process.platform === 'darwin') {
|
|
||||||
app.dock.hide();
|
class initApp {
|
||||||
|
launchApp() {
|
||||||
|
const gotTheLock = app.requestSingleInstanceLock()
|
||||||
|
if (!gotTheLock) {
|
||||||
|
app.quit()
|
||||||
|
} else {
|
||||||
|
this.beforeReady()
|
||||||
|
this.onReady()
|
||||||
|
this.onRunning()
|
||||||
|
this.onQuit()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function createWindow() {
|
createWindow() {
|
||||||
main.init();
|
main.init();
|
||||||
init(main.getWindow());
|
init(main.getWindow());
|
||||||
}
|
}
|
||||||
|
|
||||||
app.on('ready', () => {
|
beforeReady() {
|
||||||
createWindow()
|
// 系统托盘
|
||||||
|
if (commonConst.macOS()) {
|
||||||
|
if (commonConst.production() && !app.isInApplicationsFolder()) {
|
||||||
|
app.moveToApplicationsFolder();
|
||||||
|
} else {
|
||||||
|
app.dock.hide();
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
app.disableHardwareAcceleration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onReady() {
|
||||||
|
const readyFunction = () => {
|
||||||
|
this.createWindow();
|
||||||
createTray(main.getWindow());
|
createTray(main.getWindow());
|
||||||
autoUpdate();
|
autoUpdate();
|
||||||
})
|
}
|
||||||
|
if (!app.isReady()) {
|
||||||
|
app.on('ready', readyFunction)
|
||||||
|
} else {
|
||||||
|
readyFunction()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onRunning() {
|
||||||
|
app.on('second-instance', (event, commandLine, workingDirectory) => {
|
||||||
|
// 当运行第二个实例时,将会聚焦到myWindow这个窗口
|
||||||
|
const win = main.getWindow();
|
||||||
|
if (win) {
|
||||||
|
if (win.isMinimized()) {
|
||||||
|
win.restore();
|
||||||
|
}
|
||||||
|
win.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (!main.getWindow()) {
|
||||||
|
this.createWindow();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onQuit () {
|
||||||
app.on('window-all-closed', () => {
|
app.on('window-all-closed', () => {
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', () => {
|
app.on('will-quit', () => {
|
||||||
createWindow()
|
globalShortcut.unregisterAll()
|
||||||
});
|
})
|
||||||
|
// Exit cleanly on request from parent process in development mode.
|
||||||
|
if (commonConst.dev()) {
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
process.on('message', data => {
|
||||||
|
if (data === 'graceful-exit') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
process.on('SIGTERM', () => {
|
||||||
|
app.quit()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(new initApp()).launchApp();
|
||||||
|
@ -1,10 +1,20 @@
|
|||||||
import { dialog, Menu, Tray, app, shell, ipcMain } from 'electron';
|
import { dialog, Menu, Tray, app, shell } from 'electron';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import pkg from '../../package.json';
|
import pkg from '../../package.json';
|
||||||
|
import os from 'os';
|
||||||
|
import {commonConst} from './common/utils';
|
||||||
|
|
||||||
function createTray(window) {
|
function createTray(window) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const appIcon = new Tray(path.join(__static, './rocket.png'));
|
let icon;
|
||||||
|
if (commonConst.macOS()) {
|
||||||
|
icon = './icon@3x.png'
|
||||||
|
}else if (commonConst.windows()) {
|
||||||
|
icon = parseInt(os.release()) < 10 ? './icon@2x.png' : './icon.ico';
|
||||||
|
}else {
|
||||||
|
icon = 'icon@2x.png'
|
||||||
|
}
|
||||||
|
const appIcon = new Tray(path.join(__static, icon));
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
label: "帮助文档", click: () => {
|
label: "帮助文档", click: () => {
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
:src="selected.icon"
|
:src="selected.icon"
|
||||||
/>
|
/>
|
||||||
<div v-else class="rubick-logo">
|
<div v-else class="rubick-logo">
|
||||||
<img src="./assets/logo.png" />
|
<img src="./assets/imgs/logo.png" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a-input>
|
</a-input>
|
||||||
@ -362,13 +362,13 @@ export default {
|
|||||||
.rubick-logo {
|
.rubick-logo {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
background: #314659;
|
background: #574778;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
img {
|
img {
|
||||||
width: 28px;
|
width: 32px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.tag-container {
|
.tag-container {
|
||||||
|
10
src/renderer/assets/ant-reset.less
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
@import '~ant-design-vue/dist/antd.less'; // 引入官方提供的 less 样式入口文件
|
||||||
|
|
||||||
|
@primary-color: #ff4ea4; // 全局主色
|
||||||
|
@link-color: #ff4ea4; // 链接色
|
||||||
|
@error-color: #ff4ea4; // 错误色
|
||||||
|
.ant-tag-green {
|
||||||
|
color: #ff4ea4;
|
||||||
|
background: rgba(255, 159, 180, 0.3);
|
||||||
|
border-color: #ff9fb4;
|
||||||
|
}
|
BIN
src/renderer/assets/imgs/logo.png
Normal file
After Width: | Height: | Size: 15 KiB |
@ -7,7 +7,7 @@ import router from './router'
|
|||||||
import store from './store'
|
import store from './store'
|
||||||
import Antd from 'ant-design-vue';
|
import Antd from 'ant-design-vue';
|
||||||
|
|
||||||
import 'ant-design-vue/dist/antd.css';
|
import './assets/ant-reset.less';
|
||||||
|
|
||||||
const opConfig = remote.getGlobal('opConfig');
|
const opConfig = remote.getGlobal('opConfig');
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<a-icon type="right-circle" />
|
<a-icon type="right-circle" />
|
||||||
</div>
|
</div>
|
||||||
<div v-for="banner in bannerList">
|
<div v-for="banner in bannerList">
|
||||||
<img width="100%" :src="banner.src" />
|
<img @click="jumpTo(banner.link)" width="100%" :src="banner.src" />
|
||||||
</div>
|
</div>
|
||||||
</a-carousel>
|
</a-carousel>
|
||||||
<a-divider v-if="bannerList && !!bannerList.length"></a-divider>
|
<a-divider v-if="bannerList && !!bannerList.length"></a-divider>
|
||||||
@ -73,6 +73,7 @@
|
|||||||
import api from '../../../assets/api';
|
import api from '../../../assets/api';
|
||||||
import {mapActions, mapState} from 'vuex';
|
import {mapActions, mapState} from 'vuex';
|
||||||
import marked from "marked";
|
import marked from "marked";
|
||||||
|
import {shell} from "electron";
|
||||||
const rendererMD = new marked.Renderer();
|
const rendererMD = new marked.Renderer();
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -114,6 +115,11 @@ export default {
|
|||||||
this.currentSelect = item;
|
this.currentSelect = item;
|
||||||
this.currentSelect.index = index;
|
this.currentSelect.index = index;
|
||||||
},
|
},
|
||||||
|
jumpTo(link) {
|
||||||
|
if (link) {
|
||||||
|
shell.openExternal(link)
|
||||||
|
}
|
||||||
|
},
|
||||||
...mapActions('main', ['downloadPlugin'])
|
...mapActions('main', ['downloadPlugin'])
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
BIN
static/icon.ico
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
static/icon@2x.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
static/icon@3x.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 873 B After Width: | Height: | Size: 1.4 KiB |