Compare commits

...

29 Commits

Author SHA1 Message Date
8850cfd4a3 update dtk-build-release-tag-20220425.yml 2022-12-25 07:45:19 +00:00
bec8a14baf !177 将默认的README改为英文
Merge pull request !177 from shenmo/dev
2022-12-25 04:46:51 +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
8918e63484 !171 4.1.1-real
Merge pull request !171 from shenmo/dev
2022-12-21 16:18:05 +00:00
6d1fb80f0f update src/main.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-21 16:17:32 +00:00
4add78c6d7 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-12-21 16:17:19 +00:00
zty199
89c32013bf fix: 修复应用更新失败问题
zenity 处理多选框时,返回结果取值错误导致,获取值实际为已安装版本号,而不是包名

Log: 修改 zenity 参数为 --print-column=2 获取包名
2022-12-21 23:57:06 +08:00
zty199
8f7ce54584 fix: 修复检查到应用更新没有系统通知的问题
错误地把 sudo 改为了 su(su $USER -c xxxxxx)

Log: 还原为 sudo -u $USER xxxxxx
2022-12-21 05:59:10 +00:00
65f3114078 !168 4.1.0
Merge pull request !168 from shenmo/dev
2022-12-21 05:31:36 +00:00
00386c7aeb 修复文案 2022-12-21 13:22:41 +08:00
zty199
3a89394838 fix: 修复可更新应用列表为空时仍然弹出选择应用更新对话框的问题
获取可更新应用列表后直接赋值给 zenity 处理,未对列表为空进行处理

Log: 获取可更新应用列表后,若列表为空则退出;不为空再交给 zenity 处理
2022-12-21 12:09:59 +08:00
a3f3a9153a 仍然有点小问题的更新检测 2022-12-21 09:24:59 +08:00
29 changed files with 822 additions and 686 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)
众所周知国内的Linux应用比较少wine应用难以获取优质工具分散在民间各大论坛无法形成合力难以改善生态
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
The collecting process needs everyone's help
我们创建了这个应用商店广泛收录大家需要的软件包搜集优质小工具主动适配wine应用存放到储存库供大家获取
我们支持Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
## 关于协作:分支相关的文档见 [这里](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
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
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
如果想安装 `星火应用商店` ,请打开右侧的 [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
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
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
git clone https://gitee.com/deepin-community-store/spark-store.git
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/
客户端PWA
PWA Client
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
(安装星火商店后在浏览器打开或复制到搜索栏打开)

22
debian/changelog vendored
View File

@@ -1,3 +1,25 @@
spark-store (4.1.2) stable; urgency=medium
* feat: 初步的wayland支持
* fix: 首页的捐赠页面在中文环境下显示中文
* chore: 新增编译依赖,测试安装时不会出现报错
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.1) stable; urgency=medium
* fix:更新失效
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.0) stable; urgency=medium
* feat: 现在可以支持UOS签名包问题了
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.0.1) stable; urgency=medium
* feat: 提升Ubuntu下的显示效果

8
debian/control vendored
View File

@@ -15,7 +15,11 @@ Build-Depends:
libdtkgui-dev(>=5.0),
libdtkwidget-dev(>=5.0),
qttools5-private-dev,
qtwebengine5-dev
qtwebengine5-dev,
qtwayland5,
qtwayland5-dev-tools,
gcc,
g++
Standards-Version: 3.0
Homepage: https://www.spark-app.store/
@@ -28,12 +32,12 @@ Depends:${shlibs:Depends}, ${misc:Depends},
libqt5widgets5,
libqt5network5,
libqt5concurrent5,
qtwayland5,
libdtkcore5,
libdtkgui5,
libdtkwidget5,
curl,
openssl,
libssl-dev,
dde-qt5integration,
bubblewrap,
aria2,

View File

@@ -8,6 +8,7 @@ TARGET = spark-store
TEMPLATE = subdirs
CONFIG += ordered
CONFIG += wayland-compositor
SUBDIRS += \
src/spark-dstore-patch \

View File

