xiyuesaves / LiteLoaderQQNT-lite_tools

LiteLoaderQQNT 插件 - 轻量工具箱 —— 轻量 · 优雅 · 高效 · 福瑞
GNU General Public License v3.0
870 stars 30 forks source link

最近使用分组前置 #280

Closed Natsukage closed 1 month ago

Natsukage commented 1 month ago

为本地表情添加了最近使用分组前置功能

例如:现在有 A B C D E F G H...Z共26个分组 当我使用了C分组表情后,C分组会在分组表情列表中提前 本地表情列表显示为:常用表情 C A B D...Z 再次使用H分组表情后,本地表情列表顺序变为: 常用表情 H C A B D...Z 最近分组最多保留5个,其余的分组在后面还是会按照原本的顺序进行排列 例如我按照顺序从A到Z使用过每个分组的表情后,分组排列顺序将会变为 常用表情 Z Y X W V A B C...

主要是将自己平时惯用的表情包提前方便使用。 recentFolders的内容保存在了localEmoticonsConfigTemplate.json中。 上限目前写死为了常量const maxRecentFolders = 5;,这个按说应该是允许用户自行设置的,例如设置为-1时就是无上限,所有表情包全部都会按使用顺序排列,设置为0或者不设置时相当于关闭此功能,所有表情包都不会因为被使用而改变顺序。 但是我对LiteLoader的设置界面配置实在是一窍不通…所以只是实现了基本功能。

