Compare commits

..

58 Commits

Author SHA1 Message Date
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
1b9c925183 把默认的README改成英文 2022-12-25 12:43:51 +08:00
09221bc2e9 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-25 03:21:04 +00:00
98da0c22fc enhance: 规范代码行为 2022-12-24 10:29:55 +08:00
cadbb351fb enhance: 限制循环变量的作用范围 2022-12-24 10:04:40 +08:00
2de237ce83 fix: aptss ssupdate出错时不再锁死
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-24 10:04:40 +08:00
511fbaa0b0 update src/main.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-23 13:55:58 +00:00
a6d85b6ade update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-23 13:55:40 +00:00
5889ac3045 enhance: 下载列表新增 wayland 窗口标题 2022-12-23 18:42:19 +08:00
c1ba14bbd0 fix: 安装依赖缺失 2022-12-23 18:28:38 +08:00
7bdccc7783 Merge branch 'dev' of gitee.com:deepin-community-store/spark-store into dev 2022-12-23 18:12:36 +08:00
momen
3a54cba3e5 !176 让浏览器获取中文页面
* !1 enhanced: 判断系统语言,中文则修改请求头,请求中文网页
2022-12-23 10:12:18 +00:00
79463246fb fix: 修复编译依赖 2022-12-23 18:11:44 +08:00
cc8ff5eff2 enhance: 消除 c11 标准警告 2022-12-23 16:46:32 +08:00
613327b2cc fix: 修复非deepin的wayland环境下ui显示 2022-12-23 16:30:36 +08:00
8b31db843c fix: Wayland 在某些环境下错误识别为 dde 2022-12-23 16:30:36 +08:00
fd4fdbe970 format: 代码格式化 2022-12-23 12:13:48 +08:00
89a3ab0b4c feat: support wayland 2022-12-22 21:50:27 +08:00
0179c2f04f feat: wayland 2022-12-22 00:49:11 +08:00
50 changed files with 1741 additions and 2065 deletions

View File