@@ -30,7 +30,6 @@ void DownloadController::setFilename(QString filename)
this->filename = filename;
}
bool checkMeatlink(QString metaUrl)
{
QFile metaStatus("/tmp/spark-store/metaStatus.txt");

View File

@@ -1,13 +1,12 @@
#include "image_show.h"
#include <QHBoxLayout>
#include <QScreen> // Qt5 不再建议使用 QDesktopWidget
#include <QScreen> // Qt5 不再建议使用 QDesktopWidget
#include <QGuiApplication>
image_show::image_show(QWidget *parent) :
QWidget(parent),
m_dialog(new big_image),
m_label(new QLabel)
image_show::image_show(QWidget *parent) : QWidget(parent),
m_dialog(new big_image),
m_label(new QLabel)
{
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(m_label);
@@ -27,7 +26,7 @@ void image_show::setImage(QPixmap image)
desktop_w = QGuiApplication::primaryScreen()->geometry().width();
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);
m_image = QPixmap::fromImage(re_screen1);
@@ -48,7 +47,7 @@ void image_show::mousePressEvent(QMouseEvent *)
// 识别主屏幕尺寸并设置 widget 大小
m_dialog->setFixedSize(desktop_w, desktop_h);
m_dialog->move(0,0);
m_dialog->move(0, 0);
}
image_show::~image_show()
{

View File

@@ -7,7 +7,7 @@ QString SparkAPI::serverUrl = "";
SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
{
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
if(!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
if (!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
{
SparkAPI::setServerUrl(readConfig.value("server/choose").toString());
}
@@ -15,9 +15,10 @@ SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
void SparkAPI::get(QUrl url)
{
QNetworkRequest request;
HttpRequest *httprequest=new HttpRequest;
request.setUrl(QUrl(url.toString().replace("+","%2B")));
connect(httprequest,&HttpRequest::finished,[=](QString data){
HttpRequest *httprequest = new HttpRequest;
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
connect(httprequest, &HttpRequest::finished, [=](QString data)
{
QByteArray arr = data.toUtf8();
//解析Json
QJsonParseError error;
@@ -30,36 +31,35 @@ void SparkAPI::get(QUrl url)
emit finishedObject(doc);
}
httprequest->deleteLater();
});
httprequest->deleteLater(); });
httprequest->getRequest(request);
}
void SparkAPI::getRAW(QUrl url)
{
QNetworkRequest request;
HttpRequest *httprequest=new HttpRequest;
request.setUrl(QUrl(url.toString().replace("+","%2B")));
connect(httprequest,&HttpRequest::finished,[=](QString data){
HttpRequest *httprequest = new HttpRequest;
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
connect(httprequest, &HttpRequest::finished, [=](QString data)
{
emit finishedRAW(data);
httprequest->deleteLater();
});
httprequest->deleteLater(); });
httprequest->getRequest(request);
}
void SparkAPI::getAppList(QString type)
{
get(QUrl(getServerUrl()+"store/"+type+"/applist.json"));
get(QUrl(getServerUrl() + "store/" + type + "/applist.json"));
}
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)
{
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)
{
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()
{

View File

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

View File

@@ -7,97 +7,134 @@
#include <DAboutDialog>
#include <QLabel>
#include <DWidgetUtil>
#include <DSysInfo>
DCORE_USE_NAMESPACE
DWIDGET_USE_NAMESPACE
int main(int argc, char *argv[])
{
// Get build time
static const QString version = "Version 4.0.1";
static const QDate buildDate = QLocale( QLocale::English ).toDate( QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
static const QString version = "Version 4.1.2";
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");
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
//设置桌面环境环境变量
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin")) {
// 设置桌面环境环境变量
bool isDeepinOS = true;
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
{
setenv("XDG_CURRENT_DESKTOP", "Deepin", 1);
isDeepinOS = false;
}
bool isWayland = false;
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;
}
setConfig->setValue("build/isWayland", isWayland);
setConfig->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 (!readConfig.contains("build/useWayland"))
{
setConfig->setValue("build/useWayland", true);
}
bool useWayland = readConfig.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");
}
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
#ifndef DSTORE_NO_DXCBs
DApplication::loadDXcbPlugin(); // 加载 DXCB 插件
#endif
// 浏览器开启 GPU 支持
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
QVector<char*> fakeArgs(argc + 2);
QVector<char *> fakeArgs(argc + 2);
fakeArgs[0] = argv[0];
fakeArgs[1] = "-platformtheme";
fakeArgs[2] = "deepin";
for(int i = 1; i < argc; i++) fakeArgs[i + 2] = argv[i];
int fakeArgc = argc + 2; // 为啥DApplication的argc要用引用啊
QString fakeArgs1 = "-platformtheme";
QByteArray fakeArgsTemp = fakeArgs1.toLatin1(); // must
fakeArgs[1] = fakeArgsTemp.data();
fakeArgs1 = "deepin";
fakeArgsTemp = fakeArgs1.toLatin1(); // must
fakeArgs[2] = fakeArgsTemp.data();
for (int i = 1; i < argc; i++)
fakeArgs[i + 2] = argv[i];
int fakeArgc = argc + 2; // DApplication的argc要用引用避免c++编译器优化
DApplication a(fakeArgc, fakeArgs.data());
//初始化日志模块 (默认日志位置 ~/.cache/deepin/spark-store)
// 初始化日志模块 (默认日志位置 ~/.cache/deepin/spark-store)
DLogManager::registerConsoleAppender();
DLogManager::registerFileAppender();
//Wayland 环境下使用,防止子控件 Native 化
if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
// Wayland 环境下使用,防止子控件 Native 化
if (!DPlatformWindowHandle::pluginVersion().isEmpty())
{
a.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
}
a.setAttribute(Qt::AA_UseHighDpiPixmaps);
a.loadDXcbPlugin();
a.setApplicationDisplayName("Spark Store");
a.loadTranslator(); // 载入翻译
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
if (readConfig.value("build/version").toString() != version){
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();
setConfig->setValue("build/time", buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString());
}
setConfig->deleteLater();
//Customized DAboutDialog
// 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>"
)
);
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");
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.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"
)
);
QObject::tr(
"<span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
"<span style='font-size:12pt;'>Spark developers</span><br/><br/>"
"Published under GPL V3"));
// 限制单实例运行
if(!a.setSingleInstance("spark-store"))
if (!a.setSingleInstance("spark-store"))
{
qDebug() << "The application is already running!";
QDBusInterface iface("com.gitee.spark.store",
@@ -107,24 +144,25 @@ int main(int argc, char *argv[])
QString arg1 = argv[1];
iface.asyncCall("activeWindow",arg1);
iface.asyncCall("activeWindow", arg1);
return -1;
}
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); //固定主题为浅色主题
DApplicationSettings settings; // 定义 DApplicationSettings自动保存主题设置
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); // 固定主题为浅色主题
DApplicationSettings settings; // 定义 DApplicationSettings自动保存主题设置
MainWindow w;
// 让打开时界面显示在正中
Dtk::Widget::moveToCenter(&w);
QString arg1 = argv[1];
if (arg1.startsWith("spk://")) {
if (arg1.startsWith("spk://"))
{
w.openUrl(QUrl(argv[1]));
}
w.show();
w.setWindowTitle("Spark Store");
return a.exec();
}

View File

