{{ tab.name }}
@@ -27,12 +27,7 @@ const tabs = [
{ name: '收藏', type: 'collect', icon: Collection }
]
const activeTab = ref('all')
-const emit = defineEmits(['onNavClick'])
const toggleNav = (type) => (activeTab.value = type)
-const onNavClick = (type) => {
- toggleNav(type)
- emit('onNavClick', type)
-}
defineExpose({
tabs,
activeTab,
diff --git a/src/data/notify.json b/src/data/notify.json
index f6a4a0a..e0c009e 100644
--- a/src/data/notify.json
+++ b/src/data/notify.json
@@ -1,5 +1,5 @@
{
"title": "重要版本更新提示",
- "content": "1. 如果你是第一次使用此插件, 请务必设置跟随主程序启动选项, 否则可能导致剪贴板记录丢失2. 插件使用过程中遇到任何问题, 请到论坛发布页回帖或加入QQ群反馈",
- "version": 2
+ "content": "1. 如果你是第一次使用此插件, 请务必设置跟随主程序启动选项, 否则可能导致剪贴板记录丢失2. 请手动安装`clipboard-event-handler`以获得最佳剪贴板监听性能3. 插件使用过程中遇到任何问题, 请到论坛发布页回帖或加入QQ群反馈",
+ "version": 3
}
diff --git a/src/data/setting.json b/src/data/setting.json
index c009875..a6cc93f 100644
--- a/src/data/setting.json
+++ b/src/data/setting.json
@@ -49,7 +49,7 @@
"regex": "^(?:#?[a-f0-9]{6}|(?:(?:25[0-5]|2[0-4]\\d|1?\\d{1,2}), ?){2}(?:25[0-5]|2[0-4]\\d|1?\\d{1,2})|rgba?\\((?:(?:25[0-5]|2[0-4]\\d|1?\\d{1,2}), ?){2}(?:25[0-5]|2[0-4]\\d|1?\\d{1,2})(?:, ?(?:1|0|0\\.\\d{1,2}))?\\)|hs[liv]a?\\((?:360|(?:(?:3[0-5]\\d|[1-2]\\d{2}|\\d{1,2})(?:\\.\\d{1,15})?))(?:deg)?(?:, |,| )(?:100|\\d{1,2}(?:\\.\\d{1,15})?)%?(?:, |,| )(?:100|\\d{1,2}(?:\\.\\d{1,15})?)%?(?:, ?(?:1|0|0\\.\\d{1,2}))?\\))$"
}
],
- "command": "redirect:统计文本次数"
+ "command": "redirect:颜色信息"
},
{
"id": "custom.1663490862",
diff --git a/src/global/initPlugin.js b/src/global/initPlugin.js
index c3a5103..de46d0d 100644
--- a/src/global/initPlugin.js
+++ b/src/global/initPlugin.js
@@ -1,5 +1,15 @@
-const { utools, existsSync, readFileSync, writeFileSync, mkdirSync, crypto, clipboard, time } =
- window.exports
+const {
+ utools,
+ existsSync,
+ readFileSync,
+ writeFileSync,
+ mkdirSync,
+ crypto,
+ listener,
+ clipboard,
+ time,
+ Buffer
+} = window.exports
import setting from './readSetting'
export default function initPlugin() {
@@ -205,23 +215,56 @@ export default function initPlugin() {
db.addItem(item)
}
- let prev = db.dataBase.data[0] || {}
- function loop() {
- time.sleep(300).then(loop)
- const item = pbpaste()
- if (!item) return
- item.id = crypto.createHash('md5').update(item.data).digest('hex')
- if (item && prev.id != item.id) {
- // 剪切板元素 与最近一次复制内容不同
- prev = item
- handleClipboardChange(item)
- } else {
- // 剪切板元素 与上次复制内容相同
+ const addCommonListener = () => {
+ let prev = db.dataBase.data[0] || {}
+ function loop() {
+ time.sleep(300).then(loop)
+ const item = pbpaste()
+ if (!item) return
+ item.id = crypto.createHash('md5').update(item.data).digest('hex')
+ if (item && prev.id != item.id) {
+ // 剪切板元素 与最近一次复制内容不同
+ prev = item
+ handleClipboardChange(item)
+ } else {
+ // 剪切板元素 与上次复制内容相同
+ }
}
+ loop()
+ }
+
+ const registerClipEvent = (listener) => {
+ const exitHandler = () => {
+ utools.showNotification('剪贴板监听异常退出 请重启插件以开启监听')
+ utools.outPlugin()
+ }
+ const errorHandler = (error) => {
+ const info = '请到设置页手动安装 clipboard-event-handler 剪贴板监听程序'
+ utools.showNotification('启动剪贴板监听程序启动出错: ' + error + info)
+ addCommonListener()
+ }
+ listener
+ .on('change', handleClipboardChange)
+ .on('close', exitHandler)
+ .on('exit', exitHandler)
+ .on('error', (error) => errorHandler(error))
+ }
+
+ if (!utools.isMacOs()) {
+ // 首次启动插件 即开启监听
+ registerClipEvent(listener)
+ listener.startListening(setting.database.path)
+ } else {
+ // macos 由于无法执行 clipboard-event-handler-mac 所以使用旧方法
+ addCommonListener()
}
- loop()
utools.onPluginEnter(() => {
+ if (!listener.listening && !utools.isMacOs()) {
+ // 进入插件后 如果监听已关闭 则重新开启监听
+ registerClipEvent(listener)
+ listener.startListening(setting.database.path)
+ }
toTop()
resetNav()
})
diff --git a/src/global/registerElement.js b/src/global/registerElement.js
index 7ddab2c..daffe7a 100644
--- a/src/global/registerElement.js
+++ b/src/global/registerElement.js
@@ -9,6 +9,7 @@ import 'element-plus/theme-chalk/el-input.css'
import 'element-plus/theme-chalk/el-select.css'
import 'element-plus/theme-chalk/el-option.css'
import 'element-plus/theme-chalk/el-scrollbar.css'
+import 'element-plus/theme-chalk/el-tag.css'
import {
ElButton,
ElMessageBox,
@@ -17,7 +18,8 @@ import {
ElInput,
ElSelect,
ElOption,
- ElScrollbar
+ ElScrollbar,
+ ElTag
} from 'element-plus'
const components = [
@@ -28,7 +30,8 @@ const components = [
ElInput,
ElSelect,
ElOption,
- ElScrollbar
+ ElScrollbar,
+ ElTag
]
document.querySelector('html').className = utools.isDarkColors() ? 'dark' : ''
diff --git a/src/style/cpns/setting.less b/src/style/cpns/setting.less
index 9e19af8..dcd0c99 100644
--- a/src/style/cpns/setting.less
+++ b/src/style/cpns/setting.less
@@ -12,12 +12,16 @@
width: 85px;
}
&.operation-select {
- width: 450px;
+ width: 520px;
}
}
.el-textarea {
width: 70%;
}
+ .el-tag {
+ margin: 0 10px;
+ cursor: pointer;
+ }
.path {
width: 65%;
}
diff --git a/src/views/Main.vue b/src/views/Main.vue
index 251b750..4021a85 100644
--- a/src/views/Main.vue
+++ b/src/views/Main.vue
@@ -7,7 +7,7 @@
@onDataRemove="handleDataRemove"
@onOverlayClick="toggleFullData({ type: 'text', data: '' })"
>
-
+
@@ -47,7 +47,9 @@
:fullData="fullData"
:isMultiple="isMultiple"
:currentActiveTab="activeTab"
+ :isSearchPanelExpand="isSearchPanelExpand"
@onMultiCopyExecute="handleMultiCopyBtnClick"
+ @toggleMultiSelect="() => (isMultiple = true)"
@onDataChange="toggleFullData"
@onDataRemove="handleDataRemove"
>
@@ -153,7 +155,7 @@ const textFilterCallBack = (item) => {
}
}
-const updateShowList = (type) => {
+const updateShowList = (type, toTop = true) => {
// 更新显示列表
showList.value = list.value
.filter((item) =>
@@ -162,7 +164,7 @@ const updateShowList = (type) => {
.filter((item) => (filterText.value ? item.type !== 'image' : item)) // 有过滤词 排除掉图片 DataURL
.filter((item) => textFilterCallBack(item))
.slice(0, GAP) // 重新切分懒加载列表
- window.toTop()
+ toTop && window.toTop()
}
const restoreDataBase = () => {
@@ -179,11 +181,6 @@ const restoreDataBase = () => {
.catch(() => {})
}
-const handleNavClick = (type) => {
- updateShowList(type)
- offset.value = 0 // 重置懒加载偏移量
-}
-
const fullData = ref({ type: 'text', data: '' })
const fullDataShow = ref(false)
const toggleFullData = (item) => {
@@ -197,7 +194,7 @@ const ClipSwitchRef = ref()
const handleDataRemove = () => {
// 此函数须在挂载后执行
list.value = window.db.dataBase.data
- updateShowList(ClipSwitchRef.value.activeTab)
+ updateShowList(ClipSwitchRef.value.activeTab, false)
}
const emit = defineEmits(['showSetting'])
@@ -226,17 +223,26 @@ onMounted(() => {
updateShowList(activeTab.value)
// 定期检查更新
- let prev = {}
- setInterval(() => {
- const now = window.db.dataBase.data[0]
- if (prev?.id === now?.id) {
- } else {
- // 有更新
+ if (!utools.isMacOs() && window.listener.listening) {
+ // 非macOS系统且监听器开启时
+ window.listener.on('change', () => {
list.value = window.db.dataBase.data
updateShowList(activeTab.value)
- prev = now
- }
- }, 800)
+ })
+ } else {
+ // macOS且监听器启动失败时
+ let prev = {}
+ setInterval(() => {
+ const now = window.db.dataBase.data[0]
+ if (prev?.id === now?.id) {
+ } else {
+ // 有更新
+ list.value = window.db.dataBase.data
+ updateShowList(activeTab.value)
+ prev = now
+ }
+ }, 800)
+ }
// 监听搜索框
watch(filterText, (val) => updateShowList(activeTab.value))
@@ -287,6 +293,7 @@ onMounted(() => {
const isEnter = key === 'Enter'
const isShift = key === 'Shift'
const isAlt = key === 'Alt'
+ const isSpace = key === ' '
if (isTab) {
const tabTypes = tabs.map((item) => item.type)
const index = tabTypes.indexOf(activeTab.value)
@@ -308,6 +315,7 @@ onMounted(() => {
} else if (isMultiple.value) {
// 退出多选状态
isMultiple.value = !isMultiple.value
+ e.stopPropagation()
} else {
// 无上述情况 执行默认: 隐藏uTools主窗口
}
@@ -323,6 +331,8 @@ onMounted(() => {
} else if (ctrlKey || metaKey || isAlt) {
// Ctrl: utools模拟执行粘贴时触发
// Alt:
+ } else if (isSpace) {
+ // 空格向下多选
} else {
window.focus() // 其他键盘事件 直接聚焦搜索框
}
diff --git a/src/views/Setting.vue b/src/views/Setting.vue
index 54e49b8..d712b6c 100644
--- a/src/views/Setting.vue
+++ b/src/views/Setting.vue
@@ -2,13 +2,23 @@
- 🚀 主页
- ⚡ 云同步教程
- 💡 创造自己的功能按钮
+ 💖 赞赏我
+ 🚀 主页
+ ⚡ 迁移数据 | 云同步 | 自定义功能
⭐ 开源代码
🎈 论坛发布页
+
+ 剪贴板监听程序状态
+
+ {{ listenStatus ? '已安装' : '未安装' }}
+
+
数据库路径
@@ -38,7 +48,6 @@
multiple
:multiple-limit="5"
placeholder="请选择"
- :teleported="false"
>