Merge pull request !185 from shenmo/dev
This commit is contained in:
shenmo 2023-02-13 07:37:43 +00:00 committed by Gitee
commit ee0d3f87ec
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
32 changed files with 1580 additions and 633 deletions

36
debian/changelog vendored
View File

@ -1,3 +1,21 @@
spark-store (4.2.3~test2) stable; urgency=medium
* 调整:开启安装包加固
* 添加zh_TW翻译
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test1) stable; urgency=medium
* 修复因判断安装状态错误创建多个相同任务的bug
* 测试中:尝试修复安装结束的闪退问题 https://gitee.com/deepin-community-store/spark-store/commit/cb093dcc2bb0a193db89aa0ce5f20ea9cc5d56eb
* 修复Deepin 显示开发者模式未开启
* 修复:从托盘打开主窗口时透明度动画不流畅
* 修复:主窗口关闭后,从托盘打开关于窗口会被主窗口遮挡
-- shenmo <shenmo@spark-app.store> Sun, 05 Feb 2023 23:00:00 +0800
spark-store (4.2.2) stable; urgency=medium
* 调整脚本应用的transhell支持转为source导入
@ -5,7 +23,7 @@ spark-store (4.2.2) stable; urgency=medium
* 新增:应用托盘,下载时候可以放心关闭窗口了
* 新增支持spk://search/内容 格式链接
--shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.1) stable; urgency=medium
@ -14,7 +32,8 @@ spark-store (4.2.1) stable; urgency=medium
* 修复因依赖不完全导致在LinuxMint下无法下载统计
* 新增:脚本系列应用支持英文
--shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2) stable; urgency=medium
@ -23,7 +42,8 @@ spark-store (4.2) stable; urgency=medium
* 调整dwine5标签的文案改为Wine应用
* 新增:更新软件时弹窗会显示正在更新的软件包名
--shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2~test3) stable; urgency=medium
@ -31,6 +51,7 @@ spark-store (4.2~test3) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2~test2) stable; urgency=medium
* 修复: 420t1版本中ssinstall有时会重新下载软件包的问题
@ -38,8 +59,10 @@ spark-store (4.2~test2) stable; urgency=medium
* 调整: aptss在进行任何操作前均检测是否存在Packages文件若存在则不进行ssupdate
* 调整: 修改apt-fast源代码以指定conf位置为/tmp/apt-fast,这部分不再使用bwrap模拟
* 新增: aptss检测Package文件支持分目录目前指定为store
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2~test1) stable; urgency=medium
* 新增: aptss支持显示报错
@ -48,6 +71,7 @@ spark-store (4.2~test1) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.2) stable; urgency=medium
* feat: 初步的wayland支持
@ -80,10 +104,9 @@ spark-store (4.1.2) stable; urgency=medium
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
* chore: 更新翻译文件,去除已经不存在的翻译
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.2~test2) stable; urgency=medium
* feat: ssinstall支持从单独文件夹中校验软件包
@ -92,6 +115,7 @@ spark-store (4.1.2~test2) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.1.2~test1) stable; urgency=medium
* feat: 初步的wayland支持
@ -121,7 +145,6 @@ spark-store (4.1.2~test1) stable; urgency=medium
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
* chore: 更新翻译文件,去除已经不存在的翻译
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
@ -206,6 +229,7 @@ spark-store (3.3.3~test3) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (3.3.3~test2) stable; urgency=medium
* bug fix: 更新和检查更新出错时不报错.此更新需要一个推送

1
debian/rules vendored
View File

@ -1,6 +1,7 @@
#!/usr/bin/make -f
export QT_SELECT=5
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
include /usr/share/dpkg/default.mk
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)

View File

@ -36,7 +36,7 @@ case "$1" in
echo "Compiling the Sender module..."
gcc /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
gcc -Wformat -Wformat-security -Werror=format-security /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
# Install key
mkdir -p /tmp/spark-store-install/

View File