@@ -3,22 +3,25 @@
#include <DWidgetUtil>
#include <DGuiApplicationHelper>
#include <DApplicationSettings>
#include <QSizePolicy>
#define AppPageApplist 0
#define AppPageSearchlist 1
#define AppPageAppdetail 2
#define AppPageSettings 3
#define WaylandSearchCenter 1
#define OtherSearchCenter 2
#define RightSearchSpace 1
MainWindow::MainWindow(QWidget *parent)
: BaseWidgetOpacity(parent)
, ui(new Ui::MainWindow)
: BaseWidgetOpacity(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
initConfig();
moveToCenter(this); //让窗口居中显示
moveToCenter(this); // 让窗口居中显示
WidgetAnimation::widgetOpacity(this,true);
WidgetAnimation::widgetOpacity(this, true);
downloadlistwidget = new DownloadListWidget;
downloadButton = new ProgressButton(ui->titlebar);
@@ -26,7 +29,7 @@ MainWindow::MainWindow(QWidget *parent)
ui->appintopage->setDownloadWidget(downloadlistwidget);
ui->stackedWidget->setCurrentIndex(0);
ui->titlebar->setBackgroundTransparent(true);
//ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
// ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
setMaskAlpha(250);
updateUi(0);
@@ -42,32 +45,33 @@ MainWindow::MainWindow(QWidget *parent)
menu->addAction(actionSubmissionWithClient);
ui->titlebar->setMenu(menu);
connect(actionSubmission, &QAction::triggered, this, [=]{QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/"));});
connect(setting, &QAction::triggered, this, [=]{
connect(actionSubmission, &QAction::triggered, this, [=]
{ QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/")); });
connect(setting, &QAction::triggered, this, [=]
{
switchPage(AppPageSettings);
ui->settingspage->updateUI();
});
connect(upgrade, &QAction::triggered, this, [=]{QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh");});
ui->settingspage->updateUI(); });
connect(upgrade, &QAction::triggered, this, [=]
{ QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh"); });
// 投稿器
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() << "投稿器存在";
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter");
}
else{
qDebug() << "投稿器存在,跳转页面";
openUrl(submitterSpk);
}
QString submitterSpk = "spk://store/tools/spark-store-submitter";
QFile actionSubmissionClientStatus("/opt/spark-store-submitter/bin/spark-store-submitter");
if (actionSubmissionClientStatus.exists())
{
qDebug() << "投稿器存在";
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter");
}
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) {
//深色模式
setMaskColor(QColor("#2a2b2b"));
@@ -79,8 +83,7 @@ MainWindow::MainWindow(QWidget *parent)
downloadButton->setBackgroundColor(QColor("#444444"));
downloadButton->setColor(QColor("#66CCFF"));
ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg"));
int i = 0;
while (i < ui->buttonGroup->buttons().size()) {
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
@@ -91,7 +94,6 @@ MainWindow::MainWindow(QWidget *parent)
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;}");
}
i++;
}
} else {
//亮色模式
@@ -104,8 +106,7 @@ MainWindow::MainWindow(QWidget *parent)
downloadButton->setColor(QColor("#66CCFF"));
downloadButton->setIcon(":/icon/light/download.svg");
ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg"));
int i = 0;
while (i < ui->buttonGroup->buttons().size()) {
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
@@ -116,42 +117,45 @@ MainWindow::MainWindow(QWidget *parent)
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;}");
}
i++;
}
}
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->applistpage_1->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;
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);
downloadlistwidget->m_move(pos.x(), pos.y());
downloadlistwidget->show();
});
downloadlistwidget->show(); });
//appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]() {
WidgetAnimation::widgetShake(downloadButton,6);//第一个参数是抖动的控件,第二个参数是抖动范围(像素)
});
// appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
{
WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素)
});
connect(backButtom, &QPushButton::clicked, [=]() {
connect(backButtom, &QPushButton::clicked, [=]()
{
ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2));
pageHistory.removeLast();
if (pageHistory.count() > 1) {
backButtom->show();
} else {
backButtom->hide();
}
});
} });
downloadlistwidget->hide();
backButtom->hide();
ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg"));
// Check wayland configs
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
QWidget *w_titlebar = new QWidget(ui->titlebar);
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
QLabel *title = new QLabel(this);
@@ -159,26 +163,39 @@ MainWindow::MainWindow(QWidget *parent)
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
ly_titlebar->addWidget(title);
ly_titlebar->addWidget(backButtom);
ly_titlebar->addStretch(2.5);
if (!readConfig.value("build/isDeepinOS").toBool() && readConfig.value("build/useWayland").toBool())
{
// Wayland 搜索栏居中
ly_titlebar->addStretch(WaylandSearchCenter);
}
else
{
// dwayland dxcb 搜索栏顶部右侧居中
ly_titlebar->addStretch(OtherSearchCenter);
}
ly_titlebar->addWidget(searchEdit);
ly_titlebar->addWidget(downloadButton);
ly_titlebar->addStretch(1);
ly_titlebar->addStretch(RightSearchSpace);
ui->titlebar->setCustomWidget(w_titlebar);
//侧边栏按钮
// 侧边栏按钮
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);}");
connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked) {
connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked)
{
if (checked == true) {
searchEdit->clearEdit();
updateUi(i);
}
});
} });
i++;
}
// 搜索事件
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() {
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
{
QString searchtext = searchEdit->text();
if (!searchtext.isEmpty()) {
if (searchtext.startsWith("spk://")) {
@@ -189,22 +206,17 @@ MainWindow::MainWindow(QWidget *parent)
switchPage(AppPageSearchlist);
}
}
this->setFocus();
});
this->setFocus(); });
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i) {
downloadButton->setProgress(i);
});
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i)
{ downloadButton->setProgress(i); });
// 列表点击事件
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk) {
openUrl(spk);
});
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk) {
openUrl(spk);
});
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk) {
openUrl(spk);
});
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); });
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); });
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
{ openUrl(spk); });
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
initDbus();
@@ -223,12 +235,12 @@ void MainWindow::initDbus()
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
connect(dbusInter,&DBusSparkStoreService::sigOpenUrl,this,&MainWindow::onGetUrl);
connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
}
void MainWindow::onGetUrl(const QString &url)
{
if(url.left(6)=="spk://")
if (url.left(6) == "spk://")
{
openUrl(QUrl(url));
}
@@ -237,11 +249,14 @@ void MainWindow::onGetUrl(const QString &url)
void MainWindow::openUrl(QUrl url)
{
if (url.toString().startsWith("spk://")) {
ui->appintopage->openUrl(QUrl(url.toString().replace("+","%2B")));
if (url.toString().startsWith("spk://"))
{
ui->appintopage->openUrl(QUrl(url.toString().replace("+", "%2B")));
switchPage(AppPageAppdetail);
} else {
QDesktopServices::openUrl(QUrl(url.toString().replace("+","%2B")));
}
else
{
QDesktopServices::openUrl(QUrl(url.toString().replace("+", "%2B")));
}
}
@@ -252,50 +267,55 @@ void MainWindow::initConfig()
dir.mkpath("/tmp/spark-store");
}
void MainWindow::switchPage(int now) //临时方案,回家后修改
void MainWindow::switchPage(int now) // 临时方案,回家后修改
{
qDebug() << pageHistory.count();
if (pageHistory.count() >= 1) {
if (pageHistory.count() >= 1)
{
backButtom->show();
} else {
}
else
{
backButtom->hide();
}
ui->stackedWidget->setCurrentIndex(now);
pageHistory << now;
}
//刷新界面
// 刷新界面
void MainWindow::updateUi(int now)
{
pageHistory.clear();
QStringList itemlist;
itemlist << ""
<< "network"
<< "chat"
<< "music"
<< "video"
<< "image_graphics"
<< "games"
<< "office"
<< "reading"
<< "development"
<< "tools"
<< "themes"
<< "others";
ui->applistpage->getAppList(itemlist[now]);
qDebug() << itemlist[now];
switchPage(AppPageApplist);
QStringList itemlist;
itemlist << ""
<< "network"
<< "chat"
<< "music"
<< "video"
<< "image_graphics"
<< "games"
<< "office"
<< "reading"
<< "development"
<< "tools"
<< "themes"
<< "others";
ui->applistpage->getAppList(itemlist[now]);
qDebug() << itemlist[now];
switchPage(AppPageApplist);
}
void MainWindow::on_pushButton_14_clicked()
{
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
if (!upgradeStatus.exists()){
QtConcurrent::run([=]{
if (!upgradeStatus.exists())
{
QtConcurrent::run([=]
{
auto upgradeP = new QProcess();
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh");
upgradeP->waitForStarted();
upgradeP->waitForFinished(-1);
});
upgradeP->deleteLater(); });
}
}

View File

@@ -1,20 +1,19 @@
#include "appintopage.h"
#include "ui_appintopage.h"
AppIntoPage::AppIntoPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::AppIntoPage)
AppIntoPage::AppIntoPage(QWidget *parent) : QWidget(parent),
ui(new Ui::AppIntoPage)
{
ui->setupUi(this);
ui->listWidget->setViewMode(QListView::IconMode);
ui->listWidget->setMovement(QListView::Static);
ui->listWidget->setMaximumHeight(200);
ui->listWidget->setFlow(QListView::TopToBottom);
api1=new SparkAPI(this);
connect(api1,&SparkAPI::finishedRAW,[=](QString download_times){
api1 = new SparkAPI(this);
connect(api1, &SparkAPI::finishedRAW, [=](QString download_times)
{
download_times.remove(QRegExp("\\n"));
ui->download_times->setText(download_times);
qDebug()<<"Download Times:"+download_times;
});
qDebug()<<"Download Times:"+download_times; });
clear();
}
@@ -35,31 +34,31 @@ void AppIntoPage::clear()
ui->downloadButton->hide();
ui->downloadButton->setEnabled(true);
ui->pushButton_3->hide();
int n=ui->listWidget->count();
for(int i=0;i<n;i++)
int n = ui->listWidget->count();
for (int i = 0; i < n; i++)
{
QListWidgetItem *item = ui->listWidget->takeItem(0);
QWidget *card = ui->listWidget->itemWidget(item);
delete card;
card = NULL;
card = NULL;
delete item;
item = NULL;
item = NULL;
}
ui->listWidget->clear();
}
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
{
dw=w;
connect(w, &DownloadListWidget::downloadFinished, [=]() {
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
});
dw = w;
connect(w, &DownloadListWidget::downloadFinished, [=]()
{ isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); });
}
void AppIntoPage::openUrl(QUrl url)
{
spk=url;
SparkAPI *api=new SparkAPI(this);
spk = url;
SparkAPI *api = new SparkAPI(this);
clear();
connect(api,&SparkAPI::finishedObject,[=](QJsonObject appinfo){
connect(api, &SparkAPI::finishedObject, [=](QJsonObject appinfo)
{
info = appinfo;
// qDebug()<<url;
@@ -188,36 +187,42 @@ void AppIntoPage::openUrl(QUrl url)
}
this->sltAppinfoTags(&taglist);
disconnect(api,&SparkAPI::finished,nullptr,nullptr);
api->deleteLater();
});
api->deleteLater(); });
api->getAppInfo(url);
api1->getAppDownloadTimes(url);
}
void AppIntoPage::isDownloading(QUrl url)
{
if (dw->getUrlList().lastIndexOf(url) == -1) {
if (dw->getUrlList().lastIndexOf(url) == -1)
{
ui->downloadButton->setEnabled(true);
return;
} else {
}
else
{
ui->downloadButton->setEnabled(false);
}
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->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->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->setText(tr("Installing"));
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->setText(tr("Reinstall"));
ui->downloadButton->show();
@@ -227,37 +232,37 @@ void AppIntoPage::isDownloading(QUrl url)
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();
}
else if(tag=="ubuntu")
else if (tag == "ubuntu")
{
ui->tag_ubuntu->show();
}
else if(tag=="deepin")
else if (tag == "deepin")
{
ui->tag_deepin->show();
}
else if(tag=="uos")
else if (tag == "uos")
{
ui->tag_uos->show();
}
else if(tag=="dtk5")
else if (tag == "dtk5")
{
ui->tag_dtk5->show();
}
else if(tag=="dwine2")
else if (tag == "dwine2")
{
ui->tag_dwine2->show();
}
else if(tag=="dwine5")
else if (tag == "dwine5")
{
ui->tag_dwine5->show();
}
else if(tag=="a2d")
else if (tag == "a2d")
{
ui->tag_a2d->show();
}
@@ -265,9 +270,9 @@ void AppIntoPage::sltAppinfoTags(QStringList *tagList)
}
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);}";
ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet);
@@ -279,9 +284,11 @@ void AppIntoPage::setTheme(bool dark)
ui->icon_4->setPixmap(QPixmap(":/icon/dark/text.svg"));
ui->icon_5->setPixmap(QPixmap(":/icon/dark/folder.svg"));
ui->icon_6->setPixmap(QPixmap(":/icon/dark/globe.svg"));
}else {
//亮色模式
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4{background-color: #fbfbfb;border-radius:14px;border:1px solid rgb(229,229,229);}";
}
else
{
// 亮色模式
QString frameStyleSheet = "#frame,#frame_2,#frame_3,#frame_4{background-color: #fbfbfb;border-radius:14px;border:1px solid rgb(229,229,229);}";
ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet);
@@ -293,7 +300,6 @@ void AppIntoPage::setTheme(bool dark)
ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg"));
ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg"));
ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg"));
}
}
AppIntoPage::~AppIntoPage()
@@ -303,34 +309,34 @@ AppIntoPage::~AppIntoPage()
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);
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,[=](){
dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())]->install(0);
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, [=]()
{
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;
}
emit clickedDownloadBtn();
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"))
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"))
{
dw->getDIList()[dw->allDownload - 1]->reinstall = true;
}
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());
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());
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());
}
void AppIntoPage::on_pushButton_3_clicked()
{
QtConcurrent::run([=]()
{
{
ui->downloadButton->setEnabled(false);
ui->pushButton_3->setEnabled(false);
@@ -352,19 +358,17 @@ void AppIntoPage::on_pushButton_3_clicked()
}
ui->downloadButton->setEnabled(true);
ui->pushButton_3->setEnabled(true);
});
ui->pushButton_3->setEnabled(true); });
}
void AppIntoPage::on_shareButton_clicked()
{
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();
clipboard->setText(spk.toString());
}
void AppIntoPage::on_updateButton_clicked()
{
QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
@@ -374,9 +378,9 @@ void AppIntoPage::on_updateButton_clicked()
qDebug() << "反馈器存在";
QProcess::startDetached("sh /opt/durapps/store.spark-app.feedback/launch.sh");
}
else{
else
{
qDebug() << "反馈器不存在,跳转页面";
openUrl(feedbackSpk);
}
}