@@ -1,73 +0,0 @@
# Spark App Store
[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers) [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
The collecting process needs everyone's help
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
All packages will be shared in our repository for users to get freely.
Distrobution supportedDeepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future ; UniontechOS Home 21
*About OpenKylin and deepin 23*
The adaptation work is scheduled after their official release.
You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
We hope people who see here can also join our teamdevelopment help or submit applications are welcomed
If you want to submit an APP to share with othersPlease [Click here](https://upload.deepinos.org/index)
## 🙌 A simple start
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
---
#### Compile and developement
For Deepin V20/UOS 21/ Debian 11
```shell
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
```
Ubuntu 22.04
```shell
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
```
Then
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
dpkg-buildpackage
```
## 🚀 Coorperation
We use Gitee as our code hosting platform. Please click here to contact us.
https://gitee.com/deepin-community-store/spark-store
### Rocket Chat
https://chat.shenmo.tech/
PWA Client
spk://store/chat/store.spark-app.feedback
Copy and paste to search bar or in browser address bar after installing Spark Store

View File

@@ -1,50 +1,53 @@
# 星火应用商店 # Spark App Store
[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers) [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members) [![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers) [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
众所周知国内的Linux应用比较少wine应用难以获取优质工具分散在民间各大论坛无法形成合力难以改善生态 Spark Store aims to collect Linux apps for the convieniece of Linux new comers
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势 The collecting process needs everyone's help
我们创建了这个应用商店广泛收录大家需要的软件包搜集优质小工具主动适配wine应用存放到储存库供大家获取 We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
我们支持Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
## 关于协作:分支相关的文档见 [这里](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo) All packages will be shared in our repository for users to get freely.
*关于OpenKylin和deepin 23* Distrobution supportedDeepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future ; UniontechOS Home 21
支持计划将会在对应系统发布正式版之后开始评估和执行 *About OpenKylin and deepin 23*
希望看到这里的人也可以加入我们的队伍开发或者投递应用都很欢迎共同构建Linux应用生态 The adaptation work is scheduled after their official release.
在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
## 🙌 简单的开始 We hope people who see here can also join our teamdevelopment help or submit applications are welcomed
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。 If you want to submit an APP to share with othersPlease [Click here](https://upload.deepinos.org/index)
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
## 🙌 A simple start
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
--- ---
#### 编译安装 #### Compile and developement
Deepin V20/UOS 21 系统下, 安装依赖 For Deepin V20/UOS 21/ Debian 11
```shell ```shell
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
``` ```
Ubuntu 22.04 系统下, 安装依赖 Ubuntu 22.04
```shell ```shell
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
``` ```
然后 Then
```shell ```shell
git clone https://gitee.com/deepin-community-store/spark-store.git git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store cd spark-store
@@ -53,16 +56,18 @@ dpkg-buildpackage
## 🚀 协作 ## 🚀 Coorperation
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。 We use Gitee as our code hosting platform. Please click here to contact us.
### 交流平台 https://gitee.com/deepin-community-store/spark-store
### Rocket Chat
https://chat.shenmo.tech/ https://chat.shenmo.tech/
客户端PWA PWA Client
spk://store/chat/store.spark-app.feedback spk://store/chat/store.spark-app.feedback
安装星火商店后在浏览器打开或复制到搜索栏打开 Copy and paste to search bar or in browser address bar after installing Spark Store

68
README.zh.md Normal file
View File

@@ -0,0 +1,68 @@
# 星火应用商店
[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers) [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
众所周知国内的Linux应用比较少wine应用难以获取优质工具分散在民间各大论坛无法形成合力难以改善生态
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
我们创建了这个应用商店广泛收录大家需要的软件包搜集优质小工具主动适配wine应用存放到储存库供大家获取
我们支持Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
## 关于协作:分支相关的文档见 [这里](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo)
*关于OpenKylin和deepin 23*
支持计划将会在对应系统发布正式版之后开始评估和执行
希望看到这里的人也可以加入我们的队伍开发或者投递应用都很欢迎共同构建Linux应用生态
在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
## 🙌 简单的开始
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
---
#### 编译安装
Deepin V20/UOS 21 系统下, 安装依赖
```shell
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
```
Ubuntu 22.04 系统下, 安装依赖
```shell
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
```
然后
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
dpkg-buildpackage
```
## 🚀 协作
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
### 交流平台
https://chat.shenmo.tech/
客户端PWA
spk://store/chat/store.spark-app.feedback
(安装星火商店后在浏览器打开或复制到搜索栏打开)

156
debian/changelog vendored
View File

@@ -1,67 +1,107 @@
spark-store (4.1.2~test1) stable; urgency=medium
* feat: 初步的wayland支持
* 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
@@ -74,7 +114,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
@@ -82,132 +123,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
@@ -220,20 +266,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
@@ -243,53 +291,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
@@ -302,6 +351,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
* 调整 现在与系统更新分开,不再导致更新失败 * 调整 现在与系统更新分开,不再导致更新失败
@@ -310,17 +360,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
@@ -332,6 +382,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
@@ -340,8 +391,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
@@ -350,8 +399,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.
@@ -360,7 +407,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
@@ -370,7 +416,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
@@ -380,8 +425,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
@@ -389,8 +432,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
@@ -403,3 +444,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

12
debian/control vendored
View File

@@ -15,11 +15,14 @@ Build-Depends:
libdtkgui-dev(>=5.0), libdtkgui-dev(>=5.0),
libdtkwidget-dev(>=5.0), libdtkwidget-dev(>=5.0),
qttools5-private-dev, qttools5-private-dev,
qtwebengine5-dev qtwebengine5-dev,
qtwayland5,
qtwayland5-dev-tools,
gcc,
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},
@@ -28,17 +31,16 @@ Depends:${shlibs:Depends}, ${misc:Depends},
libqt5widgets5, libqt5widgets5,
libqt5network5, libqt5network5,
libqt5concurrent5, libqt5concurrent5,
qtwayland5,
libdtkcore5, libdtkcore5,
libdtkgui5, libdtkgui5,
libdtkwidget5, libdtkwidget5,
curl, curl,
openssl, openssl,
libssl-dev,
dde-qt5integration, dde-qt5integration,
bubblewrap, bubblewrap,
aria2, aria2,
gcc, gcc,
g++,
zenity zenity
Description: Spark Store Description: Spark Store
A community powered app store, based on DTK. A community powered app store, based on DTK.

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

View File

@@ -8,18 +8,17 @@ TARGET = spark-store
TEMPLATE = subdirs TEMPLATE = subdirs
CONFIG += ordered CONFIG += ordered
CONFIG += wayland-compositor
SUBDIRS += \ 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/*
@@ -63,4 +62,4 @@ INSTALLS += \
service \ service \
bash_completion \ bash_completion \
polkit-1 polkit-1
# 暂时不添加 # 暂时不添加

103
src/application.cpp Normal file
View File

@@ -0,0 +1,103 @@
#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);
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)
{ {
@@ -30,7 +32,6 @@ void DownloadController::setFilename(QString filename)
this->filename = filename; this->filename = filename;
} }
bool checkMeatlink(QString metaUrl) bool checkMeatlink(QString metaUrl)
{ {
QFile metaStatus("/tmp/spark-store/metaStatus.txt"); QFile metaStatus("/tmp/spark-store/metaStatus.txt");
@@ -49,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");
@@ -88,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();
} }
@@ -112,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出错
@@ -134,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;
@@ -145,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();
@@ -189,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;
@@ -210,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();
@@ -223,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,13 +1,12 @@
#include "image_show.h" #include "image_show.h"
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QScreen> // Qt5 不再建议使用 QDesktopWidget #include <QScreen> // Qt5 不再建议使用 QDesktopWidget
#include <QGuiApplication> #include <QGuiApplication>
image_show::image_show(QWidget *parent) : image_show::image_show(QWidget *parent) : QWidget(parent),
QWidget(parent), m_dialog(new big_image),
m_dialog(new big_image), m_label(new QLabel)
m_label(new QLabel)
{ {
QHBoxLayout *layout = new QHBoxLayout; QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(m_label); layout->addWidget(m_label);
@@ -27,7 +26,7 @@ void image_show::setImage(QPixmap image)
desktop_w = QGuiApplication::primaryScreen()->geometry().width(); desktop_w = QGuiApplication::primaryScreen()->geometry().width();
desktop_h = QGuiApplication::primaryScreen()->geometry().height(); desktop_h = QGuiApplication::primaryScreen()->geometry().height();
if(screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20)) if (screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20))
{ {
re_screen1 = screen0.scaled(QSize(desktop_w - 20, desktop_h - 20), Qt::KeepAspectRatio, Qt::SmoothTransformation); re_screen1 = screen0.scaled(QSize(desktop_w - 20, desktop_h - 20), Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_image = QPixmap::fromImage(re_screen1); m_image = QPixmap::fromImage(re_screen1);
@@ -48,7 +47,7 @@ void image_show::mousePressEvent(QMouseEvent *)
// 识别主屏幕尺寸并设置 widget 大小 // 识别主屏幕尺寸并设置 widget 大小
m_dialog->setFixedSize(desktop_w, desktop_h); m_dialog->setFixedSize(desktop_w, desktop_h);
m_dialog->move(0,0); m_dialog->move(0, 0);
} }
image_show::~image_show() image_show::~image_show()
{ {

View File

@@ -1,74 +1,87 @@
#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;
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)
{
emit finishedRAW(data); emit finishedRAW(data);
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

@@ -3,10 +3,9 @@
DBusSparkStoreService::DBusSparkStoreService(QObject *parent) DBusSparkStoreService::DBusSparkStoreService(QObject *parent)
: QDBusAbstractAdaptor(parent) : QDBusAbstractAdaptor(parent)
{ {
} }
void DBusSparkStoreService::activeWindow(const QString & arg) void DBusSparkStoreService::activeWindow(const QString &arg)
{ {
emit sigOpenUrl(arg); emit sigOpenUrl(arg);
} }

View File

@@ -1,128 +1,143 @@
#include "application.h"
#include "mainwindow-dtk.h" #include "mainwindow-dtk.h"
#include <DApplication> #include <DSysInfo>
#include <DLog>
#include <DPlatformWindowHandle>
#include <DApplicationSettings> #include <DApplicationSettings>
#include <DAboutDialog>
#include <QLabel>
#include <DWidgetUtil> #include <DWidgetUtil>
#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.1"; static const QString version = "4.1.2~test1";
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");
static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
//设置桌面环境环境变量 // 设置桌面环境环境变量
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin")) { bool isDeepinOS = true;
setenv("XDG_CURRENT_DESKTOP", "Deepin", 1); if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
{
qputenv("XDG_CURRENT_DESKTOP", "Deepin");
isDeepinOS = false;
} }
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
#ifndef DSTORE_NO_DXCBs bool isWayland = false;
DApplication::loadDXcbPlugin(); // 加载 DXCB 插件 auto e = QProcessEnvironment::systemEnvironment();
QString XDG_SESSION_TYPE = e.value(QStringLiteral("XDG_SESSION_TYPE"));
QString WAYLAND_DISPLAY = e.value(QStringLiteral("WAYLAND_DISPLAY"));
if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive))
{
isWayland = true;
}
// 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.
if (!config.contains("build/useWayland"))
{
config.setValue("build/useWayland", true);
}
config.sync(); // 写入更改至 config.ini并同步最新内容
bool useWayland = config.value("build/useWayland").toBool();
qDebug() << "System Wayland enabled:" << isWayland << ". Spark Wayland enabled:" << useWayland;
// Set display backend
if (isWayland && useWayland && !(Dtk::Core::DSysInfo::isDDE() || isDeepinOS))
{
qputenv("QT_QPA_PLATFORM", "wayland");
}
else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDDE() && isDeepinOS))
{
qputenv("QT_QPA_PLATFORM", "dwayland");
}
else
{
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 #endif
// 浏览器开启 GPU 支持 DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
QVector<char*> fakeArgs(argc + 2); // 强制使用 DTK 平台插件
QVector<char *> fakeArgs(argc + 2);
fakeArgs[0] = argv[0]; fakeArgs[0] = argv[0];
fakeArgs[1] = "-platformtheme"; fakeArgs[1] = const_cast<char *>("-platformtheme");
fakeArgs[2] = "deepin"; fakeArgs[2] = const_cast<char *>("deepin");
for(int i = 1; i < argc; i++) fakeArgs[i + 2] = argv[i]; for (int i = 1; i < argc; i++)
int fakeArgc = argc + 2; // 为啥DApplication的argc要用引用啊
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);
a.loadDXcbPlugin();
a.loadTranslator(); // 载入翻译
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
if (readConfig.value("build/version").toString() != version){
qDebug() << "Spark Store has been updated!";
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
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"))
{ {
qDebug() << "The application is already running!"; fakeArgs[i + 2] = argv[i];
QDBusInterface iface("com.gitee.spark.store", }
"/com/gitee/spark/store", int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
"com.gitee.spark.store", Application a(fakeArgc, fakeArgs.data());
QDBusConnection::sessionBus()); // 设置版本和构建时间
a.setVersionAndBuildDateTime(version, buildDateTime);
QString arg1 = argv[1];
iface.asyncCall("activeWindow",arg1);
// 限制单实例运行
if (!a.setSingleInstance("spark-store"))
{
qWarning() << "Another instance has already started, activating...";
return -1; return -1;
} }
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); //固定主题为浅色主题 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(QUrl(argv[1]));
}
} }
w.show(); w.show();

View File

@@ -3,30 +3,41 @@
#include <DWidgetUtil> #include <DWidgetUtil>
#include <DGuiApplicationHelper> #include <DGuiApplicationHelper>
#include <DApplicationSettings>
#include <QSizePolicy> #include <QSizePolicy>
#define AppPageApplist 0 #define AppPageApplist 0
#define AppPageSearchlist 1 #define AppPageSearchlist 1
#define AppPageAppdetail 2 #define AppPageAppdetail 2
#define AppPageSettings 3 #define AppPageSettings 3
#define WaylandSearchCenter 1
#define OtherSearchCenter 2
#define RightSearchSpace 1
#define UploadServerUrl "https://upload.deepinos.org/"
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: BaseWidgetOpacity(parent) : BaseWidgetOpacity(parent), ui(new Ui::MainWindow)
, ui(new Ui::MainWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowTitle(QObject::tr("Spark Store"));
initConfig(); initConfig();
moveToCenter(this); //让窗口居中显示
WidgetAnimation::widgetOpacity(this,true); // FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
bool isWayland = config.value("build/isWayland").toBool();
if (!isWayland)
{
WidgetAnimation::widgetOpacity(this, true);
}
searchEdit = new DSearchEdit(ui->titlebar);
downloadlistwidget = new DownloadListWidget; downloadlistwidget = new DownloadListWidget;
downloadButton = new ProgressButton(ui->titlebar); downloadButton = new ProgressButton(ui->titlebar);
backButtom = new QPushButton(ui->titlebar); backButtom = new QPushButton(ui->titlebar);
ui->appintopage->setDownloadWidget(downloadlistwidget); ui->appintopage->setDownloadWidget(downloadlistwidget);
ui->stackedWidget->setCurrentIndex(0); ui->stackedWidget->setCurrentIndex(0);
ui->titlebar->setBackgroundTransparent(true); ui->titlebar->setBackgroundTransparent(true);
//ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单 // ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
setMaskAlpha(250); setMaskAlpha(250);
updateUi(0); updateUi(0);
@@ -42,45 +53,42 @@ MainWindow::MainWindow(QWidget *parent)
menu->addAction(actionSubmissionWithClient); menu->addAction(actionSubmissionWithClient);
ui->titlebar->setMenu(menu); ui->titlebar->setMenu(menu);
connect(actionSubmission, &QAction::triggered, this, [=]{QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/"));}); connect(actionSubmission, &QAction::triggered, this, [=]
connect(setting, &QAction::triggered, this, [=]{ { QDesktopServices::openUrl(QUrl(UploadServerUrl)); });
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, [=]
{
QString submitterSpk = "spk://store/tools/spark-store-submitter";
QFile actionSubmissionClientStatus("/opt/spark-store-submitter/bin/spark-store-submitter");
if (actionSubmissionClientStatus.exists())
{ {
qDebug() << "投稿器存在"; QString submitterSpk = "spk://store/tools/spark-store-submitter";
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter"); QFile actionSubmissionClientStatus("/opt/spark-store-submitter/bin/spark-store-submitter");
} if (actionSubmissionClientStatus.exists())
else{ {
qDebug() << "投稿器存在,跳转页面"; qDebug() << "投稿器存在";
openUrl(submitterSpk); QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter", QStringList());
} }
else
{
qDebug() << "投稿器不存在,跳转页面";
openUrl(submitterSpk);
} });
}); // 主题切换
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;}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#FFFFFF}\
");
backButtom->setIcon(QIcon(":/icon/dark/back.svg")); 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"));
ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg")); ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg"));
int i = 0; for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
while (i < ui->buttonGroup->buttons().size()) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg")); ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") { if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\ ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
@@ -91,21 +99,16 @@ MainWindow::MainWindow(QWidget *parent)
QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\ QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}"); QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
} }
i++;
} }
} else { } else {
//亮色模式 //亮色模式
setMaskColor(QColor("#f3f7f8")); setMaskColor(QColor("#f3f7f8"));
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#000000}\
");
backButtom->setIcon(QIcon(":/icon/light/back.svg")); 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");
ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg")); ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg"));
int i = 0; for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
while (i < ui->buttonGroup->buttons().size()) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg")); ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") { if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\ ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
@@ -116,69 +119,84 @@ MainWindow::MainWindow(QWidget *parent)
QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\ QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}"); QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
} }
i++;
} }
} }
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet()); ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType); ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType); ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType);
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;
pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2); pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5); pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
downloadlistwidget->m_move(pos.x(), pos.y()); downloadlistwidget->m_move(pos.x(), pos.y());
downloadlistwidget->show(); downloadlistwidget->show(); });
});
//appintopage按下下载按钮时标题栏下载列表按钮抖动 // appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]() { connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
WidgetAnimation::widgetShake(downloadButton,6);//第一个参数是抖动的控件,第二个参数是抖动范围(像素) {
}); WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素)
});
connect(backButtom, &QPushButton::clicked, [=]() { connect(backButtom, &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(); backButtom->show();
} else { } else {
backButtom->hide(); backButtom->hide();
} } });
});
downloadlistwidget->hide(); downloadlistwidget->hide();
backButtom->hide(); backButtom->hide();
ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg")); ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg"));
QWidget *w_titlebar = new QWidget(ui->titlebar); QWidget *w_titlebar = new QWidget(ui->titlebar);
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar); QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
QLabel *title = new QLabel(this); QLabel *title = new QLabel(ui->titlebar);
title->setText(tr("Spark Store")); title->setText(tr("Spark Store"));
searchEdit->setPlaceholderText(tr("Search or enter spk://")); searchEdit->setPlaceholderText(tr("Search or enter spk://"));
ly_titlebar->addWidget(title); ly_titlebar->addWidget(title);
ly_titlebar->addWidget(backButtom); ly_titlebar->addWidget(backButtom);
ly_titlebar->addStretch(2.5);
// 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(searchEdit);
ly_titlebar->addWidget(downloadButton); ly_titlebar->addWidget(downloadButton);
ly_titlebar->addStretch(1); ly_titlebar->addStretch(RightSearchSpace);
ui->titlebar->setCustomWidget(w_titlebar); ui->titlebar->setCustomWidget(w_titlebar);
//侧边栏按钮 // 侧边栏按钮
int i = 0; int i = 0;
while (i < ui->buttonGroup->buttons().size()) { while (i < ui->buttonGroup->buttons().size())
{
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}"); ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked) { connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked)
{
if (checked == true) { if (checked == true) {
searchEdit->clearEdit(); searchEdit->clearEdit();
updateUi(i); updateUi(i);
} } });
});
i++; i++;
} }
// 搜索事件 // 搜索事件
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() { connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
{
QString searchtext = searchEdit->text(); QString searchtext = searchEdit->text();
if (!searchtext.isEmpty()) { if (!searchtext.isEmpty()) {
if (searchtext.startsWith("spk://")) { if (searchtext.startsWith("spk://")) {
@@ -189,32 +207,30 @@ MainWindow::MainWindow(QWidget *parent)
switchPage(AppPageSearchlist); switchPage(AppPageSearchlist);
} }
} }
this->setFocus(); this->setFocus(); });
});
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i) { connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i)
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); });
}); connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk) { { openUrl(spk); });
openUrl(spk); connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
}); { openUrl(spk); });
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk) {
openUrl(spk);
});
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType()); emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
initDbus(); connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete searchEdit;
delete downloadlistwidget;
delete ui; delete ui;
if (downloadlistwidget)
{
downloadlistwidget->deleteLater();
}
} }
void MainWindow::initDbus() void MainWindow::initDbus()
@@ -223,25 +239,38 @@ void MainWindow::initDbus()
QDBusConnection::sessionBus().registerService("com.gitee.spark.store"); QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this); QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
connect(dbusInter,&DBusSparkStoreService::sigOpenUrl,this,&MainWindow::onGetUrl); connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
} }
void MainWindow::onGetUrl(const QString &url) void MainWindow::onGetUrl(const QString &url)
{ {
if(url.left(6)=="spk://") if (url.trimmed().startsWith("spk://"))
{ {
openUrl(QUrl(url)); openUrl(QUrl(url));
} }
activateWindow(); activateWindow();
} }
void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
{
Q_UNUSED(pid)
if (arguments.size() > 1)
{
onGetUrl(arguments.value(1));
}
}
void MainWindow::openUrl(QUrl url) void MainWindow::openUrl(QUrl url)
{ {
if (url.toString().startsWith("spk://")) { if (url.toString().startsWith("spk://"))
ui->appintopage->openUrl(QUrl(url.toString().replace("+","%2B"))); {
ui->appintopage->openUrl(QUrl(url.toString().replace("+", "%2B")));
switchPage(AppPageAppdetail); switchPage(AppPageAppdetail);
} else { }
QDesktopServices::openUrl(QUrl(url.toString().replace("+","%2B"))); else
{
QDesktopServices::openUrl(QUrl(url.toString().replace("+", "%2B")));
} }
} }
@@ -252,50 +281,77 @@ void MainWindow::initConfig()
dir.mkpath("/tmp/spark-store"); dir.mkpath("/tmp/spark-store");
} }
void MainWindow::switchPage(int now) //临时方案,回家后修改 void MainWindow::switchPage(int now) // 临时方案,回家后修改
{ {
qDebug() << pageHistory.count(); qDebug() << pageHistory.count();
if (pageHistory.count() >= 1) { if (pageHistory.count() >= 1)
{
backButtom->show(); backButtom->show();
} else { }
else
{
backButtom->hide(); backButtom->hide();
} }
ui->stackedWidget->setCurrentIndex(now); ui->stackedWidget->setCurrentIndex(now);
ui->stackedWidget->currentWidget()->setFocus();
pageHistory << now; pageHistory << now;
} }
//刷新界面 // 刷新界面
void MainWindow::updateUi(int now) void MainWindow::updateUi(int now)
{ {
pageHistory.clear(); pageHistory.clear();
QStringList itemlist; QStringList itemlist;
itemlist << "" itemlist << ""
<< "network" << "network"
<< "chat" << "chat"
<< "music" << "music"
<< "video" << "video"
<< "image_graphics" << "image_graphics"
<< "games" << "games"
<< "office" << "office"
<< "reading" << "reading"
<< "development" << "development"
<< "tools" << "tools"
<< "themes" << "themes"
<< "others"; << "others";
ui->applistpage->getAppList(itemlist[now]); ui->applistpage->getAppList(itemlist[now]);
qDebug() << itemlist[now]; qDebug() << itemlist[now];
switchPage(AppPageApplist); switchPage(AppPageApplist);
} }
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);
QtConcurrent::run([=]{ if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool())
{
qDebug() << "UOS Developer Mode has not been enabled!";
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"
<< "功能禁用提示"
);
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(); });
} }
}
} }

View File

@@ -39,20 +39,20 @@ private:
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:
QList<int> pageHistory;
Ui::MainWindow *ui;
DownloadListWidget *downloadlistwidget;
ProgressButton *downloadButton;
QPushButton *backButtom;
DSearchEdit *searchEdit;
}; };
#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

@@ -1,20 +1,19 @@
#include "appintopage.h" #include "appintopage.h"
#include "ui_appintopage.h" #include "ui_appintopage.h"
AppIntoPage::AppIntoPage(QWidget *parent) : AppIntoPage::AppIntoPage(QWidget *parent) : QWidget(parent),
QWidget(parent), ui(new Ui::AppIntoPage)
ui(new Ui::AppIntoPage)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->listWidget->setViewMode(QListView::IconMode); ui->listWidget->setViewMode(QListView::IconMode);
ui->listWidget->setMovement(QListView::Static); ui->listWidget->setMovement(QListView::Static);
ui->listWidget->setMaximumHeight(200); ui->listWidget->setMaximumHeight(200);
ui->listWidget->setFlow(QListView::TopToBottom); ui->listWidget->setFlow(QListView::TopToBottom);
api1=new SparkAPI(this); api1 = new SparkAPI(this);
connect(api1,&SparkAPI::finishedRAW,[=](QString download_times){ connect(api1, &SparkAPI::finishedRAW, [=](QString download_times)
{
download_times.remove(QRegExp("\\n")); download_times.remove(QRegExp("\\n"));
ui->download_times->setText(download_times); ui->download_times->setText(download_times);
qDebug()<<"Download Times:"+download_times; qDebug()<<"Download Times:"+download_times; });
});
clear(); clear();
} }
@@ -33,40 +32,39 @@ 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++)
{ {
QListWidgetItem *item = ui->listWidget->takeItem(0); QListWidgetItem *item = ui->listWidget->takeItem(0);
QWidget *card = ui->listWidget->itemWidget(item); QWidget *card = ui->listWidget->itemWidget(item);
delete card; delete card;
card = NULL; card = NULL;
delete item; delete item;
item = NULL; item = NULL;
} }
ui->listWidget->clear(); ui->listWidget->clear();
} }
void AppIntoPage::setDownloadWidget(DownloadListWidget *w) void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
{ {
dw=w; dw = w;
connect(w, &DownloadListWidget::downloadFinished, [=]() { connect(w, &DownloadListWidget::downloadFinished, [=]()
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString()); { isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); });
});
} }
void AppIntoPage::openUrl(QUrl url) void AppIntoPage::openUrl(QUrl url)
{ {
spk=url; spk = url;
SparkAPI *api=new SparkAPI(this); SparkAPI *api = new SparkAPI(this);
clear(); clear();
connect(api,&SparkAPI::finishedObject,[=](QJsonObject appinfo){ connect(api, &SparkAPI::finishedObject, [=](QJsonObject appinfo)
{
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");
@@ -90,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);
@@ -188,36 +202,42 @@ void AppIntoPage::openUrl(QUrl url)
} }
this->sltAppinfoTags(&taglist); this->sltAppinfoTags(&taglist);
disconnect(api,&SparkAPI::finished,nullptr,nullptr); disconnect(api,&SparkAPI::finished,nullptr,nullptr);
api->deleteLater(); api->deleteLater(); });
});
api->getAppInfo(url); api->getAppInfo(url);
api1->getAppDownloadTimes(url); api1->getAppDownloadTimes(url);
} }
void AppIntoPage::isDownloading(QUrl url) void AppIntoPage::isDownloading(QUrl url)
{ {
if (dw->getUrlList().lastIndexOf(url) == -1) { if (dw->getUrlList().lastIndexOf(url) == -1)
{
ui->downloadButton->setEnabled(true); ui->downloadButton->setEnabled(true);
return; return;
} else { }
else
{
ui->downloadButton->setEnabled(false); ui->downloadButton->setEnabled(false);
} }
ui->pushButton_3->hide(); ui->pushButton_3->hide();
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 2) { if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 2)
{
ui->downloadButton->setEnabled(true); ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Download")); ui->downloadButton->setText(tr("Download"));
} }
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 1) { if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 1)
{
ui->downloadButton->setEnabled(true); ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Install")); ui->downloadButton->setText(tr("Install"));
} }
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->isInstall) { if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->isInstall)
{
ui->downloadButton->setEnabled(false); ui->downloadButton->setEnabled(false);
ui->downloadButton->setText(tr("Installing")); ui->downloadButton->setText(tr("Installing"));
return; return;
} }
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 3) { if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 3)
{
ui->downloadButton->setEnabled(true); ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Reinstall")); ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->show(); ui->downloadButton->show();
@@ -227,37 +247,37 @@ void AppIntoPage::isDownloading(QUrl url)
void AppIntoPage::sltAppinfoTags(QStringList *tagList) void AppIntoPage::sltAppinfoTags(QStringList *tagList)
{ {
foreach(const QString &tag, *tagList) foreach (const QString &tag, *tagList)
{ {
if(tag=="community") if (tag == "community")
{ {
ui->tag_community->show(); ui->tag_community->show();
} }
else if(tag=="ubuntu") else if (tag == "ubuntu")
{ {
ui->tag_ubuntu->show(); ui->tag_ubuntu->show();
} }
else if(tag=="deepin") else if (tag == "deepin")
{ {
ui->tag_deepin->show(); ui->tag_deepin->show();
} }
else if(tag=="uos") else if (tag == "uos")
{ {
ui->tag_uos->show(); ui->tag_uos->show();
} }
else if(tag=="dtk5") else if (tag == "dtk5")
{ {
ui->tag_dtk5->show(); ui->tag_dtk5->show();
} }
else if(tag=="dwine2") else if (tag == "dwine2")
{ {
ui->tag_dwine2->show(); ui->tag_dwine2->show();
} }
else if(tag=="dwine5") else if (tag == "dwine5")
{ {
ui->tag_dwine5->show(); ui->tag_dwine5->show();
} }
else if(tag=="a2d") else if (tag == "a2d")
{ {
ui->tag_a2d->show(); ui->tag_a2d->show();
} }
@@ -265,9 +285,10 @@ void AppIntoPage::sltAppinfoTags(QStringList *tagList)
} }
void AppIntoPage::setTheme(bool dark) 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);
@@ -281,7 +302,8 @@ void AppIntoPage::setTheme(bool dark)
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);}"; 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}";
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);
@@ -293,7 +315,6 @@ void AppIntoPage::setTheme(bool dark)
ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg")); ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg"));
ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg")); ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg"));
ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg")); ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg"));
} }
} }
AppIntoPage::~AppIntoPage() AppIntoPage::~AppIntoPage()
@@ -303,80 +324,79 @@ AppIntoPage::~AppIntoPage()
void AppIntoPage::on_downloadButton_clicked() void AppIntoPage::on_downloadButton_clicked()
{ {
if(ui->downloadButton->text() == tr("Install")) if (ui->downloadButton->text() == tr("Install"))
{ {
dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())]->install(0); dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())]->install(0);
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString()); isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,[=](){ QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, [=]()
{
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString()); isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr); disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr); });
});
return; return;
} }
emit clickedDownloadBtn(); emit clickedDownloadBtn();
dw->addItem(info["Name"].toString(),info["Filename"].toString(),info["Pkgname"].toString(),iconpixmap,SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString()); dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
if(ui->downloadButton->text() == tr("Reinstall")) if (ui->downloadButton->text() == tr("Reinstall"))
{ {
dw->getDIList()[dw->allDownload - 1]->reinstall = true; dw->getDIList()[dw->allDownload - 1]->reinstall = true;
} }
ui->downloadButton->setEnabled(false); ui->downloadButton->setEnabled(false);
QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,[=](){ QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, [=]()
{
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString()); isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr); disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr); });
}); isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
} }
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()
{ {
qDebug() << "Share" << spk; qDebug() << "Share" << spk;
Utils::sendNotification("spark-store",tr("Spark Store"),tr("The URL has been copied to the clipboard")); Utils::sendNotification("spark-store", tr("Spark Store"), tr("The URL has been copied to the clipboard"));
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(spk.toString()); clipboard->setText(spk.toString());
} }
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
{
qDebug() << "反馈器不存在,跳转页面"; qDebug() << "反馈器不存在,跳转页面";
openUrl(feedbackSpk); openUrl(feedbackSpk);
} }
} }

View File

@@ -1,68 +1,79 @@
#include "applistpage.h" #include "applistpage.h"
#include "ui_applistpage.h" #include "ui_applistpage.h"
AppListPage::AppListPage(QWidget *parent) : AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
QWidget(parent), ui(new Ui::AppListPage)
ui(new Ui::AppListPage)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->webEngineView->page()->setBackgroundColor(Qt::transparent); ui->webEngineView->page()->setBackgroundColor(Qt::transparent);
} }
void AppListPage::setTheme(bool dark) void AppListPage::setTheme(bool dark)
{ {
isDark=dark; isDark = dark;
if(dark) if (dark)
{ {
this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}"); this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}");
}else { }
//亮色模式 else
{
// 亮色模式
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}"); this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
} }
if(isSearch) if (isSearch)
{ {
getSearchList(nowType); getSearchList(nowType);
}else{ }
else
{
getAppList(nowType); getAppList(nowType);
} }
} }
void AppListPage::getAppList(QString type) void AppListPage::getAppList(QString type)
{ {
isSearch=false; isSearch = false;
nowType=type; nowType = type;
SparkAPI *api=new SparkAPI(this); SparkAPI *api = new SparkAPI(this);
QString url; QString url;
QString theme; QString theme;
if(isDark) if (isDark)
{ {
theme="theme=dark"; theme = "theme=dark";
}else{
theme="theme=light";
} }
if(type=="") else
{ {
url=api->getServerUrl()+"store/#/flamescion/?"+theme; theme = "theme=light";
}else{ }
url=api->getServerUrl()+"store/#/flamescion/applist?type="+type+"&"+theme; if (type == "")
{
url = api->getServerUrl() + "store/#/flamescion/?" + theme;
}
else
{
url = api->getServerUrl() + "store/#/flamescion/applist?type=" + type + "&" + theme;
} }
ui->webEngineView->setUrl(url); ui->webEngineView->setUrl(url);
delete api;
} }
void AppListPage::getSearchList(QString keyword) void AppListPage::getSearchList(QString keyword)
{ {
isSearch=true; isSearch = true;
nowType=keyword; nowType = keyword;
SparkAPI *api=new SparkAPI(this); SparkAPI *api = new SparkAPI(this);
QString url; QString url;
QString theme; QString theme;
if(isDark) if (isDark)
{ {
theme="theme=dark"; theme = "theme=dark";
}else{
theme="theme=light";
} }
url=api->getServerUrl()+"store/#/flamescion/search?keywords="+keyword+"&"+theme; else
{
theme = "theme=light";
}
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + keyword + "&" + theme;
ui->webEngineView->setUrl(url); ui->webEngineView->setUrl(url);
delete api;
} }
AppListPage::~AppListPage() AppListPage::~AppListPage()
@@ -72,15 +83,14 @@ AppListPage::~AppListPage()
void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1) void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
{ {
if(arg1.path().right(8) == "app.json") if (arg1.path().right(8) == "app.json")
{ {
QString url = arg1.toString(); QString url = arg1.toString();
url = url.mid(url.indexOf("/store/")); url = url.mid(url.indexOf("/store/"));
url = "spk:/"+url; url = "spk:/" + url;
url = url.mid(0,url.indexOf("/app.json")); url = url.mid(0, url.indexOf("/app.json"));
qDebug() << "程序跳转链接地址:" << url; qDebug() << "程序跳转链接地址:" << url;
ui->webEngineView->back(); ui->webEngineView->back();
emit clicked(url); emit clicked(url);
} }
} }

View File

@@ -1,22 +1,37 @@
#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), SettingsPage::SettingsPage(QWidget *parent)
ui(new Ui::SettingsPage) : QWidget(parent)
, ui(new Ui::SettingsPage)
{ {
ui->setupUi(this); ui->setupUi(this);
configCanSave = false; configCanSave = false;
initConfig(); initConfig();
} }
void SettingsPage::setTheme(bool dark) void SettingsPage::setTheme(bool dark)
{ {
if(dark) if (dark)
{ {
this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}"); this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}");
}else { }
//亮色模式 else
{
// 亮色模式
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}"); this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
} }
} }
@@ -24,38 +39,44 @@ 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)) // 校验配置文件有效性
QString lineData = textStream.readLine();//读取文件的第一行 {
return;
}
textStream.seek(0); // 回到开头
QString lineData = textStream.readLine(); // 读取文件的第一行
ui->comboBox_server->addItem(lineData); ui->comboBox_server->addItem(lineData);
while(!lineData.isNull()) while (!lineData.isNull())
{ {
lineData = textStream.readLine(); lineData = textStream.readLine();
ui->comboBox_server->addItem(lineData); ui->comboBox_server->addItem(lineData);
} }
for(int i = 0; i < ui->comboBox_server->count(); i++) for (int i = 0; i < ui->comboBox_server->count(); i++)
{ {
if(ui->comboBox_server->itemText(i) == "开发者模式 Dev only") if (ui->comboBox_server->itemText(i) == "开发者模式 Dev only")
{ {
ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1); ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1);
} }
if(ui->comboBox_server->itemText(i) == "镜像源 Download only") if (ui->comboBox_server->itemText(i) == "镜像源 Download only")
{ {
for(int j = i; j < ui->comboBox_server->count(); j++) for (int j = i; j < ui->comboBox_server->count(); j++)
{ {
ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(j, 0), QVariant(0), Qt::UserRole - 1); ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(j, 0), QVariant(0), Qt::UserRole - 1);
} }
@@ -70,14 +91,14 @@ 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; //  防止触发保存配置信号
} }
SettingsPage::~SettingsPage() SettingsPage::~SettingsPage()
@@ -88,32 +109,42 @@ SettingsPage::~SettingsPage()
void SettingsPage::on_pushButton_updateServer_clicked() 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); });
});
} }
void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1) 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();
} }
} }
@@ -124,7 +155,7 @@ void SettingsPage::setIsDownload(bool isdownload)
void SettingsPage::updateUI() void SettingsPage::updateUI()
{ {
if(isdownload) if (isdownload)
{ {
ui->pushButton_clear->setEnabled(false); ui->pushButton_clear->setEnabled(false);
} }
@@ -135,15 +166,15 @@ void SettingsPage::updateUI()
// 显示缓存占用空间 // 显示缓存占用空间
quint64 tmp_size = dirFileSize(QString::fromUtf8(TMP_PATH)); quint64 tmp_size = dirFileSize(QString::fromUtf8(TMP_PATH));
QString tmp_size_str; QString tmp_size_str;
if(tmp_size < 1024) if (tmp_size < 1024)
{ {
tmp_size_str = QString::number(tmp_size) + "B"; tmp_size_str = QString::number(tmp_size) + "B";
} }
else if(tmp_size < (1024 * 1024)) else if (tmp_size < (1024 * 1024))
{ {
tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / 1024))) + "KB"; tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / 1024))) + "KB";
} }
else if(tmp_size<(1024*1024*1024)) else if (tmp_size < (1024 * 1024 * 1024))
{ {
tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024)))) + "MB"; tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024)))) + "MB";
} }
@@ -160,13 +191,13 @@ quint64 SettingsPage::dirFileSize(const QString &path)
QDir dir(path); QDir dir(path);
quint64 size = 0; quint64 size = 0;
// dir.entryInfoList(QDir::Files); // 返回文件信息 // dir.entryInfoList(QDir::Files); // 返回文件信息
foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files)) foreach (QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
{ {
// 计算文件大小 // 计算文件大小
size += quint64(fileInfo.size()); size += quint64(fileInfo.size());
} }
// dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot); // 返回所有子目录,并进行过滤 // dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot); // 返回所有子目录,并进行过滤
foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
{ {
// 若存在子目录,则递归调用 dirFileSize() 函数 // 若存在子目录,则递归调用 dirFileSize() 函数
size += dirFileSize(path + QDir::separator() + subDir); size += dirFileSize(path + QDir::separator() + subDir);
@@ -177,7 +208,7 @@ quint64 SettingsPage::dirFileSize(const QString &path)
void SettingsPage::on_pushButton_updateApt_clicked() void SettingsPage::on_pushButton_updateApt_clicked()
{ {
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
ui->pushButton_updateApt->setEnabled(false); ui->pushButton_updateApt->setEnabled(false);
ui->label_aptserver->setText(tr("Updating, please wait...")); ui->label_aptserver->setText(tr("Updating, please wait..."));
@@ -185,17 +216,16 @@ void SettingsPage::on_pushButton_updateApt_clicked()
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()
{ {
QtConcurrent::run([=]() QtConcurrent::run([=]()
{ {
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++)
@@ -204,23 +234,21 @@ void SettingsPage::on_pushButton_clear_clicked()
} }
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Temporary cache was cleaned")); Utils::sendNotification("spark-store",tr("Spark Store"),tr("Temporary cache was cleaned"));
ui->pushButton_clear->setEnabled(true); ui->pushButton_clear->setEnabled(true);
updateUI(); updateUI(); });
});
} }
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;
QDir cacheDir(cacheLocation);
cacheDir.removeRecursively(); 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,22 +1,19 @@
#include "httprequest.h" #include "httprequest.h"
HttpRequest::HttpRequest() HttpRequest::HttpRequest()
{ {
} }
void HttpRequest::getRequest(QNetworkRequest request) void HttpRequest::getRequest(QNetworkRequest request)
{ {
QNetworkAccessManager *naManager=new QNetworkAccessManager(this); QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
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'");
request.setRawHeader("Content-Type", "application/json"); request.setRawHeader("Content-Type", "application/json");
naManager->get(request); naManager->get(request);
QObject::connect(naManager,&QNetworkAccessManager::finished,this,&HttpRequest::readdata_slot); QObject::connect(naManager, &QNetworkAccessManager::finished, this, &HttpRequest::readdata_slot);
} }
void HttpRequest::readdata_slot(QNetworkReply *reply) void HttpRequest::readdata_slot(QNetworkReply *reply)
{ {
@@ -24,19 +21,19 @@ void HttpRequest::readdata_slot(QNetworkReply *reply)
} }
QString HttpRequest::postRequest(QString url, QString jsondata) QString HttpRequest::postRequest(QString url, QString jsondata)
{ {
QByteArray array= jsondata.toLatin1(); QByteArray array = jsondata.toLatin1();
QNetworkRequest request; QNetworkRequest request;
QNetworkAccessManager *naManager=new QNetworkAccessManager(this); QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
QUrl strUrl = url.replace("+","%2B"); QUrl strUrl = url.replace("+", "%2B");
request.setUrl(strUrl); request.setUrl(strUrl);
request.setRawHeader("Content-Type", "charset='utf-8'"); request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json"); request.setRawHeader("Content-Type", "application/json");
QNetworkReply* reply = naManager->post(request, array); QNetworkReply *reply = naManager->post(request, array);
QEventLoop eventLoop; QEventLoop eventLoop;
connect(naManager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); connect(naManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
eventLoop.exec(); eventLoop.exec();
QTextCodec* codec = QTextCodec::codecForName("utf8"); QTextCodec *codec = QTextCodec::codecForName("utf8");
QString strReply = codec->toUnicode(reply->readAll()); QString strReply = codec->toUnicode(reply->readAll());
reply->deleteLater(); reply->deleteLater();
return strReply; return strReply;

View File

@@ -2,18 +2,17 @@
Utils::Utils() Utils::Utils()
{ {
} }
//这个函数是chatGPT写的 // Author: chatGPT
void Utils::sendNotification(QString icon,QString title,QString body) void Utils::sendNotification(QString icon, QString title, QString body)
{ {
QDBusInterface iface("org.freedesktop.Notifications", QDBusInterface iface("org.freedesktop.Notifications",
"/org/freedesktop/Notifications", "/org/freedesktop/Notifications",
"org.freedesktop.Notifications"); "org.freedesktop.Notifications");
QVariantList args; QVariantList args;
args << QCoreApplication::applicationName() // the name of the application args << QCoreApplication::applicationName() // the name of the application
<< (uint)0 // replaces the previous notification with the same ID << (uint)0 // replaces the previous notification with the same ID
<< icon // the application icon of the notification << icon // the application icon of the notification
<< title // the title of the notification << title // the title of the notification

View File

@@ -2,43 +2,45 @@
WidgetAnimation::WidgetAnimation() WidgetAnimation::WidgetAnimation()
{ {
} }
void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange) void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
{ {
int nX = pWidget->x(); int nX = pWidget->x();
int nY = pWidget->y(); int nY = pWidget->y();
QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget,"geometry"); QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget, "geometry");
pAnimation->setEasingCurve(QEasingCurve::InOutSine); pAnimation->setEasingCurve(QEasingCurve::InOutSine);
pAnimation->setDuration(400); pAnimation->setDuration(400);
pAnimation->setStartValue(QRect(QPoint(nX,nY),pWidget->size())); pAnimation->setStartValue(QRect(QPoint(nX, nY), pWidget->size()));
int nShakeCount = 8; int nShakeCount = 8;
double nStep = 1.0/nShakeCount; double nStep = 1.0 / nShakeCount;
for(int i = 1; i < nShakeCount; i++){ for (int i = 1; i < nShakeCount; i++)
nRange = i&1 ? -nRange : nRange; {
pAnimation->setKeyValueAt(nStep*i,QRect(QPoint(nX + nRange,nY),pWidget->size())); nRange = i & 1 ? -nRange : nRange;
pAnimation->setKeyValueAt(nStep * i, QRect(QPoint(nX + nRange, nY), pWidget->size()));
} }
pAnimation->setEndValue(QRect(QPoint(nX,nY),pWidget->size())); pAnimation->setEndValue(QRect(QPoint(nX, nY), pWidget->size()));
pAnimation->start(QAbstractAnimation::DeleteWhenStopped); pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
} }
QPropertyAnimation* WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear) QPropertyAnimation *WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
{ {
QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget); QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget);
//设置动画效果 // 设置动画效果
animation->setEasingCurve(QEasingCurve::Linear); animation->setEasingCurve(QEasingCurve::Linear);
//设置动画时间(单位:毫秒) // 设置动画时间(单位:毫秒)
animation->setDuration(500); animation->setDuration(500);
// 设置动画步长值,以及在该位置时显示的透明度 // 设置动画步长值,以及在该位置时显示的透明度
if(isAppear) if (isAppear)
{ {
animation->setKeyValueAt(0, 0); animation->setKeyValueAt(0, 0);
// m_animation->setKeyValueAt(0.5, 0); // m_animation->setKeyValueAt(0.5, 0);
animation->setKeyValueAt(1, 1); animation->setKeyValueAt(1, 1);
}else{ }
else
{
animation->setKeyValueAt(0, 1); animation->setKeyValueAt(0, 1);
animation->setKeyValueAt(1, 0); animation->setKeyValueAt(1, 0);
} }
@@ -46,7 +48,7 @@ QPropertyAnimation* WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool
} }
void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear) void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
{ {
// 开始动画 // 开始动画
createWidgetOpacity(pWidget, isAppear)->start(); createWidgetOpacity(pWidget, isAppear)->start();
} }

View File

@@ -1,18 +1,29 @@
#include "basewidgetopacity.h" #include "basewidgetopacity.h"
#include <QCloseEvent> #include <QCloseEvent>
#include <QSettings>
#include <QStandardPaths>
#include <QPropertyAnimation> #include <QPropertyAnimation>
BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent) BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
{ {
// WidgetAnimation::widgetOpacity(this,true); // WidgetAnimation::widgetOpacity(this,true);
} }
/// @brief 窗口关闭事件 /// @brief 窗口关闭事件
/// @param event /// @param event
void BaseWidgetOpacity::closeEvent(QCloseEvent *event) void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
{ {
if (!closeWindowAnimation) { // 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)
{
closeWindowAnimation = true; closeWindowAnimation = true;
QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity"); QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
@@ -21,18 +32,20 @@ void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
animation->setStartValue(1.0); animation->setStartValue(1.0);
animation->setEndValue(0.0); animation->setEndValue(0.0);
QObject::connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value){ QObject::connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value)
this->update(); {
// setWindowTitle(QString("ヾ(⌒∇⌒*)See You♪ - %1%").arg(int(value.toFloat() * 100))); this->update();
}); // setWindowTitle(QString("ヾ(⌒∇⌒*)See You♪ - %1%").arg(int(value.toFloat() * 100)));
});
QObject::connect(animation, &QPropertyAnimation::finished, this, [=](){ QObject::connect(animation, &QPropertyAnimation::finished, this, [=]()
this->close(); { this->close(); });
});
animation->start(); animation->start();
event->ignore(); event->ignore();
} else { }
else
{
event->accept(); event->accept();
} }
} }

View File

@@ -3,11 +3,10 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QtConcurrent> #include <QtConcurrent>
big_image::big_image(DBlurEffectWidget *parent) : big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
DBlurEffectWidget(parent), m_image(new QLabel)
m_image(new QLabel)
{ {
// setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); // 设置图片对话框总在最前 // setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); // 设置图片对话框总在最前
setWindowModality(Qt::ApplicationModal); // 以上无效不如直接使用 模态化对话框 setWindowModality(Qt::ApplicationModal); // 以上无效不如直接使用 模态化对话框
setRadius(0); setRadius(0);
setMaskAlpha(60); setMaskAlpha(60);

View File

@@ -6,13 +6,12 @@
bool DownloadItem::isInstall = false; bool DownloadItem::isInstall = false;
DownloadItem::DownloadItem(QWidget *parent) : DownloadItem::DownloadItem(QWidget *parent) : QWidget(parent),
QWidget(parent), reinstall(false),
reinstall(false), close(false),
close(false), ui(new Ui::DownloadItem),
ui(new Ui::DownloadItem), output_w(new DDialog),
output_w(new DDialog), textbrowser(new QTextBrowser)
textbrowser(new QTextBrowser)
{ {
ui->setupUi(this); ui->setupUi(this);
@@ -23,6 +22,9 @@ DownloadItem::DownloadItem(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()
@@ -34,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 + ")");
if(ui->label_2->text().left(4) == "100%") ui->label_2->setToolTip(QString::number(double(value) / 100) + "% (" + speed + ")");
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."));
} }
} }
@@ -49,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()
@@ -58,7 +63,7 @@ QString DownloadItem::getName()
void DownloadItem::readyInstall() void DownloadItem::readyInstall()
{ {
if(!close) if (!close)
{ {
ui->progressBar->hide(); ui->progressBar->hide();
ui->pushButton_install->setEnabled(true); ui->pushButton_install->setEnabled(true);
@@ -90,16 +95,17 @@ void DownloadItem::setSpeed(QString s)
void DownloadItem::install(int t) void DownloadItem::install(int t)
{ {
if(!isInstall) if (!isInstall)
{ {
isInstall = true; isInstall = true;
ui->pushButton_install->hide(); ui->pushButton_install->hide();
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([=]()
{ {
QProcess installer; QProcess installer;
switch(t) switch(t)
{ {
@@ -120,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:")
{ {
@@ -133,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();
} }
@@ -151,23 +158,24 @@ 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();
} }
ui->widget_spinner->hide(); ui->widget_spinner->hide();
DownloadItem::isInstall = false; DownloadItem::isInstall = false;
emit finished(); emit finished(); });
});
// emit finished(); // emit finished();
qDebug()<<ui->label_filename->text().toUtf8(); qDebug() << ui->label_filename->text().toUtf8();
} }
} }
@@ -179,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

@@ -8,15 +8,15 @@
ProgressButton::ProgressButton(QWidget *parent) ProgressButton::ProgressButton(QWidget *parent)
: QWidget{parent} : QWidget{parent}
{ {
//this->setWindowFlags(Qt::FramelessWindowHint); // this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground, true); this->setAttribute(Qt::WA_TranslucentBackground, true);
setMinimumWidth(36); setMinimumWidth(36);
setMinimumHeight(36); setMinimumHeight(36);
svgPath=""; svgPath = "";
backColor=Qt::transparent; backColor = Qt::transparent;
setMouseTracking(true); setMouseTracking(true);
connect(this,&ProgressButton::startProcessing,this,&ProgressButton::operationProcessing,Qt::QueuedConnection); connect(this, &ProgressButton::startProcessing, this, &ProgressButton::operationProcessing, Qt::QueuedConnection);
} }
ProgressButton::~ProgressButton() ProgressButton::~ProgressButton()
@@ -26,63 +26,63 @@ ProgressButton::~ProgressButton()
void ProgressButton::paintEvent(QPaintEvent *event) void ProgressButton::paintEvent(QPaintEvent *event)
{ {
QPainter painter(this); QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true); painter.setRenderHint(QPainter::Antialiasing, true);
auto rect = event->rect(); auto rect = event->rect();
if(buttonState == state::normal || buttonState == state::hover) if (buttonState == state::normal || buttonState == state::hover)
{ {
auto radiu = (rect.height() - 6) / 2; auto radiu = (rect.height() - 6) / 2;
painter.translate(rect.center()); painter.translate(rect.center());
painter.setPen(Qt::transparent); painter.setPen(Qt::transparent);
painter.setBrush(QColor(buttonState == state::normal ? color : color.darker())); painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
//painter.drawEllipse(QPoint(0,0),radiu,radiu); // painter.drawEllipse(QPoint(0,0),radiu,radiu);
//radiu -= 3; // radiu -= 3;
painter.setBrush(backColor); painter.setBrush(backColor);
painter.drawEllipse(QPoint(0,0),radiu,radiu); painter.drawEllipse(QPoint(0, 0), radiu, radiu);
QSvgRenderer m_svgRender; QSvgRenderer m_svgRender;
m_svgRender.load(svgPath); m_svgRender.load(svgPath);
m_svgRender.render(&painter ,QRectF(-radiu / 2,-radiu / 2,radiu,radiu)); m_svgRender.render(&painter, QRectF(-radiu / 2, -radiu / 2, radiu, radiu));
} }
else if(buttonState == state::openProgress) else if (buttonState == state::openProgress)
{ {
painter.translate(rect.center()); painter.translate(rect.center());
auto radiu = (rect.height() - 6) / 2 -3; auto radiu = (rect.height() - 6) / 2 - 3;
painter.setBrush(backColor); painter.setBrush(backColor);
painter.setPen(QPen(backColor,3)); painter.setPen(QPen(backColor, 3));
painter.drawEllipse(QPoint(0,0),radiu,radiu); painter.drawEllipse(QPoint(0, 0), radiu, radiu);
painter.setPen(QPen(backColor,3)); painter.setPen(QPen(backColor, 3));
QSvgRenderer m_svgRender; QSvgRenderer m_svgRender;
m_svgRender.load(svgPath); m_svgRender.load(svgPath);
m_svgRender.render(&painter ,QRectF(-radiu / 2,-radiu / 2,radiu,radiu)); m_svgRender.render(&painter, QRectF(-radiu / 2, -radiu / 2, radiu, radiu));
QRect rect = QRect(-radiu, -radiu, QRect rect = QRect(-radiu, -radiu,
radiu*2, radiu*2); radiu * 2, radiu * 2);
painter.setPen(QPen(color.darker(100),3)); painter.setPen(QPen(color.darker(100), 3));
auto angle = progress * 360 / 100; auto angle = progress * 360 / 100;
painter.drawArc(rect.adjusted(-3,-3,3,3),90 * 16,-static_cast<int>(angle * 16)); painter.drawArc(rect.adjusted(-3, -3, 3, 3), 90 * 16, -static_cast<int>(angle * 16));
} }
else if(buttonState == state::closeProgress) else if (buttonState == state::closeProgress)
{ {
auto radiu = (rect.height() - 6) / 2; auto radiu = (rect.height() - 6) / 2;
painter.translate(rect.center()); painter.translate(rect.center());
painter.setPen(Qt::transparent); painter.setPen(Qt::transparent);
painter.setBrush(QColor(0, 0, 0, 63)); painter.setBrush(QColor(0, 0, 0, 63));
painter.drawEllipse(QPoint(0,0),radiu,radiu); painter.drawEllipse(QPoint(0, 0), radiu, radiu);
radiu -= 3; radiu -= 3;
painter.setBrush(backColor); painter.setBrush(backColor);
painter.drawEllipse(QPoint(0,0),radiu,radiu); painter.drawEllipse(QPoint(0, 0), radiu, radiu);
painter.setPen(QPen(color,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.drawLine(QPoint(-radiu / 3,0), painter.drawLine(QPoint(-radiu / 3, 0),
QPoint(-radiu / 5,radiu / 3)); QPoint(-radiu / 5, radiu / 3));
painter.drawLine(QPoint(-radiu / 5,radiu / 3), painter.drawLine(QPoint(-radiu / 5, radiu / 3),
QPoint(radiu / 4,-radiu / 4)); QPoint(radiu / 4, -radiu / 4));
} }
} }
@@ -90,12 +90,12 @@ void ProgressButton::setProgress(int progress)
{ {
buttonState = state::openProgress; buttonState = state::openProgress;
ProgressButton::progress = progress; ProgressButton::progress = progress;
if(progress == 0) if (progress == 0)
{ {
buttonState = state::normal; buttonState = state::normal;
update(); update();
} }
if(progress == 100) if (progress == 100)
{ {
buttonState = state::closeProgress; buttonState = state::closeProgress;
update(); update();
@@ -127,7 +127,7 @@ void ProgressButton::setColor(QColor color)
void ProgressButton::leaveEvent(QEvent *event) void ProgressButton::leaveEvent(QEvent *event)
{ {
if(buttonState == state::hover) if (buttonState == state::hover)
{ {
buttonState = state::normal; buttonState = state::normal;
update(); update();
@@ -137,12 +137,12 @@ void ProgressButton::leaveEvent(QEvent *event)
void ProgressButton::mousePressEvent(QMouseEvent *event) void ProgressButton::mousePressEvent(QMouseEvent *event)
{ {
if(buttonState == state::hover || buttonState == state::normal) if (buttonState == state::hover || buttonState == state::normal)
{ {
widthChangeValue = (this->width() - 6) / 2; widthChangeValue = (this->width() - 6) / 2;
update(); update();
} }
else if(buttonState == state::closeProgress) else if (buttonState == state::closeProgress)
{ {
update(); update();
} }
@@ -152,24 +152,21 @@ void ProgressButton::mousePressEvent(QMouseEvent *event)
void ProgressButton::operationProcessing() void ProgressButton::operationProcessing()
{ {
} }
const int RADIUS = 60; const int RADIUS = 60;
WaterDrop::WaterDrop(QWidget *parent) WaterDrop::WaterDrop(QWidget *parent)
: QWidget(parent) : QWidget(parent), m_waterDropAnimation(nullptr), m_animationRadius(0)
, m_waterDropAnimation(nullptr)
, m_animationRadius(0)
{ {
this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2)); this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
this->setAttribute(Qt::WA_TranslucentBackground); this->setAttribute(Qt::WA_TranslucentBackground);
this->setAttribute(Qt::WA_DeleteOnClose); this->setAttribute(Qt::WA_DeleteOnClose);
m_waterDropAnimation = new QVariantAnimation(this); m_waterDropAnimation = new QVariantAnimation(this);
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40)))); // m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
} }
//把鼠标点击的点转换为圆心点坐标 // 把鼠标点击的点转换为圆心点坐标
void WaterDrop::move(const QPoint &point) void WaterDrop::move(const QPoint &point)
{ {
QPoint translatePoint = point - QPoint(RADIUS, RADIUS); QPoint translatePoint = point - QPoint(RADIUS, RADIUS);
@@ -196,7 +193,7 @@ void WaterDrop::paintEvent(QPaintEvent *event)
pen.setColor(QColor(0xffffff80)); pen.setColor(QColor(0xffffff80));
pen.setWidth(5); pen.setWidth(5);
painter.setPen(pen); painter.setPen(pen);
painter.drawEllipse(event->rect().center(),m_animationRadius, m_animationRadius); painter.drawEllipse(event->rect().center(), m_animationRadius, m_animationRadius);
} }
void WaterDrop::onRaduisChanged(QVariant value) void WaterDrop::onRaduisChanged(QVariant value)

View File

@@ -5,21 +5,20 @@
#include <QDebug> #include <QDebug>
SmoothListWidget::SmoothListWidget(QWidget *parent) : QListWidget(parent) SmoothListWidget::SmoothListWidget(QWidget *parent) : QListWidget(parent)
{ {
vScrollBar->setOrientation(Qt::Orientation::Vertical); //将滚动条设置为纵向 vScrollBar->setOrientation(Qt::Orientation::Vertical); // 将滚动条设置为纵向
setVerticalScrollBar(vScrollBar); //设置纵向滚动条 setVerticalScrollBar(vScrollBar); // 设置纵向滚动条
connect(vScrollBar, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int))); connect(vScrollBar, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
} }
void SmoothListWidget::wheelEvent(QWheelEvent *e) void SmoothListWidget::wheelEvent(QWheelEvent *e)
{ {
//当捕获到事件后,调用相对滚动的槽函数 // 当捕获到事件后,调用相对滚动的槽函数
vScrollBar->scroll(e->angleDelta().y()); vScrollBar->scroll(e->angleDelta().y());
} }
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
} }
emit msliderChanged(p); // 2 emit msliderChanged(p); // 2
} }

View File

@@ -1,56 +1,56 @@
#include "smoothscrollbar.h" #include "smoothscrollbar.h"
#include <QWheelEvent> #include <QWheelEvent>
#include <QDebug> #include <QDebug>
SmoothScrollBar::SmoothScrollBar(QWidget* parent):QScrollBar(parent) SmoothScrollBar::SmoothScrollBar(QWidget *parent) : QScrollBar(parent)
{ {
m_scrollAni=new QPropertyAnimation(this); m_scrollAni = new QPropertyAnimation(this);
m_scrollAni->setTargetObject(this); m_scrollAni->setTargetObject(this);
m_scrollAni->setPropertyName("value"); m_scrollAni->setPropertyName("value");
m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); //设置动画曲线在Qt文档中有详细的介绍 m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); // 设置动画曲线在Qt文档中有详细的介绍
m_scrollAni->setDuration(500); //设置动画时间,数值越小播放越快 m_scrollAni->setDuration(500); // 设置动画时间,数值越小播放越快
m_targetValue_v=value(); //将m_targetValue_v初始化 m_targetValue_v = value(); // 将m_targetValue_v初始化
} }
void SmoothScrollBar::setValue(int value) void SmoothScrollBar::setValue(int value)
{ {
m_scrollAni->stop();//停止现在的动画,防止出现冲突 m_scrollAni->stop(); // 停止现在的动画,防止出现冲突
m_scrollAni->setStartValue(this->value()); //设置动画滚动的初始值为当前位置 m_scrollAni->setStartValue(this->value()); // 设置动画滚动的初始值为当前位置
m_scrollAni->setEndValue(value); //设置动画的结束位置为目标值 m_scrollAni->setEndValue(value); // 设置动画的结束位置为目标值
m_scrollAni->start(); //开始动画 m_scrollAni->start(); // 开始动画
} }
void SmoothScrollBar::scrollTop() void SmoothScrollBar::scrollTop()
{ {
setValue(-m_targetValue_v); //开始动画 setValue(-m_targetValue_v); // 开始动画
m_targetValue_v=0; m_targetValue_v = 0;
} }
void SmoothScrollBar::scroll(int value) void SmoothScrollBar::scroll(int value)
{ {
//这里推荐评论区中大佬优化的写法 // 这里推荐评论区中大佬优化的写法
if(m_targetValue_v-value>=0) if (m_targetValue_v - value >= 0)
{ {
m_targetValue_v-=value; //将目标值和相对位置进行运算 m_targetValue_v -= value; // 将目标值和相对位置进行运算
setValue(m_targetValue_v); //开始动画 setValue(m_targetValue_v); // 开始动画
} }
} }
void SmoothScrollBar::mousePressEvent(QMouseEvent *e) void SmoothScrollBar::mousePressEvent(QMouseEvent *e)
{ {
//当使用鼠标操作滚动条时不会刷新m_targetValue_v的值因而需要重写事件对其进行刷新。 // 当使用鼠标操作滚动条时不会刷新m_targetValue_v的值因而需要重写事件对其进行刷新。
m_scrollAni->stop(); m_scrollAni->stop();
QScrollBar::mousePressEvent(e); QScrollBar::mousePressEvent(e);
m_targetValue_v=value(); m_targetValue_v = value();
} }
void SmoothScrollBar::mouseReleaseEvent(QMouseEvent *e) void SmoothScrollBar::mouseReleaseEvent(QMouseEvent *e)
{ {
m_scrollAni->stop(); m_scrollAni->stop();
QScrollBar::mouseReleaseEvent(e); QScrollBar::mouseReleaseEvent(e);
m_targetValue_v=value(); m_targetValue_v = value();
} }
void SmoothScrollBar::mouseMoveEvent(QMouseEvent *e) void SmoothScrollBar::mouseMoveEvent(QMouseEvent *e)
{ {
m_scrollAni->stop(); m_scrollAni->stop();
QScrollBar::mouseMoveEvent(e); QScrollBar::mouseMoveEvent(e);
m_targetValue_v=value(); m_targetValue_v = value();
} }

View File

@@ -1,10 +1,26 @@
#include "webenginepage.h" #include "webenginepage.h"
#include <QDesktopServices> #include <QDesktopServices>
#include <QWebEngineSettings>
#include <QWebEngineProfile>
WebEnginePage::WebEnginePage(QObject *parent) WebEnginePage::WebEnginePage(QObject *parent)
: QWebEnginePage(parent) : QWebEnginePage(parent)
{ {
QLocale ql;
switch (ql.language())
{
case QLocale::Chinese:
{
// 系统语言是中文,获取网页为中文 @momen @uniartisan
QWebEngineProfile *profile = QWebEngineProfile::defaultProfile();
qDebug() << profile->httpAcceptLanguage();
profile->setHttpAcceptLanguage("zh-CN,zh;q=0.8,en;q=0.6");
}
break;
default:
break;
}
} }
WebEnginePage::~WebEnginePage() WebEnginePage::~WebEnginePage()
@@ -13,7 +29,8 @@ WebEnginePage::~WebEnginePage()
void WebEnginePage::setUrl(const QUrl &url) void WebEnginePage::setUrl(const QUrl &url)
{ {
if (m_currentUrl == url) { if (m_currentUrl == url)
{
return; return;
} }
@@ -32,7 +49,8 @@ QWebEnginePage *WebEnginePage::createWindow(QWebEnginePage::WebWindowType type)
void WebEnginePage::slotUrlChanged(const QUrl &url) void WebEnginePage::slotUrlChanged(const QUrl &url)
{ {
if (m_currentUrl == url) { if (m_currentUrl == url)
{
sender()->deleteLater(); sender()->deleteLater();
return; return;
} }

View File

@@ -3,23 +3,23 @@
#include <QGraphicsOpacityEffect> #include <QGraphicsOpacityEffect>
#include <QPropertyAnimation> #include <QPropertyAnimation>
#include <QDebug> #include <QDebug>
DownloadListWidget::DownloadListWidget(QWidget *parent) : DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent),
DBlurEffectWidget(parent), ui(new Ui::DownloadListWidget)
ui(new Ui::DownloadListWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowTitle(QObject::tr("Download list"));
installEventFilter(this); installEventFilter(this);
this->setAttribute(Qt::WA_Hover,true); this->setAttribute(Qt::WA_Hover, true);
setFocus(); setFocus();
setFixedSize(500,400); setFixedSize(500, 400);
setMaskAlpha(250); setMaskAlpha(250);
ui->listWidget->hide(); ui->listWidget->hide();
ui->widget->show(); ui->widget->show();
// 计算显示下载速度 // 计算显示下载速度
download_speed.setInterval(1000); download_speed.setInterval(1000);
download_speed.start(); download_speed.start();
connect(&download_speed,&QTimer::timeout,[=]() connect(&download_speed, &QTimer::timeout, [=]()
{ {
if(isdownload && theSpeed == "") if(isdownload && theSpeed == "")
{ {
size1 = download_size; size1 = download_size;
@@ -47,15 +47,14 @@ DownloadListWidget::DownloadListWidget(QWidget *parent) :
downloaditemlist[nowDownload - 1]->setSpeed(theSpeed); downloaditemlist[nowDownload - 1]->setSpeed(theSpeed);
}else{ }else{
emit downloadProgress(0); emit downloadProgress(0);
} } });
});
} }
DownloadListWidget::~DownloadListWidget() DownloadListWidget::~DownloadListWidget()
{ {
if (downloadController) { if (downloadController)
{
downloadController->stopDownload(); downloadController->stopDownload();
downloadController->deleteLater();
} }
delete ui; delete ui;
@@ -64,41 +63,41 @@ DownloadListWidget::~DownloadListWidget()
void DownloadListWidget::clearItem() void DownloadListWidget::clearItem()
{ {
ui->listWidget->vScrollBar->scrollTop(); ui->listWidget->vScrollBar->scrollTop();
int n=ui->listWidget->count(); int n = ui->listWidget->count();
for(int i=0;i<n;i++) for (int i = 0; i < n; i++)
{ {
QListWidgetItem *item = ui->listWidget->takeItem(0); QListWidgetItem *item = ui->listWidget->takeItem(0);
QWidget *card = ui->listWidget->itemWidget(item); QWidget *card = ui->listWidget->itemWidget(item);
delete card; delete card;
card = NULL; card = NULL;
delete item; delete item;
item = NULL; item = NULL;
} }
ui->listWidget->clear(); ui->listWidget->clear();
} }
void DownloadListWidget::addItem(QString name,QString fileName,QString pkgName,const QPixmap icon,QString downloadurl) void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
{ {
if(fileName.isEmpty()) if (fileName.isEmpty())
{ {
return; return;
} }
urList.append(downloadurl); urList.append(downloadurl);
allDownload += 1; allDownload += 1;
DownloadItem *di=new DownloadItem(this); DownloadItem *di = new DownloadItem(this);
dlist<<downloadurl; dlist << downloadurl;
downloaditemlist<<di; downloaditemlist << di;
di->setName(name); di->setName(name);
di->setFileName(fileName); di->setFileName(fileName);
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)
{ {
nowDownload += 1; nowDownload += 1;
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求 startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
} }
} }
@@ -120,10 +119,10 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
isdownload = true; isdownload = true;
downloaditemlist[allDownload - 1]->free = false; downloaditemlist[allDownload - 1]->free = false;
downloadController = new DownloadController(this); // 并发下载,在点击下载按钮的时候才会初始化 downloadController = new DownloadController(this); // 并发下载,在点击下载按钮的时候才会初始化
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress); connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished); connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
//connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);}); // connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
downloadController->setFilename(fileName); downloadController->setFilename(fileName);
downloadController->startDownload(url.toString()); downloadController->startDownload(url.toString());
} }
@@ -135,37 +134,37 @@ void DownloadListWidget::httpFinished() // 完成下载
downloaditemlist[nowDownload - 1]->readyInstall(); downloaditemlist[nowDownload - 1]->readyInstall();
downloaditemlist[nowDownload - 1]->free = true; downloaditemlist[nowDownload - 1]->free = true;
emit downloadFinished(); emit downloadFinished();
if(nowDownload < allDownload) if (nowDownload < allDownload)
{ {
// 如果有排队则下载下一个 // 如果有排队则下载下一个
qDebug() << "切换下一个下载..."; qDebug() << "切换下一个下载...";
nowDownload += 1; nowDownload += 1;
while(downloaditemlist[nowDownload - 1]->close) while (downloaditemlist[nowDownload - 1]->close)
{ {
nowDownload += 1; nowDownload += 1;
if(nowDownload >= allDownload) if (nowDownload >= allDownload)
{ {
nowDownload = allDownload; nowDownload = allDownload;
return; return;
} }
} }
QString fileName = downloaditemlist[nowDownload - 1]->getName(); QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload-1), fileName); startRequest(urList.at(nowDownload - 1), fileName);
} }
} }
void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes) void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
{ {
if(totalBytes <= 0) if (totalBytes <= 0)
{ {
return; return;
} }
theSpeed = speedInfo; theSpeed = speedInfo;
downloaditemlist[nowDownload - 1]->setMax(10000); // 最大值 downloaditemlist[nowDownload - 1]->setMax(10000); // 最大值
downloaditemlist[nowDownload - 1]->setValue(int(bytesRead * 100 / totalBytes) * 100); // 当前值 downloaditemlist[nowDownload - 1]->setValue(int(bytesRead * 100 / totalBytes) * 100); // 当前值
emit downloadProgress(int(bytesRead * 100 / totalBytes)); emit downloadProgress(int(bytesRead * 100 / totalBytes));
download_size = bytesRead; download_size = bytesRead;
if(downloaditemlist[nowDownload - 1]->close) if (downloaditemlist[nowDownload - 1]->close)
{ {
// 随时检测下载是否被取消 // 随时检测下载是否被取消
downloadController->disconnect(); downloadController->disconnect();
@@ -175,21 +174,23 @@ void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesR
} }
} }
void DownloadListWidget::m_move(int x, int y)
void DownloadListWidget::m_move(int x,int y)
{ {
m_rect.setX(x); m_rect.setX(x);
m_rect.setY(y); m_rect.setY(y);
move(x,y); move(x, y);
return; return;
} }
bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event) bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event)
{ {
if (Q_NULLPTR == watched) { if (Q_NULLPTR == watched)
{
return false; return false;
} }
if (QEvent::ActivationChange == event->type()) { if (QEvent::ActivationChange == event->type())
if(QApplication::activeWindow() != this){ {
if (QApplication::activeWindow() != this)
{
this->close(); this->close();
} }
} }

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

@@ -18,8 +18,10 @@ fi
if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ];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" echo "接收星火仓库软件信息中..."
aptss ssupdate
fi
###执行 ###执行
bwrap --dev-bind / / \ bwrap --dev-bind / / \
@@ -38,13 +40,18 @@ bwrap --dev-bind / / \
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"
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ];then
echo "接收星火仓库软件信息中..."
aptss ssupdate
fi
###执行 ###执行
bwrap --dev-bind / / \ bwrap --dev-bind / / \
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \ --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

33
tool/ssaudit Executable file
View File

@@ -0,0 +1,33 @@
#!/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 ----------------------------------------------------------------------------------
dpkg -i "$DEBPATH" || aptss install -yf

View File

@@ -71,13 +71,14 @@ 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 "软件包校验失败!这不应该发生!\n可能是因为软件包已损坏星火仓库未同步或者最坏的情况恶意软件尝试利用自动安装来入侵系统\n如果你不清楚发生了什么请在接下来的认证窗口中选择取消认证\n执行 sudo aptss ssupdate 后再尝试安装。\n如果问题仍然存在请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用也可用ssaudit来替代ssinstall"
echo "软件包校验失败!这不应该发生!" echo "软件包校验失败!这不应该发生!"
echo "执行 sudo aptss ssupdate 后再尝试安装。" echo "执行 sudo aptss ssupdate 后再尝试安装。"
echo "如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!" echo "如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!"
echo "如果你是审核人员,这是正常现象,在审核通过前星火仓库不会保存相关信息。请在接下来的弹窗中进行认证即可" echo "如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作因为现在ssinstall已经被用于免密安装"
echo "如果你正在尝试安装已经下架的星火应用也可用ssaudit来替代ssinstall"
pkexec_as_current_user bash -c "dpkg -i "$DEBPATH" || aptss install -yf "
fi fi

View File

@@ -12,6 +12,7 @@ else
zenity --error --text "检查更新进程出现错误!按确定查看报错,可用于反馈" --title "星火商店更新检测模块" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --error --text "检查更新进程出现错误!按确定查看报错,可用于反馈" --title "星火商店更新检测模块" --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="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到" --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 clean-log pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
rm -f /tmp/spark-store/upgradeStatus.txt
exit exit
fi fi
@@ -77,5 +78,5 @@ done`
fi fi
fi fi
rm -f touch /tmp/spark-store/upgradeStatus.txt rm -f /tmp/spark-store/upgradeStatus.txt
# 从最开头 # 从最开头

View File

@@ -47,7 +47,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 "更新出现异常状况,等待十五秒"
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

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>
@@ -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,115 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="88"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="95"/>
<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="41"/>
<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="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/> <location filename="../src/widgets/common/downloaditem.cpp" line="154"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<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="101"/>
<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="144"/>
<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="145"/>
<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="152"/>
<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="154"/>
<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="155"/>
<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="161"/>
<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="162"/>
<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="182"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -345,7 +363,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 +376,128 @@
<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="45"/>
<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="46"/>
<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="47"/>
<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="48"/>
<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="161"/>
<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="162"/>
<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="26"/>
<source>We publish this program under GPL V3</source> <location filename="../src/application.cpp" line="27"/>
<translation type="unfinished"></translation> <location filename="../src/mainwindow-dtk.cpp" line="22"/>
</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="31"/>
<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="92"/>
<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> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@@ -584,30 +589,19 @@
<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>
<name>Widget</name>
<message>
<source>Share</source>
<translation type="obsolete">Spk share link</translation>
</message>
<message>
<source>0B</source>
<translation type="obsolete">0B</translation>
</message>
</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>
@@ -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,115 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="88"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="95"/>
<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="41"/>
<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="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/> <location filename="../src/widgets/common/downloaditem.cpp" line="154"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<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="101"/>
<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="144"/>
<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="145"/>
<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="152"/>
<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="154"/>
<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="155"/>
<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="161"/>
<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="162"/>
<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="182"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -345,7 +363,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 +376,128 @@
<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="45"/>
<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="46"/>
<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="47"/>
<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="48"/>
<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="161"/>
<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="162"/>
<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="26"/>
<source>We publish this program under GPL V3</source> <location filename="../src/application.cpp" line="27"/>
<translation type="unfinished"></translation> <location filename="../src/mainwindow-dtk.cpp" line="22"/>
</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="31"/>
<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="92"/>
<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> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@@ -595,212 +589,19 @@ 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>
<name>Widget</name>
<message>
<source></source>
<translatorcomment>Lecteurs vidéo et créateurs vidéo</translatorcomment>
<translation type="vanished">Vidéo</translation>
</message>
<message>
<source></source>
<translation type="vanished">Liste de téléchargement</translation>
</message>
<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>
</context>
</TS> </TS>

File diff suppressed because it is too large Load Diff