@ -1,7 +1,7 @@
From abbfbf12c1ea9853039e6864d0ede91973189ce6 Mon Sep 17 00:00:00 2001
From 2d49950909e0327b0ad72e008cb82ac97b7bae0e Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Sun, 11 Dec 2022 22:27:23 +0800
Subject: [PATCH 01/10] =?UTF-8?q?repo:=20=E4=B8=80=E6=AC=A1=E6=80=A7?=
Subject: [PATCH 01/11] =?UTF-8?q?repo:=20=E4=B8=80=E6=AC=A1=E6=80=A7?=
=?UTF-8?q?=E5=AF=BC=E5=85=A5=20spark=20=E9=AA=A8=E6=9E=B6=E4=BB=A5?=
=?UTF-8?q?=E5=8F=98=E4=B8=BA=20cmake=20=E6=9E=84=E5=BB=BA?=
MIME-Version: 1.0
@ -1789,10 +1789,10 @@ index 0000000..0fa070b
2.20.1
From d1974334ce60291894b53f6839b78f3147aaa233 Mon Sep 17 00:00:00 2001
From d2524f967848e6ba0d2c8a097183264d0d197d68 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Sun, 11 Dec 2022 22:37:26 +0800
Subject: [PATCH 02/10] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20deb=20?=
Subject: [PATCH 02/11] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20deb=20?=
=?UTF-8?q?=E5=AE=89=E8=A3=85=E8=84=9A=E6=9C=AC=E7=9A=84=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=88=90=20cmake=20=E5=8C=96=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA?=
@ -1856,10 +1856,10 @@ index 2ab24e7..38ad2d7 100644
2.20.1
From 5a978c7db6c34d7dcd4aa56d94605e51245004a5 Mon Sep 17 00:00:00 2001
From 7cd97a939b63143921936b9db3978d14f18a4f33 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 12 Dec 2022 00:50:01 +0800
Subject: [PATCH 03/10] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20Spark=20?=
Subject: [PATCH 03/11] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20Spark=20?=
=?UTF-8?q?=E6=9E=84=E5=BB=BA=20=E4=B8=8E=20CMake=20=E6=9E=84=E5=BB=BA?=
=?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=A2=84=E8=A7=88=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
@ -2184,10 +2184,10 @@ index 0000000..a807009
2.20.1
From 4b5b4bc91a42cc860efbe1728f2dba9f255ea954 Mon Sep 17 00:00:00 2001
From bb128568ab7d1463c0002ffff470ad5c93364c99 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Thu, 15 Dec 2022 19:59:46 +0800
Subject: [PATCH 04/10] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
Subject: [PATCH 04/11] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
=?UTF-8?q?=E4=BA=8E=20Qt5=20Svg=20=E4=BE=9D=E8=B5=96=E7=9A=84=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA=E5=86=85=E5=AE=B9?=
MIME-Version: 1.0
@ -2236,10 +2236,10 @@ index b56399f..67e29b6 100644
2.20.1
From ede820a7267afa113a2d8b4f93f45fa6c1b4b23b Mon Sep 17 00:00:00 2001
From 877a52f4b753f55e087a6c58794d690fabb6ddbb Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 19 Dec 2022 02:58:17 +0800
Subject: [PATCH 05/10] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
Subject: [PATCH 05/11] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
=?UTF-8?q?=E4=BA=8E=E6=94=AF=E6=8C=81=20BaseWidgetOpacity=20=E5=9F=BA?=
=?UTF-8?q?=E7=A1=80=E7=B1=BB=E7=9A=84=E6=9E=84=E5=BB=BA?=
MIME-Version: 1.0
@ -2283,10 +2283,10 @@ index 14530e1..b5e32d8 100644
2.20.1
From b63790722efa275977b2033a1beeb21b730c1895 Mon Sep 17 00:00:00 2001
From f89bb6a145f2a77fa0e1b55b3ad17ade69c53a69 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 20:48:25 +0800
Subject: [PATCH 06/10] =?UTF-8?q?spark:=20=E5=88=9B=E5=BB=BA=E6=96=B0?=
Subject: [PATCH 06/11] =?UTF-8?q?spark:=20=E5=88=9B=E5=BB=BA=E6=96=B0?=
=?UTF-8?q?=E7=9A=84=E6=A8=A1=E5=9D=97=E7=94=A8=E4=BA=8E=20debian/changelo?=
=?UTF-8?q?g=20=E7=9A=84=E7=89=88=E6=9C=AC=E5=8F=B7=E9=87=8D=E5=86=99?=
=?UTF-8?q?=E8=A7=84=E5=88=99?=
@ -2388,10 +2388,10 @@ index 0000000..9d8bca2
2.20.1
From cca243c18b125a0e24a08c06a358ee04f0861884 Mon Sep 17 00:00:00 2001
From b26bac7572ab7477ab4b94174fbdece759be8bc7 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 21:23:15 +0800
Subject: [PATCH 07/10] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkDebianChangelog?=
Subject: [PATCH 07/11] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkDebianChangelog?=
=?UTF-8?q?Version.cmake=20=E6=A8=A1=E5=9D=97=E7=9A=84=E6=89=A9=E5=B1=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@ -2459,10 +2459,10 @@ index 9d8bca2..65e1c16 100644
2.20.1
From f3595a55f567fc01a5928fea8e4b89f99cf8793e Mon Sep 17 00:00:00 2001
From 26f00f79a2b8613477059beb6c2f492bc24a7bb5 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 23:17:24 +0800
Subject: [PATCH 08/10] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20v4.2.2=20?=
Subject: [PATCH 08/11] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20v4.2.2=20?=
=?UTF-8?q?=E7=89=88=E6=9C=AC=E6=97=B6=E6=9C=9F=E6=96=B0=E5=A2=9E=E7=9A=84?=
=?UTF-8?q?=E5=AE=89=E8=A3=85=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
@ -2509,10 +2509,10 @@ index bbb958a..c7ea53b 100644
2.20.1
From da9ef6f95ea7be97595b1e3285ac8e98a34c8c0a Mon Sep 17 00:00:00 2001
From e4401b16037cb3b1b10c59f4c7a0fa3c2cd563b3 Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 23:18:44 +0800
Subject: [PATCH 09/10] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkTranslatorConfi?=
Subject: [PATCH 09/11] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkTranslatorConfi?=
=?UTF-8?q?g.cmake=20=E6=A8=A1=E5=9D=97=E7=9A=84=E6=89=A9=E5=B1=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@ -2544,10 +2544,10 @@ index 272dd9d..689e70d 100644
2.20.1
From 22eea0e930a073cac8e6dd750b6389044668dcd6 Mon Sep 17 00:00:00 2001
From 2d8046099776e3909359ce49818ae28378af930c Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Mon, 30 Jan 2023 23:20:12 +0800
Subject: [PATCH 10/10] =?UTF-8?q?make:=20=E5=A4=84=E7=90=86=E9=BB=98?=
Subject: [PATCH 10/11] =?UTF-8?q?make:=20=E5=A4=84=E7=90=86=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=20make=20=E7=9B=AE=E6=A0=87=E4=B8=BA=20override-versi?=
=?UTF-8?q?on=20=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
@ -2594,3 +2594,36 @@ index 81ca078..076502c 100644
--
2.20.1
From 043e6fb78e2bcb1a6fecefe2ba9aceb9df84e96e Mon Sep 17 00:00:00 2001
From: zinface <zinface@163.com>
Date: Sun, 5 Feb 2023 16:09:40 +0800
Subject: [PATCH 11/11] =?UTF-8?q?spark:=20=E5=A4=84=E7=90=86=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E5=8F=B7=204.2.3~test1=20=E6=97=B6=E9=BB=98=E8=AE=A4?=
=?UTF-8?q?=E7=9A=84=E6=88=AA=E5=8F=96=E5=AD=97=E7=AC=A6=E6=95=B0=E8=BF=87?=
=?UTF-8?q?=E7=9F=AD=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
cmake/SparkDebianChangelogVersion.cmake | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/cmake/SparkDebianChangelogVersion.cmake b/cmake/SparkDebianChangelogVersion.cmake
index 65e1c16..3ed5fa2 100644
--- a/cmake/SparkDebianChangelogVersion.cmake
+++ b/cmake/SparkDebianChangelogVersion.cmake
@@ -40,7 +40,8 @@ macro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
message("> V = ${CHANGELOG_FILE_PATH}")
if(CHANGELOG_FILE_EXISTS)
- file(READ ${CHANGELOG_FILE_PATH} CHANGELOG_CONTENT LIMIT 20)
+ file(READ ${CHANGELOG_FILE_PATH} CHANGELOG_CONTENT LIMIT 30)
+ # fix: spark-store (4.2.3~test1) 已经超过 20 字符位,所以使用 30 进行保守计算
string(FIND ${CHANGELOG_CONTENT} "(" V_PRE) # +1 to V_BEGIN
string(FIND ${CHANGELOG_CONTENT} ")" V_END)
--
2.20.1

View File

@ -66,3 +66,9 @@ INSTALLS += \
bash_completion \
polkit-1
# 暂时不添加
# https://wiki.debian.org/Hardening
QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS)
QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS)
QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS)
QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS)

View File

@ -1,4 +1,5 @@
#include "application.h"
#include "mainwindow-dtk.h"
#include <DPlatformWindowHandle>
#include <DLog>
@ -46,7 +47,7 @@ Application::Application(int &argc, char **argv)
void Application::handleAboutAction()
{
if (aboutDialog()) {
if (aboutDialog() && aboutDialog()->parent() == m_mainWindow) {
DApplication::handleAboutAction();
return;
}
@ -81,10 +82,30 @@ void Application::setVersionAndBuildDateTime(const QString &version, const QStri
setApplicationVersion(DApplication::buildVersion(config.value("build/version").toString() + "-" + "Flamescion" + "-" + config.value("build/time").toString()));
}
void Application::setMainWindow(MainWindow *window)
{
m_mainWindow = window;
if (aboutDialog() == nullptr || aboutDialog()->parent() != m_mainWindow)
{
initAboutDialog();
}
}
void Application::initAboutDialog()
{
if (m_mainWindow == nullptr)
{
return;
}
if (aboutDialog())
{
aboutDialog()->deleteLater();
setAboutDialog(nullptr);
}
// 自定义 DAboutDialog
DAboutDialog *dialog = new DAboutDialog(activeWindow());
DAboutDialog *dialog = new DAboutDialog(m_mainWindow);
dialog->setProductName(productName());
dialog->setProductIcon(productIcon());
dialog->setVersion(translate("DAboutDialog", "Version: %1").arg(applicationVersion()));

View File

@ -5,6 +5,7 @@
DWIDGET_USE_NAMESPACE
class MainWindow;
class Application : public DApplication
{
Q_OBJECT
@ -16,6 +17,7 @@ public:
static void checkAppConfigLocation();
void setVersionAndBuildDateTime(const QString &version, const QString &buildDateTime);
void setMainWindow(MainWindow *window);
private:
void initAboutDialog();
@ -23,6 +25,8 @@ private:
private:
QString m_version;
QString m_buildDateTime;
MainWindow *m_mainWindow = nullptr;
};
#endif // APPLICATION_H

View File

@ -145,17 +145,19 @@ void DownloadController::startDownload(const QString &url)
command.append(aria2NoSeeds.toUtf8());
}
qDebug() << command;
auto cmd = new QProcess(this);
cmd->setProcessChannelMode(QProcess::MergedChannels);
cmd->setProgram("aria2c");
cmd->setArguments(command);
cmd->start();
cmd->waitForStarted(); //等待启动完成
QObject::connect(cmd, &QProcess::readyReadStandardOutput, [&]()
bool downloadSuccess = true;
QProcess cmd;
cmd.setProcessChannelMode(QProcess::MergedChannels);
cmd.setProgram("aria2c");
cmd.setArguments(command);
cmd.start();
cmd.waitForStarted(-1); //等待启动完成
connect(&cmd, &QProcess::readyReadStandardOutput, [&]()
{
//通过读取输出计算下载速度
QString message = cmd->readAllStandardOutput().data();
QString message = cmd.readAllStandardOutput().data();
// qDebug() << message;
message = message.replace(" ", "");
QStringList list;
@ -195,17 +197,21 @@ void DownloadController::startDownload(const QString &url)
emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
}
});
QObject::connect(cmd, &QProcess::readyReadStandardError, [&]()
connect(&cmd, &QProcess::readyReadStandardError, [&]()
{
emit errorOccur(cmd->readAllStandardError().data());
return;
emit errorOccur(cmd.readAllStandardError().data());
downloadSuccess = false;
cmd.close();
});
auto pidNumber = cmd->processId();
this->pidNumber = pidNumber;
while (cmd->waitForFinished(-1))
pidNumber = cmd.processId();
cmd.waitForFinished(-1);
cmd.close();
if(!downloadSuccess)
{
continue;
return;
}
// 统计下载量
@ -218,7 +224,7 @@ void DownloadController::startDownload(const QString &url)
mailProcess.start(SenderdPath.toUtf8(), QStringList() << metaUrl << "HD70642");
mailProcess.waitForStarted();
mailProcess.waitForFinished(3000);
mailProcess.deleteLater();
mailProcess.close();
emit downloadFinished(); });
}