View File

@@ -1,48 +1,55 @@
#include "applistpage.h"
#include "ui_applistpage.h"
AppListPage::AppListPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::AppListPage)
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
ui(new Ui::AppListPage)
{
ui->setupUi(this);
ui->webEngineView->page()->setBackgroundColor(Qt::transparent);
}
void AppListPage::setTheme(bool dark)
{
isDark=dark;
if(dark)
isDark = dark;
if (dark)
{
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);}");
}
if(isSearch)
if (isSearch)
{
getSearchList(nowType);
}else{
}
else
{
getAppList(nowType);
}
}
void AppListPage::getAppList(QString type)
{
isSearch=false;
nowType=type;
SparkAPI *api=new SparkAPI(this);
isSearch = false;
nowType = type;
SparkAPI *api = new SparkAPI(this);
QString url;
QString theme;
if(isDark)
if (isDark)
{
theme="theme=dark";
}else{
theme="theme=light";
theme = "theme=dark";
}
if(type=="")
else
{
url=api->getServerUrl()+"store/#/flamescion/?"+theme;
}else{
url=api->getServerUrl()+"store/#/flamescion/applist?type="+type+"&"+theme;
theme = "theme=light";
}
if (type == "")
{
url = api->getServerUrl() + "store/#/flamescion/?" + theme;
}
else
{
url = api->getServerUrl() + "store/#/flamescion/applist?type=" + type + "&" + theme;
}
ui->webEngineView->setUrl(url);
@@ -50,18 +57,20 @@ void AppListPage::getAppList(QString type)
void AppListPage::getSearchList(QString keyword)
{
isSearch=true;
nowType=keyword;
SparkAPI *api=new SparkAPI(this);
isSearch = true;
nowType = keyword;
SparkAPI *api = new SparkAPI(this);
QString url;
QString theme;
if(isDark)
if (isDark)
{
theme="theme=dark";
}else{
theme="theme=light";
theme = "theme=dark";
}
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);
}
@@ -72,15 +81,14 @@ AppListPage::~AppListPage()
void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
{
if(arg1.path().right(8) == "app.json")
{
QString url = arg1.toString();
url = url.mid(url.indexOf("/store/"));
url = "spk:/"+url;
url = url.mid(0,url.indexOf("/app.json"));
qDebug() << "程序跳转链接地址:" << url;
ui->webEngineView->back();
emit clicked(url);
}
if (arg1.path().right(8) == "app.json")
{
QString url = arg1.toString();
url = url.mid(url.indexOf("/store/"));
url = "spk:/" + url;
url = url.mid(0, url.indexOf("/app.json"));
qDebug() << "程序跳转链接地址:" << url;
ui->webEngineView->back();
emit clicked(url);
}
}

