Compare commits

...

104 Commits

Author SHA1 Message Date
4ce19e25e5 !182 4.2.2
Merge pull request !182 from shenmo/dev
2023-01-31 04:31:43 +00:00
17c152ce8b update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-31 04:30:03 +00:00
zty199
9275074e10 fix: 修复窗口关闭后台运行时,调用 spk 链接窗口不会自动显示的问题
链接调用时仅执行了窗口 activateWindow() 操作,在窗口隐藏时无效

Log: 添加 setWindowState(Qt::WindowActive) 操作和 show() 操作
2023-01-31 12:12:04 +08:00
e69eaa6296 update tool/apt-fast-conf/apt-fast.conf.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-31 02:50:11 +00:00
35bc1efbad 转oyo
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-31 02:33:59 +00:00
9420959023 cmake-patch: 更新补丁用于处理 v4.2.2 时期的变动部分变动与其它问题
1. v4.2.2 时期的新增的安装文件
2. Makefile 的默认触发的目标异常
3. 以及 SPARK_QM_TRANSLATIONS 文件输出的部分
    其与 SPARK_OVERRIDE_VERSION 的文件输出相同
2023-01-30 23:24:44 +08:00
7a16b5c52f patchs-doc: 补充一些注意事项 2023-01-30 22:21:19 +08:00
24519e6560 patchs-doc: 增加补丁操作说明文档 2023-01-30 22:05:08 +08:00
2104b99208 cmake-patch: 更新补丁用于支持 debian/changelog 版本覆盖构建 2023-01-30 22:03:27 +08:00
zty199
cf549c540d feat: ISSUE #I69IJI 自动关闭到托盘以防止下载和安装中断
添加托盘图标,主窗口关闭后仍然在后台运行;左键单机托盘图标显示主窗口

Log: 添加托盘图标;重构 MainWindow 构造函数,拆分 UI 初始化代码至单独函数;修改启动时窗口渐变动画初始化位置至 showEvent 中
2023-01-30 18:30:43 +08:00
zty199
4b40e3caca feat: ISSUE #I67K8Y 新增 spk://search/keyword 链接格式解析
支持打开该链接跳转搜索页面(禁止直接搜索 %,搜索结果过多会导致搜索页面 QtWebEngine 进程崩溃,无法继续搜索)

Log: 支持链接跳转搜索结果页面;暂不支持直接跳转到应用详情页
2023-01-30 16:19:48 +08:00
1a89c2a1a6 修改: debian/changelog 2023-01-30 15:53:35 +08:00
b1fd1a3c3c fix:zenity-fail-on-wayland 2023-01-30 15:51:35 +08:00
50e895938b transhell改为用source引入 2023-01-30 13:19:07 +08:00
18d2b1edbb update tool/apt-fast-conf/apt-fast.conf.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-30 03:30:45 +00:00
柚子
f91ee56d97 判断oyo是否存在
Signed-off-by: 柚子 <chowhound_xb@163.com>
2023-01-28 16:44:12 +00:00
41a6a3fc04 !181 4.2.1
Merge pull request !181 from shenmo/dev
2023-01-27 09:51:15 +00:00
1266b16d83 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-27 09:50:18 +00:00
4359a9c58d 正确获取语言代码
将load transhell的变量改为local
2023-01-27 16:31:10 +08:00
c243a30dec 修复:安装翻译文件位置错误 2023-01-27 12:31:20 +08:00
f629dca03c 更改到usr/share来加载 2023-01-27 12:26:51 +08:00
f2e1219a83 更新翻译 2023-01-27 12:22:32 +08:00
e2f27c7746 transhell update 1 2023-01-27 11:24:20 +08:00
72ba481180 update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-26 17:05:35 +00:00
8d41966d67 奇怪的符号残留 2023-01-20 09:30:33 +08:00
f2a4ce3b25 文案修改:Ubuntu tag现在指的是22.04 2023-01-20 09:24:50 +08:00
0b2290344b 移除ssinstall的安装测试 2023-01-20 00:18:20 +08:00
a7cb44348d 修改以符合用法 2023-01-20 00:17:35 +08:00
384d4b300d 支持在安装前进行测试(ss-do-upgrade-worker)
用法:pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app pkgname
2023-01-20 00:15:24 +08:00
19a1ba4289 修复: linux mint下无法统计下载量
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-19 10:24:30 +00:00
c160f4105d update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-16 09:13:42 +00:00
682a6e38d6 !180 4.2 正式
Merge pull request !180 from shenmo/dev
2023-01-16 09:11:11 +00:00
e4a3a974b5 dWine5标签现在意味着是Wine应用而不是Dwine5应用 2023-01-16 17:00:09 +08:00
eb38f2af05 修复:wayland下无法提示
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-16 08:52:06 +00:00
7163f8ee80 更新时显示正在安装的应用 2023-01-16 15:04:04 +08:00
a934373f1e * 调整:UOS开发者模式提示现在不会那么挤了 2023-01-15 23:05:25 +08:00
ce6ded25f2 fix: mint下无法正常调用aptss
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-15 13:59:49 +00:00
f707fef65b 4.3 2023-01-07 22:30:39 +08:00
721e6580c9 aptss修复一直重复 2023-01-07 22:24:22 +08:00
e20572b28d update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-07 02:50:56 +00:00
05a6af8f86 修改: debian/changelog 2023-01-07 10:39:53 +08:00
d4e84344c3 * 修复: 420t1版本中ssinstall有时会重新下载软件包的问题
* 新增: 安装前会对软件包安装进行dry run以判断是否能正确安装

  * 调整: aptss在进行任何操作前均检测是否存在包文件

  * 调整: 修改apt-fast源代码以指定conf位置为/tmp/apt-fast,这部分不再使用bwrap模拟
2023-01-07 10:34:59 +08:00
f856060d3d 为了避免重复下载,暂时让ssinstall和ssaudit重新使用dpkg 2023-01-07 00:57:54 +08:00
49829f8d3c 统一将获取uri的改成apt-get 2023-01-06 23:53:43 +08:00
4cd3ca56e0 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev 2023-01-06 23:45:31 +08:00
0538777ceb 准备test2 2023-01-06 23:44:37 +08:00
d3b303c66c update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 15:39:10 +00:00
98c4e8a699 更多的汉化 2023-01-06 23:37:34 +08:00
69b7cbe472 apt-fast相关改动:支持显示报错等
* feat: aptss支持显示报错

  * feat: aptss部分提示汉化

  * fix: 修复部分情况下ssinstall实际未安装但是错误显示
2023-01-06 23:30:05 +08:00
539a21ccec update DOCS/spk-doc.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 11:11:16 +00:00
eb40a32cc2 add DOCS/内网部署.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 10:01:47 +00:00
440b7ea88d update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 09:49:41 +00:00
36d273dd5e !179 4.1.2 正式版
Merge pull request !179 from shenmo/dev
2023-01-06 09:43:45 +00:00
6bdc1ee51c update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 09:29:18 +00:00
ecfa9a166d update src/main.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 09:24:19 +00:00
199700495c update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 09:23:57 +00:00
0bafab7f94 update DOCS/spk-doc.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 09:14:07 +00:00
dd4deff19d update DOCS/spk-doc.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-06 09:12:58 +00:00
8b88573283 在ssinstall输出中指出根目录或者单目录 2023-01-05 14:54:57 +08:00
2717cf695c ssinstall不允许安装验证失败的软件包 2023-01-05 14:53:15 +08:00
385803754f 区分版本号,新改动转给412t2 2023-01-05 14:49:23 +08:00
8ba377cf0b changelog 2023-01-05 14:47:29 +08:00
c21d4dac96 支持store分类单独安装 2023-01-05 14:45:53 +08:00
a85200338c 删除apt-fast推荐
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-04 06:43:06 +00:00
5d34dd6413 update src/main.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-04 04:36:19 +00:00
bd3daeba75 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-04 04:35:06 +00:00
zty199
8b2a61e4b2 fix: 修复下载列表中进度提示文字显示不完整的问题
QLabel 未处理文字过长的问题

Log: 控件提升为 DLabel,设置文字过长时右侧显示省略号;添加鼠标悬浮提示;固定 item 中应用名称宽度未 120px,保证进度条显示位置对齐
2023-01-03 21:42:46 +08:00
116f14845e 修复control无法识别 2023-01-03 21:42:24 +08:00
77bf544c59 删成安装依赖了
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-03 13:34:09 +00:00
f809d7c15d update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-03 13:33:37 +00:00
1f7f3edbba 删除多余的g++依赖
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-01-03 13:20:50 +00:00
90f6b6a574 update: translate 2023-01-03 21:18:26 +08:00
3e51ce8381 Merge branch 'dev' of gitee.com:deepin-community-store/spark-store into dev 2023-01-03 21:10:37 +08:00
b7df4a5801 fix: issue I68566 2023-01-03 21:10:28 +08:00
980e4a17d9 * feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
2023-01-03 13:16:24 +08:00
d5248f4c1b Merge branch 'dev' of gitee.com:deepin-community-store/spark-store into dev 2023-01-01 11:02:04 +08:00
zty199
c169622806 fix: 修复应用详情页“应用反馈”按钮点击后无法调起交流平台问题
QProcess::startDetached 函数调用入参错误

Log: 修改调用方式,拆开 sh 和启动脚本地址分别用于 program 和 arguments
2023-01-01 00:27:04 +08:00
zty199
cc54014b29 fix: 修复应用详情页卸载应用后点击“安装”按钮后客户端崩溃问题
应用卸载后,按钮文字被设置为“安装”,导致点击按钮时判断要从下载列表中找到对应 DownloadItem 并触发安装;此时列表中并不存在此应用,list 访问下标越界导致崩溃

Log: 卸载后将按钮文字设置为“下载”避免该问题
2022-12-31 23:53:06 +08:00
zty199
c636e0882b fix: ISSUE #I68566 下载列表错位,图标错误
DownloadItem 原始定义高度为 54px,上下边距各 4px;然而图片 label 高度定义为 48,且宽度未定义,明显放不下;DownloadListWidget 中添加 item 时,设置每个 item sizeHint 高度只有 50px,与 item 高度不一致

Log: 固定 DownloadItem 高度为 56px;修改 DownloadListWidget 添加 item 时每个 item 的 sizeHint 高度;使用 DLabel 替换 QLabel 用于单个 item 中应用名称显示,使用 setElideMode 保证名称过长时右边显示省略号,并添加鼠标悬浮提示
2022-12-31 23:13:28 +08:00
zty199
4120af7e24 fix: 修复 Deepin/UOS 上始终认为开发者模式未打开的问题
读取 /var/lib/deepin/developer-mode/enabled 文件之前,QFile 未 open

Log: 判断条件中添加 QFile::open 操作;去除没啥意义的 QTextStream,直接使用 QIODevice::readLine 读取文件第一行
2022-12-31 22:08:26 +08:00
09a5789c26 Merge branch 'dev' of gitee.com:uniartisan2018/spark-store into dev 2022-12-29 12:16:00 +08:00
fc658f324d fix: 检测UOS开发者模式 2022-12-29 12:15:04 +08:00
2861b0573b fix: 检测UOS开发者模式 2022-12-29 12:07:30 +08:00
2ab4ebc0e3 fix: 安装结束的错误判断 2022-12-28 12:31:15 +08:00
e344b16aa0 fix: 校验 serverlist 有效性 2022-12-27 10:54:30 +08:00
30b65350ca fix: 规范代码 2022-12-27 10:24:15 +08:00
0db8c8b1bb 更改文案:星火计划开发者
更改链接:GPL 3的链接更改到主仓库的LICENSE文件而不是GNU官网链接
2022-12-27 01:34:22 +08:00
9e25584bdc 更新翻译:去除“联盟” 2022-12-27 01:31:06 +08:00
ee6d6f145f 最后还是简单的等10s会比较容易 2022-12-27 01:15:07 +08:00
347f6e918f update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-26 15:52:40 +00:00
0fcbd15ab4 update: 4.1.2's changelog 2022-12-26 22:13:11 +08:00
6bdac50059 chore: 默认域名修改为cdn域名 2022-12-26 22:09:34 +08:00
f45b2af260 update: 更新翻译文件 2022-12-26 20:54:47 +08:00
d744c1d978 fix: e645c5e5 参数错误 2022-12-26 20:05:17 +08:00
0544761094 fix: 修复api重复申请内存的泄漏 2022-12-26 19:05:07 +08:00
e645c5e526 fix: 消除qt警告 2022-12-26 19:05:02 +08:00
d75fdd9f80 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-26 08:49:08 +00:00
30f74db0dc Merge branch 'dev' of https://gitee.com/deepin-community-store/spark-store into dev 2022-12-25 22:10:25 +08:00
2d0069ce18 更名为ssaudit 2022-12-25 22:09:42 +08:00
48b91d1887 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-25 14:06:21 +00:00
32cb3d7453 ssinstall禁止安装验证失败的包,审核转到使用ssinstall-audit 2022-12-25 22:00:19 +08:00
zty199
ba3071d62b chore: 去除关于窗口中文描述信息中多余引号
修改翻译文件

Log: 修改翻译文件;修正 debian/changelog 中格式错误(line 8)
2022-12-25 18:10:11 +08:00
zty199
dca80a3fbb fix: 修复配置文件写入位置异常问题
main.cpp 中通过 QStandardPaths 获取配置文件路径,此时未设置组织名称和程序名称,导致路径异常

Log:
1. main.cpp 中提前设置组织名称和程序名称,再读写配置文件
2. main.cpp 中提前检查配置文件所在文件夹是否存在,不存在则创建,再读写配置文件
3. 修复 main.cpp 中修改配置文件后没有写入的问题
4. 去除版本号中重复的 Version 字样(由关于窗口提供)
5. 修复关于窗口中组织图标显示为 deepin 的问题(已去除)
6. 修复 wayland 下窗口设置透明度相关警告(wayland 下禁用透明度动画)
7. 下载列表 wayland 下窗口标题添加翻译
2022-12-25 17:58:00 +08:00
f99c0839dd !178 fix: 修复主窗口关闭后,关于窗口没有自动关闭的问题
* 添加 Application 类,继承 DApplication,将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
* 1.1. 添加 setOrganizationName 操作,设置组织名称为 spark-union,与 SWRT 保持一致
* 1.2. 设置组织名称后,QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径(server.list/config.ini 等)
* 1.3. 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
* 修复关于窗口不显示组织 Logo 的问题,补充丢失的资源文件,整理资源文件
* 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
* 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动,pid 未初始化为随机值,执行 kill 操作时未判断导致)
* 修复进入详情页时焦点默认在分享链接按钮上的问题
* 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
* 更新翻译文件,去除已经不存在的翻译
2022-12-25 08:28:05 +00:00
58 changed files with 2279 additions and 1818 deletions

View File

