perf: 客户端新增截图快捷键

This commit is contained in:
kuaifan 2022-12-02 01:59:50 +08:00
parent 8a6c956940
commit c7ff189b96
9 changed files with 156 additions and 13 deletions

44
electron/electron.js vendored
View File

@ -19,6 +19,9 @@ let mainWindow = null,
devloadUrl = "", devloadUrl = "",
devloadCachePath = path.resolve(__dirname, ".devload"); devloadCachePath = path.resolve(__dirname, ".devload");
let screenshotObj = null,
screenshotKey = null;
if (fs.existsSync(devloadCachePath)) { if (fs.existsSync(devloadCachePath)) {
devloadUrl = fs.readFileSync(devloadCachePath, 'utf8') devloadUrl = fs.readFileSync(devloadCachePath, 'utf8')
} }
@ -196,13 +199,15 @@ if (!getTheLock) {
if (process.platform === 'win32') { if (process.platform === 'win32') {
app.setAppUserModelId(config.name) app.setAppUserModelId(config.name)
} }
// 截图 // 截图对象
const screenshots = new Screenshots({ screenshotObj = new Screenshots({
singleWindow: true singleWindow: true
}) })
globalShortcut.register('ctrl+shift+a', () => { globalShortcut.register("esc", () => {
screenshots.startCapture().then(_ => {}) if (screenshotObj.$win?.isFocused()) {
}) screenshotObj.endCapture().then(_ => {});
}
});
}) })
} }
@ -454,6 +459,35 @@ ipcMain.on('copyBase64Image', (event, args) => {
event.returnValue = "ok" event.returnValue = "ok"
}) })
/**
* 绑定截图快捷键
* @param args
*/
ipcMain.on('bindScreenshotKey', (event, args) => {
const { key } = args;
if (screenshotKey !== key) {
if (screenshotKey) {
globalShortcut.unregister(screenshotKey)
screenshotKey = null
}
if (key) {
screenshotKey = key
globalShortcut.register(key, () => {
screenshotObj.startCapture().then(_ => {})
})
}
}
event.returnValue = "ok"
})
/**
* 执行截图
*/
ipcMain.on('onScreenshot', (event) => {
screenshotObj.startCapture().then(_ => {})
event.returnValue = "ok"
})
//================================================================ //================================================================
// Update // Update
//================================================================ //================================================================

View File

@ -26,13 +26,13 @@
"url": "https://github.com/kuaifan/dootask.git" "url": "https://github.com/kuaifan/dootask.git"
}, },
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "^6.0.1", "@electron-forge/cli": "^6.0.4",
"@electron-forge/maker-deb": "^6.0.1", "@electron-forge/maker-deb": "^6.0.4",
"@electron-forge/maker-rpm": "^6.0.1", "@electron-forge/maker-rpm": "^6.0.4",
"@electron-forge/maker-squirrel": "^6.0.1", "@electron-forge/maker-squirrel": "^6.0.4",
"@electron-forge/maker-zip": "^6.0.1", "@electron-forge/maker-zip": "^6.0.4",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"electron": "^21.3.0", "electron": "^22.0.0",
"electron-builder": "^23.6.0", "electron-builder": "^23.6.0",
"electron-notarize": "^1.2.2", "electron-notarize": "^1.2.2",
"form-data": "^4.0.0", "form-data": "^4.0.0",

View File