View File

@@ -1,9 +1,8 @@
#include "settingspage.h"
#include "ui_settingspage.h"
bool SettingsPage::isdownload = false;
SettingsPage::SettingsPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::SettingsPage)
SettingsPage::SettingsPage(QWidget *parent) : QWidget(parent),
ui(new Ui::SettingsPage)
{
ui->setupUi(this);
configCanSave = false;
@@ -12,11 +11,13 @@ SettingsPage::SettingsPage(QWidget *parent) :
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);}");
}else {
//亮色模式
}
else
{
// 亮色模式
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
}
}
@@ -26,7 +27,7 @@ void SettingsPage::readServerList()
// 读取服务器列表并初始化
QFile file(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
//判断文件是否存在
// 判断文件是否存在
if (!file.exists())
{
ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/");
@@ -34,28 +35,28 @@ void SettingsPage::readServerList()
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<"无法读取server.list";
qDebug() << "无法读取server.list";
}
//创建QTextStream对象
// 创建QTextStream对象
QTextStream textStream(&file);
QString lineData = textStream.readLine();//读取文件的第一行
QString lineData = textStream.readLine(); // 读取文件的第一行
ui->comboBox_server->addItem(lineData);
while(!lineData.isNull())
while (!lineData.isNull())
{
lineData = textStream.readLine();
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);
}
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);
}
@@ -71,13 +72,13 @@ void SettingsPage::initConfig()
// 读取服务器URL并初始化菜单项的链接
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
if(!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
if (!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
{
qDebug()<<readConfig.value("server/choose").toString();
qDebug() << readConfig.value("server/choose").toString();
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
SparkAPI::setServerUrl(readConfig.value("server/choose").toString());
}
configCanSave = true; // 防止触发保存配置信号
configCanSave = true; //  防止触发保存配置信号
}
SettingsPage::~SettingsPage()
@@ -88,7 +89,7 @@ SettingsPage::~SettingsPage()
void SettingsPage::on_pushButton_updateServer_clicked()
{
QtConcurrent::run([=]()
{
{
ui->pushButton_updateServer->setEnabled(false);
ui->comboBox_server->clear();
@@ -97,17 +98,15 @@ void SettingsPage::on_pushButton_updateServer_clicked()
ui->pushButton_updateServer->setEnabled(true);
readServerList();
ui->comboBox_server->setCurrentIndex(0);
});
ui->comboBox_server->setCurrentIndex(0); });
}
void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1)
{
SparkAPI::setServerUrl(arg1); // 服务器信息更新
qDebug()<<arg1;
SparkAPI::setServerUrl(arg1); // 服务器信息更新
qDebug() << arg1;
const QString updatedInfo = "TRUE";
if(configCanSave)
if (configCanSave)
{
// ui->label_setting1->show();
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
@@ -124,7 +123,7 @@ void SettingsPage::setIsDownload(bool isdownload)
void SettingsPage::updateUI()
{
if(isdownload)
if (isdownload)
{
ui->pushButton_clear->setEnabled(false);
}
@@ -135,15 +134,15 @@ void SettingsPage::updateUI()
// 显示缓存占用空间
quint64 tmp_size = dirFileSize(QString::fromUtf8(TMP_PATH));
QString tmp_size_str;
if(tmp_size < 1024)
if (tmp_size < 1024)
{
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";
}
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";
}
@@ -160,13 +159,13 @@ quint64 SettingsPage::dirFileSize(const QString &path)
QDir dir(path);
quint64 size = 0;
// dir.entryInfoList(QDir::Files); // 返回文件信息
foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
foreach (QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
{
// 计算文件大小
size += quint64(fileInfo.size());
}
// 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() 函数
size += dirFileSize(path + QDir::separator() + subDir);
@@ -177,22 +176,20 @@ quint64 SettingsPage::dirFileSize(const QString &path)
void SettingsPage::on_pushButton_updateApt_clicked()
{
QtConcurrent::run([=]()
{
{
ui->pushButton_updateApt->setEnabled(false);
ui->label_aptserver->setText(tr("Updating, please wait..."));
emit openUrl(QUrl("spk://store/tools/spark-store"));
ui->label_aptserver->setText(tr(""));
ui->pushButton_updateApt->setEnabled(true);
});
ui->pushButton_updateApt->setEnabled(true); });
}
void SettingsPage::on_pushButton_clear_clicked()
{
QtConcurrent::run([=]()
{
{
ui->pushButton_clear->setEnabled(false);
QDir tmpdir("/tmp/spark-store");
@@ -204,15 +201,13 @@ void SettingsPage::on_pushButton_clear_clicked()
}
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Temporary cache was cleaned"));
ui->pushButton_clear->setEnabled(true);
updateUI();
});
updateUI(); });
}
void SettingsPage::on_pushButton_clearWebCache_clicked()
{
QtConcurrent::run([=]()
{
{
QString dataLocal = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
qDebug() << dataLocal;
QDir dataDir(dataLocal);
@@ -220,7 +215,5 @@ void SettingsPage::on_pushButton_clearWebCache_clicked()
dataLocal = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
qDebug() << dataLocal;
QDir cacheDir(dataLocal);
cacheDir.removeRecursively();
});
cacheDir.removeRecursively(); });
}

