mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-09 23:16:18 +08:00
选项列表支持无限滚动
This commit is contained in:
parent
0231b95c8a
commit
d814bd352a
100
src/preload.js
100
src/preload.js
@ -6,6 +6,7 @@ const electron = require('electron')
|
|||||||
const { NodeVM } = require('vm2')
|
const { NodeVM } = require('vm2')
|
||||||
const path = require("path")
|
const path = require("path")
|
||||||
const util = require("util")
|
const util = require("util")
|
||||||
|
const PinyinMatch = require('pinyin-match');
|
||||||
fofoCommon = require('./common').fofo
|
fofoCommon = require('./common').fofo
|
||||||
|
|
||||||
|
|
||||||
@ -59,11 +60,13 @@ let getSleepCodeByShell = ms => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
quickcommand = {
|
quickcommand = {
|
||||||
|
// 模拟复制操作
|
||||||
simulateCopy: function() {
|
simulateCopy: function() {
|
||||||
var ctlKey = utools.isMacOs() ? 'command' : 'control';
|
var ctlKey = utools.isMacOs() ? 'command' : 'control';
|
||||||
utools.simulateKeyboardTap('c', ctlKey);
|
utools.simulateKeyboardTap('c', ctlKey);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 模拟粘贴操作
|
||||||
simulatePaste: function() {
|
simulatePaste: function() {
|
||||||
var ctlKey = utools.isMacOs() ? 'command' : 'control';
|
var ctlKey = utools.isMacOs() ? 'command' : 'control';
|
||||||
utools.simulateKeyboardTap('v', ctlKey);
|
utools.simulateKeyboardTap('v', ctlKey);
|
||||||
@ -79,6 +82,7 @@ quickcommand = {
|
|||||||
return (end - start)
|
return (end - start)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 重写 setTimeout
|
||||||
setTimeout: function(callback, ms) {
|
setTimeout: function(callback, ms) {
|
||||||
var start = new Date().getTime()
|
var start = new Date().getTime()
|
||||||
child_process.exec(getSleepCodeByShell(ms), { timeout: ms }, (err, stdout, stderr) => {
|
child_process.exec(getSleepCodeByShell(ms), { timeout: ms }, (err, stdout, stderr) => {
|
||||||
@ -87,6 +91,7 @@ quickcommand = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 显示输入框
|
||||||
showInputBox: function (callback, placeHolders) {
|
showInputBox: function (callback, placeHolders) {
|
||||||
let helps = `正确用法:
|
let helps = `正确用法:
|
||||||
quickcommand.showInputBox(yourinput => {
|
quickcommand.showInputBox(yourinput => {
|
||||||
@ -116,6 +121,7 @@ quickcommand = {
|
|||||||
swalOneByOne(options)
|
swalOneByOne(options)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 显示选项按钮
|
||||||
showButtonBox: function (callback, buttons) {
|
showButtonBox: function (callback, buttons) {
|
||||||
let helps = `正确用法:
|
let helps = `正确用法:
|
||||||
quickcommand.showButtonBox(yourchoise => {
|
quickcommand.showButtonBox(yourchoise => {
|
||||||
@ -145,6 +151,7 @@ quickcommand = {
|
|||||||
swalOneByOne(options)
|
swalOneByOne(options)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 显示自动消失的提示框
|
||||||
showMessageBox: function (title, icon = "success") {
|
showMessageBox: function (title, icon = "success") {
|
||||||
var options = {
|
var options = {
|
||||||
icon: icon,
|
icon: icon,
|
||||||
@ -160,42 +167,66 @@ quickcommand = {
|
|||||||
swalOneByOne(options)
|
swalOneByOne(options)
|
||||||
},
|
},
|
||||||
|
|
||||||
showSelectList: function (callback, selects, placeholder = "搜索", closeOnSelect = true) {
|
// 显示选项列表
|
||||||
|
showSelectList: function (callback, selects, opt = {}) {
|
||||||
let helps = `正确用法:
|
let helps = `正确用法:
|
||||||
quickcommand.showSelectList(choise => {
|
quickcommand.showSelectList(choise => {
|
||||||
var index = choise.index
|
var index = choise.index
|
||||||
var text = choise.text
|
var text = choise.text
|
||||||
//do something...
|
//do something...
|
||||||
}, [option1, option2...], placeholder, closeOnSelect)`
|
}, [option1, option2...], { placeholder, enableHTML, closeOnSelect })`
|
||||||
if (!(callback instanceof Function)) throw helps
|
if (!(callback instanceof Function)) throw helps
|
||||||
if (!(selects instanceof Array)) throw helps
|
if (!(selects instanceof Array)) throw helps
|
||||||
|
opt.placeholder || (opt.placeholder = "搜索,支持拼音")
|
||||||
|
opt.enableHTML || (opt.enableHTML = false)
|
||||||
|
typeof opt.closeOnSelect == 'undefined' && (opt.closeOnSelect = true)
|
||||||
// 调整插件高度
|
// 调整插件高度
|
||||||
let modWindowHeight = num => {
|
let modWindowHeight = () => {
|
||||||
if(!$("#customize").is(":parent")) utools.setExpendHeight(num > 10 ? 550 : 50 * num);
|
var height = $('.select2-results').height()
|
||||||
|
if (!$("#customize").is(":parent")) utools.setExpendHeight(height > 600 ? 600 : height);
|
||||||
}
|
}
|
||||||
var html = `<div id="quickselect"><select id="selectBox">`
|
if ($('#quickselect').length) $('#quickselect').remove()
|
||||||
|
$("body").append(`<div id="quickselect"><select id="selectBox"></select></div>`)
|
||||||
var selectBoxNumbers = selects.length
|
var selectBoxNumbers = selects.length
|
||||||
modWindowHeight(selectBoxNumbers)
|
var data = []
|
||||||
for (let i = 0; i < selectBoxNumbers; i++) {
|
for (let i = 0; i < selectBoxNumbers; i++) {
|
||||||
html += `<option value="${i}">${selects[i]}</option>`
|
data.push({ id: i, text: selects[i] })
|
||||||
}
|
}
|
||||||
html += `</select></div>`
|
var prefer = {
|
||||||
$("body").append(html)
|
data: data,
|
||||||
$('#selectBox').select2({
|
|
||||||
width: "100%",
|
width: "100%",
|
||||||
dropdownParent: $("#quickselect"),
|
dropdownParent: $("#quickselect"),
|
||||||
closeOnSelect: closeOnSelect
|
closeOnSelect: opt.closeOnSelect,
|
||||||
})
|
// 支持无限滚动
|
||||||
|
ajax: {
|
||||||
|
transport: (params, success, failure) => {
|
||||||
|
let pageSize = 50
|
||||||
|
let term = (params.data.term || '').toLowerCase()
|
||||||
|
let page = (params.data.page || 1)
|
||||||
|
let results = data.filter(x => {
|
||||||
|
cont = opt.enableHTML ? x.text.replace(/<[^<>]+>/g, '') : x.text
|
||||||
|
return cont.toLowerCase().includes(term) || PinyinMatch.match(cont, term)
|
||||||
|
})
|
||||||
|
let paged = results.slice((page -1) * pageSize, page * pageSize)
|
||||||
|
let options = { results: paged, pagination: { more: results.length >= page * pageSize } }
|
||||||
|
success(options)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
// 显示html时不转义标签
|
||||||
|
if (opt.enableHTML) prefer.escapeMarkup = markup => markup
|
||||||
|
$('#selectBox').select2(prefer)
|
||||||
$('#selectBox').val(null).trigger('change')
|
$('#selectBox').val(null).trigger('change')
|
||||||
$('#selectBox').select2('open')
|
$('#selectBox').select2('open')
|
||||||
$('#quickselect .select2').hide()
|
$('#quickselect .select2').hide()
|
||||||
|
modWindowHeight()
|
||||||
utools.setSubInput(({text})=>{
|
utools.setSubInput(({text})=>{
|
||||||
$("#quickselect .select2-search__field").val(text).trigger('input')
|
$("#quickselect .select2-search__field").val(text).trigger('input')
|
||||||
modWindowHeight($('#quickselect .select2-results__option').length)
|
modWindowHeight()
|
||||||
}, placeholder)
|
}, opt.placeholder)
|
||||||
$('#selectBox').on('select2:select', function (e) {
|
$('#selectBox').on('select2:select', function (e) {
|
||||||
callback({ index: $(this).val(), text: $(`option[value="${$(this).val()}"]`).text() })
|
callback({ index: $(this).val(), text: $(`option[value="${$(this).val()}"]`).text() })
|
||||||
if (closeOnSelect) {
|
if (opt.closeOnSelect) {
|
||||||
$('#selectBox').off('select2:select')
|
$('#selectBox').off('select2:select')
|
||||||
utools.removeSubInput()
|
utools.removeSubInput()
|
||||||
$("#quickselect").remove()
|
$("#quickselect").remove()
|
||||||
@ -203,14 +234,16 @@ quickcommand = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
updateSelectList: function (opt, selected = false) {
|
// 更新选项列表,暂时禁用
|
||||||
if(!$('#selectBox').length) throw '当前没有选择列表, 请结合 quickcommand.showSelectList 使用'
|
// updateSelectList: function (opt, selected = false) {
|
||||||
var num = $('#quickselect .select2-results__option').length
|
// if(!$('#selectBox').length) throw '当前没有选择列表, 请结合 quickcommand.showSelectList 使用'
|
||||||
$('#selectBox').append(new Option(opt, num, selected, selected)).trigger('change')
|
// var num = $('#quickselect .select2-results__option').length
|
||||||
$("#quickselect .select2-search__field").trigger('input')
|
// $('#selectBox').append(new Option(opt, num, selected, selected)).trigger('change')
|
||||||
if (!$("#customize").is(":parent")) utools.setExpendHeight(num > 10 ? 550 : 50 * num);
|
// $("#quickselect .select2-search__field").trigger('input')
|
||||||
},
|
// if (!$("#customize").is(":parent")) utools.setExpendHeight($('.select2-results').height() > 600 ? 600 : $('.select2-results').height());
|
||||||
|
// },
|
||||||
|
|
||||||
|
// 显示文本输入框
|
||||||
showTextAera: function (callback, placeholder = "") {
|
showTextAera: function (callback, placeholder = "") {
|
||||||
let helps = `正确用法:
|
let helps = `正确用法:
|
||||||
quickcommand.showTextAera(text => {
|
quickcommand.showTextAera(text => {
|
||||||
@ -232,8 +265,14 @@ quickcommand = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 关闭进程
|
||||||
kill: function (pid) {
|
kill: function (pid) {
|
||||||
process.kill(pid)
|
process.kill(pid)
|
||||||
|
},
|
||||||
|
|
||||||
|
// dom 解析
|
||||||
|
htmlParse: function (html) {
|
||||||
|
return new DOMParser().parseFromString(html, 'text/html')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,17 +357,26 @@ runCodeInVm = (cmd, cb, payload = "") => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let cbUnhandledError = e => {
|
let cbUnhandledError = e => {
|
||||||
window.removeEventListener('error', cbUnhandledError)
|
removeAllListener()
|
||||||
cb(null, e.error.toString())
|
cb(null, e.error.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
let cbUnhandledRejection = e => {
|
let cbUnhandledRejection = e => {
|
||||||
window.removeEventListener('unhandledrejection', cbUnhandledRejection)
|
removeAllListener()
|
||||||
cb(null, e.reason.toString())
|
cb(null, e.reason.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('error', cbUnhandledError)
|
let removeAllListener = () => {
|
||||||
window.addEventListener('unhandledrejection', cbUnhandledRejection);
|
window.removeEventListener('error', cbUnhandledError)
|
||||||
|
window.removeEventListener('unhandledrejection', cbUnhandledRejection)
|
||||||
|
delete window.isWatchingError
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!window.isWatchingError) {
|
||||||
|
window.addEventListener('error', cbUnhandledError)
|
||||||
|
window.addEventListener('unhandledrejection', cbUnhandledRejection)
|
||||||
|
window.isWatchingError = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// shell代码提示,当前环境变量下的所有命令
|
// shell代码提示,当前环境变量下的所有命令
|
||||||
|
Loading…
x
Reference in New Issue
Block a user