@@ -2,6 +2,8 @@
参数只有一个Url该url应当遵循这种格式`spk://<任意合法字符>/web分类/包名` 参数只有一个Url该url应当遵循这种格式`spk://<任意合法字符>/web分类/包名`
目前第一字段不进行处理,以后可能会对此识别。在目前阶段,这个字段可以填写任意合法字符
例如: 例如:
[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl) [spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
@@ -11,15 +13,15 @@
| 分类名称 | web分类   | | 分类名称 | web分类   |
| -------- | -------------- | | -------- | -------------- |
| 网络应用 | network | | 网络 | network |
| 社交沟通 | chat | | 社交 | chat |
| 音乐欣赏 | music | | 音乐 | music |
| 视频播放 | video | | 视频 | video |
| 图形图像 | graphics | | 图像 | image_graphics |
| 游戏娱乐 | games | | 游戏 | games |
| 办公学习 | office | | 办公 | office |
| 阅读翻译 | reading | | 阅读 | reading |
| 编程开发 | development | | 开发 | development |
| 系统工具 | tools | | 工具 | tools |
| 主题美化 | beautify | | 主题 | themes |
| 其他应用 | others | | 其他 | others |

7
DOCS/内网部署.md Normal file
View File

@@ -0,0 +1,7 @@
需要修改的内容商店默认源位置aptss获取apt-fast.conf和sparkstore.list的地址ssinstall做安装检查的源位置
服务器使用update.sh进行同步。
为方便使用(其实是早期屎山使然),请将仓库放置于 `/home/ftp/spark-store`
仓库管理相关代码请移步 [这里](https://gitee.com/deepin-community-store/repo_auto_update_script)update.sh请联系 @shenmo 获取

246
debian/changelog vendored
View File

@@ -1,77 +1,203 @@
spark-store (4.2.2) stable; urgency=medium
* 调整脚本应用的transhell支持转为source导入
* 修复ssinstall弹窗支持wayland
* 新增:应用托盘,下载时候可以放心关闭窗口了
* 新增支持spk://search/内容 格式链接
--shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.1) stable; urgency=medium
* 调整支持在安装前进行测试ss-do-upgrade-worker,但是未实装到appinfo
* 修复因依赖不完全导致在LinuxMint下无法下载统计
* 新增:脚本系列应用支持英文
--shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2) stable; urgency=medium
* 调整UOS开发者模式提示现在不会那么挤了
* 修复wayland下可正常弹出更新提示
* 调整dwine5标签的文案改为Wine应用
* 新增:更新软件时弹窗会显示正在更新的软件包名
--shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2~test3) stable; urgency=medium
* 修复: aptss ssupdates
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2~test2) stable; urgency=medium
* 修复: 420t1版本中ssinstall有时会重新下载软件包的问题
* 新增: 安装前会对软件包安装进行dry run以判断是否能正确安装
* 调整: aptss在进行任何操作前均检测是否存在Packages文件若存在则不进行ssupdate
* 调整: 修改apt-fast源代码以指定conf位置为/tmp/apt-fast,这部分不再使用bwrap模拟
* 新增: aptss检测Package文件支持分目录目前指定为store
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2~test1) stable; urgency=medium
* 新增: aptss支持显示报错
* 新增: aptss部分提示汉化
* 修复: 修复部分情况下ssinstall实际未安装但是错误显示
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.2) stable; urgency=medium spark-store (4.1.2) stable; urgency=medium
* feat: 初步的wayland支持 * feat: 初步的wayland支持
* feat: UOS下检测开发者模式是否开启若未开启则拒绝安装
* fix: 首页的捐赠页面在中文环境下显示中文 * fix: 首页的捐赠页面在中文环境下显示中文
* chore: 新增编译依赖,测试安装时不会出现报错
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。 * fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
* chore: ssinstall现在拒绝安装验证失败的包审核操作现在需要改用ssaudit
* fix: Ubuntu下下载列表无法关闭
* fix: 修复进入详情页时焦点默认在分享链接按钮上的问题
* fix: 修复特定情况下的内存泄漏问题
* fix: 适配c11代码规范消除qt编译警告
* fix: 默认服务器域名指向cdn域名
* fix: 消除内部函数的无用变量,限制作用域
* feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
* chore: 去除安装依赖:g++
* fix: 修复下载列表中进度提示文字显示不完整的问题
* feat: ssinstall支持从单独文件夹中校验软件包
* feat 支持分单文件夹下载。具体内容参见https://gitee.com/deepin-community-store/repo_auto_update_script/blob/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list
* info: 非常感谢 @jwyh 对星火商店代码仓库设计了很多标准,参见 https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo?id=%e6%9b%b4%e6%96%b0%e6%97%a5%e5%bf%97%e8%a7%84%e5%88%99 不过shenmo是自由的
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
* chore: 添加 Application 类,继承 DApplication将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
* chore: 添加 setOrganizationName 操作,设置组织名称为 spark-union与 SWRT 保持一致
* chore: 设置组织名称后QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径
* chore: 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
* chore: 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
* chore: 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动pid 未初始化为随机值,执行 kill 操作时未判断导致)
* chore: 新增编译依赖,测试安装时不会出现报错
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
* chore: 更新翻译文件,去除已经不存在的翻译
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.2~test2) stable; urgency=medium
* feat: ssinstall支持从单独文件夹中校验软件包
* feat 支持分单文件夹下载。具体内容参见https://gitee.com/deepin-community-store/repo_auto_update_script/blob/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list
* info: 非常感谢 @jwyh 对星火商店代码仓库设计了很多标准,参见 https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo 不过shenmo是自由的
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.2~test1) stable; urgency=medium
* feat: 初步的wayland支持
* feat: UOS下检测开发者模式是否开启若未开启则拒绝安装
* fix: 首页的捐赠页面在中文环境下显示中文
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
* chore: ssinstall现在拒绝安装验证失败的包审核操作现在需要改用ssaudit
* fix: Ubuntu下下载列表无法关闭
* fix: 修复进入详情页时焦点默认在分享链接按钮上的问题
* fix: 修复特定情况下的内存泄漏问题
* fix: 适配c11代码规范消除qt编译警告
* fix: 默认服务器域名指向cdn域名
* fix: 消除内部函数的无用变量,限制作用域
* feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
* chore: 去除安装依赖:g++
* fix: 修复下载列表中进度提示文字显示不完整的问题
* chore: 添加 Application 类,继承 DApplication将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
* chore: 添加 setOrganizationName 操作,设置组织名称为 spark-union与 SWRT 保持一致
* chore: 设置组织名称后QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径
* chore: 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
* chore: 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
* chore: 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动pid 未初始化为随机值,执行 kill 操作时未判断导致)
* chore: 新增编译依赖,测试安装时不会出现报错
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
* chore: 更新翻译文件,去除已经不存在的翻译
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.1) stable; urgency=medium spark-store (4.1.1) stable; urgency=medium
* fix:更新失效 * fix:更新失效
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.0) stable; urgency=medium spark-store (4.1.0) stable; urgency=medium
* feat: 现在可以支持UOS签名包问题了 * feat: 现在可以支持UOS签名包问题了
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.0.1) stable; urgency=medium spark-store (4.0.1) stable; urgency=medium
* feat: 提升Ubuntu下的显示效果 * feat: 提升Ubuntu下的显示效果
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.0.0) stable; urgency=medium spark-store (4.0.0) stable; urgency=medium
* feat: 修复了成吨的bug后开始正式版 * feat: 修复了成吨的bug后开始正式版
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.0.0~test2) stable; urgency=medium spark-store (4.0.0~test2) stable; urgency=medium
* feat: 修复了成吨的bug后开始公测 * feat: 修复了成吨的bug后开始公测
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.0.0~test1) stable; urgency=medium spark-store (4.0.0~test1) stable; urgency=medium
* feat: 柚子过来补充一下啦 * feat: 柚子过来补充一下啦
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.4~test1) stable; urgency=medium spark-store (3.4~test1) stable; urgency=medium
* feat: aptss不再尝试安装apt-fast转而自带 * feat: aptss不再尝试安装apt-fast转而自带
* chore: 删除password-check模块 * chore: 删除password-check模块
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.3) stable; urgency=medium spark-store (3.3.3) stable; urgency=medium
* feat: 首页链接调用浏览器打开 * feat: 首页链接调用浏览器打开
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
0spark-store (3.3.3~test5) stable; urgency=medium
spark-store (3.3.3~test5) stable; urgency=medium
* 修复可能的内存泄漏问题 * 修复可能的内存泄漏问题
* 修复应用搜索为空但仍显示上一次搜索结果的问题 * 修复应用搜索为空但仍显示上一次搜索结果的问题
* 修复动画加载延后的问题 * 修复动画加载延后的问题
* 修复统计下载量卡主渲染线程的问题 * 修复统计下载量卡主渲染线程的问题
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.3~test4) stable; urgency=medium spark-store (3.3.3~test4) stable; urgency=medium
* Enable i386 arch support by default * Enable i386 arch support by default
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.3~test3) stable; urgency=medium spark-store (3.3.3~test3) stable; urgency=medium
@@ -84,7 +210,8 @@ spark-store (3.3.3~test2) stable; urgency=medium
* bug fix: 更新和检查更新出错时不报错.此更新需要一个推送 * bug fix: 更新和检查更新出错时不报错.此更新需要一个推送
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.3~test1) stable; urgency=medium spark-store (3.3.3~test1) stable; urgency=medium
@@ -92,132 +219,137 @@ spark-store (3.3.3~test1) stable; urgency=medium
* 图形环境中所有root权限的组件剥离到cli(可用于deepin 23 daily只保证商店本体正常运作不处理安装依赖不满足) * 图形环境中所有root权限的组件剥离到cli(可用于deepin 23 daily只保证商店本体正常运作不处理安装依赖不满足)
* 文案更改:更新检查-->检查更新 * 文案更改:更新检查-->检查更新
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.1~test1) stable; urgency=medium spark-store (3.3.1~test1) stable; urgency=medium
* 安装时不再需要联网 * 安装时不再需要联网
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.0.4) stable; urgency=medium spark-store (3.3.0.4) stable; urgency=medium
* 为减轻服务器压力,不再单独更新某一个应用,而是作为整体更新 * 为减轻服务器压力,不再单独更新某一个应用,而是作为整体更新
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.0.3) stable; urgency=medium spark-store (3.3.0.3) stable; urgency=medium
* 回滚 更新中行为到进度条而不是实时输出 * 回滚 更新中行为到进度条而不是实时输出
* 更新应用时显示正在更新哪个应用 * 更新应用时显示正在更新哪个应用
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.0.2) stable; urgency=medium spark-store (3.3.0.2) stable; urgency=medium
* 修复 pkexec未执行 * 修复 pkexec未执行
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.0.1) stable; urgency=medium spark-store (3.3.0.1) stable; urgency=medium
* 修复 检查更新的更新进程未实际运行 * 修复 检查更新的更新进程未实际运行
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3) stable; urgency=medium spark-store (3.3) stable; urgency=medium
* 修复 检查更新 未刷新软件源 * 修复 检查更新 未刷新软件源
* 把检查更新单独拿出作为左列 * 把检查更新单独拿出作为左列
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3~test3) stable; urgency=medium spark-store (3.3~test3) stable; urgency=medium
* 把检查更新加入免密码 * 把检查更新加入免密码
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3~test2) stable; urgency=medium spark-store (3.3~test2) stable; urgency=medium
* 更新检测功能全部更改到zenity * 更新检测功能全部更改到zenity
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3~test1) stable; urgency=medium spark-store (3.3~test1) stable; urgency=medium
* zenity选择可更新应用 * zenity选择可更新应用
* 自动更新检测现在会跳过hold * 自动更新检测现在会跳过hold
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.4) stable; urgency=medium spark-store (3.2.4) stable; urgency=medium
* 修改tag相关的文案内容wine相关环境已可自动配置了 * 修改tag相关的文案内容wine相关环境已可自动配置了
* 准备发版 * 准备发版
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.4~test4) stable; urgency=medium spark-store (3.2.4~test4) stable; urgency=medium
* 现在在商店启动后点击spk链接仍会正常启动 https://gitee.com/deepin-community-store/spark-store/commit/dd6780d636042bf12d77414e6f1552cc7d1ed24c * 现在在商店启动后点击spk链接仍会正常启动 https://gitee.com/deepin-community-store/spark-store/commit/dd6780d636042bf12d77414e6f1552cc7d1ed24c
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.4~test3) stable; urgency=medium spark-store (3.2.4~test3) stable; urgency=medium
* 发版合入到master * 发版合入到master
* 翻译完毕 * 翻译完毕
* 合入先前的各项改动客户端集成投稿器入口和支持修复安装依赖时间较长时错误地返回“安装完毕”结果现在客户端版本更新时不关闭免密码登录UOS安装进程合并正常aptss中 * 合入先前的各项改动客户端集成投稿器入口和支持修复安装依赖时间较长时错误地返回“安装完毕”结果现在客户端版本更新时不关闭免密码登录UOS安装进程合并正常aptss中
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.4~test2) stable; urgency=medium spark-store (3.2.4~test2) stable; urgency=medium
* 客户端集成投稿器入口和支持 * 客户端集成投稿器入口和支持
* 修复:安装依赖时间较长时错误地返回“安装完毕”结果 * 修复:安装依赖时间较长时错误地返回“安装完毕”结果
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.4~test1) stable; urgency=medium spark-store (3.2.4~test1) stable; urgency=medium
* 客户端更新时不关闭免密码登录 * 客户端更新时不关闭免密码登录
* UOS合并正常aptss中 * UOS合并正常aptss中
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.3) stable; urgency=medium spark-store (3.2.3) stable; urgency=medium
* 客户端异常退出时仍然占用资源问题修复 * 客户端异常退出时仍然占用资源问题修复
* 降低dtk依赖版本Debian 11 stable可直接安装 * 降低dtk依赖版本Debian 11 stable可直接安装
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.2) stable; urgency=medium spark-store (3.2.2) stable; urgency=medium
* aptss will now refresh the system source before doing install, policy....etc * aptss will now refresh the system source before doing install, policy....etc
* 启动客户端GPU加速支持 * 启动客户端GPU加速支持
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2.1) stable; urgency=medium spark-store (3.2.1) stable; urgency=medium
* 更改刷新系统源的功能 * 更改刷新系统源的功能
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.2) stable; urgency=medium spark-store (3.2) stable; urgency=medium
@@ -230,20 +362,22 @@ spark-store (3.2) stable; urgency=medium
* 修复 在更新检测设置中的是否开启自动更新检测设置项的显示不随开启或关闭状态改变 * 修复 在更新检测设置中的是否开启自动更新检测设置项的显示不随开启或关闭状态改变
* 修复 在检测更新时临时降低优先级到100防止系统中有且版本一致的包被反复来回更新 * 修复 在检测更新时临时降低优先级到100防止系统中有且版本一致的包被反复来回更新
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.6) stable; urgency=medium spark-store (3.1.6) stable; urgency=medium
* 修复部分情况下无法选中正确的镜像源的问题 * 修复部分情况下无法选中正确的镜像源的问题
* 合入3.1.5以来的各项修改 * 合入3.1.5以来的各项修改
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.5-5) stable; urgency=medium spark-store (3.1.5-5) stable; urgency=medium
* 从所有镜像源中选取最快镜像源高速下载 * 从所有镜像源中选取最快镜像源高速下载
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.5-4) stable; urgency=medium spark-store (3.1.5-4) stable; urgency=medium
@@ -253,53 +387,54 @@ spark-store (3.1.5-4) stable; urgency=medium
* 更新检测服务优化:从分体改为一体 * 更新检测服务优化:从分体改为一体
* aptss 支持自动补全 * aptss 支持自动补全
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.5-3) stable; urgency=medium spark-store (3.1.5-3) stable; urgency=medium
* 包内自带密钥 * 包内自带密钥
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.5-2) stable; urgency=medium spark-store (3.1.5-2) stable; urgency=medium
* 下载软件时跳过获取大小,修复部分软件无法下载的问题 * 下载软件时跳过获取大小,修复部分软件无法下载的问题
* 修复 获取key时出错指定使用http1.1 * 修复 获取key时出错指定使用http1.1
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.5-1) stable; urgency=medium spark-store (3.1.5-1) stable; urgency=medium
* 改变更新策略UOS也下载加速但是安装不加速 * 改变更新策略UOS也下载加速但是安装不加速
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.5) stable; urgency=medium spark-store (3.1.5) stable; urgency=medium
* 改变更新策略,现在支持应用在更新时引入新依赖 * 改变更新策略,现在支持应用在更新时引入新依赖
* ss-apt-fast现在默认允许降级以与apt使用体验一致 * ss-apt-fast现在默认允许降级以与apt使用体验一致
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.4-2) stable; urgency=medium spark-store (3.1.4-2) stable; urgency=medium
* 客户端下载使用metalink来支持bt下载加速 * 客户端下载使用metalink来支持bt下载加速
* 修复使用更新和安装设置更新商店本体时出错 * 修复使用更新和安装设置更新商店本体时出错
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.4-1) stable; urgency=medium spark-store (3.1.4-1) stable; urgency=medium
* 安装脚本和检测更新脚本检查网络时间超时时间延长至5s * 安装脚本和检测更新脚本检查网络时间超时时间延长至5s
* 修复ssinstall在没有安装apt-fast的情况下首次安装需要依赖的软件时安装失败 * 修复ssinstall在没有安装apt-fast的情况下首次安装需要依赖的软件时安装失败
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.4) stable; urgency=medium spark-store (3.1.4) stable; urgency=medium
@@ -312,6 +447,7 @@ spark-store (3.1.4) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.3-2) stable; urgency=medium spark-store (3.1.3-2) stable; urgency=medium
* 调整 现在与系统更新分开,不再导致更新失败 * 调整 现在与系统更新分开,不再导致更新失败
@@ -320,17 +456,17 @@ spark-store (3.1.3-2) stable; urgency=medium
* 修改ss-apt-fast的策略现在除了安装下载和更新都改用apt * 修改ss-apt-fast的策略现在除了安装下载和更新都改用apt
* ssinstall 现在也会在不适用ss-apt-fast的时候模拟源了针对UOS * ssinstall 现在也会在不适用ss-apt-fast的时候模拟源了针对UOS
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.3-1) stable; urgency=medium spark-store (3.1.3-1) stable; urgency=medium
* 修复 下载提前退出 * 修复 下载提前退出
* 移除 下载量显示 * 移除 下载量显示
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.3) stable; urgency=medium spark-store (3.1.3) stable; urgency=medium
* Now uses aria2 to download softwares form all mirrors * Now uses aria2 to download softwares form all mirrors
@@ -342,6 +478,7 @@ spark-store (3.1.3) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.1.2) stable; urgency=medium spark-store (3.1.2) stable; urgency=medium
* Now let apt-fast method support all mirrors * Now let apt-fast method support all mirrors
@@ -350,8 +487,6 @@ spark-store (3.1.2) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
spark-store (3.1.1) stable; urgency=medium spark-store (3.1.1) stable; urgency=medium
* Now will delete the link of policy file after uninstall or upgrade * Now will delete the link of policy file after uninstall or upgrade
@@ -360,8 +495,6 @@ spark-store (3.1.1) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
spark-store (3.1.0) stable; urgency=medium spark-store (3.1.0) stable; urgency=medium
* Add pkexec policy: ssinstall. Only will be enabled after permitted. * Add pkexec policy: ssinstall. Only will be enabled after permitted.
@@ -370,7 +503,6 @@ spark-store (3.1.0) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
spark-store (3.0.3-13) stable; urgency=medium spark-store (3.0.3-13) stable; urgency=medium
* Update the ssinstall script. Now support apt-fast and will temporarily increase the spark store source priority to 500 to make depends install correctly * Update the ssinstall script. Now support apt-fast and will temporarily increase the spark store source priority to 500 to make depends install correctly
@@ -380,7 +512,6 @@ spark-store (3.0.3-13) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
spark-store (3.0.3-12) stable; urgency=medium spark-store (3.0.3-12) stable; urgency=medium
* Rollback to use DApplication::loadDXcbPlugin() to make titlebar behave normally in ubuntu * Rollback to use DApplication::loadDXcbPlugin() to make titlebar behave normally in ubuntu
@@ -390,8 +521,6 @@ spark-store (3.0.3-12) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
spark-store (3.0.3-11) stable; urgency=medium spark-store (3.0.3-11) stable; urgency=medium
* Now support autoupdate * Now support autoupdate
@@ -399,8 +528,6 @@ spark-store (3.0.3-11) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
spark-store (3.0.3-10) stable; urgency=medium spark-store (3.0.3-10) stable; urgency=medium
* Now also compile dstore patch * Now also compile dstore patch
@@ -413,3 +540,4 @@ spark-store (3.0.3-9) stable; urgency=medium
* Support dpkg-buildpackage * Support dpkg-buildpackage
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800 -- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800

8
debian/control vendored
View File

@@ -20,10 +20,9 @@ Build-Depends:
qtwayland5-dev-tools, qtwayland5-dev-tools,
gcc, gcc,
g++ g++
Standards-Version: 3.0 Standards-Version: 3.0
Homepage: https://www.spark-app.store/ Homepage: https://www.spark-app.store/
Package: spark-store Package: spark-store
Architecture: any Architecture: any
Depends:${shlibs:Depends}, ${misc:Depends}, Depends:${shlibs:Depends}, ${misc:Depends},
@@ -42,8 +41,7 @@ Depends:${shlibs:Depends}, ${misc:Depends},
bubblewrap, bubblewrap,
aria2, aria2,
gcc, gcc,
g++, zenity,
zenity libc6-dev
Description: Spark Store Description: Spark Store
A community powered app store, based on DTK. A community powered app store, based on DTK.
Recommends: apt-fast

View File

@@ -25,6 +25,7 @@ case "$1" in
ln -s -f /opt/durapps/spark-store/bin/ussremove /usr/local/bin/ussremove ln -s -f /opt/durapps/spark-store/bin/ussremove /usr/local/bin/ussremove
ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/local/bin/ssaudit
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast

View File

@@ -4,6 +4,7 @@ if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
# Remove residual symbol links # Remove residual symbol links
rm /usr/local/bin/spark-store rm /usr/local/bin/spark-store
rm /usr/local/bin/ssinstall rm /usr/local/bin/ssinstall
rm /usr/local/bin/ssaudit
rm /usr/local/bin/spark-dstore-patch rm /usr/local/bin/spark-dstore-patch
rm /usr/local/bin/ussinstall rm /usr/local/bin/ussinstall
rm /usr/local/bin/ussremove rm /usr/local/bin/ussremove

44
patchs/README.md Normal file
View File

@@ -0,0 +1,44 @@
# 补丁操作说明
- 克隆与构建本项目
> 用于 zinface-community-cmake-build-system.patch 补丁化构建方式
```shell
git clone https://gitee.com/deepin-community-store/spark-store
cd spark-store
git am < patchs/zinface-community-cmake-build-system.patch
make package
sudo dpkg -i build/*.deb
```
- 在应用补丁时,并对补丁进行的更新操作
```shell
# 切换到一个新的分支,即可开始进行补丁内的更新提交
git checkout -b cmake-build-system
# origin/dev 表示本仓库的 dev 开发分支
# 在应用过补丁,并产生了新的提交,即可在当前所在补丁更新分支内
# 相对基于 origin/dev 为参考,目前所包含的所有最新提交内容将生成为一个补丁文件(其中尾部为增量更新)
git format-patch --stdout origin/dev > patchs/zinface-community-cmake-build-system.patch
# 最后,回到你的原 dev 分支,将被改变的补丁文件进行提交
# 在推送完成后,即可放弃你在 cmake-build-system 分支中所有产生的内容(因为都已经进入补丁)
```
- 一些注意事项
```shell
# 在不了解补丁时,你需要认识一下补丁,但补丁与补丁之间有着不同的用法
# 本 patchs/zinface-community-cmake-build-system.patch 补丁为 cmake 化构建
# 关于补丁的一些方面
# 1. 首先你需要了解 git 是什么,以及简单的使用
# 2. 你需要了解补丁是什么,以及简单的使用(应用补丁)
# 3. 你需要了解如何创建一个补丁,最基本的就是相对于旧目标分支,将本分区新增的提交进行导出为补丁
# 4. 你可能只会将单个提交、或多个提交导出为补丁,但这还不够,你需要具有绝对的对于补丁的理解
# 5. 对于不同的目的补丁,应该是多个 patch 文件存在的形式
# 6. 最后,不管在什么时候,你在应用补丁前,你应该考虑是否应用到当前分支?为什么不切换到一个新的分支呢?
```

View File