View File

@@ -1,22 +1,19 @@
#include "httprequest.h"
HttpRequest::HttpRequest()
{
}
void HttpRequest::getRequest(QNetworkRequest request)
{
QNetworkAccessManager *naManager=new QNetworkAccessManager(this);
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json");
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)
{
@@ -24,19 +21,19 @@ void HttpRequest::readdata_slot(QNetworkReply *reply)
}
QString HttpRequest::postRequest(QString url, QString jsondata)
{
QByteArray array= jsondata.toLatin1();
QByteArray array = jsondata.toLatin1();
QNetworkRequest request;
QNetworkAccessManager *naManager=new QNetworkAccessManager(this);
QUrl strUrl = url.replace("+","%2B");
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
QUrl strUrl = url.replace("+", "%2B");
request.setUrl(strUrl);
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json");
QNetworkReply* reply = naManager->post(request, array);
QNetworkReply *reply = naManager->post(request, array);
QEventLoop eventLoop;
connect(naManager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
connect(naManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
eventLoop.exec();
QTextCodec* codec = QTextCodec::codecForName("utf8");
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString strReply = codec->toUnicode(reply->readAll());
reply->deleteLater();
return strReply;

View File

@@ -2,18 +2,17 @@
Utils::Utils()
{
}
//这个函数是chatGPT写的
void Utils::sendNotification(QString icon,QString title,QString body)
// Author: chatGPT
void Utils::sendNotification(QString icon, QString title, QString body)
{
QDBusInterface iface("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications");
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
<< icon // the application icon of the notification
<< title // the title of the notification

View File

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

View File

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

View File

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

View File

@@ -6,13 +6,12 @@
bool DownloadItem::isInstall = false;
DownloadItem::DownloadItem(QWidget *parent) :
QWidget(parent),
reinstall(false),
close(false),
ui(new Ui::DownloadItem),
output_w(new DDialog),
textbrowser(new QTextBrowser)
DownloadItem::DownloadItem(QWidget *parent) : QWidget(parent),
reinstall(false),
close(false),
ui(new Ui::DownloadItem),
output_w(new DDialog),
textbrowser(new QTextBrowser)
{
ui->setupUi(this);
@@ -34,7 +33,7 @@ void DownloadItem::setValue(qint64 value)
{
ui->progressBar->setValue(qint32(value));
ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
if(ui->label_2->text().left(4) == "100%")
if (ui->label_2->text().left(4) == "100%")
{
download = 1;
ui->label_2->setText(tr("Download Complete."));
@@ -58,7 +57,7 @@ QString DownloadItem::getName()
void DownloadItem::readyInstall()
{
if(!close)
if (!close)
{
ui->progressBar->hide();
ui->pushButton_install->setEnabled(true);
@@ -90,7 +89,7 @@ void DownloadItem::setSpeed(QString s)
void DownloadItem::install(int t)
{
if(!isInstall)
if (!isInstall)
{
isInstall = true;
ui->pushButton_install->hide();
@@ -99,7 +98,7 @@ void DownloadItem::install(int t)
ui->label_2->setText(tr("Installing"));
QtConcurrent::run([=]()
{
{
QProcess installer;
switch(t)
{
@@ -164,10 +163,9 @@ void DownloadItem::install(int t)
ui->widget_spinner->hide();
DownloadItem::isInstall = false;
emit finished();
});
emit finished(); });
// emit finished();
qDebug()<<ui->label_filename->text().toUtf8();
qDebug() << ui->label_filename->text().toUtf8();
}
}

View File

@@ -8,15 +8,15 @@
ProgressButton::ProgressButton(QWidget *parent)
: QWidget{parent}
{
//this->setWindowFlags(Qt::FramelessWindowHint);
// this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground, true);
setMinimumWidth(36);
setMinimumHeight(36);
svgPath="";
backColor=Qt::transparent;
svgPath = "";
backColor = Qt::transparent;
setMouseTracking(true);
connect(this,&ProgressButton::startProcessing,this,&ProgressButton::operationProcessing,Qt::QueuedConnection);
connect(this, &ProgressButton::startProcessing, this, &ProgressButton::operationProcessing, Qt::QueuedConnection);
}
ProgressButton::~ProgressButton()
@@ -26,63 +26,63 @@ ProgressButton::~ProgressButton()
void ProgressButton::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setRenderHint(QPainter::Antialiasing, true);
auto rect = event->rect();
if(buttonState == state::normal || buttonState == state::hover)
if (buttonState == state::normal || buttonState == state::hover)
{
auto radiu = (rect.height() - 6) / 2;
painter.translate(rect.center());
painter.setPen(Qt::transparent);
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.drawEllipse(QPoint(0,0),radiu,radiu);
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
QSvgRenderer m_svgRender;
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());
auto radiu = (rect.height() - 6) / 2 -3;
auto radiu = (rect.height() - 6) / 2 - 3;
painter.setBrush(backColor);
painter.setPen(QPen(backColor,3));
painter.drawEllipse(QPoint(0,0),radiu,radiu);
painter.setPen(QPen(backColor, 3));
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
painter.setPen(QPen(backColor,3));
painter.setPen(QPen(backColor, 3));
QSvgRenderer m_svgRender;
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,
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;
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;
painter.translate(rect.center());
painter.setPen(Qt::transparent);
painter.setBrush(QColor(0, 0, 0, 63));
painter.drawEllipse(QPoint(0,0),radiu,radiu);
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
radiu -= 3;
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.drawLine(QPoint(-radiu / 3,0),
QPoint(-radiu / 5,radiu / 3));
painter.drawLine(QPoint(-radiu / 5,radiu / 3),
QPoint(radiu / 4,-radiu / 4));
painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.drawLine(QPoint(-radiu / 3, 0),
QPoint(-radiu / 5, radiu / 3));
painter.drawLine(QPoint(-radiu / 5, radiu / 3),
QPoint(radiu / 4, -radiu / 4));
}
}
@@ -90,12 +90,12 @@ void ProgressButton::setProgress(int progress)
{
buttonState = state::openProgress;
ProgressButton::progress = progress;
if(progress == 0)
if (progress == 0)
{
buttonState = state::normal;
update();
}
if(progress == 100)
if (progress == 100)
{
buttonState = state::closeProgress;
update();
@@ -127,7 +127,7 @@ void ProgressButton::setColor(QColor color)
void ProgressButton::leaveEvent(QEvent *event)
{
if(buttonState == state::hover)
if (buttonState == state::hover)
{
buttonState = state::normal;
update();
@@ -137,12 +137,12 @@ void ProgressButton::leaveEvent(QEvent *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;
update();
}
else if(buttonState == state::closeProgress)
else if (buttonState == state::closeProgress)
{
update();
}
@@ -152,24 +152,21 @@ void ProgressButton::mousePressEvent(QMouseEvent *event)
void ProgressButton::operationProcessing()
{
}
const int RADIUS = 60;
WaterDrop::WaterDrop(QWidget *parent)
: QWidget(parent)
, m_waterDropAnimation(nullptr)
, m_animationRadius(0)
: QWidget(parent), m_waterDropAnimation(nullptr), m_animationRadius(0)
{
this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
this->setAttribute(Qt::WA_TranslucentBackground);
this->setAttribute(Qt::WA_DeleteOnClose);
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)
{
QPoint translatePoint = point - QPoint(RADIUS, RADIUS);
@@ -196,7 +193,7 @@ void WaterDrop::paintEvent(QPaintEvent *event)
pen.setColor(QColor(0xffffff80));
pen.setWidth(5);
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)

View File

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

View File

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

View File

@@ -1,10 +1,26 @@
#include "webenginepage.h"
#include <QDesktopServices>
#include <QWebEngineSettings>
#include <QWebEngineProfile>
WebEnginePage::WebEnginePage(QObject *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()
@@ -13,7 +29,8 @@ WebEnginePage::~WebEnginePage()
void WebEnginePage::setUrl(const QUrl &url)
{
if (m_currentUrl == url) {
if (m_currentUrl == url)
{
return;
}
@@ -32,7 +49,8 @@ QWebEnginePage *WebEnginePage::createWindow(QWebEnginePage::WebWindowType type)
void WebEnginePage::slotUrlChanged(const QUrl &url)
{
if (m_currentUrl == url) {
if (m_currentUrl == url)
{
sender()->deleteLater();
return;
}

View File

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

View File

@@ -1,26 +1,39 @@
#!/bin/bash
if [ "$(id -u)" != "0" ];then
pkexec "$0" "$@"
exit
if [ "$(id -u)" != "0" ] ; then
pkexec "$0" "$@"
exit
fi
case $1 in
ssupdate)
aptss ssupdate 2>&1 | tee /tmp/spark-store-app-ssupdate-log.txt
IS_SSUPDATE_ERROR=`cat /tmp/spark-store-app-ssupdate-log.txt | grep "E: "`
echo "$IS_SSUPDATE_ERROR" > /tmp/spark-store-app-ssupdate-status.txt
aptss ssupdate 2>&1 | tee /tmp/spark-store-app-ssupdate-log.txt
IS_SSUPDATE_ERROR=`cat /tmp/spark-store-app-ssupdate-log.txt | grep "E: "`
echo "$IS_SSUPDATE_ERROR" > /tmp/spark-store-app-ssupdate-status.txt
;;
upgradable-list)
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 list --upgradable -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" | awk 'BEGIN {FS="/"} {print $1}' | awk NR\>1
output=$(env LANGUAGE=en_US 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 list --upgradable -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="/dev/null" -o APT::Get::List-Cleanup="0" | awk NR\>1)
IFS_OLD="$IFS"
IFS=$'\n'
for line in $output ; do
PKG_NAME=$(echo $line | awk -F '/' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $6}' | awk -F ']' '{print $1}')
echo "${PKG_NAME} ${PKG_NEW_VER} ${PKG_CUR_VER}"
done
IFS="$IFS_OLD"
;;
upgrade-app)
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."`
echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."`
echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt
;;
clean-log)
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt
;;
esac

View File

@@ -1,58 +1,82 @@
#!/bin/bash
touch /tmp/spark-store/upgradeStatus.txt
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="正在检查更新,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` != "0" ];then
echo "无错误"
# 执行 apt update
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="正在检查更新,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then
echo "无错误"
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
else
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
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
exit
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
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
rm -f /tmp/spark-store/upgradeStatus.txt
exit
fi
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
####如果没更新,就弹出不需要更新
if [ -z "$PKG_LIST" ];then
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
# 获取可更新应用列表
PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
## 如果没更新,就弹出不需要更新
if [ -z "$PKG_LIST" ] ; then
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
PKG_UPGRADE_LIST=`for PKG_NAME in $PKG_LIST;
do
#### 检测是否是hold状态
if [ "$(dpkg-query -W -f='${Status}' $PKG_NAME | grep hold)" = "" ];then
echo "true"
echo "$PKG_NAME"
echo "$PKG_NAME"
else
echo "false"
echo "$PKG_NAME(无法更新:已被标记为保留)"
echo "$PKG_NAME"
## 获取用户选择的要更新的应用
### 指定分隔符为 \n
IFS_OLD="$IFS"
IFS=$'\n'
PKG_UPGRADE_LIST=`for line in $PKG_LIST ; do
PKG_NAME=$(echo $line | awk -F ' ' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $3}')
dpkg --compare-versions $PKG_NEW_VER le $PKG_CUR_VER
if [ $? -eq 0 ] ; then
continue
fi
done | zenity --list --text="选择你想更新的应用" --column=是否更新 --column=应用包名 --column="真的应用包名" --separator=" " --checklist --print-column=3 --multiple --height 350 --width 550 --hide-column=3 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg`
#### 检测是否是 hold 状态
PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME)
if [ "$PKG_STA" != "hold" ] ; then
echo "true"
echo "$PKG_NAME"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
else
echo "false"
echo "$PKG_NAME(无法更新:已被标记为保留)"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
fi
done`
#### 如果没有选择,则直接退出
### 还原分隔符
IFS="$IFS_OLD"
if [ "$PKG_UPGRADE_LIST" = "" ];then
zenity --info --text "没有选中任何软件\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
## 如果没有应用需要更新,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="选择你想更新的应用" --column="是否更新" --column="包名" --column="新版本" --column="从该版本更新" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg)
## 如果没有选择,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "没有选中任何软件\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
### 更新用户选择的应用
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE_LIST -y | zenity --progress --auto-close --no-cancel --pulsate --text="正在更新已选中的应用,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE_LIST -y | zenity --progress --auto-close --no-cancel --pulsate --text=正在更新已选中的应用,请稍候... --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ];then
zenity --info --text "选中的软件已经更新完毕" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
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-upgrade-log.txt --checkbox="我已复制了此文本框中的日志,且将会在反馈时附上 。反馈渠道可以在右上角菜单的设置中找到" --title="反馈渠道在商店右上角的设置里往下拉" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
#### 更新成功
if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ] ; then
zenity --info --text "选中的软件已经更新完毕" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
#### 更新异常
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-upgrade-log.txt --checkbox="我已复制了此文本框中的日志,且将会在反馈时附上 。反馈渠道可以在右上角菜单的设置中找到" --title="反馈渠道在商店右上角的设置里往下拉" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
fi
fi
fi
fi
fi
fi
rm -f touch /tmp/spark-store/upgradeStatus.txt
####从最开头
rm -f /tmp/spark-store/upgradeStatus.txt
# 从最开头

View File

@@ -1,96 +1,93 @@
#!/bin/bash
set -e
LANG=en.US
LANGUAGE=en_US
# 发送通知
function notify-send() {
#Detect the name of the display in use
# Detect name of the display in use
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
#Detect the user using such display
# Detect user using the display
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
#Detect the id of the user
# Detect uid of the user
local uid=$(id -u $user)
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "$@"
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
}
#检测网络链接畅通
# 检测网络链接畅通
function network()
{
#超时时间
# 超时时间
local timeout=15
#目标网站
# 目标网站
local target=www.baidu.com
#获取响应状态码
# 获取响应状态码
local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`
if [ "x$ret_code" = "x200" ]; then
#网络畅通
if [ "x$ret_code" = "x200" ] ; then
# 网络畅通
return 0
else
#网络不畅通
# 网络不畅通
return 1
fi
return 0
}
network
if [ $? -eq 1 ];then
echo "Network fail. Stop to avoid bother dpkg"
exit -1
if [ $? -ne 0 ] ; then
echo "Network fail. Stop to avoid bother dpkg"
exit -1
fi
#The code above is modified from https://blog.csdn.net/yaxuan88521/article/details/120516298
# The code above is modified from https://blog.csdn.net/yaxuan88521/article/details/120516298
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"
# 每日更新星火源文件
mkdir -p /etc/apt/preferences.d
touch /etc/apt/preferences.d/sparkstore
cat << EOF >/etc/apt/preferences.d/sparkstore
Package: *
Pin: origin *.deepinos.org.cn
Pin-Priority: 100
EOF
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`
rm /etc/apt/preferences.d/sparkstore
isupdate=`echo ${updatetext: -5}`
if [ "$isupdate" = "date." ];then
exit 0
if [ "$isupdate" = "date." ] ; then
exit 0
fi
#### 从这里开始,只有检测到了更新才会进行
## 从这里开始,只有检测到了更新才会进行
update_app_number=`echo ${updatetext%package*} #从右向左截取第一个 src 后的字符串`
update_app_number=`echo ${update_app_number##*information...}`
# 获取用户选择的要更新的应用
PKG_LIST="$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
# 指定分隔符为 \n
IFS_OLD="$IFS"
IFS=$'\n'
PKG_LIST="$(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 list --upgradable -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" | awk 'BEGIN {FS="/"} {print $1}' | awk NR\>1)"
for line in $PKG_LIST ; do
PKG_NAME=$(echo $line | awk -F ' ' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $3}')
dpkg --compare-versions $PKG_NEW_VER le $PKG_CUR_VER
if [ $? -eq 0 ] ; then
let update_app_number=$update_app_number-1
continue
fi
for PKG_NAME in $PKG_LIST;do
if [ "$(dpkg-query -W -f='${Status}' $PKG_NAME | grep hold)" != "" ];then
let update_app_number=$update_app_number-1
echo $update_app_number
echo $PKG_NAME
fi
## 检测是否是 hold 状态
PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME)
if [ "$PKG_STA" = "hold" ] ; then
let update_app_number=$update_app_number-1
fi
done
# 还原分隔符
IFS="$IFS_OLD"
if [ $update_app_number -lt 1 ];then
exit
if [ $update_app_number -le 0 ] ; then
exit 0
fi
#### 如果都是hold的那就直接退出否则把剩余的给提醒了
notify-send -i spark-store "星火更新提醒" "星火商店仓库中有$update_app_number个软件包可以更新啦!请到星火商店的菜单处理"
## 如果都是hold或者版本一致的那就直接退出否则把剩余的给提醒了
notify-send -a spark-store "星火更新提醒" "星火商店仓库中有$update_app_number个软件包可以更新啦!请到星火商店的菜单处理"