View File

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

View File

@ -1,5 +1,6 @@
#include "application.h"
#include "mainwindow-dtk.h"
#include "utils/utils.h"
#include <DSysInfo>
#include <DApplicationSettings>
@ -14,85 +15,24 @@
DCORE_USE_NAMESPACE
DWIDGET_USE_NAMESPACE
#define UOSCheckFile "/var/lib/deepin/developer-mode/enabled"
int main(int argc, char *argv[])
{
// Get build time
static const QString version = "4.2.2";
static const QString version = "4.2.3";
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
// 设置桌面环境环境变量
bool isDeepinOS = true;
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
{
qputenv("XDG_CURRENT_DESKTOP", "Deepin");
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;
}
// NOTE: 提前设置组织名称和应用名称,避免配置文件位置错误
DApplication::setOrganizationName("spark-union");
DApplication::setApplicationName("spark-store");
Application::checkAppConfigLocation(); // 检查 ~/.config/spark-union/spark-store 文件夹是否存在
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
config.setValue("build/isWayland", isWayland);
config.setValue("build/isDeepinOS", isDeepinOS);
// Check config file, if there is no wayland config, then set it to default, which means use wayland if possible.
if (!config.contains("build/useWayland"))
{
config.setValue("build/useWayland", true);
}
config.sync(); // 写入更改至 config.ini并同步最新内容
bool useWayland = config.value("build/useWayland").toBool();
qDebug() << "System Wayland enabled:" << isWayland << ". Spark Wayland enabled:" << useWayland;
// 初始化 config.ini 配置文件
Utils::initConfig();
// Set display backend
if (isWayland && useWayland && !(Dtk::Core::DSysInfo::isDDE() || isDeepinOS))
{
qputenv("QT_QPA_PLATFORM", "wayland");
}
else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDDE() && isDeepinOS))
{
qputenv("QT_QPA_PLATFORM", "dwayland");
}
else
{
qputenv("QT_QPA_PLATFORM", "dxcb");
}
// Check UOS developer mode.
QFile UOSDevelopFile(UOSCheckFile);
if (isDeepinOS && UOSDevelopFile.exists() && UOSDevelopFile.open(QFile::ReadOnly | QFile::Text))
{
config.setValue("UOS/isUOS", true);
QString lineData = UOSDevelopFile.readLine();
bool devmode = lineData.trimmed().toInt();
qDebug() << "UOS Developer Mode Status:" << devmode;
config.setValue("UOS/EnableDeveloperMode", devmode);
}
else
{
if (config.contains("UOS/isUOS"))
{
config.remove("UOS/isUOS");
config.remove("UOS/EnableDeveloperMode");
}
}
UOSDevelopFile.close();
config.sync(); // 写入更改至 config.ini并同步最新内容
Utils::setQPAPlatform();
// 龙芯机器配置,使得 DApplication 能正确加载 QTWEBENGINE
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
@ -131,6 +71,7 @@ int main(int argc, char *argv[])
DApplicationSettings settings; // 定义 DApplicationSettings自动保存主题设置
MainWindow w;
a.setMainWindow(&w); // 设置应用程序主窗口,用于初始化关于对话框
// 让打开时界面显示在正中
Dtk::Widget::moveToCenter(&w);

View File