@@ -1,7 +1,7 @@
From 9d1714ec7ceb3748bd151af059389ed10d37e676 Mon Sep 17 00:00:00 2001 From abbfbf12c1ea9853039e6864d0ede91973189ce6 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com> From: zinface <zinface@163.com>
Date: Sun, 11 Dec 2022 22:27:23 +0800 Date: Sun, 11 Dec 2022 22:27:23 +0800
Subject: [PATCH 1/5] =?UTF-8?q?repo:=20=E4=B8=80=E6=AC=A1=E6=80=A7?= Subject: [PATCH 01/10] =?UTF-8?q?repo:=20=E4=B8=80=E6=AC=A1=E6=80=A7?=
=?UTF-8?q?=E5=AF=BC=E5=85=A5=20spark=20=E9=AA=A8=E6=9E=B6=E4=BB=A5?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=20spark=20=E9=AA=A8=E6=9E=B6=E4=BB=A5?=
=?UTF-8?q?=E5=8F=98=E4=B8=BA=20cmake=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E5=8F=98=E4=B8=BA=20cmake=20=E6=9E=84=E5=BB=BA?=
MIME-Version: 1.0 MIME-Version: 1.0
@@ -1789,10 +1789,10 @@ index 0000000..0fa070b
2.20.1 2.20.1
From 1e1cb19995536d74626960ae863bf4c5cd9e3a4b Mon Sep 17 00:00:00 2001 From d1974334ce60291894b53f6839b78f3147aaa233 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com> From: zinface <zinface@163.com>
Date: Sun, 11 Dec 2022 22:37:26 +0800 Date: Sun, 11 Dec 2022 22:37:26 +0800
Subject: [PATCH 2/5] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20deb=20?= Subject: [PATCH 02/10] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20deb=20?=
=?UTF-8?q?=E5=AE=89=E8=A3=85=E8=84=9A=E6=9C=AC=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E8=84=9A=E6=9C=AC=E7=9A=84=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=88=90=20cmake=20=E5=8C=96=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=88=90=20cmake=20=E5=8C=96=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA?= =?UTF-8?q?=E5=BB=BA?=
@@ -1856,10 +1856,10 @@ index 2ab24e7..38ad2d7 100644
2.20.1 2.20.1
From 4f07b34bc268bc3c49ef1c51c524d50ccbbf6d07 Mon Sep 17 00:00:00 2001 From 5a978c7db6c34d7dcd4aa56d94605e51245004a5 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com> From: zinface <zinface@163.com>
Date: Mon, 12 Dec 2022 00:50:01 +0800 Date: Mon, 12 Dec 2022 00:50:01 +0800
Subject: [PATCH 3/5] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20Spark=20?= Subject: [PATCH 03/10] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20Spark=20?=
=?UTF-8?q?=E6=9E=84=E5=BB=BA=20=E4=B8=8E=20CMake=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=20=E4=B8=8E=20CMake=20=E6=9E=84=E5=BB=BA?=
=?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=A2=84=E8=A7=88=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=A2=84=E8=A7=88=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0 MIME-Version: 1.0
@@ -2184,10 +2184,10 @@ index 0000000..a807009
2.20.1 2.20.1
From cb59139fcfd74b530a14f2a987aa38d28d403225 Mon Sep 17 00:00:00 2001 From 4b5b4bc91a42cc860efbe1728f2dba9f255ea954 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com> From: zinface <zinface@163.com>
Date: Thu, 15 Dec 2022 19:59:46 +0800 Date: Thu, 15 Dec 2022 19:59:46 +0800
Subject: [PATCH 4/5] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?= Subject: [PATCH 04/10] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
=?UTF-8?q?=E4=BA=8E=20Qt5=20Svg=20=E4=BE=9D=E8=B5=96=E7=9A=84=E6=9E=84?= =?UTF-8?q?=E4=BA=8E=20Qt5=20Svg=20=E4=BE=9D=E8=B5=96=E7=9A=84=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=BB=BA=E5=86=85=E5=AE=B9?=
MIME-Version: 1.0 MIME-Version: 1.0
@@ -2236,10 +2236,10 @@ index b56399f..67e29b6 100644
2.20.1 2.20.1
From 72e5ca47cef718cdbd4ea45134d574874fb43ba9 Mon Sep 17 00:00:00 2001 From ede820a7267afa113a2d8b4f93f45fa6c1b4b23b Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com> From: zinface <zinface@163.com>
Date: Mon, 19 Dec 2022 02:58:17 +0800 Date: Mon, 19 Dec 2022 02:58:17 +0800
Subject: [PATCH 5/5] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?= Subject: [PATCH 05/10] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
=?UTF-8?q?=E4=BA=8E=E6=94=AF=E6=8C=81=20BaseWidgetOpacity=20=E5=9F=BA?= =?UTF-8?q?=E4=BA=8E=E6=94=AF=E6=8C=81=20BaseWidgetOpacity=20=E5=9F=BA?=
=?UTF-8?q?=E7=A1=80=E7=B1=BB=E7=9A=84=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E7=A1=80=E7=B1=BB=E7=9A=84=E6=9E=84=E5=BB=BA?=
MIME-Version: 1.0 MIME-Version: 1.0
@@ -2282,3 +2282,315 @@ index 14530e1..b5e32d8 100644
-- --
2.20.1 2.20.1
From b63790722efa275977b2033a1beeb21b730c1895 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 20:48:25 +0800
Subject: [PATCH 06/10] =?UTF-8?q?spark:=20=E5=88=9B=E5=BB=BA=E6=96=B0?=
=?UTF-8?q?=E7=9A=84=E6=A8=A1=E5=9D=97=E7=94=A8=E4=BA=8E=20debian/changelo?=
=?UTF-8?q?g=20=E7=9A=84=E7=89=88=E6=9C=AC=E5=8F=B7=E9=87=8D=E5=86=99?=
=?UTF-8?q?=E8=A7=84=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. SparkDebianChangelogVersion.cmake
在此文件中提供 spark_debian_changelog_override_version 宏:
基于指定的 debian/changelog 文件并用于读取最新版本号并覆盖到项目版本
@Since: v4.0.0
---
CMakeLists.txt | 4 ++
cmake/SparkDebianChangelogVersion.cmake | 58 +++++++++++++++++++++++++
2 files changed, 62 insertions(+)
create mode 100644 cmake/SparkDebianChangelogVersion.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b5e32d8..73221bc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,6 +11,10 @@ include(cmake/SparkFindDtkConfig.cmake) # 提供了 target_link_dtk 用
include(cmake/SparkTranslatorConfig.cmake) # 提供了 qt5 ts转qm 的操作,最终生成 SPARK_QM_TRANSLATIONS 变量用于构建可执行文件时参与编译
include(cmake/SparkMacrosExtendConfig.cmake) # 使用了 spark_ 宏基于已提供的宏参数自动展开构建可执行目标文件
include(cmake/SparkInstallMacrosConfig.cmake) # 提供了 spark_install 开头的 macro 宏用于安装 target、file、program、directory、changelog 等内容
+include(cmake/SparkDebianChangelogVersion.cmake)# 提供了 spark_debian_ 开头的宏进行进行覆盖 PROJECT_VERSION
+
+# 在开始之前,使用项目中提供的 debian/changelog 进行重写本构建系统的 PROJECT_VERSION
+spark_debian_changelog_override_version(debian/changelog)
# 资源文件路径
set(QRC_SOURCES "src/assets/assets.qrc")
diff --git a/cmake/SparkDebianChangelogVersion.cmake b/cmake/SparkDebianChangelogVersion.cmake
new file mode 100644
index 0000000..9d8bca2
--- /dev/null
+++ b/cmake/SparkDebianChangelogVersion.cmake
@@ -0,0 +1,58 @@
+# SparkDebianChangelogVersion
+
+# 尝试读取 debian/changelog 文件的第一行数据,并查找
+# spark-store (4.2.2) stable; urgency=medium
+# 将 (version) 信息应用用于 PROJECT_VERSION
+
+
+macro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
+ set(CHANGELOG_FILE_PATH ${_CHANGELOG_FILE_PATH})
+ set(CHANGELOG_FILE_EXISTS FALSE)
+
+ # 首次判断,如果判断文件不存在,将尽可能的判断文件是存在的
+ if(NOT EXISTS ${CHANGELOG_FILE_PATH})
+
+ # 在 CMake v3.19 起,可以使用 file(REAL_PATH <path> <out-var>) 进行获取 path 的绝对路径
+ if(CMAKE_VERSION GREATER_EQUAL 3.19)
+ file(REAL_PATH ${CHANGELOG_FILE_PATH} CHANGELOG_FILE_ABSOLUTE_PATH)
+ if(EXISTS ${CHANGELOG_FILE_ABSOLUTE_PATH})
+ set(CHANGELOG_FILE_EXISTS TRUE)
+ set(CHANGELOG_FILE_PATH ${CHANGELOG_FILE_ABSOLUTE_PATH})
+ endif(EXISTS ${CHANGELOG_FILE_ABSOLUTE_PATH})
+ endif(CMAKE_VERSION GREATER_EQUAL 3.19)
+
+ # 第二次判断与处理 使用 file(SIZE) 方式
+ if(NOT CHANGELOG_FILE_EXISTS)
+ file(SIZE ${CHANGELOG_FILE_PATH} CHANGELOG_FILE_SIZE)
+ if(CHANGELOG_FILE_SIZE GREATER 0)
+ set(CHANGELOG_FILE_EXISTS TRUE)
+ endif(CHANGELOG_FILE_SIZE GREATER 0)
+ endif(NOT CHANGELOG_FILE_EXISTS)
+
+ # 第三次判断与处理 使用路径拼接方式
+ if(NOT CHANGELOG_FILE_EXISTS)
+ if(EXISTS ${CMAKE_SOURCE_DIR}/${CHANGELOG_FILE_PATH})
+ set(CHANGELOG_FILE_PATH ${CMAKE_SOURCE_DIR}/${CHANGELOG_FILE_PATH})
+ set(CHANGELOG_FILE_EXISTS TRUE)
+ endif(EXISTS ${CMAKE_SOURCE_DIR}/${CHANGELOG_FILE_PATH})
+ endif(NOT CHANGELOG_FILE_EXISTS)
+ endif(NOT EXISTS ${CHANGELOG_FILE_PATH})
+
+ message("> V = ${CHANGELOG_FILE_PATH}")
+ if(CHANGELOG_FILE_EXISTS)
+ file(READ ${CHANGELOG_FILE_PATH} CHANGELOG_CONTENT LIMIT 20)
+
+ string(FIND ${CHANGELOG_CONTENT} "(" V_PRE) # +1 to V_BEGIN
+ string(FIND ${CHANGELOG_CONTENT} ")" V_END)
+
+ math(EXPR V_BEGIN "${V_PRE}+1")
+ math(EXPR V_LENGTH "${V_END}-${V_BEGIN}")
+
+ string(SUBSTRING ${CHANGELOG_CONTENT} ${V_BEGIN} ${V_LENGTH} V)
+
+ message("> V = ${CHANGELOG_CONTENT}")
+ message("> V = [${V}]")
+
+ set(PROJECT_VERSION ${V})
+ endif(CHANGELOG_FILE_EXISTS)
+endmacro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
--
2.20.1
From cca243c18b125a0e24a08c06a358ee04f0861884 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 21:23:15 +0800
Subject: [PATCH 07/10] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkDebianChangelog?=
=?UTF-8?q?Version.cmake=20=E6=A8=A1=E5=9D=97=E7=9A=84=E6=89=A9=E5=B1=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 增加 SPARK_OVERRIDE_VERSION 的文件输出
以解决 Makefile 中无法明确多个 deb 包时无法确定最新版本的情况
---
Makefile | 15 +++++++++++++--
cmake/SparkDebianChangelogVersion.cmake | 1 +
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index c673c76..81ca078 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,17 @@ SUFFIX=_$(OSID)$(OSRELEASE)
endif
PROJECT_NAME=spark-store
+PROJECT_VERSION=*
+
+ifneq ($(wildcard build/SPARK_OVERRIDE_VERSION),)
+SPARK_OVERRIDE_VERSION=`cat build/SPARK_OVERRIDE_VERSION`
+.PHONY: override-version
+override-version:
+ @echo $(SPARK_OVERRIDE_VERSION)
+ @echo "wildcard - good: $(wildcard build/SPARK_OVERRIDE_VERSION)"
+ @echo "wildcard - bad.: $(wildcard build/SPARK_OVERRIDE_VERSIONS)"
+PROJECT_VERSION=$(SPARK_OVERRIDE_VERSION)-
+endif
all:
mkdir -p build
@@ -44,7 +55,7 @@ debian-build-scripts:
package: release debian-build-scripts
cd build && make package
tree build/_CPack_Packages/Linux/DEB/$(PROJECT_NAME)-*
- dpkg-deb --contents build/$(PROJECT_NAME)_*$(CALENDAR)*$(SUFFIX).deb
+ dpkg-deb --contents build/$(PROJECT_NAME)_$(PROJECT_VERSION)$(CALENDAR)*$(SUFFIX).deb
# cd build/_CPack_Packages/Linux/DEB/$(PROJECT_NAME)_*$(CALENDAR)*$(SUFFIX).deb && find .
builddeps:
@@ -54,7 +65,7 @@ cpus:
@echo "CPU数量: $(CPUS)"
copytosource:package
- cp build/$(PROJECT_NAME)_*$(CALENDAR)*.deb .
+ cp build/$(PROJECT_NAME)_$(PROJECT_VERSION)$(CALENDAR)*.deb .
# 进入 qdebug 模式,在 deepin 中默认被禁用,可 env | grep QT 查看,并在 /etc/X11/Xsession.d/00deepin-dde-env 配置中已定义
# 1. 禁止 qt 的 debug 打印: qt.*.debug=false
diff --git a/cmake/SparkDebianChangelogVersion.cmake b/cmake/SparkDebianChangelogVersion.cmake
index 9d8bca2..65e1c16 100644
--- a/cmake/SparkDebianChangelogVersion.cmake
+++ b/cmake/SparkDebianChangelogVersion.cmake
@@ -54,5 +54,6 @@ macro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
message("> V = [${V}]")
set(PROJECT_VERSION ${V})
+ file(WRITE ${CMAKE_BINARY_DIR}/SPARK_OVERRIDE_VERSION ${V})
endif(CHANGELOG_FILE_EXISTS)
endmacro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
--
2.20.1
From f3595a55f567fc01a5928fea8e4b89f99cf8793e Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 23:17:24 +0800
Subject: [PATCH 08/10] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20v4.2.2=20?=
=?UTF-8?q?=E7=89=88=E6=9C=AC=E6=97=B6=E6=9C=9F=E6=96=B0=E5=A2=9E=E7=9A=84?=
=?UTF-8?q?=E5=AE=89=E8=A3=85=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
pkg/usr/share/ssinstall/transhell
-> /usr/share/ssinstall
---
CMakeLists.txt | 5 +++++
cmake/SparkInstallMacrosConfig.cmake | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 73221bc..22a788d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -86,6 +86,11 @@ spark_install_file(/usr/share/icons/hicolor/scalable/apps
spark_install_program(/tmp/spark-store-install
pkg/tmp/spark-store-install/feedback.sh)
+# 安装什么翻译? Since: v4.2.2
+spark_install_directory(/usr/share/ssinstall
+ pkg/usr/share/ssinstall/transhell
+)
+
# 安装 qm 文件?
spark_install_file(/usr/share/spark-store/translations
${SPARK_QM_TRANSLATIONS})
diff --git a/cmake/SparkInstallMacrosConfig.cmake b/cmake/SparkInstallMacrosConfig.cmake
index bbb958a..c7ea53b 100644
--- a/cmake/SparkInstallMacrosConfig.cmake
+++ b/cmake/SparkInstallMacrosConfig.cmake
@@ -79,7 +79,7 @@ macro(spark_install_directory INSTALL_DIRECTORY_DIR INSTALL_DIRECOTRY)
# message(FATAL_ERROR " directory: ${INSTALL_DIRECTORY_FIND_INDEX_SUBSTRING_FILE_GLOB_LIST_LENGTH}")
else()
- message(FATAL_ERROR "install ${INSTALL_DIRECTORY_DIR}")
+ # message(FATAL_ERROR "install ${INSTALL_DIRECTORY_DIR}")
install(DIRECTORY
${INSTALL_DIRECOTRY} ${ARGN}
--
2.20.1
From da9ef6f95ea7be97595b1e3285ac8e98a34c8c0a Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 23:18:44 +0800
Subject: [PATCH 09/10] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkTranslatorConfi?=
=?UTF-8?q?g.cmake=20=E6=A8=A1=E5=9D=97=E7=9A=84=E6=89=A9=E5=B1=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 增加 SPARK_QM_TRANSLATIONS 的文件输出
无任何其它变动
---
cmake/SparkTranslatorConfig.cmake | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/cmake/SparkTranslatorConfig.cmake b/cmake/SparkTranslatorConfig.cmake
index 272dd9d..689e70d 100644
--- a/cmake/SparkTranslatorConfig.cmake
+++ b/cmake/SparkTranslatorConfig.cmake
@@ -12,6 +12,11 @@ endforeach(item IN LISTS SPARK_TRANSLATIONS)
qt5_add_translation(SPARK_QM_TRANSLATIONS
${SPARK_TRANSLATIONS})
+file(WRITE ${CMAKE_BINARY_DIR}/SPARK_QM_TRANSLATIONS "")
+foreach(item IN LISTS SPARK_QM_TRANSLATIONS)
+ file(APPEND ${CMAKE_BINARY_DIR}/SPARK_QM_TRANSLATIONS "${item}\n")
+endforeach(item IN LISTS SPARK_QM_TRANSLATIONS)
+
message("translator(ts -> qm):")
foreach(item IN LISTS SPARK_QM_TRANSLATIONS)
message("-> ${item}")
--
2.20.1
From 22eea0e930a073cac8e6dd750b6389044668dcd6 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 23:20:12 +0800
Subject: [PATCH 10/10] =?UTF-8?q?make:=20=E5=A4=84=E7=90=86=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=20make=20=E7=9B=AE=E6=A0=87=E4=B8=BA=20override-versi?=
=?UTF-8?q?on=20=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Makefile | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/Makefile b/Makefile
index 81ca078..076502c 100644
--- a/Makefile
+++ b/Makefile
@@ -12,11 +12,6 @@ PROJECT_VERSION=*
ifneq ($(wildcard build/SPARK_OVERRIDE_VERSION),)
SPARK_OVERRIDE_VERSION=`cat build/SPARK_OVERRIDE_VERSION`
-.PHONY: override-version
-override-version:
- @echo $(SPARK_OVERRIDE_VERSION)
- @echo "wildcard - good: $(wildcard build/SPARK_OVERRIDE_VERSION)"
- @echo "wildcard - bad.: $(wildcard build/SPARK_OVERRIDE_VERSIONS)"
PROJECT_VERSION=$(SPARK_OVERRIDE_VERSION)-
endif
@@ -82,4 +77,13 @@ copytosource:package
enter-qdebug-mode:
# 进入新的 bash 环境
@# export QT_LOGGING_RULES=".debug=true; qt.*.debug=false; dtk.*.debug=false; dde.*.debug=false; qtc*=false; " && bash
- export QT_LOGGING_RULES=".debug=true" && bash
\ No newline at end of file
+ export QT_LOGGING_RULES=".debug=true" && bash
+
+
+ifneq ($(wildcard build/SPARK_OVERRIDE_VERSION),)
+.PHONY: override-version
+override-version:
+ @echo $(SPARK_OVERRIDE_VERSION)
+ @echo "wildcard - good: $(wildcard build/SPARK_OVERRIDE_VERSION)"
+ @echo "wildcard - bad.: $(wildcard build/SPARK_OVERRIDE_VERSIONS)"
+endif
\ No newline at end of file
--
2.20.1

View File

@@ -0,0 +1,4 @@
#!/bin/bash
TRANSHELL_CONTENT_HASH_CHECK_FAILED="Failed in checking package hash! \nPossibly reason can be the package is broken, laggy in sync of Spark Store repository, or, there is a malware attempt to attack. \nIf you don't know what happend, please try install again after execute the command below\n sudo aptss ssupdate\n\nIf the problem still happen, please click APP Feedback button in the APP information page to feedback to us.\n\n If you are in the Audition GroupPlease use ssaudit instead of ssinstall to audit APPsfor ssinstall is used for password-free install now.\nIf you want to install an app that is removed from Spark Store repositoryyou can also use ssaudit."
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="Please run ssinstall as root"
TRANSHELL_CONTENT_FILE_NOT_EXIST="File not exist"

View File

@@ -0,0 +1,4 @@
#!/bin/bash
TRANSHELL_CONTENT_HASH_CHECK_FAILED="软件包校验失败!这不应该发生!\n可能是因为软件包已损坏星火仓库未同步或者最坏的情况恶意软件尝试利用自动安装来入侵系统\n如果你不清楚发生了什么请执行 sudo aptss ssupdate 后再尝试安装。\n如果问题仍然存在请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用也可用ssaudit来替代ssinstall"
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="请使用root启动ssinstall"
TRANSHELL_CONTENT_FILE_NOT_EXIST="文件不存在"

View File

@@ -14,13 +14,11 @@ SUBDIRS += \
src/spark-dstore-patch \ src/spark-dstore-patch \
src/spark-store.pro src/spark-store.pro
#TRANSLATIONS += \
# translations/spark-store_fr.ts \
# translations/spark-store_en.ts \
# translations/spark-store_zh_CN.ts
# Update translation files # Update translation files
CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh) CONFIG(release, debug|release) {
system(bash $${PWD}/translate_update.sh)
system(bash $${PWD}/translate_generation.sh)
}
# Rules for deployment # Rules for deployment
tool.files += tool/* tool.files += tool/*
@@ -50,6 +48,9 @@ polkit-1.path = /usr/share/polkit-1/actions/
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
icon.path = /usr/share/icons/hicolor/scalable/apps icon.path = /usr/share/icons/hicolor/scalable/apps
ssinstall-transhell.files += pkg/usr/share/ssinstall/transhell
ssinstall-transhell.path = /usr/share/ssinstall/
tmp.files += pkg/tmp/spark-store-install/feedback.sh tmp.files += pkg/tmp/spark-store-install/feedback.sh
tmp.path = /tmp/spark-store-install tmp.path = /tmp/spark-store-install
@@ -58,10 +59,10 @@ INSTALLS += \
qm \ qm \
desktop \ desktop \
icon \ icon \
# preferences \ ssinstall-transhell \
# sourceslist \ # sourceslist \
tmp \ tmp \
service \ service \
bash_completion \ bash_completion \
polkit-1 polkit-1
# 暂时不添加 # 暂时不添加

105
src/application.cpp Normal file
View File

@@ -0,0 +1,105 @@
#include "application.h"
#include <DPlatformWindowHandle>
#include <DLog>
#include <DGuiApplicationHelper>
#include <DAboutDialog>
#include <QSettings>
#include <QStandardPaths>
DCORE_USE_NAMESPACE
Application::Application(int &argc, char **argv)
: DApplication(argc, argv)
{
// Wayland 环境下使用,防止子控件 Native 化
if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
}
setAttribute(Qt::AA_UseHighDpiPixmaps);
setQuitOnLastWindowClosed(false); // 启用托盘图标时,关闭窗口程序仍然运行
loadTranslator(); // 载入翻译
setOrganizationName("spark-union");
setApplicationName("spark-store"); // 影响 ~/.config/spark-union ~/.local/share/spark-union 下文件夹名称
setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
setProductName(QObject::tr("Spark Store"));
setProductIcon(QIcon::fromTheme("spark-store"));
setApplicationHomePage("https://gitee.com/deepin-community-store");
setApplicationDescription(
QObject::tr(
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
"<span style=' font-size:12pt;'>Spark developers</span>"));
setApplicationLicense(" <a href='https://gitee.com/deepin-community-store/spark-store/blob/Flamescion/LICENSE'>GPLv3</a> ");
// 检查 ~/.config/spark-union/spark-store 文件夹是否存在
checkAppConfigLocation();
// 初始化日志模块 (默认日志位置 ~/.cache/spark-union/spark-store)
DLogManager::registerConsoleAppender();
DLogManager::registerFileAppender();
}
void Application::handleAboutAction()
{
if (aboutDialog()) {
DApplication::handleAboutAction();
return;
}
initAboutDialog();
DApplication::handleAboutAction();
}
void Application::checkAppConfigLocation()
{
QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation));
if (!dir.exists()) {
qWarning() << "AppConfigLocation not existed, creating...";
dir.mkpath(dir.absolutePath());
}
}
void Application::setVersionAndBuildDateTime(const QString &version, const QString &buildDateTime)
{
m_version = version;
m_buildDateTime = buildDateTime;
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (config.value("build/version").toString() != m_version) {
qDebug() << "Spark Store has been updated!";
config.setValue("build/version", m_version);
config.setValue("build/time", m_buildDateTime);
config.sync();
}
setApplicationVersion(DApplication::buildVersion(config.value("build/version").toString() + "-" + "Flamescion" + "-" + config.value("build/time").toString()));
}
void Application::initAboutDialog()
{
// 自定义 DAboutDialog
DAboutDialog *dialog = new DAboutDialog(activeWindow());
dialog->setProductName(productName());
dialog->setProductIcon(productIcon());
dialog->setVersion(translate("DAboutDialog", "Version: %1").arg(applicationVersion()));
// 根据 shenmo 要求,不显示组织 Logo
// dialog->setCompanyLogo(QPixmap(":/icon/Logo-Spark.png"));
dialog->setCompanyLogo(QPixmap());
dialog->setWebsiteName(QObject::tr("Spark Project"));
dialog->setWebsiteLink(applicationHomePage());
dialog->setDescription(applicationDescription());
dialog->setLicense(translate("DAboutDialog", "%1 is released under %2").arg(productName()).arg(applicationLicense()));
setAboutDialog(dialog);
connect(aboutDialog(), &DAboutDialog::destroyed, this, [=] {
setAboutDialog(nullptr);
});
dialog->hide();
}

28
src/application.h Normal file
View File

@@ -0,0 +1,28 @@
#ifndef APPLICATION_H
#define APPLICATION_H
#include <DApplication>
DWIDGET_USE_NAMESPACE
class Application : public DApplication
{
Q_OBJECT
public:
Application(int &argc, char **argv);
void handleAboutAction() override;
static void checkAppConfigLocation();
void setVersionAndBuildDateTime(const QString &version, const QString &buildDateTime);
private:
void initAboutDialog();
private:
QString m_version;
QString m_buildDateTime;
};
#endif // APPLICATION_H

View File

@@ -1,64 +1,65 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>icon/logo.svg</file> <file>icon/Logo-Spark.png</file>
<file>tags/a2d-small.png</file> <file>icon/dark/back.svg</file>
<file>tags/a2d.png</file> <file>icon/dark/box.svg</file>
<file>tags/community-small.png</file> <file>icon/dark/calendar.svg</file>
<file>tags/community.png</file> <file>icon/dark/download.svg</file>
<file>tags/community.svg</file> <file>icon/dark/folder.svg</file>
<file>tags/deepin-small.png</file> <file>icon/dark/globe.svg</file>
<file>tags/deepin.svg</file> <file>icon/dark/leftbutton_0.svg</file>
<file>tags/dtk-small.png</file> <file>icon/dark/leftbutton_1.svg</file>
<file>tags/dwine2-small.png</file> <file>icon/dark/leftbutton_2.svg</file>
<file>tags/dwine5-small.png</file> <file>icon/dark/leftbutton_3.svg</file>
<file>tags/dwine5.svg</file> <file>icon/dark/leftbutton_4.svg</file>
<file>tags/logo_icon.svg</file> <file>icon/dark/leftbutton_5.svg</file>
<file>tags/ubuntu-small.png</file> <file>icon/dark/leftbutton_6.svg</file>
<file>tags/ubuntu.png</file> <file>icon/dark/leftbutton_7.svg</file>
<file>tags/uos-authorize.svg</file> <file>icon/dark/leftbutton_8.svg</file>
<file>tags/uos-small.png</file> <file>icon/dark/leftbutton_9.svg</file>
<file>tags/uos.svg</file> <file>icon/dark/leftbutton_10.svg</file>
<file>icon/light/back.svg</file> <file>icon/dark/leftbutton_11.svg</file>
<file>icon/light/download.svg</file> <file>icon/dark/leftbutton_12.svg</file>
<file>icon/light/leftbutton_0.svg</file> <file>icon/dark/text.svg</file>
<file>icon/light/leftbutton_1.svg</file> <file>icon/dark/update.svg</file>
<file>icon/light/leftbutton_2.svg</file> <file>icon/light/back.svg</file>
<file>icon/light/leftbutton_3.svg</file> <file>icon/light/download.svg</file>
<file>icon/light/leftbutton_4.svg</file> <file>icon/light/leftbutton_0.svg</file>
<file>icon/light/leftbutton_5.svg</file> <file>icon/light/leftbutton_1.svg</file>
<file>icon/light/leftbutton_6.svg</file> <file>icon/light/leftbutton_2.svg</file>
<file>icon/light/leftbutton_7.svg</file> <file>icon/light/leftbutton_3.svg</file>
<file>icon/light/leftbutton_8.svg</file> <file>icon/light/leftbutton_4.svg</file>
<file>icon/light/leftbutton_9.svg</file> <file>icon/light/leftbutton_5.svg</file>
<file>icon/light/leftbutton_10.svg</file> <file>icon/light/leftbutton_6.svg</file>
<file>icon/light/leftbutton_11.svg</file> <file>icon/light/leftbutton_7.svg</file>
<file>icon/light/leftbutton_12.svg</file> <file>icon/light/leftbutton_8.svg</file>
<file>icon/light/box.svg</file> <file>icon/light/leftbutton_9.svg</file>
<file>icon/light/calendar.svg</file> <file>icon/light/leftbutton_10.svg</file>
<file>icon/light/globe.svg</file> <file>icon/light/leftbutton_11.svg</file>
<file>icon/light/folder.svg</file> <file>icon/light/leftbutton_12.svg</file>
<file>icon/light/text.svg</file> <file>icon/light/box.svg</file>
<file>icon/dark/back.svg</file> <file>icon/light/calendar.svg</file>
<file>icon/dark/box.svg</file> <file>icon/light/globe.svg</file>
<file>icon/dark/calendar.svg</file> <file>icon/light/folder.svg</file>
<file>icon/dark/download.svg</file> <file>icon/light/text.svg</file>
<file>icon/dark/folder.svg</file> <file>icon/light/update.svg</file>
<file>icon/dark/globe.svg</file> <file>icon/logo.svg</file>
<file>icon/dark/leftbutton_0.svg</file> <file>tags/a2d-small.png</file>
<file>icon/dark/leftbutton_1.svg</file> <file>tags/a2d.png</file>
<file>icon/dark/leftbutton_2.svg</file> <file>tags/community-small.png</file>
<file>icon/dark/leftbutton_3.svg</file> <file>tags/community.png</file>
<file>icon/dark/leftbutton_4.svg</file> <file>tags/community.svg</file>
<file>icon/dark/leftbutton_5.svg</file> <file>tags/deepin-small.png</file>
<file>icon/dark/leftbutton_6.svg</file> <file>tags/deepin.svg</file>
<file>icon/dark/leftbutton_7.svg</file> <file>tags/dtk-small.png</file>
<file>icon/dark/leftbutton_8.svg</file> <file>tags/dwine2-small.png</file>
<file>icon/dark/leftbutton_9.svg</file> <file>tags/dwine5-small.png</file>
<file>icon/dark/leftbutton_10.svg</file> <file>tags/dwine5.svg</file>
<file>icon/dark/leftbutton_11.svg</file> <file>tags/logo_icon.svg</file>
<file>icon/dark/leftbutton_12.svg</file> <file>tags/ubuntu-small.png</file>
<file>icon/dark/text.svg</file> <file>tags/ubuntu.png</file>
<file>icon/light/update.svg</file> <file>tags/uos-authorize.svg</file>
<file>icon/dark/update.svg</file> <file>tags/uos-small.png</file>
</qresource> <file>tags/uos.svg</file>
</RCC> </qresource>
</RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,9 +1,11 @@
#include "downloadworker.h" #include "downloadworker.h"
#include <QEventLoop> #include <QEventLoop>
#include <QProcess> #include <QProcess>
#include <QRegularExpression> #include <QRegularExpression>
#include <QDir> #include <QDir>
#include <QtConcurrent> #include <QtConcurrent>
#include <QStandardPaths>
DownloadController::DownloadController(QObject *parent) DownloadController::DownloadController(QObject *parent)
{ {
@@ -48,7 +50,7 @@ bool checkMeatlink(QString metaUrl)
void gennerateDomain(QVector<QString> &domains) void gennerateDomain(QVector<QString> &domains)
{ {
QFile serverList(QDir::homePath().toUtf8() + "/.config/spark-store/server.list"); QFile serverList(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
if (serverList.open(QFile::ReadOnly)) if (serverList.open(QFile::ReadOnly))
{ {
QStringList list = QString(serverList.readAll()).trimmed().split("\n"); QStringList list = QString(serverList.readAll()).trimmed().split("\n");
@@ -87,14 +89,17 @@ void DownloadController::startDownload(const QString &url)
} }
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
QString metaUrl = url + ".metalink"; QString metaUrl = url + ".metalink";
qDebug() << "metalink" << metaUrl; qDebug() << "metalink" << metaUrl;
bool useMetalink = false; bool useMetalink = false;
if (checkMeatlink(metaUrl)){ if (checkMeatlink(metaUrl))
{
useMetalink = true; useMetalink = true;
qDebug() << "useMetalink:" << useMetalink; qDebug() << "useMetalink:" << useMetalink;
}else{ }
else
{
gennerateDomain(domains); gennerateDomain(domains);
// qDebug() << domains << domains.size(); // qDebug() << domains << domains.size();
} }
@@ -111,10 +116,12 @@ void DownloadController::startDownload(const QString &url)
QString aria2ConnectionMax = "--max-concurrent-downloads=16"; QString aria2ConnectionMax = "--max-concurrent-downloads=16";
QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5"; QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5";
if (useMetalink){ if (useMetalink)
{
command.append(metaUrl.toUtf8()); command.append(metaUrl.toUtf8());
} }
else{ else
{
for (int i = 0; i < domains.size(); i++) for (int i = 0; i < domains.size(); i++)
{ {
command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译避免oss出错 command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译避免oss出错
@@ -133,7 +140,8 @@ void DownloadController::startDownload(const QString &url)
command.append(aria2ConnectionPerServer.toUtf8()); command.append(aria2ConnectionPerServer.toUtf8());
command.append(aria2ConnectionMax.toUtf8()); command.append(aria2ConnectionMax.toUtf8());
command.append(aria2DNSCommand.toUtf8()); command.append(aria2DNSCommand.toUtf8());
if (useMetalink){ if (useMetalink)
{
command.append(aria2NoSeeds.toUtf8()); command.append(aria2NoSeeds.toUtf8());
} }
qDebug() << command; qDebug() << command;
@@ -144,8 +152,7 @@ void DownloadController::startDownload(const QString &url)
cmd->start(); cmd->start();
cmd->waitForStarted(); //等待启动完成 cmd->waitForStarted(); //等待启动完成
QObject::connect(cmd, &QProcess::readyReadStandardOutput, QObject::connect(cmd, &QProcess::readyReadStandardOutput, [&]()
[&]()
{ {
//通过读取输出计算下载速度 //通过读取输出计算下载速度
QString message = cmd->readAllStandardOutput().data(); QString message = cmd->readAllStandardOutput().data();
@@ -188,8 +195,7 @@ void DownloadController::startDownload(const QString &url)
emit downloadProcess(speedInfo, downloadSizeRecord, fileSize); emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
} }
}); });
QObject::connect(cmd, &QProcess::readyReadStandardError, QObject::connect(cmd, &QProcess::readyReadStandardError, [&]()
[&]()
{ {
emit errorOccur(cmd->readAllStandardError().data()); emit errorOccur(cmd->readAllStandardError().data());
return; return;
@@ -209,7 +215,7 @@ void DownloadController::startDownload(const QString &url)
* HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis. * HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis.
*/ */
QProcess mailProcess; QProcess mailProcess;
mailProcess.start(SenderdPath.toUtf8() + " " + metaUrl.toUtf8() + " " + "HD70642"); mailProcess.start(SenderdPath.toUtf8(), QStringList() << metaUrl << "HD70642");
mailProcess.waitForStarted(); mailProcess.waitForStarted();
mailProcess.waitForFinished(3000); mailProcess.waitForFinished(3000);
mailProcess.deleteLater(); mailProcess.deleteLater();
@@ -222,15 +228,22 @@ void DownloadController::startDownload(const QString &url)
*/ */
void DownloadController::stopDownload() void DownloadController::stopDownload()
{ {
if (pidNumber < 0)
{
return;
}
// 实现下载进程退出 // 实现下载进程退出
QString killCmd = QString("kill -9 %1").arg(pidNumber); QString killCmd = QString("kill -9 %1").arg(pidNumber);
system(killCmd.toUtf8()); system(killCmd.toUtf8());
qDebug() << "kill aria2!"; qDebug() << "kill aria2!";
pidNumber = -1;
} }
qint64 DownloadController::getFileSize(const QString &url) qint64 DownloadController::getFileSize(const QString &url)
{ {
// 已经无需使用 qtnetwork 再获取 filesize完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。 // 已经无需使用 qtnetwork 再获取 filesize完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。
qDebug() << "Begin download:" << url;
qint64 fileSize = 10000; qint64 fileSize = 10000;
return fileSize; return fileSize;
} }

View File

@@ -21,7 +21,7 @@ public:
private: private:
int threadNum; int threadNum;
int pidNumber; int pidNumber = -1;
QString filename; QString filename;
qint64 fileSize; qint64 fileSize;
QVector<QPair<qint64, qint64>> ranges; QVector<QPair<qint64, qint64>> ranges;

View File

@@ -1,39 +1,45 @@
#include "sparkapi.h" #include "sparkapi.h"
#include <QSettings>
#include <QStandardPaths>
#include <QDebug> #include <QDebug>
QString SparkAPI::serverUrl = ""; QString SparkAPI::serverUrl = "";
SparkAPI::SparkAPI(QObject *parent) : QObject(parent) SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
{ {
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat); QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE") if (!config.value("server/choose").toString().isEmpty() && config.value("server/updated").toBool())
{ {
SparkAPI::setServerUrl(readConfig.value("server/choose").toString()); SparkAPI::setServerUrl(config.value("server/choose").toString());
} }
} }
void SparkAPI::get(QUrl url) void SparkAPI::get(QUrl url)
{ {
QNetworkRequest request; QNetworkRequest request;
HttpRequest *httprequest = new HttpRequest; HttpRequest *httprequest = new HttpRequest;
request.setUrl(QUrl(url.toString().replace("+", "%2B"))); request.setUrl(QUrl(url.toString().replace("+", "%2B")));
connect(httprequest, &HttpRequest::finished, [=](QString data) connect(httprequest, &HttpRequest::finished, [=](QString data)
{ {
QByteArray arr = data.toUtf8(); QByteArray arr = data.toUtf8();
//解析Json // 解析 Json
QJsonParseError error; QJsonParseError error;
if(QJsonDocument::fromJson(arr,&error).isArray()) if(QJsonDocument::fromJson(arr,&error).isArray())
{ {
auto doc = QJsonDocument::fromJson(arr,&error).array(); auto doc = QJsonDocument::fromJson(arr,&error).array();
emit finished(doc); emit finished(doc);
}else { } else {
auto doc = QJsonDocument::fromJson(arr,&error).object(); auto doc = QJsonDocument::fromJson(arr,&error).object();
emit finishedObject(doc); emit finishedObject(doc);
} }
httprequest->deleteLater();
});
httprequest->deleteLater(); });
httprequest->getRequest(request); httprequest->getRequest(request);
} }
void SparkAPI::getRAW(QUrl url) void SparkAPI::getRAW(QUrl url)
{ {
QNetworkRequest request; QNetworkRequest request;
@@ -45,30 +51,37 @@ void SparkAPI::getRAW(QUrl url)
httprequest->deleteLater(); }); httprequest->deleteLater(); });
httprequest->getRequest(request); httprequest->getRequest(request);
} }
void SparkAPI::getAppList(QString type) void SparkAPI::getAppList(QString type)
{ {
get(QUrl(getServerUrl() + "store/" + type + "/applist.json")); get(QUrl(getServerUrl() + "store/" + type + "/applist.json"));
} }
void SparkAPI::getSearchList(QString keyword) void SparkAPI::getSearchList(QString keyword)
{ {
get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword=" + keyword)); get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword=" + keyword));
} }
void SparkAPI::getAppInfo(QUrl spk) void SparkAPI::getAppInfo(QUrl spk)
{ {
get(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/app.json")); get(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/app.json"));
} }
void SparkAPI::getAppDownloadTimes(QUrl spk) void SparkAPI::getAppDownloadTimes(QUrl spk)
{ {
getRAW(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/download-times.txt")); getRAW(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/download-times.txt"));
} }
QString SparkAPI::getServerUrl() QString SparkAPI::getServerUrl()
{ {
return SparkAPI::serverUrl; return SparkAPI::serverUrl;
} }
QString SparkAPI::getImgServerUrl() QString SparkAPI::getImgServerUrl()
{ {
return SparkAPI::serverUrl; return SparkAPI::serverUrl;
} }
void SparkAPI::setServerUrl(QString url) void SparkAPI::setServerUrl(QString url)
{ {
SparkAPI::serverUrl = url; SparkAPI::serverUrl = url;

View File

@@ -1,16 +1,21 @@
#ifndef SPARKAPI_H #ifndef SPARKAPI_H
#define SPARKAPI_H #define SPARKAPI_H
#include "utils/httprequest.h"
#include <QObject> #include <QObject>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonParseError> #include <QJsonParseError>
#include "utils/httprequest.h"
#include <QSettings>
#include <QDir> #include <QDir>
class SparkAPI : public QObject class SparkAPI : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit SparkAPI(QObject *parent = nullptr);
static QString getServerUrl(); static QString getServerUrl();
static QString getImgServerUrl(); static QString getImgServerUrl();
static void setServerUrl(QString url); static void setServerUrl(QString url);
@@ -20,17 +25,14 @@ public:
void getRAW(QUrl url); void getRAW(QUrl url);
void getAppList(QString type); void getAppList(QString type);
void getAppInfo(QUrl spk); void getAppInfo(QUrl spk);
explicit SparkAPI(QObject *parent = nullptr);
private:
static QString serverUrl;
signals: signals:
void finished(QJsonArray); void finished(QJsonArray);
void finishedRAW(QString); void finishedRAW(QString);
void finishedObject(QJsonObject); void finishedObject(QJsonObject);
public slots: private:
static QString serverUrl;
}; };
#endif // SPARKAPI_H #endif // SPARKAPI_H

