编辑器全屏功能,窗口模式调整

This commit is contained in:
fofolee 2020-06-28 17:46:12 +08:00
parent 3252ad3909
commit 85a923c438

View File

@ -1,10 +1,11 @@
let getDB = id => { !function () {
getDB = id => {
var db = utools.db.get(id), var db = utools.db.get(id),
dbData = db ? db.data : {}; dbData = db ? db.data : {};
return dbData; return dbData;
} }
let putDB = (code, pushData, id) => { putDB = (code, pushData, id) => {
var db = utools.db.get(id); var db = utools.db.get(id);
if (db) { if (db) {
var rev = db._rev var rev = db._rev
@ -16,10 +17,10 @@ let putDB = (code, pushData, id) => {
data[code] = pushData; data[code] = pushData;
utools.db.put({ _id: id, data: data }); utools.db.put({ _id: id, data: data });
} }
} }
// 导入 // 导入
let importCommand = file => { let importCommand = file => {
var options = file ? { type: 'file', argvs: file } : { type: 'dialog', argvs: { filters: [{ name: 'json', extensions: ['json'] }] } } var options = file ? { type: 'file', argvs: file } : { type: 'dialog', argvs: { filters: [{ name: 'json', extensions: ['json'] }] } }
options.readfile = true options.readfile = true
var fileinfo = getFileInfo(options) var fileinfo = getFileInfo(options)
@ -46,9 +47,9 @@ let importCommand = file => {
Swal.fire({ icon: 'error', title: '啊嘞?!', text: '格式错误!', }) Swal.fire({ icon: 'error', title: '啊嘞?!', text: '格式错误!', })
} }
} }
} }
let exportAll = () => { let exportAll = () => {
json = utools.db.get('customFts').data, json = utools.db.get('customFts').data,
options = { options = {
title: '选择保存位置', title: '选择保存位置',
@ -58,10 +59,9 @@ let exportAll = () => {
] ]
}; };
window.saveFile(options, JSON.stringify(json)); window.saveFile(options, JSON.stringify(json));
} }
let clearAll = () => {
let clearAll = () => {
Swal.fire({ Swal.fire({
text: '将会清空所有命令,请确认!', text: '将会清空所有命令,请确认!',
icon: 'warning', icon: 'warning',
@ -77,9 +77,9 @@ let clearAll = () => {
showOptions(); showOptions();
} }
}) })
} }
let programs = { programs = {
shell: { shell: {
bin: 'bash', bin: 'bash',
argv: '', argv: '',
@ -164,9 +164,9 @@ let programs = {
codec: '', codec: '',
color: '#438eff' color: '#438eff'
} }
} }
let showOptions = (tag = "默认") => { showOptions = (tag = "默认") => {
$("#options").empty().fadeIn(); $("#options").empty().fadeIn();
var currentFts = utools.getFeatures(), var currentFts = utools.getFeatures(),
customFts = getDB('customFts'); customFts = getDB('customFts');
@ -185,21 +185,25 @@ let showOptions = (tag = "默认") => {
if (!fts.tags) return false if (!fts.tags) return false
if (!fts.tags.includes(tag)) return false if (!fts.tags.includes(tag)) return false
} }
var cmds = '', rules; var cmds = '', rules = features.cmds[0].match;
if (features.cmds[0].type == 'regex') { if (features.cmds[0].type == 'regex') {
rules = features.cmds[0].match;
if (rules.length > 15) rules = rules.slice(0, 15) + '...'; if (rules.length > 15) rules = rules.slice(0, 15) + '...';
cmds = `<div class="topchild">正则</div><div><span class="keyword re">${rules}</span></div>`; cmds = `<div class="topchild">正则</div><div><span class="keyword re">${rules}</span></div>`;
} else if (features.cmds[0].type == 'window') { } else if (features.cmds[0].type == 'window') {
rules = features.cmds[0].match.app.join(",")
if(rules.length > 15) rules = rules.slice(0, 15) + '...';
cmds += `<div class="topchild">窗口</div><div>` cmds += `<div class="topchild">窗口</div><div>`
if (!rules) {
cmds += `<span class="keyword win">所有窗口</span>`
} else if (rules.title || rules.class) {
cmds += `<span class="keyword win">${JSON.stringify(rules).slice(0, 15) + '...'}</span>`;
} else if (rules.app) {
rules = rules.app.join(",")
if(rules.length > 15) rules = rules.slice(0, 15) + '...';
rules.split(',').forEach(r => { rules.split(',').forEach(r => {
cmds += `<span class="keyword win">${r}</span>`; cmds += `<span class="keyword win">${r}</span>`;
}); });
}
cmds += `</div>` cmds += `</div>`
} else if (features.cmds[0].type == 'files') { } else if (features.cmds[0].type == 'files') {
rules = features.cmds[0].match
if (rules.length > 15) rules = rules.slice(0, 15) + '...'; if (rules.length > 15) rules = rules.slice(0, 15) + '...';
cmds = `<div class="topchild">文件</div><div><span class="keyword fil">${rules}</span></div>`; cmds = `<div class="topchild">文件</div><div><span class="keyword fil">${rules}</span></div>`;
} else { } else {
@ -227,7 +231,7 @@ let showOptions = (tag = "默认") => {
<div class="topchild">${features.explain}</div> <div class="topchild">${features.explain}</div>
<div> <div>
<span class="info"> <span class="info">
<span style="margin: 0; color: ${fts.program == 'quickcommand' ? "#00af2c;" : programs[fts.program].color}"></span> <span style="margin: 0; font-size: smaller; color: ${fts.program == 'quickcommand' ? "#00af2c;" : programs[fts.program].color}"></span>
${fts.program} | ${platformIcons.join('')} ${fts.program} | ${platformIcons.join('')}
</div> </div>
</td> </td>
@ -262,9 +266,9 @@ let showOptions = (tag = "默认") => {
<div id="sample" class="footBtn">下载命令</div> <div id="sample" class="footBtn">下载命令</div>
</div>` </div>`
$("#options").append(sidebar + featureList + footer) $("#options").append(sidebar + featureList + footer)
} }
let showCustomize = (readonly = false) => { let showCustomize = (readonly = false) => {
$("#customize").remove(); $("#customize").remove();
let options = `<option>${Object.keys(programs).join('</option><option>')}</option>` let options = `<option>${Object.keys(programs).join('</option><option>')}</option>`
let allTags = [] let allTags = []
@ -345,7 +349,7 @@ let showCustomize = (readonly = false) => {
<img id="win32" class="platform" src="./img/win32.svg"> <img id="win32" class="platform" src="./img/win32.svg">
<img id="darwin" class="platform" src="./img/darwin.svg"> <img id="darwin" class="platform" src="./img/darwin.svg">
<img id="linux" class="platform" src="./img/linux.svg"> <img id="linux" class="platform" src="./img/linux.svg">
${readonly ? '' : '<button class="button cmdBtn save">保存</button>'} ${(readonly && !fofoCommon.isDev()) ? '' : '<button class="button cmdBtn save">保存</button>'}
<button class="button cmdBtn run">运行</button> <button class="button cmdBtn run">运行</button>
<button class="button cmdBtn cancel">取消</button> <button class="button cmdBtn cancel">取消</button>
</p>` </p>`
@ -373,13 +377,13 @@ let showCustomize = (readonly = false) => {
maximumSelectionLength: 3, maximumSelectionLength: 3,
dropdownParent: $("#customize") dropdownParent: $("#customize")
}).on("select2:unselecting", e => { }).on("select2:unselecting", e => {
(e.params.args.data.text == "默认") && e.preventDefault(); (e.params.args.data.text == "默认") && !fofoCommon.isDev() && e.preventDefault();
}).on("select2:selecting", e => { }).on("select2:selecting", e => {
(e.params.args.data.text == "默认" || e.params.args.data.text == "未分类") && e.preventDefault(); (e.params.args.data.text == "默认" || e.params.args.data.text == "未分类") && !fofoCommon.isDev() && e.preventDefault();
}) })
} }
createEditor = () => { let createEditor = () => {
window.editor = CodeMirror.fromTextArea(document.getElementById("cmd"), { window.editor = CodeMirror.fromTextArea(document.getElementById("cmd"), {
lineNumbers: true, lineNumbers: true,
matchBrackets: true, matchBrackets: true,
@ -389,8 +393,10 @@ createEditor = () => {
keyMap: "sublime", keyMap: "sublime",
theme: "mdn-like", theme: "mdn-like",
extraKeys: { extraKeys: {
"Alt-Enter": cm => { "Alt-Enter": () => {
cm.setOption("fullScreen", !cm.getOption("fullScreen")); $('.CodeMirror').hasClass('CodeMirror-fullscreen') &&
$('.CodeMirror').removeClass('CodeMirror-fullscreen') ||
$('.CodeMirror').addClass('CodeMirror-fullscreen')
}, },
"Ctrl-B": () => { "Ctrl-B": () => {
runCurrentCommand() runCurrentCommand()
@ -412,13 +418,13 @@ createEditor = () => {
window.editor.on("change", showHint); window.editor.on("change", showHint);
window.editor.setOption("mode", 'javascript'); window.editor.setOption("mode", 'javascript');
} }
let showHint = () => { showHint = () => {
editor.showHint({ completeSingle: false }); editor.showHint({ completeSingle: false });
} }
let beautifyCode = () => { let beautifyCode = () => {
if ($("#customize").is(":parent")) { if ($("#customize").is(":parent")) {
var cmd = window.editor.getValue() var cmd = window.editor.getValue()
switch ($("#program").val()) { switch ($("#program").val()) {
@ -436,20 +442,20 @@ let beautifyCode = () => {
break; break;
} }
} }
} }
// 获取特殊变量 // 获取特殊变量
let getSpecialVars = () => { let getSpecialVars = () => {
var specialVars = [] var specialVars = []
$("#vars option").each(i => { $("#vars option").each(i => {
var selector = $("#vars option").eq(i) var selector = $("#vars option").eq(i)
if (selector.css('display') != 'none') specialVars.push(selector.val()) if (selector.css('display') != 'none') specialVars.push(selector.val())
}) })
localStorage['specialVars'] = specialVars localStorage['specialVars'] = specialVars
} }
let typeCheck = () => { let typeCheck = () => {
var type = $("#type").val(); var type = $("#type").val();
switch (type) { switch (type) {
case 'key': case 'key':
@ -473,27 +479,27 @@ let typeCheck = () => {
$("#ruleWord").html("进&#12288;程"); $("#ruleWord").html("进&#12288;程");
$(".var.regex, .var.files").prop("disabled", true) $(".var.regex, .var.files").prop("disabled", true)
$(".var.window").prop("disabled", false) $(".var.window").prop("disabled", false)
$("#rule").prop("placeholder", '窗口进程名,多个用逗号隔开'); $("#rule").prop("placeholder", '多个窗口进程逗号隔开,留空匹配所有窗口');
break; break;
default: default:
break; break;
} }
getSpecialVars() getSpecialVars()
} }
let clearAllFeatures = () => { let clearAllFeatures = () => {
for (var fts of utools.getFeatures()) { for (var fts of utools.getFeatures()) {
utools.removeFeature(fts.code) utools.removeFeature(fts.code)
} }
} }
let hasCustomIcon = () => { let hasCustomIcon = () => {
var src = $("#icon").attr('src'); var src = $("#icon").attr('src');
var iconame = $("#iconame").val(); var iconame = $("#iconame").val();
return /data:image\/png;base64,/.test(src) || iconame return /data:image\/png;base64,/.test(src) || iconame
} }
let programCheck = () => { let programCheck = () => {
let mode = $('#program').val(); let mode = $('#program').val();
$('.customscript').hide(); $('.customscript').hide();
$('.quickactions').hide(); $('.quickactions').hide();
@ -529,10 +535,10 @@ let programCheck = () => {
break; break;
} }
window.editor.setOption("mode", mode); window.editor.setOption("mode", mode);
} }
// 合规性校验 // 合规性校验
let cmdCheck = (type, cmd) => { let cmdCheck = (type, cmd) => {
var blacklist var blacklist
switch (type) { switch (type) {
case 'key': case 'key':
@ -557,19 +563,19 @@ let cmdCheck = (type, cmd) => {
} else { } else {
return true return true
} }
} }
// 开关 // 开关
$("#options").on('change', 'input[type=checkbox]', function () { $("#options").on('change', 'input[type=checkbox]', function () {
var customFts = getDB('customFts'), var customFts = getDB('customFts'),
code = $(this).attr('id'); code = $(this).attr('id');
if (!utools.removeFeature(code)) { if (!utools.removeFeature(code)) {
utools.setFeature(customFts[code].features); utools.setFeature(customFts[code].features);
} }
}); });
// 底部功能按钮 // 底部功能按钮
$("#options").on('click', '.footBtn', function () { $("#options").on('click', '.footBtn', function () {
switch ($(this).attr('id')) { switch ($(this).attr('id')) {
case 'sample': visit('https://github.com/fofolee/uTools-QuickerCommand/tree/master/CommandCollections'); case 'sample': visit('https://github.com/fofolee/uTools-QuickerCommand/tree/master/CommandCollections');
break; break;
@ -587,10 +593,10 @@ $("#options").on('click', '.footBtn', function () {
case 'clear': clearAll(); case 'clear': clearAll();
break; break;
} }
}) })
// 编辑 // 编辑
$("#options").on('click', '.editBtn', function () { $("#options").on('click', '.editBtn', function () {
var readonly = false, var readonly = false,
code = $(this).attr('code'), code = $(this).attr('code'),
data = utools.db.get("customFts").data[code], data = utools.db.get("customFts").data[code],
@ -604,7 +610,9 @@ $("#options").on('click', '.editBtn', function () {
if (cmds.type == 'regex' || cmds.type == 'files') { if (cmds.type == 'regex' || cmds.type == 'files') {
$('#rule').val(cmds.match); $('#rule').val(cmds.match);
} else if (cmds.type == 'window') { } else if (cmds.type == 'window') {
$('#rule').val(cmds.match.app); if (!cmds.match) $('#rule').val('');
else if (cmds.match.title || cmds.match.class) $('#rule').val(JSON.stringify(cmds.match));
else $('#rule').val(cmds.match.app);
} else { } else {
$('#type').val('key').trigger("change") $('#type').val('key').trigger("change")
$('#rule').val(data.features.cmds.toString()); $('#rule').val(data.features.cmds.toString());
@ -629,10 +637,10 @@ $("#options").on('click', '.editBtn', function () {
$("#customize").animate({ top: '0px' }, () => { $("#customize").animate({ top: '0px' }, () => {
window.editor.replaceRange(data.cmd.slice(2000), {line: Infinity}); window.editor.replaceRange(data.cmd.slice(2000), {line: Infinity});
}); });
}) })
// 添加模拟按键 // 添加模拟按键
$("#options").on('click', '#addKey', function () { $("#options").on('click', '#addKey', function () {
$("#addKey").text("▶ 录制中").addClass('record') $("#addKey").text("▶ 录制中").addClass('record')
message('开始录制按键,可连续录制') message('开始录制按键,可连续录制')
Mousetrap.record(sequence => { Mousetrap.record(sequence => {
@ -643,17 +651,17 @@ $("#options").on('click', '#addKey', function () {
}) })
$("#addKey").text("﹢按键").removeClass('record') $("#addKey").text("﹢按键").removeClass('record')
}); });
}) })
// quickCommand的帮助 // quickCommand的帮助
$("#options").on('click', '#showHelp', function () { $("#options").on('click', '#showHelp', function () {
$.get('./HELP.md', r => { $.get('./HELP.md', r => {
utools.ubrowser.goto(r).run() utools.ubrowser.goto(r).run()
}) })
}) })
// 添加动作 // 添加动作
$("#options").on('click', '#addAction', function () { $("#options").on('click', '#addAction', function () {
var html = ` var html = `
<select id="actionType" class="swal2-select" style="width: 80%; height: 3rem;"> <select id="actionType" class="swal2-select" style="width: 80%; height: 3rem;">
<option value="open" args="文件、文件夹或软件的绝对路径">打开文件/文件夹/软件</option> <option value="open" args="文件、文件夹或软件的绝对路径">打开文件/文件夹/软件</option>
@ -689,10 +697,10 @@ $("#options").on('click', '#addAction', function () {
window.editor.replaceSelection(`${action}\n`) window.editor.replaceSelection(`${action}\n`)
} }
}) })
}) })
// 导出 // 导出
$("#options").on('click', '.exportBtn', function () { $("#options").on('click', '.exportBtn', function () {
var code = $(this).attr('code'), var code = $(this).attr('code'),
json = getDB('customFts')[code], json = getDB('customFts')[code],
options = { options = {
@ -702,10 +710,10 @@ $("#options").on('click', '.exportBtn', function () {
] ]
}; };
window.saveFile(options, JSON.stringify(json)); window.saveFile(options, JSON.stringify(json));
}) })
// 删除 // 删除
$("#options").on('click', '.delBtn', function () { $("#options").on('click', '.delBtn', function () {
Swal.fire({ Swal.fire({
text: '删除这个快捷命令', text: '删除这个快捷命令',
icon: 'warning', icon: 'warning',
@ -727,10 +735,10 @@ $("#options").on('click', '.delBtn', function () {
showOptions(currentTag); showOptions(currentTag);
} }
}) })
}) })
// 选择图标 // 选择图标
$("#options").on('click', '#icon, #iconame', function () { $("#options").on('click', '#icon, #iconame', function () {
var options = { var options = {
buttonLabel: '选择', buttonLabel: '选择',
filters: [{ filters: [{
@ -743,17 +751,17 @@ $("#options").on('click', '#icon, #iconame', function () {
$("#iconame").val(file.name); $("#iconame").val(file.name);
$("#icon").attr('src', file.path); $("#icon").attr('src', file.path);
} }
}) })
let SaveCurrentCommand = async (debug = false) => { let SaveCurrentCommand = async () => {
if ($('#tags').is(":parent")) { if ($('#tags').is(":parent")) {
var type = $('#type').val(), var type = $('#type').val(),
code = $("#code").val(), code = $("#code").val(),
tags = $('#tags').val(), tags = $('#tags').val(),
rule = $('#rule').val(), rule = $('#rule').val(),
cmd = window.editor.getValue(); cmd = window.editor.getValue();
if (tags && tags.includes("默认") && !debug) return if (tags && tags.includes("默认") && !fofoCommon.isDev()) return
if (!rule) return swal.fire(`${$('#ruleWord').text().replace(" ", "")} 不能留空!`) if (type != "window" && !rule) return swal.fire(`${$('#ruleWord').text().replace(" ", "")} 不能留空!`)
if (!cmdCheck(type, cmd)) return if (!cmdCheck(type, cmd)) return
if (!code) { if (!code) {
// 生成唯一code // 生成唯一code
@ -870,10 +878,10 @@ let SaveCurrentCommand = async (debug = false) => {
} }
}); });
} }
} }
// 显示运行结果 // 显示运行结果
let showRunResult = (content, raw, success) => { let showRunResult = (content, raw, success) => {
var options, position, showClass, hideClass, maxlength = 100000 var options, position, showClass, hideClass, maxlength = 100000
if ($("#vars").is(":parent")) { if ($("#vars").is(":parent")) {
position = 'top' position = 'top'
@ -910,9 +918,9 @@ let showRunResult = (content, raw, success) => {
} }
success ? swalOneByOne(options) : Swal.fire(options) success ? swalOneByOne(options) : Swal.fire(options)
} }
} }
let runCurrentCommand = async () => { let runCurrentCommand = async () => {
if ($("#customize").is(":parent")) { if ($("#customize").is(":parent")) {
var cmd = window.editor.getValue() var cmd = window.editor.getValue()
cmd = special(cmd) cmd = special(cmd)
@ -969,31 +977,31 @@ let runCurrentCommand = async () => {
}) })
} }
} }
} }
let killCurrentCommand = () => { let killCurrentCommand = () => {
}
} let quitCurrentCommand = () => {
let quitCurrentCommand = () => {
if ($("#customize").is(":parent") && $("#featureList").is(":parent")) { if ($("#customize").is(":parent") && $("#featureList").is(":parent")) {
$("#customize").animate({ top: '100%' }); $("#customize").animate({ top: '100%' });
$("#customize").empty() $("#customize").empty()
} }
} }
let highlightIfKnown = ext => { let highlightIfKnown = ext => {
var lang = Object.keys(programs).filter(p => programs[p].ext == ext) var lang = Object.keys(programs).filter(p => programs[p].ext == ext)
if (lang.length) { if (lang.length) {
if (lang[0] == 'python') getPythonMods() if (lang[0] == 'python') getPythonMods()
window.editor.setOption("mode", lang[0]) window.editor.setOption("mode", lang[0])
return lang[0] return lang[0]
} }
} }
showCodeEditor = file => { showCodeEditor = file => {
let options = `<option>${Object.keys(programs).join('</option><option>')}</option>` let options = `<option>${Object.keys(programs).join('</option><option>')}</option>`
var customWindow = ` var customWindow = `
<div id="customize"> <div id="customize">
<select id="program"> <select id="program">
<option value="quickcommand">quickcommand</option> <option value="quickcommand">quickcommand</option>
@ -1013,12 +1021,12 @@ showCodeEditor = file => {
<span id="addKey" class="footBtn robot">按键</span> <span id="addKey" class="footBtn robot">按键</span>
<span id="showHelp" class="footBtn robot">帮助</span> <span id="showHelp" class="footBtn robot">帮助</span>
</span> </span>
<textarea id="cmd" placeholder="可以直接拖放脚本文件至此处, 支持VSCode快捷键\nCtrl+B 运行\nCtrl+F 搜索\nShift+Alt+F 格式化仅JS/PY"></textarea> <textarea id="cmd" placeholder="可以直接拖放脚本文件至此处, 支持VSCode快捷键\nCtrl+B 运行\nCtrl+F 搜索\nAlt+Enter 全屏\nShift+Alt+F 格式化仅JS/PY"></textarea>
</div> </div>
` `
$("#options").html(customWindow) $("#options").html(customWindow)
createEditor() createEditor()
$(".CodeMirror").css({ bottom: "0", top: "33px", left: "0", right: "0" }) $(".CodeMirror").addClass('CodeMirror-coderunner')
$("#customize").css({ top: '0px', padding: '0px' }); $("#customize").css({ top: '0px', padding: '0px' });
$("span.customscript > input").css({"height": "30px"}) $("span.customscript > input").css({"height": "30px"})
var db = getDB('codeHistory') var db = getDB('codeHistory')
@ -1044,81 +1052,82 @@ showCodeEditor = file => {
} }
programCheck() programCheck()
$('#program').select2({ $('#program').select2({
width: 130, width: 140,
minimumResultsForSearch: Infinity, minimumResultsForSearch: Infinity,
dropdownParent: $("#customize"), dropdownParent: $("#customize"),
dropdownAutoWidth: true dropdownAutoWidth: true
}); });
$("#options").show() $("#options").show()
} }
// 切换TAGS // 切换TAGS
$("#options").on('click', '.sidebar li', function () { $("#options").on('click', '.sidebar li', function () {
showOptions($(this).text()); showOptions($(this).text());
}) })
// 运行 // 运行
$("#options").on('click', '.cmdBtn.run, #runCode', function () { $("#options").on('click', '.cmdBtn.run, #runCode', function () {
runCurrentCommand() runCurrentCommand()
}) })
// 格式化 // 格式化
$("#options").on('click', '#beautifyCode', function () { $("#options").on('click', '#beautifyCode', function () {
beautifyCode() beautifyCode()
}) })
// 取消 // 取消
$("#options").on('click', '.cmdBtn.cancel', function () { $("#options").on('click', '.cmdBtn.cancel', function () {
quitCurrentCommand() quitCurrentCommand()
}) })
// 保存 // 保存
$("#options").on('click', '.cmdBtn.save', function () { $("#options").on('click', '.cmdBtn.save', function () {
SaveCurrentCommand() SaveCurrentCommand()
}) })
// 语言选项改变时 // 语言选项改变时
$("#options").on('change', '#program', function () { $("#options").on('change', '#program', function () {
programCheck() programCheck()
}) })
// 变量选项改变时 // 变量选项改变时
$("#options").on('change', '#vars', function () { $("#options").on('change', '#vars', function () {
$("#vars").css({'color':'black'}) $("#vars").css({'color':'black'})
window.editor.replaceSelection($("#vars").val()); window.editor.replaceSelection($("#vars").val());
}) })
$("#options").on('change', '#action', function () { $("#options").on('change', '#action', function () {
$("#action").css({ 'color': 'black' }) $("#action").css({ 'color': 'black' })
}) })
// 方式选项改变时 // 方式选项改变时
$("#options").on('change', '#type', function () { $("#options").on('change', '#type', function () {
// resetVars(); // resetVars();
typeCheck(); typeCheck();
}) })
// 平台按钮 // 平台按钮
$("#options").on('click', '.platform', function () { $("#options").on('click', '.platform', function () {
if ($(this).hasClass('disabled')){ if ($(this).hasClass('disabled')){
$(this).removeClass('disabled') $(this).removeClass('disabled')
} else { } else {
if ($('.disabled').length == 2) message('至少保留一个平台') if ($('.disabled').length == 2) message('至少保留一个平台')
else $(this).addClass('disabled') else $(this).addClass('disabled')
} }
}) })
Mousetrap.bind('ctrl+s', () => { Mousetrap.bind('ctrl+s', () => {
SaveCurrentCommand() SaveCurrentCommand()
return false return false
}); });
Mousetrap.bind('ctrl+q', () => { Mousetrap.bind('ctrl+q', () => {
quitCurrentCommand() quitCurrentCommand()
return false return false
}); });
Mousetrap.bind('ctrl+b', () => { Mousetrap.bind('ctrl+b', () => {
runCurrentCommand() runCurrentCommand()
return false return false
}); });
}()