@ -11,6 +11,7 @@
#include <DGuiApplicationHelper>
#include <QAbstractButton>
#include <QtConcurrent>
#define AppPageApplist 0
#define AppPageSearchlist 1
@ -74,10 +75,7 @@ void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
{
Q_UNUSED(pid)
if (arguments.size() > 1)
{
onGetUrl(arguments.value(1));
}
onGetUrl(arguments.value(1, ""));
}
void MainWindow::openUrl(const QString &url)
@ -141,7 +139,7 @@ void MainWindow::initTitleBar()
ly_titlebar->addWidget(backButton);
// Check wayland configs
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (!config.value("build/isDeepinOS").toBool() && config.value("build/useWayland").toBool())
if (!config.value("runtime/isDDE").toBool() && config.value("runtime/useWayland").toBool())
{
// Wayland 搜索栏居中
ly_titlebar->addStretch(WaylandSearchCenter);
@ -218,8 +216,9 @@ void MainWindow::initLeftMenu()
void MainWindow::initTrayIcon()
{
QMenu *menu = new QMenu(this);
trayIcon->setToolTip(tr("Spark Store"));
QMenu *menu = new QMenu(this);
QAction *showAction = new QAction(QObject::tr("Show MainWindow"), menu);
QAction *aboutAction = new QAction(qApp->translate("TitleBarMenu", "About"), menu);
QAction *exitAction = new QAction(qApp->translate("TitleBarMenu", "Exit"), menu);

View File

@ -1,82 +1,40 @@
#include "appintopage.h"
#include "ui_appintopage.h"
AppIntoPage::AppIntoPage(QWidget *parent) : QWidget(parent),
ui(new Ui::AppIntoPage)
#include "backend/sparkapi.h"
#include "widgets/downloadlistwidget.h"
#include "backend/image_show.h"
#include "application.h"
#include <QtConcurrent>
#include <QClipboard>
AppIntoPage::AppIntoPage(QWidget *parent)
: QWidget(parent)
, ui(new Ui::AppIntoPage)
, api(new SparkAPI(this))
{
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)
{
download_times.remove(QRegExp("\\n"));
ui->download_times->setText(download_times);
qDebug()<<"Download Times:"+download_times; });
clear();
initUI();
initConnections();
}
void AppIntoPage::clear()
AppIntoPage::~AppIntoPage()
{
ui->tag_a2d->hide();
ui->tag_uos->hide();
ui->tag_dtk5->hide();
ui->tag_deepin->hide();
ui->tag_dwine2->hide();
ui->tag_dwine5->hide();
ui->tag_ubuntu->hide();
ui->tag_community->hide();
ui->icon->clear();
ui->title->clear();
ui->author->clear();
ui->label_2->clear();
ui->downloadButton->hide();
ui->downloadButton->setEnabled(false);
ui->pushButton_3->hide();
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;
delete item;
item = NULL;
}
ui->listWidget->clear();
delete ui;
}
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
{
dw = w;
connect(w, &DownloadListWidget::downloadFinished, [=]()
{ isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); });
}
void AppIntoPage::openUrl(QUrl url)
void AppIntoPage::openUrl(const QUrl &url)
{
clear();
// qDebug() << url;
spk = url;
SparkAPI *api = new SparkAPI(this);
clear();
connect(api, &SparkAPI::finishedObject, [=](QJsonObject appinfo)
{
SparkAPI *api1 = new SparkAPI(this);
connect(api1, &SparkAPI::finishedObject, [=](const QJsonObject &appinfo)
{
info = appinfo;
// qDebug()<<url;
//获取图标
QNetworkRequest request;
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
qDebug()<<api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png";
request.setUrl(QUrl(api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png"));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
naManager->get(request);
QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
QByteArray jpegData = reply->readAll();
iconpixmap.loadFromData(jpegData);
iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->icon->setPixmap(iconpixmap);
ui->icon->setScaledContents(true);
});
// 显示基本信息
ui->title->setText(info["Name"].toString());
ui->version->setText(info["Version"].toString());
ui->author->setText(info["Author"].toString());
@ -84,10 +42,66 @@ void AppIntoPage::openUrl(QUrl url)
ui->d_size->setText(info["Size"].toString());
ui->d_update->setText(info["Update"].toString());
ui->d_pkgname->setText(info["Pkgname"].toString());
ui->d_website->setText("<a href=\""+info["Website"].toString()+"\">"+tr("Click Open"));
ui->d_website->setText("<a href=\"" + info["Website"].toString() + "\">" + tr("Click Open"));
ui->d_contributor->setText(info["Contributor"].toString());
ui->label_2->setText(info["More"].toString());
// 显示 tags
QStringList taglist = info["Tags"].toString().split(";", QString::SkipEmptyParts);
setAppinfoTags(taglist);
// 获取图标
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
qDebug() << api->getImgServerUrl() + "store" + url.path() + "/icon.png";
request.setUrl(QUrl(api->getImgServerUrl() + "store" + url.path() + "/icon.png"));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
manager->get(request);
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
QByteArray jpegData = reply->readAll();
iconpixmap.loadFromData(jpegData);
iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->icon->setPixmap(iconpixmap);
ui->icon->setScaledContents(true);
manager->deleteLater(); });
// 获取截图
QJsonParseError error;
QJsonArray array = QJsonDocument::fromJson(info.value("img_urls").toString().toUtf8(), &error).array();
QStringList imglist;
foreach (const QJsonValue &value, array) {
QString imgUrl = value.toString();
imglist.append(imgUrl);
}
qDebug() << imglist;
for (int i = 0; i < imglist.size(); i++)
{
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
request.setUrl(QUrl(imglist.value(i)));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
manager->get(request);
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
QByteArray jpegData = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(jpegData);
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
image_show *img=new image_show(this);
img->setImage(pixmap);
//img->setScaledContents(true);
QListWidgetItem* pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(280, 200));
ui->listWidget->addItem(pItem);
ui->listWidget->setItemWidget(pItem, img);
manager->deleteLater(); });
}
// Check UOS
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
@ -135,108 +149,181 @@ void AppIntoPage::openUrl(QUrl url)
isUpdated = false;
}
QObject::connect(naManager, &QNetworkAccessManager::finished, [=]()
{
if (isInstalled)
if (isInstalled)
{
if (isUpdated)
{
if (isUpdated)
{
ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
}
else
{
ui->downloadButton->setText(tr("Upgrade"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
}
ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
ui->pushButton_3->show();
}
else
{
ui->downloadButton->setText(tr("Download"));
ui->downloadButton->setText(tr("Upgrade"));
ui->downloadButton->setEnabled(true);
isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
ui->downloadButton->show();
} });
ui->pushButton_3->show();
}
}
else
{
ui->downloadButton->setText(tr("Download"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
}
isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
}
QStringList taglist = info["Tags"].toString().split(";");
QString tmp=info["img_urls"].toString();
qDebug() << tmp;
if (tmp.left(2) == "[\"")
{
tmp.remove(0, 2);
}
if (tmp.right(2) == "\"]")
{
tmp.remove(tmp.size() - 2, tmp.size());
}
QStringList imglist = tmp.split("\",\"");
qDebug() << imglist;
for (int i = 0; i < imglist.size(); i++)
{
QNetworkRequest request;
QNetworkAccessManager *iconNaManager = new QNetworkAccessManager(this);
request.setUrl(QUrl(imglist[i].replace("+", "%2B")));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
iconNaManager->get(request);
QObject::connect(iconNaManager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
QByteArray jpegData = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(jpegData);
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
image_show *img=new image_show(this);
img->setImage(pixmap);
//img->setScaledContents(true);
QListWidgetItem* pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(280, 200));
ui->listWidget->addItem(pItem);
ui->listWidget->setItemWidget(pItem, img);
});
}
this->sltAppinfoTags(&taglist);
disconnect(api,&SparkAPI::finished,nullptr,nullptr);
api->deleteLater(); });
api->getAppInfo(url);
api1->getAppDownloadTimes(url);
api1->disconnect();
api1->deleteLater(); });
api1->getAppInfo(url);
api->getAppDownloadTimes(url);
}
void AppIntoPage::isDownloading(QUrl url)
void AppIntoPage::clear()
{
if (dw->getUrlList().lastIndexOf(url) == -1)
ui->tag_a2d->hide();
ui->tag_uos->hide();
ui->tag_dtk5->hide();
ui->tag_deepin->hide();
ui->tag_dwine2->hide();
ui->tag_dwine5->hide();
ui->tag_ubuntu->hide();
ui->tag_community->hide();
ui->icon->clear();
ui->title->clear();
ui->author->clear();
ui->label_2->clear();
ui->downloadButton->hide();
ui->downloadButton->setEnabled(false);
ui->pushButton_3->hide();
// QListWidgetItem *item = nullptr;
// while ((item = ui->listWidget->takeItem(0)) != nullptr)
// {
// QWidget *card = ui->listWidget->itemWidget(item);
// if (card)
// {
// card->deleteLater();
// card = nullptr;
// }
// delete item;
// item = nullptr;
// }
ui->listWidget->clear(); // NOTE: QListWidget::clear() 会析构所有 items
}
void AppIntoPage::setTheme(bool 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);}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #FFFFFF}";
ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet);
ui->frame_4->setStyleSheet(frameStyleSheet);
ui->icon_1->setPixmap(QPixmap(":/icon/dark/box.svg"));
ui->icon_2->setPixmap(QPixmap(":/icon/dark/box.svg"));
ui->icon_3->setPixmap(QPixmap(":/icon/dark/calendar.svg"));
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);}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #000000}";
ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet);
ui->frame_4->setStyleSheet(frameStyleSheet);
ui->icon_1->setPixmap(QPixmap(":/icon/light/box.svg"));
ui->icon_2->setPixmap(QPixmap(":/icon/light/box.svg"));
ui->icon_3->setPixmap(QPixmap(":/icon/light/calendar.svg"));
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"));
}
}
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
{
if (dw)
{
dw->deleteLater();
dw = nullptr;
}
dw = w;
connect(w, &DownloadListWidget::downloadFinished, [=]()
{ isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); });
}
void AppIntoPage::initUI()
{
ui->setupUi(this);
ui->listWidget->setViewMode(QListView::IconMode);
ui->listWidget->setFlow(QListView::TopToBottom);
ui->listWidget->setMovement(QListView::Static);
ui->listWidget->setMaximumHeight(200);
clear();
}
void AppIntoPage::initConnections()
{
connect(api, &SparkAPI::finishedRAW, [=](QString download_times)
{
download_times = download_times.trimmed();
qDebug() << "Download Times:" + download_times;
ui->download_times->setText(download_times); });
}
void AppIntoPage::isDownloading(const QUrl &url)
{
int index = dw->getUrlList().lastIndexOf(url);
if (index == -1)
{
ui->downloadButton->setEnabled(true);
return;
}
else
DownloadItem *item = dw->getDIList().at(index);
if (item == nullptr)
{
ui->downloadButton->setEnabled(false);
ui->downloadButton->setEnabled(true);
return;
}
ui->downloadButton->setEnabled(false);
ui->pushButton_3->hide();
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 2)
if (item->download == 2)
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Download"));
}
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 1)
if (item->download == 1)
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Install"));
}
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->isInstall)
if (item->isInstall)
{
ui->downloadButton->setEnabled(false);
ui->downloadButton->setText(tr("Installing"));
return;
}
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 3)
if (item->download == 3)
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Reinstall"));
@ -245,9 +332,9 @@ void AppIntoPage::isDownloading(QUrl url)
}
}
void AppIntoPage::sltAppinfoTags(QStringList *tagList)
void AppIntoPage::setAppinfoTags(const QStringList &tagList)
{
foreach (const QString &tag, *tagList)
foreach (const QString &tag, tagList)
{
if (tag == "community")
{
@ -283,69 +370,42 @@ void AppIntoPage::sltAppinfoTags(QStringList *tagList)
}
}
}
void AppIntoPage::setTheme(bool 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);}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #FFFFFF}";
ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet);
ui->frame_4->setStyleSheet(frameStyleSheet);
ui->icon_1->setPixmap(QPixmap(":/icon/dark/box.svg"));
ui->icon_2->setPixmap(QPixmap(":/icon/dark/box.svg"));
ui->icon_3->setPixmap(QPixmap(":/icon/dark/calendar.svg"));
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);}\
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #000000}";
ui->frame->setStyleSheet(frameStyleSheet);
ui->frame_2->setStyleSheet(frameStyleSheet);
ui->frame_3->setStyleSheet(frameStyleSheet);
ui->frame_4->setStyleSheet(frameStyleSheet);
ui->icon_1->setPixmap(QPixmap(":/icon/light/box.svg"));
ui->icon_2->setPixmap(QPixmap(":/icon/light/box.svg"));
ui->icon_3->setPixmap(QPixmap(":/icon/light/calendar.svg"));
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()
{
delete ui;
}
void AppIntoPage::on_downloadButton_clicked()
{
QString downloadUrl = SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString();
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, [=]()
{
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); });
DownloadItem *item = dw->getDIList()[dw->getUrlList().lastIndexOf(downloadUrl)];
if (item == nullptr)
{
return;
}
connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); });
item->install(0);
isDownloading(downloadUrl);
return;
}
emit clickedDownloadBtn();
dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
DownloadItem *item = dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, downloadUrl);
if (item == nullptr)
{
return;
}
if (ui->downloadButton->text() == tr("Reinstall"))
{
dw->getDIList()[dw->allDownload - 1]->reinstall = true;
item->reinstall = true;
}
ui->downloadButton->setEnabled(false);
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());
connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); });
isDownloading(downloadUrl);
}
void AppIntoPage::on_pushButton_3_clicked()
@ -380,9 +440,9 @@ void AppIntoPage::on_pushButton_3_clicked()
void AppIntoPage::on_shareButton_clicked()
{
qDebug() << "Share" << spk;
Application::clipboard()->setText(spk.toString());
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()

View File

@ -1,52 +1,55 @@
#ifndef APPINTOPAGE_H
#define APPINTOPAGE_H
#include <QWidget>
#include <QUrl>
#include <QString>
#include <QtConcurrent>
#include <QClipboard>
#include "backend/sparkapi.h"
#include "backend/image_show.h"
#include "widgets/downloadlistwidget.h"
#include "utils/utils.h"
#include <QWidget>
#include <QJsonObject>
#include <QUrl>
namespace Ui {
class AppIntoPage;
}
class SparkAPI;
class DownloadListWidget;
class AppIntoPage : public QWidget
{
Q_OBJECT
public:
void clear();
void setDownloadWidget(DownloadListWidget *w);
void setTheme(bool dark);
void openUrl(QUrl url);
explicit AppIntoPage(QWidget *parent = nullptr);
~AppIntoPage();
~AppIntoPage() override;
private slots:
void on_downloadButton_clicked();
void on_pushButton_3_clicked();
void on_shareButton_clicked();
void on_updateButton_clicked();
void openUrl(const QUrl &url);
void clear();
void setTheme(bool dark);
void setDownloadWidget(DownloadListWidget *w);
private:
SparkAPI *api1;
QJsonObject info;
QPixmap iconpixmap;
QUrl spk;
void isDownloading(QUrl url);
void sltAppinfoTags(QStringList *tagList);
DownloadListWidget *dw;
Ui::AppIntoPage *ui;
void initUI();
void initConnections();
void isDownloading(const QUrl &url);
void setAppinfoTags(const QStringList &tagList);
signals:
void clickedDownloadBtn();
private slots:
void on_downloadButton_clicked();
void on_pushButton_3_clicked();
void on_shareButton_clicked();
void on_updateButton_clicked();
private:
Ui::AppIntoPage *ui;
SparkAPI *api;
DownloadListWidget *dw = nullptr;
QJsonObject info;
QPixmap iconpixmap;
QUrl spk;
};
#endif // APPINTOPAGE_H

View File

@ -89,7 +89,8 @@ RESOURCES += \
TRANSLATIONS += \
../translations/spark-store_en.ts \
../translations/spark-store_fr.ts \
../translations/spark-store_zh_CN.ts
../translations/spark-store_zh_CN.ts \
../translations/spark-store_zh_TW.ts
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin

View File

@ -1,25 +1,184 @@
#include "utils.h"
#include "application.h"
Utils::Utils()
{
}
#include <DSysInfo>
// Author: chatGPT
void Utils::sendNotification(QString icon, QString title, QString body)
#include <QDBusInterface>
#include <QProcessEnvironment>
#include <QSettings>
#include <QStandardPaths>
#include <QFile>
#define UOSDeveloperModeFile "/var/lib/deepin/developer-mode/enabled"
/**
* @author chatGPT
* @brief Utils::sendNotification
* @param icon
* @param title
* @param body
*/
void Utils::sendNotification(const QString &icon, const QString &title, const QString &body)
{
QDBusInterface iface("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications");
QDBusInterface interface("org.freedesktop.Notifications",
"/org/freedesktop/Notifications",
"org.freedesktop.Notifications");
QVariantList args;
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
<< body // the body of the notification
<< QStringList() // no actions
<< QVariantMap() // no hints
<< -1; // no timeout
args << Application::applicationName() // the name of the application
<< static_cast<quint32>(0) // replaces the previous notification with the same ID
<< icon // the application icon of the notification
<< title // the title of the notification
<< body // the body of the notification
<< QStringList() // no actions
<< QVariantMap() // no hints
<< -1; // no timeout
iface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
interface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
}
/**
* @brief Utils::isDDE 使 DDE
* @return
*/
bool Utils::isDDE()
{
bool isDDE = true;
if (!QString::fromUtf8(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
{
qputenv("XDG_CURRENT_DESKTOP", "Deepin");
isDDE = false;
}
return isDDE;
}
/**
* @brief Utils::isWayland 使 wayland
* @return bool true: 使 wayland false: 使 x11
*/
bool Utils::isWayland()
{
bool isWayland = false;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
QString XDG_SESSION_TYPE = env.value(QStringLiteral("XDG_SESSION_TYPE"));
QString WAYLAND_DISPLAY = env.value(QStringLiteral("WAYLAND_DISPLAY"));
if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive))
{
isWayland = true;
}
return isWayland;
}
/**
* @brief Utils::initConfig config.ini
*/
void Utils::initConfig()
{
// WARNING: 请在 组织名称 和 应用程序名称 初始化完成后调用
bool useWayland = true;
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (config.contains("build/useWayland"))
{
useWayland = config.value("build/useWayland").toBool();
}
config.remove("build/isDeepinOS");
config.remove("build/isWayland");
config.remove("build/useWayland");
config.setValue("runtime/isDDE", isDDE());
config.setValue("runtime/isWayland", isWayland());
// Check config file, if there is no wayland config, then set it to default, which means use wayland if possible.
if (!config.contains("runtime/useWayland"))
{
config.setValue("runtime/useWayland", useWayland);
}
config.sync(); // 写入更改至 config.ini并同步最新内容
checkUOSDeveloperMode(); // Check UOS developer mode
}
/**
* @brief Utils::isUOS UOS
* @return bool true: UOS false: UOS
*/
bool Utils::isUOS()
{
// WARNING: 请在 组织名称 和 应用程序名称 初始化完成后调用
bool isUOS = false;
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Uos)
{
isUOS = true;
config.setValue("UOS/isUOS", true);
}
else
{
isUOS = false;
config.remove("UOS");
}
config.sync(); // 写入更改至 config.ini并同步最新内容
return isUOS;
}
/**
* @brief Utils::setQPAPlatform Set display backend
*/
void Utils::setQPAPlatform()
{
// WARNING: 请在 initConfig() 执行后调用
bool isDDE = Utils::isDDE(); // WARNING: 只能执行一次,后续执行时环境变量已经被覆盖,导致判断错误
bool isWayland = Utils::isWayland();
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
bool useWayland = config.value("runtime/useWayland").toBool();
qDebug() << "System Wayland enabled:" << isWayland << "Spark Wayland enabled:" << useWayland;
if (isWayland && useWayland && !(Dtk::Core::DSysInfo::isDeepin() || isDDE))
{
qputenv("QT_QPA_PLATFORM", "wayland");
}
else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDeepin() && isDDE))
{
qputenv("QT_QPA_PLATFORM", "dwayland");
}
else
{
qputenv("QT_QPA_PLATFORM", "dxcb");
}
}
/**
* @brief Utils::checkUOSDeveloperMode Check UOS developer mode
*/
void Utils::checkUOSDeveloperMode()
{
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
QFile file(UOSDeveloperModeFile);
if (Utils::isUOS() && file.exists() && file.open(QFile::ReadOnly | QFile::Text))
{
QString lineData = QString::fromUtf8(file.readLine());
bool devmode = lineData.trimmed().toInt();
qDebug() << "UOS Developer Mode Status:" << devmode;
config.setValue("UOS/EnableDeveloperMode", devmode);
}
else
{
/**
* NOTE: Utils::isUOS() UOS config UOS
* UOS
*/
if (config.contains("UOS/EnableDeveloperMode"))
{
config.setValue("UOS/EnableDeveloperMode", false);
}
}
file.close();
config.sync(); // 写入更改至 config.ini并同步最新内容
}