View File

@@ -1,52 +1,62 @@
#include "application.h"
#include "mainwindow-dtk.h" #include "mainwindow-dtk.h"
#include <DApplication>
#include <DLog>
#include <DPlatformWindowHandle>
#include <DApplicationSettings>
#include <DAboutDialog>
#include <QLabel>
#include <DWidgetUtil>
#include <DSysInfo> #include <DSysInfo>
#include <DApplicationSettings>
#include <DWidgetUtil>
#include <QDate>
#include <QProcessEnvironment>
#include <QSettings>
#include <QFile>
#include <QStandardPaths>
DCORE_USE_NAMESPACE DCORE_USE_NAMESPACE
DWIDGET_USE_NAMESPACE DWIDGET_USE_NAMESPACE
#define UOSCheckFile "/var/lib/deepin/developer-mode/enabled"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
// Get build time // Get build time
static const QString version = "Version 4.1.2"; static const QString version = "4.2.2";
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy"); static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss"); static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat); static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
// 设置桌面环境环境变量 // 设置桌面环境环境变量
bool isDeepinOS = true; bool isDeepinOS = true;
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin")) if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
{ {
setenv("XDG_CURRENT_DESKTOP", "Deepin", 1); qputenv("XDG_CURRENT_DESKTOP", "Deepin");
isDeepinOS = false; isDeepinOS = false;
} }
bool isWayland = false; bool isWayland = false;
auto e = QProcessEnvironment::systemEnvironment(); auto e = QProcessEnvironment::systemEnvironment();
QString XDG_SESSION_TYPE = e.value(QStringLiteral("XDG_SESSION_TYPE")); QString XDG_SESSION_TYPE = e.value(QStringLiteral("XDG_SESSION_TYPE"));
QString WAYLAND_DISPLAY = e.value(QStringLiteral("WAYLAND_DISPLAY")); QString WAYLAND_DISPLAY = e.value(QStringLiteral("WAYLAND_DISPLAY"));
if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive)) if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive))
{ {
isWayland = true; isWayland = true;
} }
setConfig->setValue("build/isWayland", isWayland);
setConfig->setValue("build/isDeepinOS", isDeepinOS);
// NOTE: 提前设置组织名称和应用名称,避免配置文件位置错误
DApplication::setOrganizationName("spark-union");
DApplication::setApplicationName("spark-store");
Application::checkAppConfigLocation(); // 检查 ~/.config/spark-union/spark-store 文件夹是否存在
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
config.setValue("build/isWayland", isWayland);
config.setValue("build/isDeepinOS", isDeepinOS);
// Check config file, if there is no wayland config, then set it to default, which means use wayland if possible. // Check config file, if there is no wayland config, then set it to default, which means use wayland if possible.
if (!readConfig.contains("build/useWayland")) if (!config.contains("build/useWayland"))
{ {
setConfig->setValue("build/useWayland", true); config.setValue("build/useWayland", true);
} }
config.sync(); // 写入更改至 config.ini并同步最新内容
bool useWayland = readConfig.value("build/useWayland").toBool(); bool useWayland = config.value("build/useWayland").toBool();
qDebug() << "System Wayland enabled:" << isWayland << ". Spark Wayland enabled:" << useWayland; qDebug() << "System Wayland enabled:" << isWayland << ". Spark Wayland enabled:" << useWayland;
// Set display backend // Set display backend
@@ -62,107 +72,77 @@ int main(int argc, char *argv[])
{ {
qputenv("QT_QPA_PLATFORM", "dxcb"); qputenv("QT_QPA_PLATFORM", "dxcb");
} }
// Check UOS developer mode.
QFile UOSDevelopFile(UOSCheckFile);
if (isDeepinOS && UOSDevelopFile.exists() && UOSDevelopFile.open(QFile::ReadOnly | QFile::Text))
{
config.setValue("UOS/isUOS", true);
QString lineData = UOSDevelopFile.readLine();
bool devmode = lineData.trimmed().toInt();
qDebug() << "UOS Developer Mode Status:" << devmode;
config.setValue("UOS/EnableDeveloperMode", devmode);
}
else
{
if (config.contains("UOS/isUOS"))
{
config.remove("UOS/isUOS");
config.remove("UOS/EnableDeveloperMode");
}
}
UOSDevelopFile.close();
config.sync(); // 写入更改至 config.ini并同步最新内容
// 龙芯机器配置,使得 DApplication 能正确加载 QTWEBENGINE
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
// 浏览器开启 GPU 支持
#ifdef __sw_64__
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode --no-sandbox");
#else
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
#endif
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持 DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
// 浏览器开启 GPU 支持 // 强制使用 DTK 平台插件
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
QVector<char *> fakeArgs(argc + 2); QVector<char *> fakeArgs(argc + 2);
fakeArgs[0] = argv[0]; fakeArgs[0] = argv[0];
QString fakeArgs1 = "-platformtheme"; fakeArgs[1] = const_cast<char *>("-platformtheme");
QByteArray fakeArgsTemp = fakeArgs1.toLatin1(); // must fakeArgs[2] = const_cast<char *>("deepin");
fakeArgs[1] = fakeArgsTemp.data();
fakeArgs1 = "deepin";
fakeArgsTemp = fakeArgs1.toLatin1(); // must
fakeArgs[2] = fakeArgsTemp.data();
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
{
fakeArgs[i + 2] = argv[i]; fakeArgs[i + 2] = argv[i];
int fakeArgc = argc + 2; // DApplication的argc要用引用避免c++编译器优化
DApplication a(fakeArgc, fakeArgs.data());
// 初始化日志模块 (默认日志位置 ~/.cache/deepin/spark-store)
DLogManager::registerConsoleAppender();
DLogManager::registerFileAppender();
// Wayland 环境下使用,防止子控件 Native 化
if (!DPlatformWindowHandle::pluginVersion().isEmpty())
{
a.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
} }
a.setAttribute(Qt::AA_UseHighDpiPixmaps); int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
a.setApplicationDisplayName("Spark Store"); Application a(fakeArgc, fakeArgs.data());
// 设置版本和构建时间
a.setVersionAndBuildDateTime(version, buildDateTime);
a.loadTranslator(); // 载入翻译
if (readConfig.value("build/version").toString() != version)
{
qDebug() << "Spark Store has been updated!";
setConfig->setValue("build/version", version);
setConfig->setValue("build/time", buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString());
}
setConfig->deleteLater();
// Customized DAboutDialog
DAboutDialog dialog;
a.setAboutDialog(&dialog);
dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
dialog.setVersion(DApplication::buildVersion(readConfig.value("build/version").toString() + "-" + "Flamescion" + "-" + readConfig.value("build/time").toString()));
dialog.setProductIcon(QIcon::fromTheme("spark-store")); // 设置Logo
dialog.setProductName(QLabel::tr("Spark Store"));
dialog.setDescription(
QObject::tr(
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
"<span style=' font-size:12pt;'>Spark developers</span>"));
dialog.setProductName(QLabel::tr("Spark Store"));
dialog.setCompanyLogo(QPixmap(":/spark-store.png"));
dialog.setWebsiteName(QObject::tr("The Spark Project"));
dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
a.setOrganizationName("spark-union");
a.setProductName(QObject::tr("Spark Store"));
a.setApplicationName("Spark Store"); // 不用翻译,影响 ~/.local/share/spark-union 下文件夹名称
a.setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
a.setWindowIcon(QIcon::fromTheme("spark-store"));
a.setApplicationDescription(
QObject::tr(
"<span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
"<span style='font-size:12pt;'>Spark developers</span><br/><br/>"
"Published under GPL V3"));
// 限制单实例运行 // 限制单实例运行
if (!a.setSingleInstance("spark-store")) if (!a.setSingleInstance("spark-store"))
{ {
qDebug() << "The application is already running!"; qWarning() << "Another instance has already started, activating...";
QDBusInterface iface("com.gitee.spark.store",
"/com/gitee/spark/store",
"com.gitee.spark.store",
QDBusConnection::sessionBus());
QString arg1 = argv[1];
iface.asyncCall("activeWindow", arg1);
return -1; return -1;
} }
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); // 固定主题为浅色主题 DApplicationSettings settings; // 定义 DApplicationSettings自动保存主题设置
DApplicationSettings settings; // 定义 DApplicationSettings自动保存主题设置
MainWindow w; MainWindow w;
// 让打开时界面显示在正中 // 让打开时界面显示在正中
Dtk::Widget::moveToCenter(&w); Dtk::Widget::moveToCenter(&w);
QString arg1 = argv[1]; if (argc > 1)
if (arg1.startsWith("spk://"))
{ {
w.openUrl(QUrl(argv[1])); QString arg1 = argv[1];
if (arg1.trimmed().startsWith("spk://"))
{
w.openUrl(arg1);
}
} }
w.show(); w.show();
w.setWindowTitle("Spark Store");
return a.exec(); return a.exec();
} }

View File

