From ac1bcceb115e4696917452df1f899c0d1b026484 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 3 Sep 2019 22:39:44 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=92=8C=E9=9F=B3=E9=A2=91=E6=96=87=E4=BB=B6=E7=9A=84=E9=A2=84?= =?UTF-8?q?=E8=A7=88=202.=20=E5=A2=9E=E5=8A=A0=E9=9D=9E=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E9=A2=84=E8=A7=88,=20=E5=8D=B3?= =?UTF-8?q?=E5=9C=A8=E6=8F=92=E4=BB=B6=E9=A2=84=E8=A7=88=E4=B8=AD=E9=99=A4?= =?UTF-8?q?=E4=BA=86=E5=8E=9F=E6=9D=A5=E7=9A=84=E5=9B=9B=E5=A4=A7=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B(=E5=9B=BE=E7=89=87,=20=E9=9F=B3=E9=A2=91,=20=E8=A7=86?= =?UTF-8?q?=E9=A2=91,=20=E6=96=87=E6=9C=AC)=E4=B9=8B=E5=A4=96=E7=9A=84?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=96=87=E4=BB=B6=E4=B9=9F=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=88=AA=E5=9B=BE=E7=9A=84=E6=96=B9=E5=BC=8F=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E9=A2=84=E8=A7=88,=20=E5=A6=82pdf,=20=E4=BD=86=E6=AF=95?= =?UTF-8?q?=E7=AB=9Felectron=E5=B0=B1=E6=98=AFelectron,=20=E5=8F=97?= =?UTF-8?q?=E9=99=90=E4=BA=8E=E6=80=A7=E8=83=BD,=20=E8=BF=99=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9A=84=E9=A2=84=E8=A7=88=E5=8F=AA=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=86=85=E5=AE=B9,=20=E5=A6=82pdf=E5=8F=AA?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E7=AC=AC=E4=B8=80=E9=A1=B5,=20=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E7=9A=84=E5=86=85=E5=AE=B9=E9=80=9A=E8=BF=87=E5=8E=9F?= =?UTF-8?q?=E7=94=9F=E9=A2=84=E8=A7=88=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 + package-lock.json | 2 +- package.json | 2 +- public/logo.png | Bin 3082 -> 2195 bytes public/plugin.json | 2 +- public/preload.js | 21 +++ src/Finder.vue | 304 ++++++++++++++++++++++++------------- src/components/Detail.vue | 14 +- src/components/Setting.vue | 14 +- src/handler.js | 1 + src/main.js | 7 +- src/store.js | 4 +- src/tools.js | 22 ++- vue.config.js | 26 ++-- 14 files changed, 286 insertions(+), 137 deletions(-) diff --git a/README.md b/README.md index cc6698f..d900eb2 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ utools 插件, 用于在 macOS 提供与 Windows 中 Everything 插件类似的 另外科普一下, Everything 是基于 NTFS 文件系统的特性实现实时搜索, 在 macOS 上无论如何也是很难达到 Everything 的速度的, 所以插件直接使用了『回合制搜索』(即输入完成后需要按一下回车再开始搜索)而不是『实时搜索』, 反正也做不到干脆放弃. # 版本 +- `0.1.4` +插件预览可以预览非指定文件了! + 1. 增加视频和音频文件的预览 + 2. 增加非指定文件的预览, 即在插件预览中除了原来的四大类型(图片, 音频, 视频, 文本)之外的部分文件也通过截图的方式实现预览, 如pdf, 但毕竟electron就是electron, 受限于性能, 这部分的预览只提供部分内容, 如pdf只预览第一页, 更多的内容通过原生预览操作 - `0.1.3` 1. 右键菜单增加复制文件和删除文件的操作, 对应快捷键`c`和`delete` 2. 增加在插件预览的时候, 鼠标可以直接操作搜索结果, 切换预览的文件 diff --git a/package-lock.json b/package-lock.json index a0168c6..88138e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "utools-find", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a56dc0d..4bef005 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "utools-find", - "version": "0.1.3", + "version": "0.1.4", "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/public/logo.png b/public/logo.png index 08c04a8d950b09f77a11ba55ba122f8f28655fc1..460eb307a77e71d9797653add561c036bc6968df 100644 GIT binary patch literal 2195 zcmah~c{J2}AD+Q5MqbHKBaAH#%966bh_S^Cp}9&mX2z1T&yZ_v&>#%ims>`PvPJe} zyY@0DTlQ=&;959ob!9W&+~kq=lA{dn_!Q&6oyDb004lnwH4BV zd%FJpfqA(&W)a6-03+;eoy@uNp92H}|0(}3H$`8ucKGFAF&qxZb-4JG{0tmAhw>-K znvmH-NU6b-^9nxfWDc-{+qOL$n1q61LVh34&9iiT zC%K>H_Iw^6_Y5CQ!TW{2oZP+LxQ+7;!g<`byo{mru>6|0-Ksb7xn1}NrTEY!Twv5O zD3nk%LHO+*o*3;`wSkXFw9uf%$w3owpVucjKbnS)MW_y2m+NM?<)18OiWkM?@u*1HQlYdPsiHIPYgL)k!MsE7wIYL z$$5tJ%wSa%tEI}lwdq{PT7^oN%Q8H^N~GC0&vW%gH-&9noGTLu4V6!=S{XuQz@lOn zc2h3d?6G{`7!wnwXX||PXB`HNl9^Ez{##=R&Au9kaT+0n@3M*>{^P;YZS#9|4HP(< z7Cu__ zl4PRNmB-2aq(?WR@a9C!`MrrWuddmmw0_i@X%`fbzSLU0CpR*m9=Ep(TZP?>Dt@V5 z&5-^e8R$5^7M;re3x?S-&&T==S5B<03BSmhHtn`uux<`naa_H+O-_ z?34A_s}{*Wwv#8yoLOpK!kO9z1A763@z|REzP6;ZzJ^yVK!5e?oEcm#)dY*hLXUi4 zPdk?5KF9IaPkaoeWX7au?Av!Pig?dp=6KvzJ7EKUN|Qat9QCApWqV7)VBch8MHVbN zb<8yEJU}~3*|;-XUu)_~pM@M^F&iN%{L1k2!R!OVKw*0jdWx!YEVx7?g0xLzWtjzz zJH}bxNhep{jW9bdlj zD#(HfZ-U~2)}QM;(K;`L=PRL=Utuw{7*X)w9{&GUjZBdc^Yc+Z#&Af;(A4u+6& zU@=%Ib$wYYHpc6O{EgubnIxHt{F^J4WwK_2ox*tGTGS9vvX%d1Bv~VAWMM$rDBc0I z6=RVB#`P76MK+^?MFd4eyHzwCf)@C)Dh2p>Fk%nO)J9gdrTs&cUg_uB;u0fu7d(n0 zAA^7MUN2r29A_;#xe67z-iv>&%r6;J{naHX{Zg->C`hsxLJ=&lS&xs}=9TFAA**v` z*sa&&CN;(wVttUKJ0L)Ba>dy9ysf zOA5taI~hs%)jvO;Mn(!mP&leRI$!H*L~P8WFBYI&PAKu0`53k|J6#B{V=OhgFS@&U zL^`kJ2<(V-o7-n9x+cR42_U@)!Vctcs7X18#S z{G--s|Ijp1Z}qd4W1qj=xszyvs$XsKq3?e**KqoymMKGWfbg?wQZ*AdTj;q)rISSaY6RKfR>tvw1FS57sxQ={CK#Y`tL-}*S zJ5)Pctmw Q?&AiqHb)~XO=;>p-2Y>1f@%n5|l1Q z=_n-uL6D{(MZtigBqTw<++oIX<~rXyv(KLQJm;K!W`FFy@s{R>yj&7oAP|Vx*hnAF zyd(a-z^u$VVGzq~u!1bjY+#1IW=!VS(lxjJh5rbUNaP>+Ka&3yo51b=sAQ5%@vrqq z4YO-(Z3h4V3WfTkU_S(bK>WAM^fGzoV%kGOLjM1Q{%il8`Q`lun6XUk>gviIj0v2b zotezhK zjZCkJwcW4${a9vYTA0Bd0Ab%9N z-*0Gj`D!x-C>%%n-9n;0Q9-e8b(=ud3M%$d#;e^YZ)x>2w7?EZGhakm0NmUfv`b+fdGUi~kDvVjj8}N$2isTjr8B;yZ!aHi5sfN* zJ~Kwv>*eH|Oje6^zoV*Ike zJ>bn{NMHQt9`PP=qS=9I&S;_x8+TXw@!+_nM z)X0^(B7CS<>*KYXm$h+h=oLAuF*Ltari9Hypd>d@by=q(>aTwIuyIRHU{`rQiXWt; z;-h_W(Xbo$TABMIuH8A@wbv;y;Feb$kLf1W7njou)r#XEGyxI6D~B$by6EsqLrqom zF>DuWCJN#xX>c4qrCe|U0_P8xvK`SrdEi?bZ{~JwBTm-(?#EA*2ApT5?n>y*P|Gt% z@P3Oru5b%Z4|g_wclu&rJUXu21~F$({JuS0dz_9djXnRUz!$TuYSkSbc@N;03t6Al z7VL`p;P6C6Y5G#otL(Jx`)UFzN9(qdcv{GK)q;#@DMwS*oc`i9UH%wKd*O6w=$HJJr>ijh``x-n3PLJU$w&NjEHhg%oL1 zzUum49tqBBy1*U~IENM~_L9$Q`c%;KbfPk4QNA%uL%O&UT|FLE`A;*%Af+4f?aaCz zw#R~d>kIOxk~DJZQkl%$>;OY6g5}gz+@NMQOjoA%D4Jo*(HVeRBkKHBsAz8bMHgG7 zsdxQ7)HmMrv|=wFvyfV<;~)V|(;w`TFLBxkKe#^wfNBh!<8tkX)2Q zjGb{+Q(h7s_(>gFSPfd}q>Q$VKVt(MW~;VI^A=3#6uvvj(!5tEt9saM%Fp zXj$j`i00dQ6^dw8vnaL*t{bU+nrFVeH#8r*uC6UiO8%!g-v>HbrW9n(da6bu0dhY) zf;Uj@C2bVHDPE@@oUciLlRvcW5F{A8BfVl*%2KtZ{CG#0cw={P+eoL1<V$4)FsGC-cWbf4pGJ~-tDRKLnD$Jh)xY8i7 zQNuU~$$PaRQpid8f>f{0b4F1#wpAtu-o6J*j4GIoh)M~peIV3Ss#vw7 zuoJxG`QPcEE^g zJr`xkSXi_%b0Wp9puT#T!j=8X`mT%{-QP>FW`|llh$C5vmlP!7Eo6x2f-HHT2iEH? z!Fj}t_8M4%BTg4EJRV5k+5=Kb#c*YwP{z_EiNE}L z*};fv37q5WW!R9g2{cmyuM<6G+EmF>Zs4rsl_SP=Ltm?8QWC*4`O-hG@3}|lKf6va zlFbE^C_i%efyEkIR>DIvi6_`TjNLCjC$-zDz2)k8O`M?56_IHcZ+#*A-t&nC(@hmD z9k+NQ*YUOhPGcHHCvc2m>E$=MmpxHxRA z16wuT`S?_13>5T6=Zq5MVo~(`^57%C<-C>Cf60lKeW-Pij!zvLZ0P1v#7CAz-dKzh z)gE@IXNGx3pUCc!6b=}B<^E$P9aiyW6uq^|DdWoZ0`k&)N>^z5 zv~dd~{NW?I0y3DGow%*<5A|_d1et<@K$D~eCN$Oo$?4M>q?8$!BL zz}B;-SM^ziWN7@*k*5kqC2QRtyWEAdRawnGiYzn7enP&zDNHgbsz2hn#jUGhW8|`8 z)7R>1PQ??xE=~{h z+Pop=n;~n=;5_xfQ*RJwd%ac&`}TA<$F%aj@uE?wgfQ9$OZ5XfJ`t2Va1Bo4Pr uM=}4zeZ=N4?ER!&M*ltZXbQKj0^`;NV0TJCudeyuQ=u`;T)##a5&1t;4O%V$ diff --git a/public/plugin.json b/public/plugin.json index f3e0bb7..93cc56c 100644 --- a/public/plugin.json +++ b/public/plugin.json @@ -3,7 +3,7 @@ "author": "lanyuanxiaoyao", "homepage": "http://lanyuanxiaoyao.com", "description": "Mac 上的 Everything", - "version": "0.1.3", + "version": "0.1.4", "logo": "logo.png", "main": "index.html", "preload": "preload.js", diff --git a/public/preload.js b/public/preload.js index 2d00c57..1f537b5 100644 --- a/public/preload.js +++ b/public/preload.js @@ -290,6 +290,27 @@ var r=n(20),i=n(21),o=n(8);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647: }) } + const tempPath = '.' + window.initTempPath = base => { + this.tempPath = `${base}utools-find` + node_child.execSync(`rm -rf ${this.tempPath}`) + node_child.execSync(`mkdir -p ${this.tempPath}`) + } + + window.generatePreviewPicture = (name, path, callback) => { + node_child.exec(`qlmanage -t -s 1024 "${path}" -o ${this.tempPath}`, (error, stdout, stderr) => { + if (error) { + callback('') + } + var filePath = `${this.tempPath}/${name}.png` + if (fs.existsSync(filePath)) { + callback(filePath) + } else { + callback('') + } + }) + } + window.readFileList = (path, callback) => { var files = fs.readdirSync(path) var fileList = [] diff --git a/src/Finder.vue b/src/Finder.vue index 28f598c..d89a1d2 100644 --- a/src/Finder.vue +++ b/src/Finder.vue @@ -139,8 +139,9 @@ :modal="false" :modal-append-to-body="false" :show-close="false" - :size="'400px'" + :size="'450px'" :visible.sync="detailDrawer.open" + @close="detailDrawerCloseEvent" @open="detailDrawerOpenEvent" custom-class="detail-body" > @@ -150,121 +151,148 @@ > 文件详情 Detail +
-
- - - - -
- -
-
- - -
+ + + + +
+ +
+
+ + +
+
+
+
+
+
+ + 暂无预览, - 暂无预览, 使用 + 使用 quick look查看 - - - + + + + +
+ {{ item.name }} + 复制 +
+
+ +
+ {{ item.path }} + 复制 +
+
+ - -
- {{ item.name }} - 复制 -
-
- -
- {{ item.path }} - 复制 -
-
- {{ numberFix(item.size / 1000000000, 2) }} GB + {{ numberFix(item.size / 1000000, 2) }} MB + {{ numberFix(item.size / 1000, 2) }} KB + {{ item.size }} B + + + {{ item.count }} + + - {{ numberFix(item.size / 1000000000, 2) }} GB - {{ numberFix(item.size / 1000000, 2) }} MB - {{ numberFix(item.size / 1000, 2) }} KB - {{ item.size }} B - - - {{ item.count }} - - -
{{ item.type }}
- {{ item.kind }} -
-
- - - - - - -
-
-
+
{{ item.type }}
+ {{ item.kind }} + + + + + + + + + +
@@ -305,12 +333,14 @@ import { mapGetters } from 'vuex' import Tips from './components/Tips' import Settings from './components/Setting' +import Detail from './components/Detail' export default { name: 'finder', components: { Settings, - Tips + Tips, + Detail }, data() { return { @@ -332,6 +362,30 @@ export default { direction: 'rtl' }, item: {}, + codeMirrorOption: { + lineNumbers: true, + lineWrapping: true, + dragDrop: false, + readOnly: 'nocursor' + }, + viewer: { + images: [] + }, + viewerOptions: { + inline: false, + button: true, + navbar: false, + title: true, + toolbar: true, + tooltip: false, + movable: false, + zoomable: true, + rotatable: true, + scalable: true, + transition: false, + fullscreen: false, + keyboard: false + }, tempDir: '', homeDir: '/', rootDir: '/', @@ -401,6 +455,9 @@ export default { }), mounted() { utools.onPluginReady(() => { + var tempPath = utools.getPath('temp') + window.initTempPath(tempPath) + console.log('onPluginReady') var newSettings = Tools.databaseUpdate(this.settings) this.$store.commit('updateSettings', newSettings) @@ -535,6 +592,7 @@ export default { this.sort.field, this.sort.type ) + // 加载搜索结果 this.$refs.xTable.loadData(this.tableData) // 设置第一条结果的高亮 @@ -727,7 +785,9 @@ export default { } }, currentChangeEvent({ row }) { - this.loadData(row) + if (this.detailDrawer.open) { + this.loadData(row) + } }, sortChangeEvent(value) { this.loading = true @@ -791,6 +851,16 @@ export default { this.settings.data.pictureExtension.indexOf(extension) > -1 ) { this.item.preview = 'picture' + } else if ( + extension && + this.settings.data.videoExtension.indexOf(extension) > -1 + ) { + this.item.preview = 'video' + } else if ( + extension && + this.settings.data.audioExtension.indexOf(extension) > -1 + ) { + this.item.preview = 'audio' } if ( @@ -798,10 +868,17 @@ export default { (this.item.preview && this.item.preview === 'text') ) { window.readTextFile(this.item.path, data => { + this.item.text = '加载中...' var encode = CharDetect.detect(data) this.item.text = IconvLite.decode(data, encode) }) } + + if (!this.item.preview) { + window.generatePreviewPicture(this.item.name, this.item.path, path => { + this.item.thumbnails = path + }) + } }, numberFix(number, fixed) { return number.toFixed(fixed) @@ -812,6 +889,15 @@ export default { detailDrawerOpenEvent() { var item = this.$refs.xTable.getCurrentRow() this.loadData(item) + // this.$refs.detail.loadData(item) + }, + detailDrawerCloseEvent() { + if (this.$refs.videoPlayer) { + this.$refs.videoPlayer.pause() + } + if (this.$refs.audioPlayer) { + this.$refs.audioPlayer.pause() + } }, test() { console.log('hello') diff --git a/src/components/Detail.vue b/src/components/Detail.vue index 4928602..3e07ea4 100644 --- a/src/components/Detail.vue +++ b/src/components/Detail.vue @@ -136,7 +136,19 @@ export default { return } var extension = Tools.getExtension(this.item.name) - this.item.preview = Constant.typeMap()[extension] + console.log(extension) + if ( + extension && + this.settings.data.fileExtension.indexOf(extension) > -1 + ) { + this.item.preview = 'text' + } else if ( + extension && + this.settings.data.pictureExtension.indexOf(extension) > -1 + ) { + this.item.preview = 'picture' + } + if ( this.item.type === 'public.plain-text' || (this.item.preview && this.item.preview === 'text') diff --git a/src/components/Setting.vue b/src/components/Setting.vue index 1d1b512..e116803 100644 --- a/src/components/Setting.vue +++ b/src/components/Setting.vue @@ -100,7 +100,7 @@ >
很多文本文件(如代码)在 macOS 中并不会被识别为同一个类型, 基于此插件决定把后缀名交由用户决定, 将自己常用的文本文件定义为在这里, 即可对其进行预览, 图片亦是如此 - (注: 图片格式需谷歌浏览器图片标签原生支持, 否则无法显示). + (注: 图片, 音频和视频格式需谷歌浏览器标签原生支持, 否则无法显示).
@@ -121,6 +121,18 @@ v-model="settings.data.pictureExtension" > + + + + + + diff --git a/src/handler.js b/src/handler.js index 5cb9367..76610d9 100644 --- a/src/handler.js +++ b/src/handler.js @@ -47,6 +47,7 @@ export default { createDate: item.kMDItemFSCreationDate, updateDate: item.kMDItemFSContentChangeDate, text: "", + thumbnails: "", preview: "", files: [] }); diff --git a/src/main.js b/src/main.js index d34d117..6b5398a 100644 --- a/src/main.js +++ b/src/main.js @@ -5,7 +5,6 @@ import VXETable from "vxe-table"; import "vxe-table/lib/index.css"; import ElementUI from "element-ui"; import "../theme/index.css"; - import store from "./store"; Vue.use(VXETable); @@ -14,9 +13,7 @@ Vue.use(ElementUI); Vue.config.productionTip = false; Vue.directive("focus", { - update: (el, { - value - }) => { + update: (el, { value }) => { if (value) { el.focus(); } @@ -26,4 +23,4 @@ Vue.directive("focus", { new Vue({ store, render: h => h(Finder) -}).$mount("#app"); \ No newline at end of file +}).$mount("#app"); diff --git a/src/store.js b/src/store.js index 0e2e5b6..ea75f8b 100644 --- a/src/store.js +++ b/src/store.js @@ -20,7 +20,9 @@ const store = new Vuex.Store({ }, keyList: [], fileExtension: "txt,md,markdown,json,xml,java,py,c,cpp,html,css,vue", - pictureExtension: "png,jpg,jpeg,bmp,svg,ico" + pictureExtension: "png,jpg,jpeg,bmp,svg,ico", + videoExtension: "mp4,flv", + audioExtension: "mp3,ogg,wav" }, _rev: "" } diff --git a/src/tools.js b/src/tools.js index fa2d383..18b048f 100644 --- a/src/tools.js +++ b/src/tools.js @@ -25,18 +25,32 @@ export default { }, databaseUpdate(settings) { console.log("database update before:", settings); - if (!settings["data"]["databaseVersion"] || settings["data"]["databaseVersion"] < 1) { + if ( + !settings["data"]["databaseVersion"] || + settings["data"]["databaseVersion"] < 1 + ) { settings["data"]["databaseVersion"] = 1; settings["data"]["fileExtension"] = "txt,java,py,c,cpp,html,css,vue"; settings["data"]["pictureExtension"] = "png,jpg,jpeg,bmp,svg,ico"; } - if (!settings["data"]["databaseVersion"] || settings["data"]["databaseVersion"] < 2) { + if ( + !settings["data"]["databaseVersion"] || + settings["data"]["databaseVersion"] < 2 + ) { settings["data"]["databaseVersion"] = 2; settings["data"]["preview"] = { native: false - } + }; + } + if ( + !settings["data"]["databaseVersion"] || + settings["data"]["databaseVersion"] < 3 + ) { + settings["data"]["databaseVersion"] = 3; + settings["data"]["videoExtension"] = "mp4,flv"; + settings["data"]["audioExtension"] = "mp3,ogg,wav"; } console.log("database update finish:", settings); return settings; } -}; \ No newline at end of file +}; diff --git a/vue.config.js b/vue.config.js index 430b023..f513998 100644 --- a/vue.config.js +++ b/vue.config.js @@ -4,18 +4,18 @@ module.exports = { publicPath: "./", productionSourceMap: false, configureWebpack: { - optimization: { - minimizer: [ - new UglifyJsPlugin({ - uglifyOptions: { - compress: { - drop_console: true, - drop_debugger: false, - pure_funcs: ["console.log"] - } - } - }) - ] - } + // optimization: { + // minimizer: [ + // new UglifyJsPlugin({ + // uglifyOptions: { + // compress: { + // drop_console: true, + // drop_debugger: false, + // pure_funcs: ["console.log"] + // } + // } + // }) + // ] + // } } };