View File

@ -2,13 +2,17 @@
#define UTILS_H
#include <QObject>
#include <QtDBus>
class Utils
{
public:
Utils();
static void sendNotification(QString icon,QString title,QString body);
static void sendNotification(const QString &icon, const QString &title, const QString &body);
static bool isDDE();
static bool isWayland();
static void initConfig();
static bool isUOS();
static void setQPAPlatform();
static void checkUOSDeveloperMode();
};
#endif // UTILS_H

View File

@ -1,8 +1,5 @@
#include "widgetanimation.h"
WidgetAnimation::WidgetAnimation()
{
}
#include "widgets/base/basewidgetopacity.h"
void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
{
@ -28,27 +25,35 @@ void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
QPropertyAnimation *WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
{
QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget);
// 设置动画效果
animation->setEasingCurve(QEasingCurve::Linear);
// 设置动画时间(单位:毫秒)
animation->setDuration(500);
// 设置动画步长值,以及在该位置时显示的透明度
if (isAppear)
{
animation->setKeyValueAt(0, 0);
// m_animation->setKeyValueAt(0.5, 0);
animation->setKeyValueAt(1, 1);
// 设置动画效果
animation->setEasingCurve(QEasingCurve::Linear);
// 设置动画步长值,以及在该位置时显示的透明度(即动画关键帧)
animation->setKeyValueAt(0.0, 0.0);
animation->setKeyValueAt(1.0, 1.0);
}
else
{
animation->setKeyValueAt(0, 1);
animation->setKeyValueAt(1, 0);
animation->setEasingCurve(QEasingCurve::OutQuart);
animation->setKeyValueAt(0.0, 1.0);
animation->setKeyValueAt(1.0, 0.0);
QObject::connect(animation, &QPropertyAnimation::finished, pWidget, [=]() { pWidget->close(); });
}
QObject::connect(animation, &QPropertyAnimation::valueChanged, pWidget, [=]()
{
pWidget->update(); // NOTE: 保证窗口透明度动画平滑
});
return animation;
}
void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
{
// 开始动画
createWidgetOpacity(pWidget, isAppear)->start();
// 启动/关闭动画
createWidgetOpacity(pWidget, isAppear)->start(QPropertyAnimation::DeleteWhenStopped);
}