@@ -1,10 +1,16 @@
#include "mainwindow-dtk.h" #include "mainwindow-dtk.h"
#include "ui_mainwindow-dtk.h" #include "ui_mainwindow-dtk.h"
#include "utils/widgetanimation.h"
#include "widgets/common/progressbutton.h"
#include "widgets/downloadlistwidget.h"
#include "dbus/dbussparkstoreservice.h"
#include "application.h"
#include <DLabel>
#include <DWidgetUtil> #include <DWidgetUtil>
#include <DGuiApplicationHelper> #include <DGuiApplicationHelper>
#include <DApplicationSettings>
#include <QSizePolicy> #include <QAbstractButton>
#define AppPageApplist 0 #define AppPageApplist 0
#define AppPageSearchlist 1 #define AppPageSearchlist 1
@@ -13,46 +19,171 @@
#define WaylandSearchCenter 1 #define WaylandSearchCenter 1
#define OtherSearchCenter 2 #define OtherSearchCenter 2
#define RightSearchSpace 1 #define RightSearchSpace 1
#define UploadServerUrl "https://upload.deepinos.org/"
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: BaseWidgetOpacity(parent), ui(new Ui::MainWindow) : BaseWidgetOpacity(parent)
, ui(new Ui::MainWindow)
, downloadlistwidget(new DownloadListWidget)
, trayIcon(new QSystemTrayIcon(QIcon::fromTheme("spark-store"), this))
{ {
ui->setupUi(this); ui->setupUi(this);
initConfig();
moveToCenter(this); // 让窗口居中显示
WidgetAnimation::widgetOpacity(this, true); initTmpDir();
initUI();
initConnections();
downloadlistwidget = new DownloadListWidget;
downloadButton = new ProgressButton(ui->titlebar);
backButtom = new QPushButton(ui->titlebar);
ui->appintopage->setDownloadWidget(downloadlistwidget); ui->appintopage->setDownloadWidget(downloadlistwidget);
ui->stackedWidget->setCurrentIndex(0);
ui->titlebar->setBackgroundTransparent(true); emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
// ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单 }
MainWindow::~MainWindow()
{
delete ui;
downloadlistwidget->deleteLater();
}
void MainWindow::initDbus()
{
DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
}
void MainWindow::onGetUrl(const QString &url)
{
if (url.trimmed().startsWith("spk://"))
{
openUrl(url);
}
showWindowAnimation = false;
closeWindowAnimation = false;
setWindowState(windowState() & Qt::WindowActive);
activateWindow();
show();
}
void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
{
Q_UNUSED(pid)
if (arguments.size() > 1)
{
onGetUrl(arguments.value(1));
}
}
void MainWindow::openUrl(const QString &url)
{
if (url.startsWith("spk://search/"))
{
QString keyword = url.mid(13);
if (keyword == "%")
{
qWarning() << "keyword '%' is not valid, which will cause QtWebEngine crash.";
return;
}
ui->applistpage_1->getSearchList(keyword);
switchPage(AppPageSearchlist);
}
else if (url.startsWith("spk://"))
{
ui->appintopage->openUrl(QUrl::fromUserInput(url));
switchPage(AppPageAppdetail);
}
else
{
QDesktopServices::openUrl(QUrl::fromUserInput(url));
}
}
void MainWindow::initUI()
{
setWindowTitle(QObject::tr("Spark Store"));
setMaskAlpha(250); setMaskAlpha(250);
initTitleBar();
initLeftMenu();
ui->stackedWidget->setCurrentIndex(0);
updateUi(0); updateUi(0);
initTrayIcon();
}
void MainWindow::initTitleBar()
{
ui->titlebar->setIcon(QIcon::fromTheme("spark-store"));
ui->titlebar->setBackgroundTransparent(true);
// ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
// 初始化标题栏控件
DLabel *title = new DLabel(ui->titlebar);
title->setText(tr("Spark Store"));
backButton = new DPushButton(ui->titlebar);
searchEdit = new DSearchEdit(ui->titlebar);
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
downloadButton = new ProgressButton(ui->titlebar);
QWidget *w_titlebar = new QWidget(ui->titlebar);
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
ly_titlebar->addWidget(title);
ly_titlebar->addWidget(backButton);
// Check wayland configs
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (!config.value("build/isDeepinOS").toBool() && config.value("build/useWayland").toBool())
{
// Wayland 搜索栏居中
ly_titlebar->addStretch(WaylandSearchCenter);
}
else
{
// dwayland dxcb 搜索栏顶部右侧居中
ly_titlebar->addStretch(OtherSearchCenter);
}
ly_titlebar->addWidget(searchEdit);
ly_titlebar->addWidget(downloadButton);
ly_titlebar->addStretch(RightSearchSpace);
ui->titlebar->setCustomWidget(w_titlebar);
initTitleBarMenu();
backButton->hide();
downloadlistwidget->hide();
}
void MainWindow::initTitleBarMenu()
{
QAction *actionSubmission = new QAction(tr("Submit App"), this); QAction *actionSubmission = new QAction(tr("Submit App"), this);
QAction *actionSubmissionWithClient = new QAction(tr("Submit App with client(Recommanded)"), this); QAction *actionSubmissionWithClient = new QAction(tr("Submit App with client(Recommanded)"), this);
QAction *setting = new QAction(tr("Settings")); QAction *setting = new QAction(tr("Settings"));
QAction *upgrade = new QAction(tr("APP Upgrade and Install Settings")); QAction *upgrade = new QAction(tr("APP Upgrade and Install Settings"));
QMenu *menu = new QMenu; QMenu *menu = new QMenu(ui->titlebar);
menu->addAction(setting); menu->addAction(setting);
menu->addAction(upgrade); menu->addAction(upgrade);
menu->addAction(actionSubmission); menu->addAction(actionSubmission);
menu->addAction(actionSubmissionWithClient); menu->addAction(actionSubmissionWithClient);
ui->titlebar->setMenu(menu); ui->titlebar->setMenu(menu);
connect(actionSubmission, &QAction::triggered, this, [=] connect(actionSubmission, &QAction::triggered, this, [=]
{ QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/")); }); { QDesktopServices::openUrl(QUrl(UploadServerUrl)); });
connect(setting, &QAction::triggered, this, [=] connect(setting, &QAction::triggered, this, [=]
{ {
switchPage(AppPageSettings); switchPage(AppPageSettings);
ui->settingspage->updateUI(); }); ui->settingspage->updateUI(); });
connect(upgrade, &QAction::triggered, this, [=] connect(upgrade, &QAction::triggered, this, [=]
{ QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh"); }); { QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh", QStringList()); });
// 投稿器 // 投稿器
connect(actionSubmissionWithClient, &QAction::triggered, this, [=] connect(actionSubmissionWithClient, &QAction::triggered, this, [=]
{ {
@@ -61,24 +192,69 @@ MainWindow::MainWindow(QWidget *parent)
if (actionSubmissionClientStatus.exists()) if (actionSubmissionClientStatus.exists())
{ {
qDebug() << "投稿器存在"; qDebug() << "投稿器存在";
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter"); QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter", QStringList());
} }
else else
{ {
qDebug() << "投稿器不存在,跳转页面"; qDebug() << "投稿器不存在,跳转页面";
openUrl(submitterSpk); openUrl(submitterSpk);
} }); } });
}
void MainWindow::initLeftMenu()
{
// 侧边栏按钮
foreach (QAbstractButton *button, ui->buttonGroup->buttons())
{
button->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
connect(button, &QPushButton::toggled, [=](bool checked)
{
if (checked == true) {
searchEdit->clearEdit();
updateUi(ui->buttonGroup->buttons().indexOf(button));
} });
}
}
void MainWindow::initTrayIcon()
{
QMenu *menu = new QMenu(this);
QAction *showAction = new QAction(QObject::tr("Show MainWindow"), menu);
QAction *aboutAction = new QAction(qApp->translate("TitleBarMenu", "About"), menu);
QAction *exitAction = new QAction(qApp->translate("TitleBarMenu", "Exit"), menu);
menu->addAction(showAction);
menu->addAction(aboutAction);
menu->addAction(exitAction);
trayIcon->setContextMenu(menu);
connect(showAction, &QAction::triggered, this, [=]()
{
showWindowAnimation = false;
closeWindowAnimation = false;
setWindowState(windowState() & Qt::WindowActive);
activateWindow();
show(); });
connect(aboutAction, &QAction::triggered, this, [=]()
{
qobject_cast<Application *>(qApp)->handleAboutAction(); });
connect(exitAction, &QAction::triggered, this, [=]()
{
qobject_cast<Application *>(qApp)->quit(); });
trayIcon->show();
}
void MainWindow::initConnections()
{
// 主题切换 // 主题切换
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType)
{ {
if (themeType == DGuiApplicationHelper::DarkType) { if (themeType == DGuiApplicationHelper::DarkType) {
//深色模式 //深色模式
setMaskColor(QColor("#2a2b2b")); setMaskColor(QColor("#2a2b2b"));
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\ backButton->setIcon(QIcon(":/icon/dark/back.svg"));
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#FFFFFF}\
");
backButtom->setIcon(QIcon(":/icon/dark/back.svg"));
downloadButton->setIcon(":/icon/dark/download.svg"); downloadButton->setIcon(":/icon/dark/download.svg");
downloadButton->setBackgroundColor(QColor("#444444")); downloadButton->setBackgroundColor(QColor("#444444"));
downloadButton->setColor(QColor("#66CCFF")); downloadButton->setColor(QColor("#66CCFF"));
@@ -98,10 +274,7 @@ MainWindow::MainWindow(QWidget *parent)
} else { } else {
//亮色模式 //亮色模式
setMaskColor(QColor("#f3f7f8")); setMaskColor(QColor("#f3f7f8"));
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\ backButton->setIcon(QIcon(":/icon/light/back.svg"));
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#000000}\
");
backButtom->setIcon(QIcon(":/icon/light/back.svg"));
downloadButton->setBackgroundColor(QColor("#e3e4e4")); downloadButton->setBackgroundColor(QColor("#e3e4e4"));
downloadButton->setColor(QColor("#66CCFF")); downloadButton->setColor(QColor("#66CCFF"));
downloadButton->setIcon(":/icon/light/download.svg"); downloadButton->setIcon(":/icon/light/download.svg");
@@ -125,7 +298,6 @@ MainWindow::MainWindow(QWidget *parent)
ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType); ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); }); ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); });
// 初始化标题栏控件
connect(downloadButton, &ProgressButton::clicked, [=]() connect(downloadButton, &ProgressButton::clicked, [=]()
{ {
QPoint pos; QPoint pos;
@@ -140,58 +312,15 @@ MainWindow::MainWindow(QWidget *parent)
WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素) WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素)
}); });
connect(backButtom, &QPushButton::clicked, [=]() connect(backButton, &QPushButton::clicked, [=]()
{ {
ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2)); ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2));
pageHistory.removeLast(); pageHistory.removeLast();
if (pageHistory.count() > 1) { if (pageHistory.count() > 1) {
backButtom->show(); backButton->show();
} else { } else {
backButtom->hide(); backButton->hide();
} }); } });
downloadlistwidget->hide();
backButtom->hide();
ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg"));
// Check wayland configs
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
QWidget *w_titlebar = new QWidget(ui->titlebar);
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
QLabel *title = new QLabel(this);
title->setText(tr("Spark Store"));
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
ly_titlebar->addWidget(title);
ly_titlebar->addWidget(backButtom);
if (!readConfig.value("build/isDeepinOS").toBool() && readConfig.value("build/useWayland").toBool())
{
// Wayland 搜索栏居中
ly_titlebar->addStretch(WaylandSearchCenter);
}
else
{
// dwayland dxcb 搜索栏顶部右侧居中
ly_titlebar->addStretch(OtherSearchCenter);
}
ly_titlebar->addWidget(searchEdit);
ly_titlebar->addWidget(downloadButton);
ly_titlebar->addStretch(RightSearchSpace);
ui->titlebar->setCustomWidget(w_titlebar);
// 侧边栏按钮
int i = 0;
while (i < ui->buttonGroup->buttons().size())
{
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked)
{
if (checked == true) {
searchEdit->clearEdit();
updateUi(i);
} });
i++;
}
// 搜索事件 // 搜索事件
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
@@ -199,11 +328,18 @@ MainWindow::MainWindow(QWidget *parent)
QString searchtext = searchEdit->text(); QString searchtext = searchEdit->text();
if (!searchtext.isEmpty()) { if (!searchtext.isEmpty()) {
if (searchtext.startsWith("spk://")) { if (searchtext.startsWith("spk://")) {
openUrl(QUrl(searchtext)); openUrl(searchtext);
searchEdit->clearEdit(); searchEdit->clearEdit();
} else { } else {
ui->applistpage_1->getSearchList(searchtext); if (searchtext == "%")
switchPage(AppPageSearchlist); {
qWarning() << "keyword '%' matches too many results, which will cause QtWebEngine crash.";
}
else
{
ui->applistpage_1->getSearchList(searchtext);
switchPage(AppPageSearchlist);
}
} }
} }
this->setFocus(); }); this->setFocus(); });
@@ -212,55 +348,35 @@ MainWindow::MainWindow(QWidget *parent)
{ downloadButton->setProgress(i); }); { downloadButton->setProgress(i); });
// 列表点击事件 // 列表点击事件
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk) connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); }); { openUrl(spk.toString()); });
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk) connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); }); { openUrl(spk.toString()); });
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk) connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
{ openUrl(spk); }); { openUrl(spk.toString()); });
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
initDbus(); // 托盘图标点击事件
connect(trayIcon, &QSystemTrayIcon::activated, this, [=](QSystemTrayIcon::ActivationReason reason)
{
switch (reason) {
case QSystemTrayIcon::Trigger:
{
showWindowAnimation = false;
closeWindowAnimation = false;
setWindowState(windowState() & Qt::WindowActive);
activateWindow();
show();
Q_FALLTHROUGH();
}
default:
break;
} });
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance);
} }
MainWindow::~MainWindow() void MainWindow::initTmpDir()
{
delete searchEdit;
delete downloadlistwidget;
delete ui;
}
void MainWindow::initDbus()
{
DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
}
void MainWindow::onGetUrl(const QString &url)
{
if (url.left(6) == "spk://")
{
openUrl(QUrl(url));
}
activateWindow();
}
void MainWindow::openUrl(QUrl url)
{
if (url.toString().startsWith("spk://"))
{
ui->appintopage->openUrl(QUrl(url.toString().replace("+", "%2B")));
switchPage(AppPageAppdetail);
}
else
{
QDesktopServices::openUrl(QUrl(url.toString().replace("+", "%2B")));
}
}
void MainWindow::initConfig()
{ {
// 新建临时文件夹 // 新建临时文件夹
QDir dir; QDir dir;
@@ -272,13 +388,14 @@ void MainWindow::switchPage(int now) // 临时方案,回家后修改
qDebug() << pageHistory.count(); qDebug() << pageHistory.count();
if (pageHistory.count() >= 1) if (pageHistory.count() >= 1)
{ {
backButtom->show(); backButton->show();
} }
else else
{ {
backButtom->hide(); backButton->hide();
} }
ui->stackedWidget->setCurrentIndex(now); ui->stackedWidget->setCurrentIndex(now);
ui->stackedWidget->currentWidget()->setFocus();
pageHistory << now; pageHistory << now;
} }
@@ -307,15 +424,38 @@ void MainWindow::updateUi(int now)
void MainWindow::on_pushButton_14_clicked() void MainWindow::on_pushButton_14_clicked()
{ {
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt"); // Check UOS
if (!upgradeStatus.exists()) QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool())
{ {
qDebug() << "UOS Developer Mode has not been enabled!";
QtConcurrent::run([=] QtConcurrent::run([=]
{ {
auto upgradeP = new QProcess(); auto upgradeP = new QProcess();
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh"); upgradeP->startDetached("zenity", QStringList() << "--info"
<< "--text"
<< "UOS开发者模式未开启相关功能被禁用"
<< "--title"
<< "功能禁用提示"
<< "--width"
<< "360"
);
upgradeP->waitForStarted();
upgradeP->waitForFinished(30);
upgradeP->deleteLater(); });
}
else
{
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
if (!upgradeStatus.exists())
{
QtConcurrent::run([=]
{
auto upgradeP = new QProcess();
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh", QStringList());
upgradeP->waitForStarted(); upgradeP->waitForStarted();
upgradeP->waitForFinished(-1); upgradeP->waitForFinished(-1);
upgradeP->deleteLater(); }); upgradeP->deleteLater(); });
}
} }
} }

View File

@@ -1,21 +1,15 @@
#ifndef MAINWINDOWDTK_H #ifndef MAINWINDOWDTK_H
#define MAINWINDOWDTK_H #define MAINWINDOWDTK_H
#include "widgets/base/basewidgetopacity.h"
#include <DMainWindow> #include <DMainWindow>
#include <DTitlebar> #include <DTitlebar>
#include <DPushButton>
#include <DSearchEdit> #include <DSearchEdit>
#include <QGraphicsDropShadowEffect>
#include <DGuiApplicationHelper> #include <DGuiApplicationHelper>
#include <QPushButton> #include <QSystemTrayIcon>
#include <QDir>
#include <QDesktopServices>
#include "widgets/base/basewidgetopacity.h"
#include "widgets/downloadlistwidget.h"
#include "widgets/common/progressbutton.h"
#include "utils/widgetanimation.h"
#include "dbus/dbussparkstoreservice.h"
DWIDGET_USE_NAMESPACE DWIDGET_USE_NAMESPACE
@@ -23,6 +17,8 @@ namespace Ui {
class MainWindow; class MainWindow;
} }
class ProgressButton;
class DownloadListWidget;
class MainWindow : public BaseWidgetOpacity class MainWindow : public BaseWidgetOpacity
{ {
Q_OBJECT Q_OBJECT
@@ -31,28 +27,37 @@ public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
void openUrl(QUrl); void openUrl(const QString &url);
private: private:
void initUI();
void initTitleBar();
void initTitleBarMenu();
void initLeftMenu();
void initTrayIcon();
void initConnections();
void initDbus(); void initDbus();
void initConfig(); void initTmpDir();
void switchPage(int now); void switchPage(int now);
void updateUi(int now); void updateUi(int now);
private:
QList<int> pageHistory;
DownloadListWidget *downloadlistwidget;
ProgressButton *downloadButton;
QPushButton *backButtom;
DSearchEdit *searchEdit = new DSearchEdit;
Ui::MainWindow *ui;
private slots: private slots:
//接受来自dbus的url //接受来自dbus的url
void onGetUrl(const QString &url); void onGetUrl(const QString &url);
void onNewProcessInstance(qint64 pid, const QStringList &arguments);
void on_pushButton_14_clicked(); void on_pushButton_14_clicked();
private:
Ui::MainWindow *ui;
DPushButton *backButton;
DSearchEdit *searchEdit;
ProgressButton *downloadButton;
DownloadListWidget *downloadlistwidget;
QSystemTrayIcon *trayIcon = nullptr;
QList<int> pageHistory;
}; };
#endif // MAINWINDOWDTK_H #endif // MAINWINDOWDTK_H

View File

@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1190</width> <width>1190</width>
<height>651</height> <height>656</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -34,6 +34,12 @@
<property name="autoFillBackground"> <property name="autoFillBackground">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="styleSheet">
<string notr="true">.QWidget#mainpage {
background: transparent;
border-radius: 14px;
}</string>
</property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>

View File

@@ -32,7 +32,7 @@ void AppIntoPage::clear()
ui->author->clear(); ui->author->clear();
ui->label_2->clear(); ui->label_2->clear();
ui->downloadButton->hide(); ui->downloadButton->hide();
ui->downloadButton->setEnabled(true); ui->downloadButton->setEnabled(false);
ui->pushButton_3->hide(); ui->pushButton_3->hide();
int n = ui->listWidget->count(); int n = ui->listWidget->count();
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
@@ -63,9 +63,8 @@ void AppIntoPage::openUrl(QUrl url)
info = appinfo; info = appinfo;
// qDebug()<<url; // qDebug()<<url;
//获取图标 //获取图标
QNetworkAccessManager *naManager;
QNetworkRequest request; QNetworkRequest request;
naManager=new QNetworkAccessManager(this); QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
qDebug()<<api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png"; qDebug()<<api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png";
request.setUrl(QUrl(api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png")); request.setUrl(QUrl(api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png"));
request.setRawHeader("User-Agent", "Mozilla/5.0"); request.setRawHeader("User-Agent", "Mozilla/5.0");
@@ -89,89 +88,105 @@ void AppIntoPage::openUrl(QUrl url)
ui->d_contributor->setText(info["Contributor"].toString()); ui->d_contributor->setText(info["Contributor"].toString());
ui->label_2->setText(info["More"].toString()); ui->label_2->setText(info["More"].toString());
QProcess isInstall;
bool isInstalled; // Check UOS
bool isUpdated; QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
QString packagename = info["Pkgname"].toString(); if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool()){
isInstall.start("dpkg -s " + info["Pkgname"].toString()); qDebug() << "UOS Developer Mode has not been enabled!";
qDebug()<<info["Pkgname"].toString(); ui->downloadButton->setText(tr("Developer Mode Disabled"));
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟 ui->downloadButton->setEnabled(false);
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); ui->downloadButton->show();
if(error == 0) }
else // 非 UOS 或 UOS 已经开启开发者模式
{ {
isInstalled = true; QProcess isInstall;
bool isInstalled;
bool isUpdated;
QString packagename = info["Pkgname"].toString();
isInstall.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString());
qDebug() << info["Pkgname"].toString();
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if (error == 0)
{
isInstalled = true;
QProcess isUpdate; QProcess isUpdate;
isUpdate.start("dpkg-query --showformat='${Version}' --show " + info["Pkgname"].toString()); isUpdate.start("dpkg-query", QStringList() << "--showformat='${Version}'"
isUpdate.waitForFinished(180*1000); // 默认超时 3 分钟 << "--show" << info["Pkgname"].toString());
QString localVersion = isUpdate.readAllStandardOutput(); isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
localVersion.replace("'", ""); QString localVersion = isUpdate.readAllStandardOutput();
localVersion.replace("'", "");
isUpdate.start("dpkg --compare-versions " + localVersion + " ge " + info["Version"].toString()); isUpdate.start("dpkg", QStringList() << "--compare-versions" << localVersion << "ge" << info["Version"].toString());
isUpdate.waitForFinished(180*1000); // 默认超时 3 分钟 isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
if(!isUpdate.exitCode()) if (!isUpdate.exitCode())
{
isUpdated = true;
}
else
{
isUpdated = false;
}
}
else
{
isInstalled = false;
isUpdated = false;
}
QObject::connect(naManager, &QNetworkAccessManager::finished, [=]()
{
if (isInstalled)
{
if (isUpdated)
{ {
isUpdated = true; ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
} }
else else
{ {
isUpdated = false; ui->downloadButton->setText(tr("Upgrade"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
} }
} }
else else
{ {
isInstalled = false; ui->downloadButton->setText(tr("Download"));
isUpdated = false; ui->downloadButton->setEnabled(true);
} isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
ui->downloadButton->show();
if(isInstalled) } });
{
if(isUpdated)
{
ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
}
else
{
ui->downloadButton->setText(tr("Upgrade"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
}
}
else
{
ui->downloadButton->setText(tr("Download"));
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
} }
QStringList taglist = info["Tags"].toString().split(";"); QStringList taglist = info["Tags"].toString().split(";");
QString tmp=info["img_urls"].toString(); QString tmp=info["img_urls"].toString();
qDebug()<<tmp; qDebug() << tmp;
if(tmp.left(2)=="[\"") if (tmp.left(2) == "[\"")
{ {
tmp.remove(0,2); tmp.remove(0, 2);
} }
if(tmp.right(2)=="\"]") if (tmp.right(2) == "\"]")
{ {
tmp.remove(tmp.size()-2,tmp.size()); tmp.remove(tmp.size() - 2, tmp.size());
} }
QStringList imglist = tmp.split("\",\""); QStringList imglist = tmp.split("\",\"");
qDebug()<<imglist; qDebug() << imglist;
for(int i=0;i < imglist.size();i++) for (int i = 0; i < imglist.size(); i++)
{ {
QNetworkAccessManager *naManager;
QNetworkRequest request; QNetworkRequest request;
naManager=new QNetworkAccessManager(this); QNetworkAccessManager *iconNaManager = new QNetworkAccessManager(this);
request.setUrl(QUrl(imglist[i].replace("+","%2B"))); request.setUrl(QUrl(imglist[i].replace("+", "%2B")));
request.setRawHeader("User-Agent", "Mozilla/5.0"); request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'"); request.setRawHeader("Content-Type", "charset='utf-8'");
naManager->get(request); iconNaManager->get(request);
QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){ QObject::connect(iconNaManager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
QByteArray jpegData = reply->readAll(); QByteArray jpegData = reply->readAll();
QPixmap pixmap; QPixmap pixmap;
pixmap.loadFromData(jpegData); pixmap.loadFromData(jpegData);
@@ -272,7 +287,8 @@ void AppIntoPage::setTheme(bool dark)
{ {
if (dark) if (dark)
{ {
QString frameStyleSheet = "#frame,#frame_2,#frame_3,#frame_4{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}"; QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4 {background-color: #252525; border-radius: 14px; border: 1px solid rgb(64, 64, 64);}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #FFFFFF}";
ui->frame->setStyleSheet(frameStyleSheet); ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet); ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet); ui->frame_3->setStyleSheet(frameStyleSheet);
@@ -284,11 +300,10 @@ void AppIntoPage::setTheme(bool dark)
ui->icon_4->setPixmap(QPixmap(":/icon/dark/text.svg")); ui->icon_4->setPixmap(QPixmap(":/icon/dark/text.svg"));
ui->icon_5->setPixmap(QPixmap(":/icon/dark/folder.svg")); ui->icon_5->setPixmap(QPixmap(":/icon/dark/folder.svg"));
ui->icon_6->setPixmap(QPixmap(":/icon/dark/globe.svg")); ui->icon_6->setPixmap(QPixmap(":/icon/dark/globe.svg"));
} }else {
else //亮色模式
{ QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4 {background-color: #fbfbfb; border-radius: 14px; border: 1px solid rgb(229,229,229);}\
// 亮色模式 QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #000000}";
QString frameStyleSheet = "#frame,#frame_2,#frame_3,#frame_4{background-color: #fbfbfb;border-radius:14px;border:1px solid rgb(229,229,229);}";
ui->frame->setStyleSheet(frameStyleSheet); ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet); ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet); ui->frame_3->setStyleSheet(frameStyleSheet);
@@ -336,29 +351,30 @@ void AppIntoPage::on_downloadButton_clicked()
void AppIntoPage::on_pushButton_3_clicked() void AppIntoPage::on_pushButton_3_clicked()
{ {
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
ui->downloadButton->setEnabled(false); ui->downloadButton->setEnabled(false);
ui->pushButton_3->setEnabled(false); ui->pushButton_3->setEnabled(false);
QProcess uninstall; QProcess uninstall;
uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower()); uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower());
uninstall.waitForFinished(-1); uninstall.waitForFinished(-1);
QProcess check; QProcess check;
check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower()); check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
check.waitForFinished(10*1000); check.waitForFinished(10*1000);
if (check.readAllStandardOutput().isEmpty()) if (check.readAllStandardOutput().isEmpty())
{ {
ui->downloadButton->setText(tr("Install")); ui->downloadButton->setText(tr("Download"));
ui->pushButton_3->hide(); ui->pushButton_3->hide();
updatesEnabled(); updatesEnabled();
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded")); Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded"));
} }
ui->downloadButton->setEnabled(true); ui->downloadButton->setEnabled(true);
ui->pushButton_3->setEnabled(true); }); ui->pushButton_3->setEnabled(true);
});
} }
void AppIntoPage::on_shareButton_clicked() void AppIntoPage::on_shareButton_clicked()
@@ -372,11 +388,11 @@ void AppIntoPage::on_shareButton_clicked()
void AppIntoPage::on_updateButton_clicked() void AppIntoPage::on_updateButton_clicked()
{ {
QString feedbackSpk = "spk://store/chat/store.spark-app.feedback"; QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
QFile actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback"); QFileInfo actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
if (actionSubmissionClientStatus.exists()) if (actionSubmissionClientStatus.exists() && actionSubmissionClientStatus.isDir())
{ {
qDebug() << "反馈器存在"; qDebug() << "反馈器存在";
QProcess::startDetached("sh /opt/durapps/store.spark-app.feedback/launch.sh"); QProcess::startDetached("sh", QStringList() << "/opt/durapps/store.spark-app.feedback/launch.sh");
} }
else else
{ {

View File

@@ -426,10 +426,10 @@
</size> </size>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="whatsThis"> <property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@@ -540,10 +540,10 @@
</size> </size>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="whatsThis"> <property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>

View File

@@ -53,9 +53,10 @@ void AppListPage::getAppList(QString type)
} }
ui->webEngineView->setUrl(url); ui->webEngineView->setUrl(url);
delete api;
} }
void AppListPage::getSearchList(QString keyword) void AppListPage::getSearchList(const QString &keyword)
{ {
isSearch = true; isSearch = true;
nowType = keyword; nowType = keyword;
@@ -70,8 +71,9 @@ void AppListPage::getSearchList(QString keyword)
{ {
theme = "theme=light"; theme = "theme=light";
} }
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + keyword + "&" + theme; url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme;
ui->webEngineView->setUrl(url); ui->webEngineView->setUrl(url);
delete api;
} }
AppListPage::~AppListPage() AppListPage::~AppListPage()