updateOptions的时候可能也需要额外地处理一下recentFolders的内容,此外,由于不清楚到底哪个广播可以触发下方的表情分组列表更新,我直接在insertToEditor时进行updateRecentFolders并广播了LiteLoader.lite_tools.updateEmoticons。如果这里有问题的话也要麻烦您改一下了(

xiyuesaves commented 1 month ago

这个功能的实现目前有点问题,如果我按住ctrl想同时输入多个表情时,在点击第一个表情后表情列表就会更新,导致用户得重新翻找刚才的表情包文件夹位置

Natsukage commented 1 month ago

是,其实广播事件应该放在窗体关闭的时候,如果不广播updateEmoticons的话,窗体里面的顺序是不会改变的。 但是我不太确定这里是不是应该广播整个updateEmoticons还是有其他更合适的广播(

Natsukage commented 1 month ago

因为正常情况下(在没有这个功能的时候) 表情文件夹的顺序是不会发生改变的,只有表情文件夹发生改变之后才会整体重载。所以好像并没有对应“只更新表情分组顺序”的广播。 但是我不确定是不是我看漏了…

xiyuesaves commented 1 month ago

确实没有单独更新顺序的事件,因为制作的时候也没有考虑这个问题,其实这个需求如果去掉动态排序的话,只需要修改文件夹名称就能实现表情包的排序了)

Natsukage commented 1 month ago

但是这个功能其实设计之初的思路就是为了动态排序( 相当于是常用表情plus

最初就是因为按文件夹名排序的结果就是我表情包前面全是BA,想找个弔图表情包要滚轮滚半天(

xiyuesaves commented 1 month ago

最初就是因为按文件夹名排序的结果就是我表情包前面全是BA,想找个弔图表情包要滚轮滚半天(

本地表情是有一个(不太好用)的快捷输入表情功能的,只需要前期花上亿点时间给每个表情文件命名就能快速找到想要的表情了)

Natsukage commented 1 month ago

是,我之前就是因为用快捷输入觉得不如直接选表情方便所以才考虑的这个(

针对特定表情而非表情包的检索不太方便, 因为很多抽象的表情其实挺难命名的,而且吐槽类的表情包(鲁迅表情包之类的)可能很久才用一次,特地去命名了真到要用的时候往往早就忘了表情包名了。 绝大多数都是点开表情包列表然后挑一个合适的进行回复(

还有个场外原因是因为之前litetools实装贴纸下载功能之前,我是用的单独的贴纸管理工具,它判断有没有新贴纸包的方式就是和本地文件(去掉扩展名后)列表对比,所以tg表情包都是用uniqueId命名的,改文件名会给追更表情包带来不小的麻烦。所以我一般都不会去改TG贴纸表情包的文件名来的。

xiyuesaves commented 1 month ago

针对特定表情而非表情包的检索不太方便, 因为很多抽象的表情其实挺难命名的,而且吐槽类的表情包(鲁迅表情包之类的)可能很久才用一次,特地去命名了真到要用的时候往往早就忘了表情包名了。 绝大多数都是点开表情包列表然后挑一个合适的进行回复(

或许可以把表情包路径也进行筛选,这样会不会好些(?如果要改成你的pr的这种实现的话,那估计本地表情这个模块得重构很大一部分)

Natsukage commented 1 month ago

啊,如果太麻烦的话就算了233,毕竟这个功能本来也是我自己有用,别人可能确实没这需求。 路径筛选的意义不太大,之所以会需要用本地表情其实很大一个原因就是因为表情太多了,QQ自带的1000个收藏表情不够用,如果是少数一些比较高频常用的表情的话其实用QQ自己的收藏表情功能就完全够用了(QQ自己的收藏表情本身就可以设置备注然后通过输入文字快速插入的)。

有不少弔图表情包、斗图用的表情包其实都是养兵千日用兵一时的,绝大多数的TG贴纸集的表情包也是这样,比如下面这些例子 https://t.me/addstickers/BlueArchiveOfficialMangaMarkIII https://t.me/addstickers/BlueArchiveOfficialMangaMarkII https://t.me/addstickers/BlueArchiveOfficialManga 一个表情包里有120个贴纸,下载下来时候根本也不知道以后自己会用到哪张,甚至以后会不会用到都难说,只是可能正好聊到相关话题了就从表情包集合里翻出来去用。

斗图的表情包几乎都是几十几百张的弔图,就算用路径检索实际上也很难定位到自己想要的那张(毕竟快捷输入只会显示10张符合要求的图片)。这个pr最开始的原因就是因为尝试了几种方法(包括nekoImageGallery,改为输入表情包名以后自动弹出对应的本地表情包窗口,将常用表情功能右键选项里添加一个“跳转到表情分组”,将常用表情功能改为常用分组功能,点击对应的常用表情不会插入表情而是会直接跳到对应的表情包等,现在的pr思路本质上就是对最后2个方法的优化结果。

感觉这个应该不用太重构模块吧?上面的实现中并没有修改表情包的存储方式等底层的东西,它做的只是在appendEmoticons时候优先append最近N组表情,然后再按照正常顺序append其他表情。除此以外并没有进行其他改动呀。appendEmoticons只影响根据表情包生成html元素(和右键菜单)时的顺序,实际上表情包在内存中依然还是按照原始的顺序存储的。

其实之所以会用tg表情包最根本原因就是偷图省事爽, 而且直接下载的TG贴纸表情包的文件夹名本身是贴纸的shortname而不是贴纸的title,想要能够根据路径定位的话就还得手动去管理文件夹名,我现在偷了上百个贴纸集以后看到文件夹目录就已经完全不想动了 (结果就是宁可去码pr都不想整理表情包

xiyuesaves commented 1 month ago

感觉动态更新还是不太好设计,不如在设置页面让用户自行排序表情包顺序

Natsukage commented 1 month ago

感觉动态更新还是不太好设计,不如在设置页面让用户自行排序表情包顺序

之前也考虑过这个思路(TG就是这样的),但是感觉上按照这个思路实现的话对本地表情的模块的改动会更大,而且需要额外设计本地表情管理的设置模块和对应的UI,感觉有些小题大做,所以最后没采取这个思路。

现在的动态更新不好设计的具体难点是在哪里呢?我看看有没有办法解决。是因为多次调用appendEmoticons会导致过高的资源消耗吗?

xiyuesaves commented 1 month ago

主要是这个逻辑有点奇怪?我还没见到哪个软件的功能是部分区域重排的,还有就是排序的更新时机得调整下,不能在用户还没有关闭表情窗口时更新排序,或者更新后能跳转到新的表情位置

Natsukage commented 1 month ago

image 在TG群里At你了,不过你可能没看到( 这个就是TG的手机版自带的功能,我就是因为习惯了TG的贴纸用法,所以这个功能也是参照TG的实现的233

xiyuesaves commented 1 month ago

怎么关了?我最近还没时间来改这个功能,准备过段时间来处理来着

Natsukage commented 1 month ago

大改了一下,现在应该是已经完成的状态了(可以在设置中进行配置,-1为无限制,0为关闭功能(默认关闭)) 之前的因为临时施工痕迹太多了,commit乱七八糟,我就重置了一下合并成一个commit再提交了。