View File

@ -1,14 +1,12 @@
#ifndef WIDGETANIMATION_H
#define WIDGETANIMATION_H
#include <QObject>
#include <QWidget>
#include <QPropertyAnimation>
class WidgetAnimation
{
public:
WidgetAnimation();
static void widgetShake(QWidget *pWidget, int nRange);
static QPropertyAnimation* createWidgetOpacity(QWidget *pWidget, bool isAppear);

View File

@ -1,5 +1,6 @@
#include "basewidgetopacity.h"
#include "utils/widgetanimation.h"
#include "utils/utils.h"
#include <QSettings>
#include <QStandardPaths>
@ -8,7 +9,6 @@
BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
{
// WidgetAnimation::widgetOpacity(this,true);
}
/**
@ -19,7 +19,7 @@ void BaseWidgetOpacity::showEvent(QShowEvent *event)
{
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
bool isWayland = config.value("build/isWayland").toBool();
bool isWayland = Utils::isWayland();
if (!isWayland)
{
if (!showWindowAnimation)
@ -32,13 +32,15 @@ void BaseWidgetOpacity::showEvent(QShowEvent *event)
DBlurEffectWidget::showEvent(event);
}
/// @brief 窗口关闭事件
/// @param event
/**
* @brief
* @param event
*/
void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
{
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
bool isWayland = config.value("build/isWayland").toBool();
bool isWayland = Utils::isWayland();
if (isWayland)
{
return DBlurEffectWidget::closeEvent(event);
@ -47,23 +49,8 @@ void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
if (!closeWindowAnimation)
{
closeWindowAnimation = true;
WidgetAnimation::widgetOpacity(this, false);
QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
animation->setEasingCurve(QEasingCurve::OutQuart);
animation->setDuration(500);
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::finished, this, [=]()
{ this->close(); });
animation->start();
event->ignore();
}
else

View File

@ -105,76 +105,10 @@ void DownloadItem::install(int t)
ui->label_2->setToolTip(tr("Installing"));
QtConcurrent::run([=]()
{
QProcess installer;
switch(t)
{
case 0:
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
case 1:
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
case 2:
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
}
{
slotAsyncInstall(t);
});
bool haveError = false;
bool notRoot = false;
installer.waitForFinished(-1); // 不设置超时
out = installer.readAllStandardOutput();
QStringList everyOut = out.split("\n");
for (int i = 0; i < everyOut.size(); i++)
{
if(everyOut[i].left(2) == "E:")
{
haveError = true;
}
if(everyOut[i].right(14) == "Not authorized")
{
notRoot = true;
}
}
QProcess isInstall;
isInstall.start("dpkg", QStringList() << "-s" << pkgName);
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if (error == 0 && !haveError)
{
ui->pushButton_install->hide();
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
ui->label_2->setText(tr("Finish"));
ui->label_2->setToolTip(tr("Finish"));
download = 3;
ui->pushButton_3->show();
}
else
{
ui->pushButton_install->show();
ui->pushButton_install->setText(tr("Retry"));
download = 1;
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again"));
ui->pushButton_3->show();
}
if (notRoot)
{
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been abortedyou can retry installation."));
ui->label_2->setText(tr("dpkg progress had been abortedyou can retry installation"));
ui->label_2->setToolTip(tr("dpkg progress had been abortedyou can retry installation"));
ui->pushButton_install->show();
ui->pushButton_3->hide();
}
ui->widget_spinner->hide();
DownloadItem::isInstall = false;
emit finished(); });
// emit finished();
qDebug() << ui->label_filename->text().toUtf8();
}
}
@ -207,3 +141,75 @@ void DownloadItem::on_pushButton_3_clicked()
output_w->layout()->addWidget(textbrowser);
output_w->show();
}
void DownloadItem::slotAsyncInstall(int t)
{
QProcess installer;
switch(t)
{
case 0:
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
case 1:
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
case 2:
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
}
bool haveError = false;
bool notRoot = false;
installer.waitForFinished(-1); // 不设置超时
out = installer.readAllStandardOutput();
QStringList everyOut = out.split("\n");
for (int i = 0; i < everyOut.size(); i++)
{
if(everyOut[i].left(2) == "E:")
{
haveError = true;
}
if(everyOut[i].right(14) == "Not authorized")
{
notRoot = true;
}
}
QProcess isInstall;
isInstall.start("dpkg", QStringList() << "-s" << pkgName);
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if (error == 0 && !haveError)
{
ui->pushButton_install->hide();
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
ui->label_2->setText(tr("Finish"));
ui->label_2->setToolTip(tr("Finish"));
download = 3;
ui->pushButton_3->show();
}
else
{
ui->pushButton_install->show();
ui->pushButton_install->setText(tr("Retry"));
download = 1;
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again"));
ui->pushButton_3->show();
}
if (notRoot)
{
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been abortedyou can retry installation."));
ui->label_2->setText(tr("dpkg progress had been abortedyou can retry installation"));
ui->label_2->setToolTip(tr("dpkg progress had been abortedyou can retry installation"));
ui->pushButton_install->show();
ui->pushButton_3->hide();
}
ui->widget_spinner->hide();
DownloadItem::isInstall = false;
emit finished();
}