View File

@@ -14,7 +14,7 @@ class AppListPage : public QWidget
public: public:
void setTheme(bool dark); void setTheme(bool dark);
void getSearchList(QString keyword); void getSearchList(const QString &keyword);
void getAppList(QString type); void getAppList(QString type);
explicit AppListPage(QWidget *parent = nullptr); explicit AppListPage(QWidget *parent = nullptr);
~AppListPage(); ~AppListPage();

View File

@@ -1,10 +1,24 @@
#include "settingspage.h" #include "settingspage.h"
#include "ui_settingspage.h" #include "ui_settingspage.h"
#include "../backend/sparkapi.h"
#include "utils/utils.h"
#include <QSettings>
#include <QtConcurrent>
#include <QDebug>
#define TMP_PATH "/tmp/spark-store"
#define DEFAULT_SERVER_URL "https://cdn.d.store.deepinos.org.cn/"
#define DEFAULT_CHECK_DOMAIN "deepinos"
bool SettingsPage::isdownload = false; bool SettingsPage::isdownload = false;
SettingsPage::SettingsPage(QWidget *parent) : QWidget(parent),
ui(new Ui::SettingsPage) SettingsPage::SettingsPage(QWidget *parent)
: QWidget(parent)
, ui(new Ui::SettingsPage)
{ {
ui->setupUi(this); ui->setupUi(this);
configCanSave = false; configCanSave = false;
initConfig(); initConfig();
} }
@@ -25,22 +39,28 @@ void SettingsPage::setTheme(bool dark)
void SettingsPage::readServerList() void SettingsPage::readServerList()
{ {
// 读取服务器列表并初始化 // 读取服务器列表并初始化
QFile file(QDir::homePath().toUtf8() + "/.config/spark-store/server.list"); QFile file(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
// 判断文件是否存在 // 判断文件是否存在
if (!file.exists()) if (!file.exists())
{ {
ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/"); ui->comboBox_server->addItem(DEFAULT_SERVER_URL);
return;
} }
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{ {
qDebug() << "无法读取server.list"; qWarning() << "无法读取 server.list";
return;
} }
// 创建QTextStream对象 // 创建 QTextStream 对象
QTextStream textStream(&file); QTextStream textStream(&file);
if (!textStream.readAll().contains(DEFAULT_CHECK_DOMAIN)) // 校验配置文件有效性
{
return;
}
textStream.seek(0); // 回到开头
QString lineData = textStream.readLine(); // 读取文件的第一行 QString lineData = textStream.readLine(); // 读取文件的第一行
ui->comboBox_server->addItem(lineData); ui->comboBox_server->addItem(lineData);
while (!lineData.isNull()) while (!lineData.isNull())
@@ -71,12 +91,12 @@ void SettingsPage::initConfig()
readServerList(); readServerList();
// 读取服务器URL并初始化菜单项的链接 // 读取服务器URL并初始化菜单项的链接
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat); QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE") if (!config.value("server/choose").toString().isEmpty() && config.value("server/updated").toBool())
{ {
qDebug() << readConfig.value("server/choose").toString(); qDebug() << config.value("server/choose").toString();
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString()); ui->comboBox_server->setCurrentText(config.value("server/choose").toString());
SparkAPI::setServerUrl(readConfig.value("server/choose").toString()); SparkAPI::setServerUrl(config.value("server/choose").toString());
} }
configCanSave = true; //  防止触发保存配置信号 configCanSave = true; //  防止触发保存配置信号
} }
@@ -91,11 +111,23 @@ void SettingsPage::on_pushButton_updateServer_clicked()
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
ui->pushButton_updateServer->setEnabled(false); ui->pushButton_updateServer->setEnabled(false);
QFile::remove(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
auto updateSuccess = system("curl -o " + QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation).toUtf8() + "/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
qDebug() << "Update serverlist status:" << updateSuccess;
if (updateSuccess != 0) // 更新失败不换服务器配置
{
QFile file(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
if (file.exists())
{
file.remove();
}
// FIXME: 向用户提示更新失败
ui->pushButton_updateServer->setEnabled(true);
return;
}
ui->comboBox_server->clear(); ui->comboBox_server->clear();
QFile::remove(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
system("curl -o " + QDir::homePath().toUtf8() + "/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
ui->pushButton_updateServer->setEnabled(true); ui->pushButton_updateServer->setEnabled(true);
readServerList(); readServerList();
ui->comboBox_server->setCurrentIndex(0); }); ui->comboBox_server->setCurrentIndex(0); });
@@ -105,14 +137,14 @@ void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1)
{ {
SparkAPI::setServerUrl(arg1); // 服务器信息更新 SparkAPI::setServerUrl(arg1); // 服务器信息更新
qDebug() << arg1; qDebug() << arg1;
const QString updatedInfo = "TRUE"; bool updatedInfo = true;
if (configCanSave) if(configCanSave)
{ {
// ui->label_setting1->show(); // ui->label_setting1->show();
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat); QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
setConfig->setValue("server/choose", arg1); config.setValue("server/choose", arg1);
setConfig->setValue("server/updated", updatedInfo); config.setValue("server/updated", updatedInfo);
setConfig->deleteLater(); config.sync();
} }
} }
@@ -183,7 +215,8 @@ void SettingsPage::on_pushButton_updateApt_clicked()
emit openUrl(QUrl("spk://store/tools/spark-store")); emit openUrl(QUrl("spk://store/tools/spark-store"));
ui->label_aptserver->setText(tr("")); ui->label_aptserver->setText(tr(""));
ui->pushButton_updateApt->setEnabled(true); }); ui->pushButton_updateApt->setEnabled(true);
});
} }
void SettingsPage::on_pushButton_clear_clicked() void SettingsPage::on_pushButton_clear_clicked()
@@ -192,7 +225,7 @@ void SettingsPage::on_pushButton_clear_clicked()
{ {
ui->pushButton_clear->setEnabled(false); ui->pushButton_clear->setEnabled(false);
QDir tmpdir("/tmp/spark-store"); QDir tmpdir(QString::fromUtf8(TMP_PATH));
tmpdir.setFilter(QDir::Files); tmpdir.setFilter(QDir::Files);
int quantity = int(tmpdir.count()); int quantity = int(tmpdir.count());
for(int i = 0; i < quantity; i++) for(int i = 0; i < quantity; i++)
@@ -207,13 +240,15 @@ void SettingsPage::on_pushButton_clear_clicked()
void SettingsPage::on_pushButton_clearWebCache_clicked() void SettingsPage::on_pushButton_clearWebCache_clicked()
{ {
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
QString dataLocal = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); QString localDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/QtWebEngine";
qDebug() << dataLocal; qDebug() << localDataLocation;
QDir dataDir(dataLocal); QDir dataDir(localDataLocation);
dataDir.removeRecursively(); dataDir.removeRecursively();
dataLocal = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
qDebug() << dataLocal; QString cacheLocation = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/QtWebEngine";
QDir cacheDir(dataLocal); qDebug() << cacheLocation;
cacheDir.removeRecursively(); }); QDir cacheDir(cacheLocation);
cacheDir.removeRecursively();
});
} }

View File