@ -237,6 +237,7 @@ export default {
key: 'manifest', key: 'manifest',
url: $A.apiUrl("../manifest") url: $A.apiUrl("../manifest")
}) })
$A.bindScreenshotKey($A.jsonParse(window.localStorage['__keyboard:data__'] || {}));
}, },
eeuiEvents() { eeuiEvents() {

View File

@ -193,3 +193,16 @@ $A.execMainCacheJudge = (key) => {
return val return val
}; };
$A.bindScreenshotKey = (data) => {
let key = "";
if (data.screenshot_key && (data.screenshot_mate || data.screenshot_shift)) {
if (data.screenshot_mate) {
key = /macintosh|mac os x/i.test(navigator.userAgent) ? 'command' : 'ctrl'
}
if (data.screenshot_shift) {
key = `${key ? `${key}+` : ''}shift`
}
key = `${key}+${data.screenshot_key.toLowerCase()}`
}
$A.Electron.sendMessage('bindScreenshotKey', {key});
};

View File

@ -76,6 +76,10 @@ export default {
{path: 'email', name: '修改邮箱'}, {path: 'email', name: '修改邮箱'},
] ]
if (this.$Electron) {
menu.splice(2, 0, {path: 'keyboard', name: '快捷键'})
}
if ([ if ([
'127.0.0.1:2222', '127.0.0.1:2222',
'192.168.100.88:2222', '192.168.100.88:2222',

View File

@ -0,0 +1,86 @@
<template>
<div class="setting-item submit">
<Form ref="formData" :model="formData" :rules="ruleData" label-width="auto" @submit.native.prevent>
<FormItem :label="$L('截图快捷键')" prop="screenshot">
<div class="input-box">
<Checkbox v-model="formData.screenshot_mate">{{mateName}}</Checkbox>
<div class="input-box-push">+</div>
<Checkbox v-model="formData.screenshot_shift">Shift</Checkbox>
<div class="input-box-push">+</div>
<Input class="input-box-key" :value="formData.screenshot_key" @on-keyup="onKeydown" :maxlength="1"/>
</div>
</FormItem>
</Form>
<div class="setting-footer">
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
<Button :loading="loadIng > 0" @click="resetForm" style="margin-left: 8px">{{$L('重置')}}</Button>
</div>
</div>
</template>
<style scoped lang="scss">
.input-box {
display: flex;
align-items: center;
.input-box-push {
opacity: 0.5;
padding: 0 12px 0 8px;
}
.input-box-key {
width: 80px;
}
}
</style>
<script>
export default {
data() {
return {
loadIng: 0,
mateName: /macintosh|mac os x/i.test(navigator.userAgent) ? 'Command' : 'Ctrl',
formData: {
screenshot_mate: true,
screenshot_shift: true,
screenshot_key: '',
},
ruleData: { },
}
},
mounted() {
this.initData();
},
methods: {
initData() {
this.formData = Object.assign({
screenshot_mate: true,
screenshot_shift: true,
screenshot_key: '',
}, $A.jsonParse(window.localStorage['__keyboard:data__'] || {}));
//
this.formData_bak = $A.cloneJSON(this.formData);
},
onKeydown({key}) {
this.formData.screenshot_key = key && key.length === 1 ? key.toUpperCase() : ""
},
submitForm() {
this.$refs.formData.validate((valid) => {
if (valid) {
window.localStorage['__keyboard:data__'] = $A.jsonStringify(this.formData);
$A.bindScreenshotKey(this.formData);
}
})
},
resetForm() {
this.formData = $A.cloneJSON(this.formData_bak);
}
}
}
</script>

View File

@ -15,11 +15,9 @@
</template> </template>
<script> <script>
import ImgUpload from "../../../components/ImgUpload";
import {languageList, languageType, setLanguage} from "../../../language"; import {languageList, languageType, setLanguage} from "../../../language";
export default { export default {
components: {ImgUpload},
data() { data() {
return { return {
loadIng: 0, loadIng: 0,

View File

@ -44,6 +44,11 @@ export default [
path: 'language', path: 'language',
component: () => import('./pages/manage/setting/language.vue'), component: () => import('./pages/manage/setting/language.vue'),
}, },
{
name: 'manage-setting-keyboard',
path: 'keyboard',
component: () => import('./pages/manage/setting/keyboard.vue'),
},
{ {
name: 'manage-setting-password', name: 'manage-setting-password',
path: 'password', path: 'password',

View File

@ -514,6 +514,7 @@ export default {
const cacheLoginEmail = $A.getStorageString("cacheLoginEmail"); const cacheLoginEmail = $A.getStorageString("cacheLoginEmail");
const cacheFileSort = $A.getStorageJson("cacheFileSort"); const cacheFileSort = $A.getStorageJson("cacheFileSort");
const languageType = window.localStorage['__language:type__']; const languageType = window.localStorage['__language:type__'];
const keyboardData = window.localStorage['__keyboard:data__'];
const themeMode = window.localStorage['__theme:mode__']; const themeMode = window.localStorage['__theme:mode__'];
// //
window.localStorage.clear(); window.localStorage.clear();
@ -525,6 +526,7 @@ export default {
state.cacheTasks = []; state.cacheTasks = [];
// //
window.localStorage['__language:type__'] = languageType; window.localStorage['__language:type__'] = languageType;
window.localStorage['__keyboard:data__'] = keyboardData;
window.localStorage['__theme:mode__'] = themeMode; window.localStorage['__theme:mode__'] = themeMode;
$A.setStorage("cacheProjectParameter", state.cacheProjectParameter); $A.setStorage("cacheProjectParameter", state.cacheProjectParameter);
$A.setStorage("cacheServerUrl", state.cacheServerUrl); $A.setStorage("cacheServerUrl", state.cacheServerUrl);