View File

@ -59,6 +59,8 @@ private slots:
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void slotAsyncInstall(int t);
signals:
void finished();
};

View File

@ -9,7 +9,7 @@ ProgressButton::ProgressButton(QWidget *parent)
: QWidget{parent}
{
// this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground, true);
// this->setAttribute(Qt::WA_TranslucentBackground, true);
setMinimumWidth(36);
setMinimumHeight(36);
svgPath = "";
@ -99,8 +99,8 @@ void ProgressButton::setProgress(int progress)
{
buttonState = state::closeProgress;
update();
auto waterDrop = new WaterDrop();
waterDrop->move(this->mapToGlobal(this->rect().center()));
WaterDrop *waterDrop = new WaterDrop(parentWidget());
waterDrop->move(geometry().center());
waterDrop->show();
}
repaint();
@ -159,11 +159,13 @@ WaterDrop::WaterDrop(QWidget *parent)
: 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);
// 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))));
connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::deleteLater);
}
// 把鼠标点击的点转换为圆心点坐标
@ -179,9 +181,9 @@ void WaterDrop::show()
m_waterDropAnimation->setEndValue(RADIUS);
m_waterDropAnimation->setDuration(350);
connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRaduisChanged);
connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRadiusChanged);
connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::close);
m_waterDropAnimation->start();
m_waterDropAnimation->start(QVariantAnimation::DeleteWhenStopped);
QWidget::show();
}
@ -194,9 +196,11 @@ void WaterDrop::paintEvent(QPaintEvent *event)
pen.setWidth(5);
painter.setPen(pen);
painter.drawEllipse(event->rect().center(), m_animationRadius, m_animationRadius);
QWidget::paintEvent(event);
}
void WaterDrop::onRaduisChanged(QVariant value)
void WaterDrop::onRadiusChanged(QVariant value)
{
m_animationRadius = value.toInt();
update();

View File

@ -61,7 +61,7 @@ public:
private:
void paintEvent(QPaintEvent *event);
void onRaduisChanged(QVariant value);
void onRadiusChanged(QVariant value);
private:
class QVariantAnimation* m_waterDropAnimation;

View File

@ -54,36 +54,42 @@ DownloadListWidget::~DownloadListWidget()
{
if (downloadController)
{
downloadController->disconnect();
downloadController->stopDownload();
downloadController->deleteLater();
}
clearItem();
delete ui;
}
void DownloadListWidget::clearItem()
{
ui->listWidget->vScrollBar->scrollTop();
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;
delete item;
item = NULL;
}
// QListWidgetItem *item = nullptr;
// while ((item = ui->listWidget->takeItem(0)) != nullptr)
// {
// QWidget *card = ui->listWidget->itemWidget(item);
// if (card)
// {
// card->deleteLater();
// card = nullptr;
// }
// delete item;
// item = nullptr;
// }
// ui->listWidget->vScrollBar->scrollTop();
ui->listWidget->clear();
}
void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
{
if (fileName.isEmpty())
{
return;
return nullptr;
}
urList.append(downloadurl);
allDownload += 1;
DownloadItem *di = new DownloadItem(this);
DownloadItem *di = new DownloadItem;
dlist << downloadurl;
downloaditemlist << di;
di->setName(name);
@ -99,6 +105,8 @@ void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName
nowDownload += 1;
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
}
return di;
}
QList<DownloadItem *> DownloadListWidget::getDIList()
@ -119,7 +127,13 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
isdownload = true;
downloaditemlist[allDownload - 1]->free = false;
downloadController = new DownloadController(this); // 并发下载,在点击下载按钮的时候才会初始化
if (downloadController)
{
downloadController->disconnect();
downloadController->stopDownload();
downloadController->deleteLater();
}
downloadController = new DownloadController; // 并发下载,在点击下载按钮的时候才会初始化
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
// connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});

View File

@ -20,7 +20,7 @@ class DownloadListWidget : public DBlurEffectWidget
Q_OBJECT
public:
void addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
DownloadItem *addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
int nowDownload = 0;
int allDownload = 0;
QList<DownloadItem *> getDIList();
@ -35,7 +35,7 @@ private:
QStringList dlist;
QList<QUrl> urList;
QList<DownloadItem *> downloaditemlist;
DownloadController *downloadController;
DownloadController *downloadController = nullptr;
int nowdownload = 0;
QString theSpeed;
QTimer download_speed;

View File

@ -0,0 +1,17 @@
#!/bin/bash
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="正在檢查更新,請稍候…"
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模塊"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="檢查更新行程出現錯誤! 按確定查看報錯,可用於回報"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已複製了此文字方塊中的日誌,且將會在回報時附上。 迴響通路可以在右上角選單的設定中找到 "
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="回報入口在商店右上角的設定裏"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="沒有軟體需要更新\n但是你並沒有站在世界之巔"
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(无法更新:已被标记为保留)"
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="选择你想更新的应用"
TRANSHELL_CONTENT_CHOOSE="选择"
TRANSHELL_CONTENT_PKG_NAME="包名"
TRANSHELL_CONTENT_NEW_VERSION="新版本"
TRANSHELL_CONTENT_UPGRADE_FROM="从该版本更新"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何軟體\n但是你並沒有站在世界之巔"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的軟體已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

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

View File

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

View File