@@ -2,14 +2,7 @@
#define SETTINGSPAGE_H #define SETTINGSPAGE_H
#include <QWidget> #include <QWidget>
#include <QFile> #include <QUrl>
#include <QDir>
#include <QDebug>
#include <QSettings>
#include <QtConcurrent>
#include "../backend/sparkapi.h"
#include "utils/utils.h"
#define TMP_PATH "/tmp/spark-store"
namespace Ui { namespace Ui {
class SettingsPage; class SettingsPage;

View File

@@ -4,7 +4,7 @@
# #
#------------------------------------------------- #-------------------------------------------------
QT += core gui network concurrent webenginewidgets dbus svg QT += core gui concurrent dbus network svg webenginewidgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@@ -22,78 +22,75 @@ DEFINES += QT_DEPRECATED_WARNINGS
# You can also select to disable deprecated APIs only up to a certain version of Qt. # You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
DEFINES += QT_APP_DEBUG # Disable qWarning / qDebug output in Release
# CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
CONFIG += c++11 link_pkgconfig CONFIG += c++11 link_pkgconfig
PKGCONFIG += dtkcore dtkgui dtkwidget PKGCONFIG += dtkcore dtkgui dtkwidget
# Disable qWarning / qDebug output in Release
CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
# Update translation files
CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
TRANSLATIONS += \
../translations/spark-store_en.ts \
../translations/spark-store_fr.ts \
../translations/spark-store_zh_CN.ts
SOURCES += \ SOURCES += \
dbus/dbussparkstoreservice.cpp \ backend/downloadworker.cpp \
main.cpp \ backend/image_show.cpp \
mainwindow-dtk.cpp \
backend/sparkapi.cpp \ backend/sparkapi.cpp \
dbus/dbussparkstoreservice.cpp \
pages/appintopage.cpp \
pages/applistpage.cpp \
pages/settingspage.cpp \ pages/settingspage.cpp \
utils/httprequest.cpp \
utils/utils.cpp \ utils/utils.cpp \
utils/widgetanimation.cpp \ utils/widgetanimation.cpp \
widgets/common/progressbutton.cpp \ widgets/base/basewidgetopacity.cpp \
widgets/common/webenginepage.cpp \
widgets/common/webengineview.cpp \
widgets/downloadlistwidget.cpp \
widgets/common/downloaditem.cpp \ widgets/common/downloaditem.cpp \
widgets/common/progressbutton.cpp \
widgets/common/smoothlistwidget.cpp \ widgets/common/smoothlistwidget.cpp \
widgets/common/smoothscrollbar.cpp \ widgets/common/smoothscrollbar.cpp \
utils/httprequest.cpp \ widgets/common/webenginepage.cpp \
pages/applistpage.cpp \ widgets/common/webengineview.cpp \
backend/downloadworker.cpp \
pages/appintopage.cpp \
widgets/big_image.cpp \ widgets/big_image.cpp \
backend/image_show.cpp \ widgets/downloadlistwidget.cpp \
widgets/base/basewidgetopacity.cpp application.cpp \
main.cpp \
mainwindow-dtk.cpp
HEADERS += \ HEADERS += \
dbus/dbussparkstoreservice.h \ backend/downloadworker.h \
mainwindow-dtk.h \ backend/image_show.h \
backend/sparkapi.h \ backend/sparkapi.h \
dbus/dbussparkstoreservice.h \
pages/appintopage.h \
pages/applistpage.h \
pages/settingspage.h \ pages/settingspage.h \
utils/httprequest.h \
utils/utils.h \ utils/utils.h \
utils/widgetanimation.h \ utils/widgetanimation.h \
widgets/common/progressbutton.h \ widgets/base/basewidgetopacity.h \
widgets/common/webenginepage.h \
widgets/common/webengineview.h \
widgets/downloadlistwidget.h \
widgets/common/downloaditem.h \ widgets/common/downloaditem.h \
widgets/common/progressbutton.h \
widgets/common/smoothlistwidget.h \ widgets/common/smoothlistwidget.h \
widgets/common/smoothscrollbar.h \ widgets/common/smoothscrollbar.h \
utils/httprequest.h \ widgets/common/webenginepage.h \
pages/applistpage.h \ widgets/common/webengineview.h \
backend/downloadworker.h \
pages/appintopage.h \
widgets/big_image.h \ widgets/big_image.h \
backend/image_show.h \ widgets/downloadlistwidget.h \
widgets/base/basewidgetopacity.h application.h \
mainwindow-dtk.h
FORMS += \ FORMS += \
mainwindow-dtk.ui \ pages/appintopage.ui \
pages/settingspage.ui \
widgets/downloadlistwidget.ui \
widgets/common/downloaditem.ui \
pages/applistpage.ui \ pages/applistpage.ui \
pages/appintopage.ui pages/settingspage.ui \
widgets/common/downloaditem.ui \
widgets/downloadlistwidget.ui \
mainwindow-dtk.ui
RESOURCES += \ RESOURCES += \
assets/assets.qrc assets/assets.qrc
TRANSLATIONS += \
../translations/spark-store_en.ts \
../translations/spark-store_fr.ts \
../translations/spark-store_zh_CN.ts
# Default rules for deployment. # Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/durapps/$${TARGET}/bin else: unix:!android: target.path = /opt/durapps/$${TARGET}/bin

View File

@@ -1,17 +1,49 @@
#include "basewidgetopacity.h" #include "basewidgetopacity.h"
#include "utils/widgetanimation.h"
#include <QCloseEvent> #include <QSettings>
#include <QStandardPaths>
#include <QPropertyAnimation> #include <QPropertyAnimation>
#include <QCloseEvent>
BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent) BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
{ {
// WidgetAnimation::widgetOpacity(this,true); // WidgetAnimation::widgetOpacity(this,true);
} }
/**
* @brief 窗口显示事件
* @param event
*/
void BaseWidgetOpacity::showEvent(QShowEvent *event)
{
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
bool isWayland = config.value("build/isWayland").toBool();
if (!isWayland)
{
if (!showWindowAnimation)
{
showWindowAnimation = true;
WidgetAnimation::widgetOpacity(this, true);
}
}
DBlurEffectWidget::showEvent(event);
}
/// @brief 窗口关闭事件 /// @brief 窗口关闭事件
/// @param event /// @param event
void BaseWidgetOpacity::closeEvent(QCloseEvent *event) void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
{ {
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
bool isWayland = config.value("build/isWayland").toBool();
if (isWayland)
{
return DBlurEffectWidget::closeEvent(event);
}
if (!closeWindowAnimation) if (!closeWindowAnimation)
{ {
closeWindowAnimation = true; closeWindowAnimation = true;

View File

@@ -8,17 +8,17 @@ DWIDGET_USE_NAMESPACE
class BaseWidgetOpacity : public DBlurEffectWidget class BaseWidgetOpacity : public DBlurEffectWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit BaseWidgetOpacity(QWidget *parent = nullptr); explicit BaseWidgetOpacity(QWidget *parent = nullptr);
signals:
public slots:
// QWidget interface
protected: protected:
bool closeWindowAnimation = false; void showEvent(QShowEvent *event) override;
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;
protected:
bool showWindowAnimation = false;
bool closeWindowAnimation = false;
}; };
#endif // BASEWIDGETOPACITY_H #endif // BASEWIDGETOPACITY_H

View File

@@ -22,6 +22,9 @@ DownloadItem::DownloadItem(QWidget *parent) : QWidget(parent),
ui->pushButton_3->hide(); ui->pushButton_3->hide();
ui->widget_spinner->start(); ui->widget_spinner->start();
ui->widget_spinner->hide(); ui->widget_spinner->hide();
ui->label->setElideMode(Qt::TextElideMode::ElideRight);
ui->label_2->setElideMode(Qt::TextElideMode::ElideRight);
} }
DownloadItem::~DownloadItem() DownloadItem::~DownloadItem()
@@ -33,10 +36,12 @@ void DownloadItem::setValue(qint64 value)
{ {
ui->progressBar->setValue(qint32(value)); ui->progressBar->setValue(qint32(value));
ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")"); ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
ui->label_2->setToolTip(QString::number(double(value) / 100) + "% (" + speed + ")");
if (ui->label_2->text().left(4) == "100%") if (ui->label_2->text().left(4) == "100%")
{ {
download = 1; download = 1;
ui->label_2->setText(tr("Download Complete.")); ui->label_2->setText(tr("Download Complete."));
ui->label_2->setToolTip(tr("Download Complete."));
} }
} }
@@ -48,6 +53,7 @@ void DownloadItem::setMax(qint64 max)
void DownloadItem::setName(QString name) void DownloadItem::setName(QString name)
{ {
ui->label->setText(name); ui->label->setText(name);
ui->label->setToolTip(name);
} }
QString DownloadItem::getName() QString DownloadItem::getName()
@@ -96,6 +102,7 @@ void DownloadItem::install(int t)
ui->widget_spinner->show(); ui->widget_spinner->show();
qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8(); qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
ui->label_2->setText(tr("Installing")); ui->label_2->setText(tr("Installing"));
ui->label_2->setToolTip(tr("Installing"));
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
@@ -119,7 +126,7 @@ void DownloadItem::install(int t)
out = installer.readAllStandardOutput(); out = installer.readAllStandardOutput();
QStringList everyOut = out.split("\n"); QStringList everyOut = out.split("\n");
for(int i=0;i<everyOut.size();i++) for (int i = 0; i < everyOut.size(); i++)
{ {
if(everyOut[i].left(2) == "E:") if(everyOut[i].left(2) == "E:")
{ {
@@ -132,14 +139,15 @@ void DownloadItem::install(int t)
} }
QProcess isInstall; QProcess isInstall;
isInstall.start("dpkg -s " + pkgName); isInstall.start("dpkg", QStringList() << "-s" << pkgName);
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟 isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if(error == 0) if (error == 0 && !haveError)
{ {
ui->pushButton_install->hide(); ui->pushButton_install->hide();
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete.")); Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
ui->label_2->setText(tr("Finish")); ui->label_2->setText(tr("Finish"));
ui->label_2->setToolTip(tr("Finish"));
download = 3; download = 3;
ui->pushButton_3->show(); ui->pushButton_3->show();
} }
@@ -150,13 +158,15 @@ void DownloadItem::install(int t)
download = 1; download = 1;
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again.")); Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again")); ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again"));
ui->pushButton_3->show(); ui->pushButton_3->show();
} }
if(notRoot) if (notRoot)
{ {
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been abortedyou can retry installation.")); Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been abortedyou can retry installation."));
ui->label_2->setText(tr("dpkg progress had been abortedyou can retry installation")); ui->label_2->setText(tr("dpkg progress had been abortedyou can retry installation"));
ui->label_2->setToolTip(tr("dpkg progress had been abortedyou can retry installation"));
ui->pushButton_install->show(); ui->pushButton_install->show();
ui->pushButton_3->hide(); ui->pushButton_3->hide();
} }
@@ -177,6 +187,7 @@ void DownloadItem::on_pushButton_install_clicked()
void DownloadItem::on_pushButton_2_clicked() void DownloadItem::on_pushButton_2_clicked()
{ {
ui->label_2->setText(tr("Download canceled")); ui->label_2->setText(tr("Download canceled"));
ui->label_2->setToolTip(tr("Download canceled"));
download = 2; download = 2;
ui->pushButton_2->setEnabled(false); ui->pushButton_2->setEnabled(false);
ui->progressBar->hide(); ui->progressBar->hide();

View File

@@ -7,13 +7,25 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>666</width> <width>666</width>
<height>54</height> <height>56</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>56</height>
</size>
</property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
<height>54</height> <height>56</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -40,10 +52,22 @@
</property> </property>
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>48</width>
<height>48</height>
</size>
</property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>48</width> <width>48</width>
<height>16777215</height> <height>48</height>
</size> </size>
</property> </property>
<property name="text"> <property name="text">
@@ -52,6 +76,9 @@
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@@ -70,6 +97,31 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="DLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>120</width>
<height>48</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>120</width>
<height>48</height>
</size>
</property>
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel" name="label_filename"> <widget class="QLabel" name="label_filename">
<property name="maximumSize"> <property name="maximumSize">
@@ -83,33 +135,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="label">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>13</pointsize>
</font>
</property>
<property name="text">
<string>Name</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_2">
<property name="orientation"> <property name="orientation">
@@ -153,11 +178,14 @@
<property name="leftMargin"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
<property name="topMargin">
<number>8</number>
</property>
<property name="rightMargin"> <property name="rightMargin">
<number>0</number> <number>0</number>
</property> </property>
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>8</number>
</property> </property>
<item> <item>
<widget class="QProgressBar" name="progressBar"> <widget class="QProgressBar" name="progressBar">
@@ -188,7 +216,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="DLabel" name="label_2">
<property name="font"> <property name="font">
<font> <font>
<pointsize>9</pointsize> <pointsize>9</pointsize>
@@ -297,6 +325,11 @@
<header location="global">dspinner.h</header> <header location="global">dspinner.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>DLabel</class>
<extends>QLabel</extends>
<header>dlabel.h</header>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections/> <connections/>

View File

@@ -16,7 +16,6 @@ void SmoothListWidget::wheelEvent(QWheelEvent *e)
} }
void SmoothListWidget::onSliderChanged(int p) void SmoothListWidget::onSliderChanged(int p)
{ {
int startRow = count();
if (p == vScrollBar->maximum()) if (p == vScrollBar->maximum())
{ {
emit reachedBottom(); // 1 emit reachedBottom(); // 1

View File

@@ -7,7 +7,7 @@ DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(pare
ui(new Ui::DownloadListWidget) ui(new Ui::DownloadListWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowTitle("Download list"); setWindowTitle(QObject::tr("Download list"));
installEventFilter(this); installEventFilter(this);
this->setAttribute(Qt::WA_Hover, true); this->setAttribute(Qt::WA_Hover, true);
setFocus(); setFocus();
@@ -55,7 +55,6 @@ DownloadListWidget::~DownloadListWidget()
if (downloadController) if (downloadController)
{ {
downloadController->stopDownload(); downloadController->stopDownload();
downloadController->deleteLater();
} }
delete ui; delete ui;
@@ -92,7 +91,7 @@ void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName
di->pkgName = pkgName; di->pkgName = pkgName;
di->seticon(icon); di->seticon(icon);
QListWidgetItem *pItem = new QListWidgetItem(); QListWidgetItem *pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(240, 50)); pItem->setSizeHint(QSize(240, 56)); // ui 中单个 downloaditem 高度固定 56px上下 margin 8px图片固定 48x48
ui->listWidget->addItem(pItem); ui->listWidget->addItem(pItem);
ui->listWidget->setItemWidget(pItem, di); ui->listWidget->setItemWidget(pItem, di);
if (!isBusy) if (!isBusy)

View File

@@ -85,7 +85,7 @@ QListWidget::item::selected
}</string> }</string>
</property> </property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::NoFrame</enum>
</property> </property>
<property name="verticalScrollBarPolicy"> <property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum> <enum>Qt::ScrollBarAsNeeded</enum>
@@ -99,9 +99,15 @@ QListWidget::item::selected
<property name="autoScrollMargin"> <property name="autoScrollMargin">
<number>10</number> <number>10</number>
</property> </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="resizeMode"> <property name="resizeMode">
<enum>QListView::Fixed</enum> <enum>QListView::Fixed</enum>
</property> </property>
<property name="spacing">
<number>4</number>
</property>
</widget> </widget>
</item> </item>
<item> <item>

View File

@@ -11,8 +11,20 @@
# #
# Default: apt-get # Default: apt-get
# #
_APTMGR=apt _APTMGR=apt-get
if [ -x "$(command -v apt)" ]; then
_APTMGR=apt
fi
if grep -Eqi "linuxmint" /etc/os-release;then
_APTMGR=apt-get
fi
if [ -x "$(command -v oyo)" ]; then
_APTMGR=/usr/bin/apt
fi
#### ####
# #
@@ -25,6 +37,8 @@ AUTH_UOS_PASSWD="`cat /etc/apt/auth.conf.d/uos.conf | grep home-packages.chinau
AUTH_UOS_PASSWD=`echo ${AUTH_UOS_PASSWD#*password }` AUTH_UOS_PASSWD=`echo ${AUTH_UOS_PASSWD#*password }`
fi fi
##### UOS自动读取账号密码以实现使用aptss来加速下载
# Enable DOWNLOADBEFORE to suppress apt-fast confirmation dialog and download # Enable DOWNLOADBEFORE to suppress apt-fast confirmation dialog and download
# packages directly. # packages directly.
# #
@@ -65,7 +79,7 @@ DOWNLOADBEFORE=true
# #
# Default: disabled # Default: disabled
# #
MIRRORS=( 'https://d.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-store-repository/,http://cdn.dl.uniartisan.com:9000/deepinos/,https://d1.store.deepinos.org.cn/,https://d2.store.deepinos.org.cn/,https://d4.store.deepinos.org.cn/,https://d5.store.deepinos.org.cn/' ) MIRRORS=( 'https://d.store.deepinos.org.cn/,https://zunyun01.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-store-repository/,http://cdn.dl.uniartisan.com:9000/deepinos/,https://d1.store.deepinos.org.cn/,https://d2.store.deepinos.org.cn/,https://d3.store.deepinos.org.cn/,https://d4.store.deepinos.org.cn/,https://d5.store.deepinos.org.cn/' )
# Maximum number of connections # Maximum number of connections
@@ -73,7 +87,7 @@ MIRRORS=( 'https://d.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-sto
# #
# Default: 5 # Default: 5
# #
_MAXNUM=5 _MAXNUM=16
# Maximum number of connections per server # Maximum number of connections per server

View File

@@ -161,7 +161,8 @@ VERBOSE_OUTPUT=
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=600 --timeout=600 -m0' _DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=600 --timeout=600 -m0'
# Load config file. # Load config file.
CONFFILE="/etc/apt-fast.conf" CONFFILE="/tmp/aptss-conf/apt-fast.conf"
#### Spark Store apt-fast conf is in /tmp
if [ -e "$CONFFILE" ]; then if [ -e "$CONFFILE" ]; then
source "$CONFFILE" source "$CONFFILE"
fi fi
@@ -207,7 +208,9 @@ fi
msg_already_running() msg_already_running()
{ {
msg "apt-fast already running!" "warning" msg "apt-fast already running!" "warning"
msg "apt-fast 已经在运行了" "warning"
msg "Verify that all apt-fast processes are finished then remove $LCK_FILE.lock and try again." "hint" msg "Verify that all apt-fast processes are finished then remove $LCK_FILE.lock and try again." "hint"
msg "请确认所有的apt-fast进程已经结束然后删除 $LCK_FILE.lock 后重试." "hint"
} }
# Check if a lock file exists. # Check if a lock file exists.
@@ -246,6 +249,7 @@ cleanup_dllist()
if ! rm -f -- "$DLLIST" 2>/dev/null if ! rm -f -- "$DLLIST" 2>/dev/null
then then
msg "Could not clean up download list file." "warning" msg "Could not clean up download list file." "warning"
msg "无法清除下载列表文件." "warning"
CLEANUP_STATE=1 CLEANUP_STATE=1
fi fi
fi fi
@@ -304,12 +308,14 @@ get_uris(){
if ! mkdir -p -- "$(dirname "$DLLIST")" if ! mkdir -p -- "$(dirname "$DLLIST")"
then then
msg "Could not create download file directory." "warning" msg "Could not create download file directory." "warning"
msg "无法创建下载文件夹" "warning"
exit 1 exit 1
fi fi
elif [ -f "$DLLIST" ]; then elif [ -f "$DLLIST" ]; then
if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null
then then
msg "Unable to write to download file. Try restarting with root permissions or run 'apt-fast clean' first." "warning" msg "Unable to write to download file. Try restarting with root permissions or run 'aptss clean' first." "warning"
msg "无法下载文件。尝试使用root权限或者运行 'aptss clean'" "warning"
exit 1 exit 1
fi fi
fi fi
@@ -318,15 +324,19 @@ get_uris(){
echo "# apt-fast mirror list: $(date)" > "$DLLIST" echo "# apt-fast mirror list: $(date)" > "$DLLIST"
#NOTE: aptitude doesn't have this functionality, so we use apt-get to get #NOTE: aptitude doesn't have this functionality, so we use apt-get to get
# package URIs. # package URIs.
case "$_APTMGR" in # case "$_APTMGR" in
apt|apt-get) uri_mgr=$_APTMGR;; # apt|apt-get) uri_mgr=$_APTMGR;;
*) uri_mgr=apt-get;; # *) uri_mgr=apt-get;;
esac # esac
# NOTE:apt可能出现变动不建议在脚本中使用因此在此统一改用apt-get
uri_mgr=apt-get
uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")" uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")"
uris_full_ret="$?" uris_full_ret="$?"
if [ "$uris_full_ret" -ne 0 ] if [ "$uris_full_ret" -ne 0 ]
then then
msg "Package manager quit with exit code." "warning" msg "Package manager quit with exit code.Here is the log" "warning"
msg "包管理器以错误代码退出.日志如下" "warning"
msg "${uris_full}"
exit "$uris_full_ret" exit "$uris_full_ret"
fi fi
while read -r pkg_uri_info while read -r pkg_uri_info
@@ -396,6 +406,7 @@ get_uris(){
checksum="$(echo "$patch_checksum" | cut -d' ' -f2)" checksum="$(echo "$patch_checksum" | cut -d' ' -f2)"
else else
msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning" msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning"
msg "无法获得 $pkg_name ($pkg_version) 的受支持的散列验证值" "warning"
REMOVE_WORKING_MESSAGE= REMOVE_WORKING_MESSAGE=
fi fi
fi fi
@@ -434,6 +445,7 @@ display_downloadfile(){
done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")" done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")"
fi fi
msg "Download size: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal" msg "Download size: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
msg "下载大小: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
} }
# Create and insert a PID number to lockfile. # Create and insert a PID number to lockfile.
@@ -477,6 +489,7 @@ if [ "$CMD" == "aria2c" ]; then
done done
if [ -z "$HASH_SUPPORTED" ]; then if [ -z "$HASH_SUPPORTED" ]; then
msg "Couldn't find supported checksum algorithm from aria2c. Checksums disabled." "warning" msg "Couldn't find supported checksum algorithm from aria2c. Checksums disabled." "warning"
msg "无法找到aria2c支持的散列验证算法. 散列验证已被禁用." "warning"
fi fi
fi fi
@@ -531,6 +544,7 @@ fi
if [ "$option" == "install" ]; then if [ "$option" == "install" ]; then
msg msg
msg "Working... this may take a while." "normal" msg "Working... this may take a while." "normal"
msg "正在工作中,请稍等" "normal"
REMOVE_WORKING_MESSAGE=y REMOVE_WORKING_MESSAGE=y
get_uris "$@" get_uris "$@"
@@ -598,6 +612,7 @@ elif [ "$option" == "clean" ]; then
elif [ "$option" == "download" ]; then elif [ "$option" == "download" ]; then
msg msg
msg "Working... this may take a while." "normal" msg "Working... this may take a while." "normal"
msg "正在工作中,请稍等" "normal"
REMOVE_WORKING_MESSAGE=y REMOVE_WORKING_MESSAGE=y
get_uris "$@" get_uris "$@"
@@ -616,6 +631,7 @@ elif [ "$option" == "download" ]; then
elif [ "$option" == "source" ]; then elif [ "$option" == "source" ]; then
msg msg
msg "Working... this may take a while." "normal" msg "Working... this may take a while." "normal"
msg "正在工作中,请稍等" "normal"
REMOVE_WORKING_MESSAGE=y REMOVE_WORKING_MESSAGE=y
get_uris "$@" get_uris "$@"

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
SS_APT_FAST="/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast"
if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then
###刷新apt-fast配置 ###刷新apt-fast配置
@@ -14,37 +14,54 @@ chmod -R 755 /tmp/aptss-conf
fi fi
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
echo "接收星火仓库软件信息中..."
mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..."
echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
#只更新星火源
fi
if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
###执行 ###执行
bwrap --dev-bind / / \ bwrap --dev-bind / / \
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \ --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast "$@" --allow-downgrades ${SS_APT_FAST} "$@" --allow-downgrades
elif [ "$1" = "download" ];then elif [ "$1" = "download" ];then
###执行 ###执行
bwrap --dev-bind / / \ bwrap --dev-bind / / \
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \ --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast "$@" --allow-downgrades ${SS_APT_FAST} "$@" --allow-downgrades
elif [ "$1" = "policy" ] || [ "$1" = "search" ];then elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
###执行 ###执行
bwrap --dev-bind / / \ bwrap --dev-bind / / \
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \ --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
apt "$@" --allow-downgrades apt "$@"
elif [ "$1" = "ssupdate" ];then elif [ "$1" = "ssupdate" ];then

31
tool/bashimport/transhell.amber Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
##load transhell
function load_transhell_debug()
{
local WORK_PATH="$(cd "$(dirname "${0}")" && pwd)"
local CURRENT_LANG="$(echo ${LANG%.*})"
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell; echo "Loading transhell from /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell ..."; fi
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell; echo "Loading transhell from /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell ..."; fi
if [ -e "${WORK_PATH}/transhell/$(basename $0)_en_US.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell; echo "Loading transhell from ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell ..."; fi
if [ -e "${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell; echo "Loading transhell from ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell ..."; fi
echo "-----------------------------------------------------------------------------"
}
function load_transhell()
{
local WORK_PATH="$(cd "$(dirname "${0}")" && pwd)"
local CURRENT_LANG="$(echo ${LANG%.*})"
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell; fi
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell; fi
if [ -e "${WORK_PATH}/transhell/$(basename $0)_en_US.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell; fi
if [ -e "${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell; fi
}
function update_transhell()
{
load_transhell $@
}

44
tool/ssaudit Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
echo "Spark Store Audit script.星火商店审核脚本"
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
exit
fi
if [ ! -f "$1" ]
then
echo "文件不存在"
exit 1
fi
if [ "$(id -u)" != "0" ];then
#############################无root权限时
echo "请使用root启动ssaudit"
exit 1
fi
###
DEBPATH=`realpath $1`
echo ----------------------------------------------------------------------------------
try_run_output=$(aptss --dry-run install $DEBPATH)
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
dpkg -i "$DEBPATH" || aptss install -yf

View File

@@ -1,33 +1,35 @@
#!/bin/bash #!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
echo "Spark Store Install script.星火商店安装脚本" echo "Spark Store Install script.星火商店安装脚本"
function pkexec_as_current_user() { function pkexec_as_current_user() {
#Detect the name of the display in use
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
#Detect the user using such display
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
#Detect the id of the user #Detect the id of the user
local uid=$(id -u $user) local uid=$(id -u $user)
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus pkexec "$@" sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus pkexec "$@"
} }
function zenity() { function zenity()
#Detect the name of the display in use {
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
#Detect the user using such display #Detect the user using such display
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1) local user=$(who | awk '{print $1}' | head -n 1)
#Detect the id of the user #Detect the id of the user
local uid=$(id -u $user) local uid=$(id -u $user)
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus zenity "$@"
}
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus zenity "$@"
}
#################检测文件是否存在 #################检测文件是否存在
if [ $# -eq 0 ];then if [ $# -eq 0 ];then
echo "没有接收到参数,退出" echo "没有接收到参数,退出"
@@ -37,13 +39,13 @@ fi
if [ ! -f "$1" ] if [ ! -f "$1" ]
then then
echo "文件不存在" echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST}"
exit 1 exit 1
fi fi
if [ "$(id -u)" != "0" ];then if [ "$(id -u)" != "0" ];then
#############################无root权限时 #############################无root权限时
echo "请使用root启动ssinstall" echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
exit 1 exit 1
fi fi
@@ -52,32 +54,53 @@ fi
DEBPATH=`realpath $1` DEBPATH=`realpath $1`
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ];then if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
echo "接收星火仓库软件信息中..." echo "接收星火仓库软件信息中..."
aptss ssupdate aptss ssupdate
fi fi
### 选择包信息位置
if [ -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是单目录仓库配置"
else
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是根目录仓库配置"
fi
echo "正在计算hash并与星火仓库匹配..." echo "正在计算hash并与星火仓库匹配..."
DEB_MD5SUM=`md5sum "$DEBPATH" | cut -c -32` DEB_MD5SUM=`md5sum "$DEBPATH" | cut -c -32`
IS_MD5SUM_CHECKD=`cat /var/lib/apt/lists/d.store.deepinos.org.cn_Packages | grep $DEB_MD5SUM` IS_MD5SUM_CHECKD=`cat $PACKAGES_DATA_PATH | grep $DEB_MD5SUM`
if [ ! -z "$IS_MD5SUM_CHECKD" ];then if [ ! -z "$IS_MD5SUM_CHECKD" ];then
echo "校验成功,开始安装" echo "校验成功,开始安装"
echo ---------------------------------------------------------------------------------- echo ----------------------------------------------------------------------------------
dpkg -i "$DEBPATH" || aptss install -yf
try_run_output=$(aptss --dry-run install $DEBPATH)
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
dpkg -i "$DEBPATH" || aptss install -yf
else else
zenity --info --icon-name=spark-store --height 270 --width 500 --text "软件包校验失败!这不应该发生!\n可能是因为软件包已损坏星火仓库未同步或者最坏的情况恶意软件尝试利用自动安装来入侵系统\n如果你不清楚发生了什么请在接下来的认证窗口中选择取消认证\n执行 sudo aptss ssupdate 后再尝试安装。\n如果问题仍然存在请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n如果你是审核人员这是正常现象在审核通过前星火仓库不会保存相关信息。请在接下来的弹窗中进行认证即可" zenity --info --icon-name=spark-store --height 270 --width 500 --text "${TRANSHELL_CONTENT_HASH_CHECK_FAILED}"
echo "软件包校验失败!这不应该发生!" echo -e ${TRANSHELL_CONTENT_HASH_CHECK_FAILED}
echo "执行 sudo aptss ssupdate 后再尝试安装。"
echo "如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!"
echo "如果你是审核人员,这是正常现象,在审核通过前星火仓库不会保存相关信息。请在接下来的弹窗中进行认证即可"
pkexec_as_current_user bash -c "dpkg -i "$DEBPATH" || aptss install -yf "
fi fi

View File

@@ -28,10 +28,25 @@ case $1 in
;; ;;
upgrade-app) upgrade-app)
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."` IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."`
echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt
;; ;;
test-install-app)
try_run_output=$(aptss --dry-run install $2)
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
exit 0
;;
clean-log) clean-log)
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt

View File

@@ -1,16 +1,19 @@
#!/bin/bash #!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
touch /tmp/spark-store/upgradeStatus.txt touch /tmp/spark-store/upgradeStatus.txt
# 执行 apt update # 执行 apt update
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="正在检查更新,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="${TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then
echo "无错误"
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
else else
zenity --error --text "检查更新进程出现错误!按确定查看报错,可用于反馈" --title "星火商店更新检测模块" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --error --text "${TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到" --title="反馈渠道在商店右上角的设置里" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
rm -f /tmp/spark-store/upgradeStatus.txt rm -f /tmp/spark-store/upgradeStatus.txt
exit exit
@@ -20,7 +23,7 @@ fi
PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)" PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
## 如果没更新,就弹出不需要更新 ## 如果没更新,就弹出不需要更新
if [ -z "$PKG_LIST" ] ; then if [ -z "$PKG_LIST" ] ; then
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else else
## 获取用户选择的要更新的应用 ## 获取用户选择的要更新的应用
### 指定分隔符为 \n ### 指定分隔符为 \n
@@ -45,7 +48,7 @@ else
echo "$PKG_CUR_VER" echo "$PKG_CUR_VER"
else else
echo "false" echo "false"
echo "$PKG_NAME(无法更新:已被标记为保留)" echo "$PKG_NAME${TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD}"
echo "$PKG_NEW_VER" echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER" echo "$PKG_CUR_VER"
fi fi
@@ -56,23 +59,25 @@ done`
## 如果没有应用需要更新,则直接退出 ## 如果没有应用需要更新,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else else
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="选择你想更新的应用" --column="是否更新" --column="包名" --column="新版本" --column="从该版本更新" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg) PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg)
## 如果没有选择,则直接退出 ## 如果没有选择,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "没有选中任何软件\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --info --text "${TRANSHELL_CONTENT_NO_APP_IS_CHOSEN}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else else
### 更新用户选择的应用 ### 更新用户选择的应用
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE_LIST -y | zenity --progress --auto-close --no-cancel --pulsate --text="正在更新已选中的应用,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg for PKG_UPGRADE in $PKG_UPGRADE_LIST;do
update_transhell
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -y | zenity --progress --auto-close --no-cancel --pulsate --text="${TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
done
#### 更新成功 #### 更新成功
if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ] ; then if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ] ; then
zenity --info --text "选中的软件已经更新完毕" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --info --text "${TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else else
#### 更新异常 #### 更新异常
zenity --error --text "更新出现错误!按确定查看报错,可用于反馈" --title "星火商店更新检测模块" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --error --text "${TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
zenity --text-info --filename=/tmp/spark-store-app-upgrade-log.txt --checkbox="我已复制了此文本框中的日志,且将会在反馈时附上 。反馈渠道可以在右上角菜单的设置中找到" --title="反馈渠道在商店右上角的设置里往下拉" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --text-info --filename=/tmp/spark-store-app-upgrade-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
fi fi
fi fi
fi fi

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
endloop=0 endloop=0
@@ -7,42 +9,39 @@ endloop=0
while [ $endloop -eq 0 ] ;do while [ $endloop -eq 0 ] ;do
if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then
text_update_open="关闭" text_update_open="${TRANSHELL_CONTENT_CLOSE}"
#已经开启了就显示关闭 #已经开启了就显示关闭
else else
text_update_open="开启" text_update_open="${TRANSHELL_CONTENT_OPEN}"
fi fi
update_transhell
option=`zenity --list --text="${TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN}" --column 数字 --column=${TRANSHELL_CONTENT_OPTIONS} --print-column=2 --height 350 --width 760 0 "${TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK}" 1 "${TRANSHELL_CONTENT_CHECK_FOR_UPDATE}" 2 "${TRANSHELL_CONTENT_EXIT}" --hide-column=1 --print-column=1`
option=`zenity --list --text="欢迎使用星火更新和安装设置工具\n请在以下操作中选择一个进行~" --column 数字 --column=操作选项 --print-column=2 --height 350 --width 760 0 "查看自动更新相关功能使用前须知(重要)" 1 "$text_update_open星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)" 2 查看可更新软件包列表并决定是否更新 4 退出脚本 --hide-column=1 --print-column=1`
case $option in case $option in
0) 0)
zenity --info --icon-name=spark-store --height 450 --width 500 --text "此须知适用于自动更新功能\n\n此脚本可以检测星火源中是否有比当前系统更高版本的软件包由您决定是否安装在安装更新过程中请不要直接点击关闭本页面以免发生错误\n\n此脚本使用apt update/apt list --upgrade/apt upgrade来更新软件源、列出更新列表和操作更新\n\n该脚本不对其使用效果有任何明示或暗示的担保在使用前请您确保您清楚地知道您在干什么。您应当清楚星火商店的软件包并不是适配所有发行版的尽管绝大多数的软件更新是无害的您仍然应该仔细检查显示出来的更新内容以确保不会对您的依赖环境造成破坏尤其是那些看起来和系统依赖相关的软件包。在查看过更新列表之后确认更新之前您仍有取消更新的机会。\n\n本脚本的开发者不对使用该脚本可能造成的后果负责"
;;
1)
if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then
zenity --info --icon-name=spark-store --height 150 --width 200 --text "检测到已经启动了自动更新检测,执行关闭" --timeout=2 zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK}" --timeout=2
pkexec systemctl disable spark-update-notifier pkexec systemctl disable spark-update-notifier
zenity --info --icon-name=spark-store --height 150 --width 200 --text "已关闭" --timeout=2 zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_CLOSED}" --timeout=2
else else
zenity --info --icon-name=spark-store --height 150 --width 200 --text "未检测到自动更新检测,执行启动" --timeout=2 zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK}" --timeout=2
pkexec systemctl enable spark-update-notifier pkexec systemctl enable spark-update-notifier
pkexec service spark-update-notifier start pkexec service spark-update-notifier start
zenity --info --icon-name=spark-store --height 150 --width 200 --text "已启动" --timeout=2 zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENED}" --timeout=2
fi fi
;; ;;
2) 1)
/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh
;; ;;
4) 2)
exit 0 exit 0
;; ;;
*) *)
exit 0 exit 0
esac esac
done done

View File

@@ -1,18 +1,23 @@
#!/bin/bash #!/bin/bash
LANGUAGE=en_US LANGUAGE=en_US
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
#############################################################
# 发送通知 # 发送通知
function notify-send() { function notify-send() {
# Detect name of the display in use
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
# Detect user using the display # Detect user using the display
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1) local user=$(who | awk '{print $1}' | head -n 1)
# Detect uid of the user # Detect uid of the user
local uid=$(id -u $user) local uid=$(id -u $user)
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@" sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
} }
# 检测网络链接畅通 # 检测网络链接畅通
@@ -38,7 +43,7 @@ function network()
network network
if [ $? -ne 0 ] ; then if [ $? -ne 0 ] ; then
echo "Network fail. Stop to avoid bother dpkg" echo "$TRANSHELL_CONTENT_NETWORK_FAIL"
exit -1 exit -1
fi fi
@@ -47,7 +52,19 @@ fi
# 每日更新星火源文件 # 每日更新星火源文件
curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list" curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
updatetext=`aptss ssupdate`
updatetext=`aptss ssupdate 2>&1`
until [ "`echo $updatetext | grep E: `" = "" ];do
echo "${TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC}"
sleep 15
updatetext=`aptss ssupdate 2>&1`
done
isupdate=`echo ${updatetext: -5}` isupdate=`echo ${updatetext: -5}`
if [ "$isupdate" = "date." ] ; then if [ "$isupdate" = "date." ] ; then
exit 0 exit 0
@@ -84,10 +101,10 @@ done
# 还原分隔符 # 还原分隔符
IFS="$IFS_OLD" IFS="$IFS_OLD"
if [ $update_app_number -le 0 ] ; then if [ $update_app_number -le 0 ] ; then
exit 0 exit 0
fi fi
update_transhell
## 如果都是hold或者版本一致的那就直接退出否则把剩余的给提醒了 ## 如果都是hold或者版本一致的那就直接退出否则把剩余的给提醒了
notify-send -a spark-store "星火更新提醒" "星火商店仓库中有$update_app_number个软件包可以更新啦!请到星火商店的菜单处理" notify-send -a spark-store "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY}" "${TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE}"

View File

@@ -0,0 +1,17 @@
#!/bin/bash
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="Checking for update, please wait..."
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="Spark Store APP Upgrade model"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured in checking for update! Press Confirm to get the error log (Can be useful when feedback)"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="I already copied the log in the text box and I will attach it when feeding back. You can find feedback entry in the settings which is located in the top right of the store."
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="Feedback entry in the settings which is located in the top right of the store"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="All APPs are up to date.\nBut you are not standing at the top of the world"
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="Unable to upgrade: Being marked as hold"
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="Choose the app you want to upgrade"
TRANSHELL_CONTENT_CHOOSE="Choose"
TRANSHELL_CONTENT_PKG_NAME="Pkg name"
TRANSHELL_CONTENT_NEW_VERSION="New version"
TRANSHELL_CONTENT_UPGRADE_FROM="Upgrade from"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="No app is chosen\nBut you are not standing at the top of the world"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="Upgrading $PKG_UPGRADE , please wait..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="The chosen app is upgraded"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured when upgrading! Press Confirm to get the error log (Can be useful when feedback)"

View File

@@ -0,0 +1,17 @@
#!/bin/bash
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="正在检查更新,请稍候..."
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模块"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="检查更新进程出现错误!按确定查看报错,可用于反馈"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到"
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="反馈渠道在商店右上角的设置里"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="没有软件需要更新\n但是你并没有站在世界之巅"
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(无法更新:已被标记为保留)"
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="选择你想更新的应用"
TRANSHELL_CONTENT_CHOOSE="选择"
TRANSHELL_CONTENT_PKG_NAME="包名"
TRANSHELL_CONTENT_NEW_VERSION="新版本"
TRANSHELL_CONTENT_UPGRADE_FROM="从该版本更新"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何软件\n但是你并没有站在世界之巅"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的软件已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

@@ -0,0 +1,12 @@
#!/bin/bash
TRANSHELL_CONTENT_CLOSE="Close"
TRANSHELL_CONTENT_OPEN="Open"
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="Welcome to Spark Store APP Upgrade Settings\nPlease choose one option to run"
TRANSHELL_CONTENT_OPTIONS="Options"
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open Spark Store APP upgrade check. (Will notify APP upgrade at start up if opened.)"
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="Check Upgradable app list."
TRANSHELL_CONTENT_EXIT="Exit"
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="Please authorize to close APP upgrade check"
TRANSHELL_CONTENT_CLOSED="Closed"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="Please authorize to open APP upgrade check"
TRANSHELL_CONTENT_OPENED="Opened"

View File