@ -10,9 +10,9 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="226"/>
<location filename="../src/pages/appintopage.cpp" line="368"/>
<location filename="../src/pages/appintopage.cpp" line="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
@ -175,51 +175,51 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="87"/>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<source>Click Open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="96"/>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="145"/>
<location filename="../src/pages/appintopage.cpp" line="242"/>
<location filename="../src/pages/appintopage.cpp" line="339"/>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="152"/>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="231"/>
<location filename="../src/pages/appintopage.cpp" line="327"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="236"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="383"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="383"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
</message>
@ -240,12 +240,12 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="90"/>
<location filename="../src/application.cpp" line="111"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="97"/>
<location filename="../src/application.cpp" line="118"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
</message>
@ -299,9 +299,9 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
@ -312,46 +312,46 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<source>Installation complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<source>Finish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="157"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="168"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="189"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<source>Download canceled</source>
<translation type="unfinished"></translation>
</message>
@ -452,32 +452,33 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="161"/>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<source>Submit App</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="162"/>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="163"/>
<location filename="../src/mainwindow-dtk.cpp" line="167"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="164"/>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="123"/>
<location filename="../src/mainwindow-dtk.cpp" line="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="128"/>
<location filename="../src/mainwindow-dtk.cpp" line="132"/>
<source>Search or enter spk://</source>
<translation type="unfinished"></translation>
</message>
@ -485,19 +486,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="28"/>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/mainwindow-dtk.cpp" line="103"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="94"/>
<location filename="../src/application.cpp" line="115"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
@ -507,7 +508,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="217"/>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation>
</message>
@ -618,12 +619,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="218"/>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>

View File

@ -10,9 +10,9 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="226"/>
<location filename="../src/pages/appintopage.cpp" line="368"/>
<location filename="../src/pages/appintopage.cpp" line="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
@ -175,51 +175,51 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="87"/>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<source>Click Open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="96"/>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="145"/>
<location filename="../src/pages/appintopage.cpp" line="242"/>
<location filename="../src/pages/appintopage.cpp" line="339"/>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="152"/>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="231"/>
<location filename="../src/pages/appintopage.cpp" line="327"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="236"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="383"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="383"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
</message>
@ -240,12 +240,12 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="90"/>
<location filename="../src/application.cpp" line="111"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="97"/>
<location filename="../src/application.cpp" line="118"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
</message>
@ -299,9 +299,9 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
@ -312,46 +312,46 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<source>Installation complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<source>Finish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="157"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="168"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="189"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<source>Download canceled</source>
<translation type="unfinished"></translation>
</message>
@ -452,32 +452,33 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="161"/>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<source>Submit App</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="162"/>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="163"/>
<location filename="../src/mainwindow-dtk.cpp" line="167"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="164"/>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="123"/>
<location filename="../src/mainwindow-dtk.cpp" line="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="128"/>
<location filename="../src/mainwindow-dtk.cpp" line="132"/>
<source>Search or enter spk://</source>
<translation type="unfinished"></translation>
</message>
@ -485,19 +486,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="28"/>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/mainwindow-dtk.cpp" line="103"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="94"/>
<location filename="../src/application.cpp" line="115"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
@ -507,7 +508,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="217"/>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation>
</message>
@ -618,12 +619,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="218"/>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>

View File

@ -10,9 +10,9 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="226"/>
<location filename="../src/pages/appintopage.cpp" line="368"/>
<location filename="../src/pages/appintopage.cpp" line="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation></translation>
</message>
@ -175,51 +175,51 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="87"/>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="96"/>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="145"/>
<location filename="../src/pages/appintopage.cpp" line="242"/>
<location filename="../src/pages/appintopage.cpp" line="339"/>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="152"/>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="231"/>
<location filename="../src/pages/appintopage.cpp" line="327"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="236"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="383"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="383"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@ -240,12 +240,12 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="90"/>
<location filename="../src/application.cpp" line="111"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="97"/>
<location filename="../src/application.cpp" line="118"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
@ -299,9 +299,9 @@
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>Spark Store</source>
<translation></translation>
</message>
@ -312,46 +312,46 @@
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<source>Installation complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="149"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<source>Finish</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="157"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<source>Retry</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation>dpkg出现错误</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation>dpkg进程被中断</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="168"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="189"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<source>Download canceled</source>
<translation></translation>
</message>
@ -452,32 +452,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="161"/>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="162"/>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<source>Submit App with client(Recommanded)</source>
<translation>使稿</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="163"/>
<location filename="../src/mainwindow-dtk.cpp" line="167"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="164"/>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<source>APP Upgrade and Install Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="123"/>
<location filename="../src/mainwindow-dtk.cpp" line="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="128"/>
<location filename="../src/mainwindow-dtk.cpp" line="132"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@ -485,19 +486,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="28"/>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/mainwindow-dtk.cpp" line="103"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="94"/>
<location filename="../src/application.cpp" line="115"/>
<source>Spark Project</source>
<translation></translation>
</message>
@ -507,7 +508,7 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="217"/>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@ -618,12 +619,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="218"/>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Exit</source>
<translation>退</translation>
</message>

View File

@ -0,0 +1,632 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_TW">
<context>
<name>AppIntoPage</name>
<message>
<location filename="../src/pages/appintopage.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="346"/>
<source>0</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="356"/>
<source>Download Times</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="410"/>
<location filename="../src/pages/appintopage.ui" line="413"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Linux生态的贡献&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="416"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="448"/>
<location filename="../src/pages/appintopage.ui" line="451"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;UOS家庭版 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="454"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="467"/>
<location filename="../src/pages/appintopage.ui" line="470"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will automatically configure the wine kit for you.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation> deepin-wine2 wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="473"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="486"/>
<location filename="../src/pages/appintopage.ui" line="489"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;DTK5应用使&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="492"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="505"/>
<location filename="../src/pages/appintopage.ui" line="508"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="511"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="524"/>
<location filename="../src/pages/appintopage.ui" line="527"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Appimage转制应用.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="530"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="549"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="602"/>
<source>Share</source>
<translation>Spk共享链接</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="609"/>
<source>APP Feedback</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation> Wine wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>稿</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
</context>
<context>
<name>AppListPage</name>
<message>
<location filename="../src/pages/applistpage.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/applistpage.ui" line="60"/>
<source>about:blank</source>
<translation></translation>
</message>
</context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="111"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="118"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
<source>icon</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
<source>TextLabel</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
<source>Name</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
<source>Waiting to download</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
<source>Info</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
<source>Download Complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<source>Installation complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<source>Finish</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<source>Retry</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation>dpkg出现错误</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation>dpkg进程被中断</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<source>Download canceled</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadListWidget</name>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="41"/>
<source>The list is currently empty. Go and download some softwares!</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
<source>Open download directory</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../src/mainwindow-dtk.ui" line="14"/>
<source>MainWindow</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="166"/>
<source>Home</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="203"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="231"/>
<source>Chat</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="259"/>
<source>Music</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="287"/>
<source>Video</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="315"/>
<source>Picture</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="343"/>
<source>Game</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="371"/>
<source>Office</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="399"/>
<source>Reading</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="427"/>
<source>Development</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="455"/>
<source>Tool</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="483"/>
<source>Theme</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="511"/>
<source>Other</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="539"/>
<source>APP Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<source>Submit App with client(Recommanded)</source>
<translation>()</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="167"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<source>APP Upgrade and Install Settings</source>
<translation> </translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="132"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/application.cpp" line="34"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="115"/>
<source>Spark Project</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<source>Download list</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsPage</name>
<message>
<location filename="../src/pages/settingspage.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="91"/>
<source>Line Settings</source>
<translation>线</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="107"/>
<source>Choose Line:</source>
<translation>线</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="130"/>
<source>Refresh</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect when restart</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="185"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="202"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="195"/>
<source>Spark Store Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Temp</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="243"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation>/tmp下使</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="250"/>
<source>0B</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="257"/>
<source>Location/tmp/spark-store</source>
<translation>/tmp/spark-store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Clean</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="290"/>
<source>Size:</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="297"/>
<source>Clear Web Cache</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="318"/>
<source>About us</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="325"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;&lt;/span&gt;Linux/deepinSpark&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;使使&lt;/p&gt;&lt;p&gt; &amp;lt;jifengshenmo@outlook.com&amp;gt; &lt;/p&gt;&lt;p&gt;稿&lt;/p&gt;&lt;p&gt; Spark IM :&lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;QQ 872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="213"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
</context>
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Exit</source>
<translation>退</translation>
</message>
</context>
</TS>