@@ -0,0 +1,12 @@
#!/bin/bash
TRANSHELL_CONTENT_CLOSE="关闭"
TRANSHELL_CONTENT_OPEN="开启"
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="欢迎使用星火更新和安装设置工具\n请在以下操作中选择一个进行~"
TRANSHELL_CONTENT_OPTIONS="操作选项"
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)"
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="查看可更新软件包列表"
TRANSHELL_CONTENT_EXIT="退出"
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="执行关闭自动更新检测,请授权"
TRANSHELL_CONTENT_CLOSED="已关闭"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="执行启动自动更新检测,请授权"
TRANSHELL_CONTENT_OPENED="已开启"

View File

@@ -0,0 +1,5 @@
#!/bin/bash
TRANSHELL_CONTENT_NETWORK_FAIL="Network fail. Stop to avoid bother dpkg"
TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC="Update error! Wait for 15 seconds..."
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY="Spark Store Upgrade Notifier"
TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE="There are ${update_app_number} APPs available to upgrade! Please go to Spark Store to upgrade."

View File

@@ -0,0 +1,5 @@
#!/bin/bash
TRANSHELL_CONTENT_NETWORK_FAIL="网络错误为防止阻塞dpkg,停止"
TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC="更新出现异常状况,等待十五秒"
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY="星火更新提醒"
TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE="星火商店仓库中有$update_app_number个软件包可以更新啦请到星火商店的菜单处理"

View File

@@ -1,10 +1,6 @@
#!/bin/bash #!/bin/bash
# this file is used to auto-generate .qm file from .ts file. # this file is used to auto-generate .qm file from .ts file.
ts_list=(`ls ./translations/*.ts`) cd $(dirname $0)
for ts in "${ts_list[@]}" lrelease ./src/spark-store.pro
do
printf "\nprocess ${ts}\n"
lrelease "${ts}"
done

6
translate_update.sh Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/bash
# this file is used to auto-update .ts file.
cd $(dirname $0)
lupdate ./src/spark-store.pro -no-obsolete

View File

@@ -10,8 +10,9 @@
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="244"/> <location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="147"/> <location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="209"/> <location filename="../src/pages/appintopage.cpp" line="226"/>
<location filename="../src/pages/appintopage.cpp" line="368"/>
<source>Download</source> <source>Download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -41,12 +42,6 @@
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="435"/> <location filename="../src/pages/appintopage.ui" line="435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@@ -107,12 +102,6 @@
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="549"/> <location filename="../src/pages/appintopage.ui" line="549"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@@ -143,6 +132,18 @@
<source>Screen capture</source> <source>Screen capture</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="1161"/> <location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source> <source>Update</source>
@@ -174,47 +175,51 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="89"/> <location filename="../src/pages/appintopage.cpp" line="87"/>
<source>Click Open</source> <source>Click Open</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="132"/> <location filename="../src/pages/appintopage.cpp" line="96"/>
<location filename="../src/pages/appintopage.cpp" line="224"/> <source>Developer Mode Disabled</source>
<location filename="../src/pages/appintopage.cpp" line="316"/> <translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="145"/>
<location filename="../src/pages/appintopage.cpp" line="242"/>
<location filename="../src/pages/appintopage.cpp" line="339"/>
<source>Reinstall</source> <source>Reinstall</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="139"/> <location filename="../src/pages/appintopage.cpp" line="152"/>
<source>Upgrade</source> <source>Upgrade</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="214"/> <location filename="../src/pages/appintopage.cpp" line="231"/>
<location filename="../src/pages/appintopage.cpp" line="308"/> <location filename="../src/pages/appintopage.cpp" line="327"/>
<location filename="../src/pages/appintopage.cpp" line="341"/>
<source>Install</source> <source>Install</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="219"/> <location filename="../src/pages/appintopage.cpp" line="236"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="345"/> <location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="356"/> <location filename="../src/pages/appintopage.cpp" line="383"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="345"/> <location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Uninstall succeeded</source> <source>Uninstall succeeded</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="356"/> <location filename="../src/pages/appintopage.cpp" line="383"/>
<source>The URL has been copied to the clipboard</source> <source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -232,102 +237,121 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="90"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="97"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>DownloadItem</name> <name>DownloadItem</name>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="20"/> <location filename="../src/widgets/common/downloaditem.ui" line="32"/>
<source>Form</source> <source>Form</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="50"/> <location filename="../src/widgets/common/downloaditem.ui" line="74"/>
<source>icon</source> <source>icon</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="82"/> <location filename="../src/widgets/common/downloaditem.ui" line="134"/>
<source>TextLabel</source> <source>TextLabel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="106"/> <location filename="../src/widgets/common/downloaditem.ui" line="121"/>
<source>Name</source> <source>Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="198"/> <location filename="../src/widgets/common/downloaditem.ui" line="226"/>
<source>Waiting to download</source> <source>Waiting to download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="249"/> <location filename="../src/widgets/common/downloaditem.ui" line="277"/>
<source>Install</source> <source>Install</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="268"/> <location filename="../src/widgets/common/downloaditem.ui" line="296"/>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="287"/> <location filename="../src/widgets/common/downloaditem.ui" line="315"/>
<source>Info</source> <source>Info</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="40"/> <location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
<source>Download Complete.</source> <source>Download Complete.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/> <location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="99"/> <location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/> <location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<source>Installation complete.</source> <source>Installation complete.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="143"/> <location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
<source>Finish</source> <source>Finish</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/> <location filename="../src/widgets/common/downloaditem.cpp" line="157"/>
<source>Retry</source> <source>Retry</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/> <location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<source>Error happened in dpkg progress , you can try it again.</source> <source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="153"/> <location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<source>Error happened in dpkg progress , you can try it again</source> <source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<source>dpkg progress had been abortedyou can retry installation.</source> <source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/> <location filename="../src/widgets/common/downloaditem.cpp" line="168"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/>
<source>dpkg progress had been abortedyou can retry installation</source> <source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="181"/> <location filename="../src/widgets/common/downloaditem.cpp" line="189"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -345,7 +369,7 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/downloadlistwidget.ui" line="110"/> <location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
<source>Open download directory</source> <source>Open download directory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -358,141 +382,133 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="160"/> <location filename="../src/mainwindow-dtk.ui" line="166"/>
<source>Home</source> <source>Home</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="197"/> <location filename="../src/mainwindow-dtk.ui" line="203"/>
<source>Network</source> <source>Network</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="225"/> <location filename="../src/mainwindow-dtk.ui" line="231"/>
<source>Chat</source> <source>Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="253"/> <location filename="../src/mainwindow-dtk.ui" line="259"/>
<source>Music</source> <source>Music</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="281"/> <location filename="../src/mainwindow-dtk.ui" line="287"/>
<source>Video</source> <source>Video</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="309"/> <location filename="../src/mainwindow-dtk.ui" line="315"/>
<source>Picture</source> <source>Picture</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="337"/> <location filename="../src/mainwindow-dtk.ui" line="343"/>
<source>Game</source> <source>Game</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="365"/> <location filename="../src/mainwindow-dtk.ui" line="371"/>
<source>Office</source> <source>Office</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="393"/> <location filename="../src/mainwindow-dtk.ui" line="399"/>
<source>Reading</source> <source>Reading</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="421"/> <location filename="../src/mainwindow-dtk.ui" line="427"/>
<source>Development</source> <source>Development</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="449"/> <location filename="../src/mainwindow-dtk.ui" line="455"/>
<source>Tool</source> <source>Tool</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="477"/> <location filename="../src/mainwindow-dtk.ui" line="483"/>
<source>Theme</source> <source>Theme</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="505"/> <location filename="../src/mainwindow-dtk.ui" line="511"/>
<source>Other</source> <source>Other</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="533"/> <location filename="../src/mainwindow-dtk.ui" line="539"/>
<source>APP Upgrade</source> <source>APP Upgrade</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="34"/> <location filename="../src/mainwindow-dtk.cpp" line="161"/>
<source>Submit App</source> <source>Submit App</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="35"/> <location filename="../src/mainwindow-dtk.cpp" line="162"/>
<source>Submit App with client(Recommanded)</source> <source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="36"/> <location filename="../src/mainwindow-dtk.cpp" line="163"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="164"/>
<source>APP Upgrade and Install Settings</source> <source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="158"/> <location filename="../src/mainwindow-dtk.cpp" line="123"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="159"/> <location filename="../src/mainwindow-dtk.cpp" line="128"/>
<source>Search or enter spk://</source> <source>Search or enter spk://</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>QLabel</name>
<message>
<location filename="../src/main.cpp" line="64"/>
<location filename="../src/main.cpp" line="73"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/main.cpp" line="61"/> <location filename="../src/application.cpp" line="28"/>
<source>We publish this program under GPL V3</source> <location filename="../src/application.cpp" line="29"/>
<translation type="unfinished"></translation> <location filename="../src/mainwindow-dtk.cpp" line="103"/>
</message>
<message>
<location filename="../src/main.cpp" line="66"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="75"/>
<source>The Spark Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="79"/>
<location filename="../src/main.cpp" line="81"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="84"/> <location filename="../src/application.cpp" line="33"/>
<source>&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Published under GPL V3</source> <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="94"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<source>Download list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="217"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@@ -584,30 +600,32 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/settingspage.cpp" line="181"/> <location filename="../src/pages/settingspage.cpp" line="213"/>
<source>Updating, please wait...</source> <source>Updating, please wait...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/settingspage.cpp" line="204"/> <location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/settingspage.cpp" line="204"/> <location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Temporary cache was cleaned</source> <source>Temporary cache was cleaned</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
<name>Widget</name> <name>TitleBarMenu</name>
<message> <message>
<source>Share</source> <location filename="../src/mainwindow-dtk.cpp" line="218"/>
<translation type="obsolete">Spk share link</translation> <source>About</source>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>0B</source> <location filename="../src/mainwindow-dtk.cpp" line="219"/>
<translation type="obsolete">0B</translation> <source>Exit</source>
<translation type="unfinished"></translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@@ -10,8 +10,9 @@
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="244"/> <location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="147"/> <location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="209"/> <location filename="../src/pages/appintopage.cpp" line="226"/>
<location filename="../src/pages/appintopage.cpp" line="368"/>
<source>Download</source> <source>Download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -41,12 +42,6 @@
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 20.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="435"/> <location filename="../src/pages/appintopage.ui" line="435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@@ -107,12 +102,6 @@
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine5 app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="549"/> <location filename="../src/pages/appintopage.ui" line="549"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@@ -143,6 +132,18 @@
<source>Screen capture</source> <source>Screen capture</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="1161"/> <location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source> <source>Update</source>
@@ -174,47 +175,51 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="89"/> <location filename="../src/pages/appintopage.cpp" line="87"/>
<source>Click Open</source> <source>Click Open</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="132"/> <location filename="../src/pages/appintopage.cpp" line="96"/>
<location filename="../src/pages/appintopage.cpp" line="224"/> <source>Developer Mode Disabled</source>
<location filename="../src/pages/appintopage.cpp" line="316"/> <translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="145"/>
<location filename="../src/pages/appintopage.cpp" line="242"/>
<location filename="../src/pages/appintopage.cpp" line="339"/>
<source>Reinstall</source> <source>Reinstall</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="139"/> <location filename="../src/pages/appintopage.cpp" line="152"/>
<source>Upgrade</source> <source>Upgrade</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="214"/> <location filename="../src/pages/appintopage.cpp" line="231"/>
<location filename="../src/pages/appintopage.cpp" line="308"/> <location filename="../src/pages/appintopage.cpp" line="327"/>
<location filename="../src/pages/appintopage.cpp" line="341"/>
<source>Install</source> <source>Install</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="219"/> <location filename="../src/pages/appintopage.cpp" line="236"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="345"/> <location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="356"/> <location filename="../src/pages/appintopage.cpp" line="383"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="345"/> <location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Uninstall succeeded</source> <source>Uninstall succeeded</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="356"/> <location filename="../src/pages/appintopage.cpp" line="383"/>
<source>The URL has been copied to the clipboard</source> <source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -232,102 +237,121 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="90"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="97"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>DownloadItem</name> <name>DownloadItem</name>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="20"/> <location filename="../src/widgets/common/downloaditem.ui" line="32"/>
<source>Form</source> <source>Form</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="50"/> <location filename="../src/widgets/common/downloaditem.ui" line="74"/>
<source>icon</source> <source>icon</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="82"/> <location filename="../src/widgets/common/downloaditem.ui" line="134"/>
<source>TextLabel</source> <source>TextLabel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="106"/> <location filename="../src/widgets/common/downloaditem.ui" line="121"/>
<source>Name</source> <source>Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="198"/> <location filename="../src/widgets/common/downloaditem.ui" line="226"/>
<source>Waiting to download</source> <source>Waiting to download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="249"/> <location filename="../src/widgets/common/downloaditem.ui" line="277"/>
<source>Install</source> <source>Install</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="268"/> <location filename="../src/widgets/common/downloaditem.ui" line="296"/>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.ui" line="287"/> <location filename="../src/widgets/common/downloaditem.ui" line="315"/>
<source>Info</source> <source>Info</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="40"/> <location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
<source>Download Complete.</source> <source>Download Complete.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/> <location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="99"/> <location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/> <location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<source>Installation complete.</source> <source>Installation complete.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="143"/> <location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
<source>Finish</source> <source>Finish</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/> <location filename="../src/widgets/common/downloaditem.cpp" line="157"/>
<source>Retry</source> <source>Retry</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/> <location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<source>Error happened in dpkg progress , you can try it again.</source> <source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="153"/> <location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<source>Error happened in dpkg progress , you can try it again</source> <source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<source>dpkg progress had been abortedyou can retry installation.</source> <source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/> <location filename="../src/widgets/common/downloaditem.cpp" line="168"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/>
<source>dpkg progress had been abortedyou can retry installation</source> <source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="181"/> <location filename="../src/widgets/common/downloaditem.cpp" line="189"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -345,7 +369,7 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/downloadlistwidget.ui" line="110"/> <location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
<source>Open download directory</source> <source>Open download directory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -358,152 +382,133 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="160"/> <location filename="../src/mainwindow-dtk.ui" line="166"/>
<source>Home</source> <source>Home</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="197"/> <location filename="../src/mainwindow-dtk.ui" line="203"/>
<source>Network</source> <source>Network</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="225"/> <location filename="../src/mainwindow-dtk.ui" line="231"/>
<source>Chat</source> <source>Chat</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="253"/> <location filename="../src/mainwindow-dtk.ui" line="259"/>
<source>Music</source> <source>Music</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="281"/> <location filename="../src/mainwindow-dtk.ui" line="287"/>
<source>Video</source> <source>Video</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="309"/> <location filename="../src/mainwindow-dtk.ui" line="315"/>
<source>Picture</source> <source>Picture</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="337"/> <location filename="../src/mainwindow-dtk.ui" line="343"/>
<source>Game</source> <source>Game</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="365"/> <location filename="../src/mainwindow-dtk.ui" line="371"/>
<source>Office</source> <source>Office</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="393"/> <location filename="../src/mainwindow-dtk.ui" line="399"/>
<source>Reading</source> <source>Reading</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="421"/> <location filename="../src/mainwindow-dtk.ui" line="427"/>
<source>Development</source> <source>Development</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="449"/> <location filename="../src/mainwindow-dtk.ui" line="455"/>
<source>Tool</source> <source>Tool</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="477"/> <location filename="../src/mainwindow-dtk.ui" line="483"/>
<source>Theme</source> <source>Theme</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="505"/> <location filename="../src/mainwindow-dtk.ui" line="511"/>
<source>Other</source> <source>Other</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.ui" line="533"/> <location filename="../src/mainwindow-dtk.ui" line="539"/>
<source>APP Upgrade</source> <source>APP Upgrade</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="34"/> <location filename="../src/mainwindow-dtk.cpp" line="161"/>
<source>Submit App</source> <source>Submit App</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="35"/> <location filename="../src/mainwindow-dtk.cpp" line="162"/>
<source>Submit App with client(Recommanded)</source> <source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="36"/> <location filename="../src/mainwindow-dtk.cpp" line="163"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="164"/>
<source>APP Upgrade and Install Settings</source> <source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="158"/> <location filename="../src/mainwindow-dtk.cpp" line="123"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="159"/> <location filename="../src/mainwindow-dtk.cpp" line="128"/>
<source>Search or enter spk://</source> <source>Search or enter spk://</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>QLabel</name>
<message>
<source>Spark应用商店</source>
<translation type="vanished">Spark Store</translation>
</message>
<message>
<source>
GPL第三版开源</source>
<translation type="vanished">Un app store tier alimenté par la communauté Deepin
Spark Store est publié sous licence GPL V3
Nous sommes nés pour le changement.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="64"/>
<location filename="../src/main.cpp" line="73"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/main.cpp" line="61"/> <location filename="../src/application.cpp" line="28"/>
<source>We publish this program under GPL V3</source> <location filename="../src/application.cpp" line="29"/>
<translation type="unfinished"></translation> <location filename="../src/mainwindow-dtk.cpp" line="103"/>
</message>
<message>
<location filename="../src/main.cpp" line="66"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="75"/>
<source>The Spark Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/main.cpp" line="79"/>
<location filename="../src/main.cpp" line="81"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/main.cpp" line="84"/> <location filename="../src/application.cpp" line="33"/>
<source>&lt;span style=&apos;font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by deepin community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos;font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Published under GPL V3</source> <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="94"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<source>Download list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="217"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@@ -595,212 +600,32 @@ Nous sommes nés pour le changement.</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/settingspage.cpp" line="181"/> <location filename="../src/pages/settingspage.cpp" line="213"/>
<source>Updating, please wait...</source> <source>Updating, please wait...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/settingspage.cpp" line="204"/> <location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/settingspage.cpp" line="204"/> <location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Temporary cache was cleaned</source> <source>Temporary cache was cleaned</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
<name>Widget</name> <name>TitleBarMenu</name>
<message> <message>
<source></source> <location filename="../src/mainwindow-dtk.cpp" line="218"/>
<translatorcomment>Lecteurs vidéo et créateurs vidéo</translatorcomment> <source>About</source>
<translation type="vanished">Vidéo</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source></source> <location filename="../src/mainwindow-dtk.cpp" line="219"/>
<translation type="vanished">Liste de téléchargement</translation> <source>Exit</source>
</message> <translation type="unfinished"></translation>
<message>
<source></source>
<translation type="vanished">Outils</translation>
</message>
<message>
<source></source>
<translatorcomment>Thème des icônes et autres </translatorcomment>
<translation type="vanished">Thèmes</translation>
</message>
<message>
<source></source>
<translation type="vanished">Musique</translation>
</message>
<message>
<source></source>
<translation type="vanished">Développement</translation>
</message>
<message>
<source></source>
<translation type="vanished">Bureau</translation>
</message>
<message>
<source></source>
<translation type="vanished">Traduire</translation>
</message>
<message>
<source></source>
<translation type="vanished">Autres</translation>
</message>
<message>
<source></source>
<translation type="vanished">Accueil</translation>
</message>
<message>
<source></source>
<translation type="vanished">Images</translation>
</message>
<message>
<source></source>
<translation type="vanished">Jeux</translation>
</message>
<message>
<source></source>
<translation type="vanished">Chat</translation>
</message>
<message>
<source></source>
<translation type="vanished">Réseau</translation>
</message>
<message>
<source></source>
<translation type="vanished">La liste de téléchargement est vide</translation>
</message>
<message>
<source></source>
<translation type="vanished">Ouvrir dans le gestionnaire de fichiers</translation>
</message>
<message>
<source></source>
<translation type="vanished">Installer</translation>
</message>
<message>
<source></source>
<translation type="vanished">Supprimer</translation>
</message>
<message>
<source></source>
<translation type="vanished">Site</translation>
</message>
<message>
<source></source>
<translation type="vanished">Nom</translation>
</message>
<message>
<source></source>
<translation type="vanished">Icon</translation>
</message>
<message>
<source></source>
<translation type="vanished">Partager</translation>
</message>
<message>
<source></source>
<translation type="vanished">Détails</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;magasin de logiciels développé par des passionnés de la communauté&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source></source>
<translation type="vanished">Captures d&apos;écran</translation>
</message>
<message>
<source>线</source>
<translation type="vanished">Line Settings</translation>
</message>
<message>
<source>线</source>
<translation type="vanished">Choisissez: </translation>
</message>
<message>
<source></source>
<translation type="vanished">Mise à jour</translation>
</message>
<message>
<source> </source>
<translation type="vanished">Redémarrez pour prendre effet</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;使apt工具获取软件使线&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Le rôle du serveur source est de s&apos;assurer que le logiciel est mis à jour et prend en charge l&apos;utilisation de l&apos;outil apt pour obtenir le logiciel. Nous préférons généralement que vous utilisiez la première ligne comme source de mise à jour, qui est généralement la plus stable. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source></source>
<translation type="vanished">Mettre à jour la source APT</translation>
</message>
<message>
<source></source>
<translation type="vanished">Source APT: </translation>
</message>
<message>
<source></source>
<translation type="vanished">serveur</translation>
</message>
<message>
<source></source>
<translation type="vanished">Temp</translation>
</message>
<message>
<source></source>
<translation type="vanished">Nettoyer</translation>
</message>
<message>
<source>/tmp下使</source>
<translation type="vanished">Étant donné que ce répertoire se trouve sous /tmp, même si vous ne l&apos;effacez pas manuellement, il sera effacé automatiquement au redémarrage du système.</translation>
</message>
<message>
<source></source>
<translation type="vanished">Taille: </translation>
</message>
<message>
<source>0B</source>
<translation type="obsolete">0B</translation>
</message>
<message>
<source>/tmp/spark-store</source>
<translation type="vanished">Emplacement:/tmp/spark-store</translation>
</message>
<message>
<source></source>
<translation type="vanished">À propos de nous</translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Linux/deepin系统爱好者和用户之中的一员Spark应用商店&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;使使&lt;/p&gt;&lt;p&gt;&amp;lt;jifengshenmo@outlook.com&amp;gt;&lt;/p&gt;&lt;p&gt;稿&lt;/p&gt;&lt;p&gt;QQ872690351&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Nous ne sommes pas l&apos;équipe officielle, tout comme vous, nous ne sommes qu&apos;un des nombreux passionnés et utilisateurs de systèmes Linux / deepin, nous développons et gérons le &quot;Spark Store&quot;! &quot;, est de rassembler la communauté pour partager des logiciels utiles, ou pour participer au développement ensemble, afin que nous utilisions tous les derniers et meilleurs logiciels. &lt;/p&gt;&lt;p&gt; Nous n&apos;en tirons aucun profit, tous les développeurs et mainteneurs ne sont pas payés, et nous comptons sur les dons de la communauté pour la plupart de nos dépenses, dont nous sommes reconnaissants et qui nous permettent de ne pas dépenser trop d&apos;énergie se soucier du financement. &lt;/p&gt;&lt;p&gt;Notre service et nos logiciels sont gratuits pour tout le monde à utiliser, à communiquer et à apprendre, mais vous devez vous conformer aux lois et réglementations locales dans le processus de votre utilisation, sinon tout problème n&apos;a rien à voir avec nous. &lt;/p&gt;&lt;p&gt;Si une partie du magasin enfreint vos droits, veuillez nous en informer &amp;lt;jifengshenmo@outlook.com&amp;gt; nous retirerons le contenu en infraction dès que possible. &lt;/p&gt;&lt;p&gt;Si vous souhaitez également vous impliquer avec nous, que vous soyez impliqué dans le développement, la conception, le pitching ou la soumission de travaux, nous vous invitons à nous rejoindre. &lt;/p&gt;&lt;p&gt;QQ group:872690351&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
<name>downloadlist</name>
<message>
<source></source>
<translation type="vanished">Nom</translation>
</message>
<message>
<source></source>
<translatorcomment>Attendez pour téléchargerd</translatorcomment>
<translation type="vanished">Attendez pour télécharger</translation>
</message>
<message>
<source></source>
<translation type="vanished">Installer</translation>
</message>
<message>
<source></source>
<translation type="vanished">Annuler</translation>
</message>
<message>
<source></source>
<translation type="vanished">Détail</translation>
</message> </message>
</context> </context>
</TS> </TS>

File diff suppressed because it is too large Load Diff