From 2f8c11a30ba69bcf686eefd2fc480a132eac40e3 Mon Sep 17 00:00:00 2001 From: metanoia1989 Date: Tue, 16 Feb 2021 23:00:27 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/downloadworker.cpp | 234 +++++++++++++++++++++++++++++++++++++++++ src/downloadworker.h | 73 +++++++++++++ src/spark-store.pro | 2 + src/widget.cpp | 69 +++++++----- src/widget.h | 4 +- 5 files changed, 355 insertions(+), 27 deletions(-) create mode 100644 src/downloadworker.cpp create mode 100644 src/downloadworker.h diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp new file mode 100644 index 00000000..8ca0a133 --- /dev/null +++ b/src/downloadworker.cpp @@ -0,0 +1,234 @@ +#include "downloadworker.h" +#include +#include +#include +#include +#include +#include +#include + +DownloadWorker::DownloadWorker(QObject *parent) +{ + +} + +void DownloadWorker::setIdentifier(int identifier) +{ + this->identifier = identifier; +} + +void DownloadWorker::setParamter(const QString &url, QPair range, QFile *file) +{ + this->url = url; + this->startPos = range.first; + this->endPos = range.second; + this->file = file; +} + +qint64 DownloadWorker::getReceivedPos() +{ + return receivedPos; +} + +void DownloadWorker::doWork() +{ + mgr = new QNetworkAccessManager(this); + QNetworkRequest request; + request.setUrl(url); + request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); + request.setRawHeader("Range", QString("bytes=%1-%2").arg(startPos) + .arg(endPos).toLocal8Bit()); + reply = mgr->get(request); + qDebug() << "开始下载数据:" << QString(" %1~%2 -> writePos Start %3") + .arg(startPos).arg(endPos).arg(receivedPos); + connect(reply, static_cast(&QNetworkReply::error), + [this](QNetworkReply::NetworkError error){ + if (error != QNetworkReply::NoError) { + qDebug() << "出错了:" << reply->errorString(); + } + }); + connect(reply, &QNetworkReply::finished, mgr, &QNetworkAccessManager::deleteLater); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); + connect(reply, &QNetworkReply::readyRead, this, &DownloadWorker::dataReady); + connect(reply, &QNetworkReply::finished, this, &DownloadWorker::slotFinish); + connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWorker::handleProcess); + +} + +void DownloadWorker::doStop() +{ + reply->disconnect(); + reply->aboutToClose(); + reply->deleteLater(); + reply = nullptr; +} + +void DownloadWorker::dataReady() +{ + QByteArray data = reply->readAll(); + file->seek(startPos + receivedPos); + file->write(data); + receivedPos += data.size(); +} + +void DownloadWorker::slotFinish() +{ + file->flush(); + qDebug() << "数据块下载完毕:" << QString(" %1~%2 -> writePos Start %3") + .arg(startPos).arg(endPos).arg(receivedPos); + emit workFinished(); +} + +void DownloadWorker::handleProcess(qint64, qint64) +{ + emit this->downloadProcess(); +} + + +DownloadController::DownloadController(QObject *parent) +{ + this->threadNum = QThread::idealThreadCount() > 4 ? 4 : QThread::idealThreadCount(); +} + +DownloadController::~DownloadController() +{ + for(int i = 0; i < workers.size(); i++) { + workers.at(i)->doStop(); + workers.at(i)->disconnect(); + workers.at(i)->deleteLater(); + } + workers.clear(); +} + +void DownloadController::setFilename(QString filename) +{ + this->filename = filename; +} + +void DownloadController::setThreadNum(int threadNum) +{ + this->threadNum = threadNum; +} + +/** + * @brief 开始下载 + */ +void DownloadController::startDownload(const QString &url) +{ + // 下载任务等分,计算每个线程的下载数据 + fileSize = getFileSize(url); + if (fileSize == 0) { + emit errorOccur("文件大小获取失败"); + return; + } + qint64 segmentSize = fileSize / threadNum; + ranges.resize(threadNum); + QVector receivedBytes; + receivedBytes.resize(threadNum); + for (int i = 0; i < threadNum; i++) { + ranges[i].first = i * segmentSize; + ranges[i].second = i * segmentSize + segmentSize - 1; + receivedBytes[i] = 0; + } + ranges[threadNum-1].second = fileSize; // 余数部分加入最后一个 + + // 打开文件 + file = new QFile; + file->setFileName(filename); + if (file->exists()) + file->remove(); + if (!file->open(QIODevice::WriteOnly)) { + delete file; + file = nullptr; + emit errorOccur(file->errorString()); + return; + } + file->resize(fileSize); + + // 创建下载线程 + workers.clear(); + for(int i = 0; i < ranges.size(); i++) { + qDebug() << QString("第%1个下载请求:%2-%3").arg(i).arg(ranges.at(i).first).arg(ranges.at(i).second); + auto worker = new DownloadWorker(this); + auto range = ranges.at(i); + worker->setIdentifier(i); + worker->setParamter(url, range, file); + workers.append(worker); + connect(worker, &DownloadWorker::downloadProcess, this, &DownloadController::handleProcess); + connect(worker, &DownloadWorker::workFinished, this, &DownloadController::chunkDownloadFinish); + worker->doWork(); + } +} + +/** + * @brief 停止下载 + */ +void DownloadController::stopDownload() +{ + for(int i = 0; i < workers.size(); i++) { + workers.at(i)->doStop(); + workers.at(i)->disconnect(); + workers.at(i)->deleteLater(); + } + workers.clear(); +// file->flush(); + file->close(); + delete file; + file = nullptr; +} + + +void DownloadController::handleProcess() +{ + qint64 bytesReceived = 0; + for(int i = 0; i < workers.size(); i++) { + bytesReceived += workers.at(i)->getReceivedPos(); + } + qDebug() << QString("下载进度 %1-%2").arg(bytesReceived).arg(fileSize); + emit downloadProcess(bytesReceived, fileSize); +} + +void DownloadController::chunkDownloadFinish() +{ + finish++; + if (finish == threadNum) { + file->flush(); + file->close(); + delete file; + file = nullptr; + for(int i = 0; i < workers.size(); i++) { + workers.at(i)->doStop(); + workers.at(i)->disconnect(); + workers.at(i)->deleteLater(); + } + workers.clear(); + emit downloadFinished(); + } +} + +qint64 DownloadController::getFileSize(const QString& url) +{ + QEventLoop event; + QNetworkAccessManager requestManager; + QNetworkRequest request; + request.setUrl(QUrl(url)); + request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); + QNetworkReply *reply = requestManager.head(request); + connect(reply, static_cast(&QNetworkReply::error), + [this, reply](QNetworkReply::NetworkError error){ + if (error != QNetworkReply::NoError) { + emit errorOccur(reply->errorString()); + } + }); + connect(reply, &QNetworkReply::finished, &event, &QEventLoop::quit); + event.exec(); + qint64 fileSize = 0; + if (reply->rawHeader("Accept-Ranges") == QByteArrayLiteral("bytes") + && reply->hasRawHeader(QString("Content-Length").toLocal8Bit())) { + fileSize = reply->header(QNetworkRequest::ContentLengthHeader).toUInt(); + } + qDebug() << "文件大小为:" << fileSize; + reply->deleteLater(); + return fileSize; +} + diff --git a/src/downloadworker.h b/src/downloadworker.h new file mode 100644 index 00000000..8e719d65 --- /dev/null +++ b/src/downloadworker.h @@ -0,0 +1,73 @@ +#ifndef DOWNLOADWORKER_H +#define DOWNLOADWORKER_H + +#include +#include +#include +#include + +class DownloadWorker : public QObject +{ + Q_OBJECT +public: + explicit DownloadWorker(QObject *parent = nullptr); + void setIdentifier(int identifier); + void setParamter(const QString &url, QPair range, QFile *flle); + qint64 getReceivedPos(); + +public slots: + void doWork(); + void doStop(); + void dataReady(); + void slotFinish(); + void handleProcess(qint64, qint64); + +signals: + void resultReady(int identifier, QByteArray data); + void testSignals(); + void workFinished(); + void downloadProcess(); + +private: + int identifier; + QString url; + qint64 startPos; + qint64 endPos; + qint64 receivedPos = 0; + QNetworkReply *reply; + QNetworkAccessManager *mgr; + QFile *file; +}; + +class DownloadController : public QObject +{ + Q_OBJECT +public: + explicit DownloadController(QObject *parent = nullptr); + ~DownloadController(); + void setFilename(QString filename); + void setThreadNum(int threadNum); + void startDownload(const QString &url); + void stopDownload(); + qint64 getFileSize(const QString& url); + +public slots: + void handleProcess(); + void chunkDownloadFinish(); + +signals: + void errorOccur(const QString& msg); + void downloadProcess(qint64, qint64); + void downloadFinished(); + +private: + int threadNum; + QString filename; + qint64 fileSize; + QVector> ranges; + QFile *file; + QList workers; + int finish = 0; +}; + +#endif // FILEDOWNLOADWORKER_H diff --git a/src/spark-store.pro b/src/spark-store.pro index 09c2bbe9..14407ec8 100644 --- a/src/spark-store.pro +++ b/src/spark-store.pro @@ -27,6 +27,7 @@ DEFINES += QT_DEPRECATED_WARNINGS SOURCES += main.cpp\ appitem.cpp \ + downloadworker.cpp \ widget.cpp \ downloadlist.cpp \ image_show.cpp \ @@ -37,6 +38,7 @@ SOURCES += main.cpp\ HEADERS += \ appitem.h \ + downloadworker.h \ widget.h \ downloadlist.h \ image_show.h \ diff --git a/src/widget.cpp b/src/widget.cpp index 796dacf7..d7f3f89c 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -33,6 +33,7 @@ #include "HttpClient.h" #include "appitem.h" #include "flowlayout.h" +#include "downloadworker.h" DWIDGET_USE_NAMESPACE @@ -48,6 +49,8 @@ Widget::Widget(DBlurEffectWidget *parent) : m_loadweb->show(); httpClient = new AeaQt::HttpClient; + // 并发下载 + downloadController = new DownloadController(this); connect(ui->menu_main,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(0);}); connect(ui->menu_network,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(1);}); @@ -72,6 +75,7 @@ Widget::Widget(DBlurEffectWidget *parent) : connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishedScreenshotLoad, this, &Widget::sltAppinfoScreenshot, Qt::ConnectionType::BlockingQueuedConnection); connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishAllLoading, this, &Widget::sltAppinfoFinish, Qt::ConnectionType::BlockingQueuedConnection); + // 搜索事件 connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() { @@ -705,31 +709,41 @@ void Widget::on_pushButton_download_clicked() system("cp icon.png icon_"+QString::number(allDownload-1).toUtf8()+".png"); download_list[allDownload-1].seticon(icon); if(!isBusy){ - file = new QFile(fileName); - if(!file->open(QIODevice::WriteOnly)){ - delete file; - file = nullptr; - return ; - } +// file = new QFile(fileName); +// if(!file->open(QIODevice::WriteOnly)){ +// delete file; +// file = nullptr; +// return ; +// } + nowDownload+=1; - startRequest(urList.at(nowDownload-1)); // 进行链接请求 + + startRequest(urList.at(nowDownload-1), fileName); // 进行链接请求 } if(ui->pushButton_download->text()==tr("Reinstall")){ download_list[allDownload-1].reinstall=true; } } -void Widget::startRequest(QUrl url) +void Widget::startRequest(QUrl url, QString fileName) { ui->listWidget->show(); ui->label->hide(); isBusy=true; isdownload=true; download_list[allDownload-1].free=false; - reply = manager->get(QNetworkRequest(url)); - connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); - connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); - connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64))); + +// reply = manager->get(QNetworkRequest(url)); +// connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); +// connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); +// connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64))); + connect(downloadController, &DownloadController::downloadProcess, this, &Widget::updateDataReadProgress); + connect(downloadController, &DownloadController::downloadFinished, this, &Widget::httpFinished); + connect(downloadController, &DownloadController::errorOccur, [this](QString msg){ + this->sendNotification(msg); + }); + downloadController->setFilename(fileName); + downloadController->startDownload(url.toString()); } void Widget::searchApp(QString text) @@ -846,6 +860,8 @@ void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值 download_size=bytesRead; if(download_list[nowDownload-1].close){ // 随时检测下载是否被取消 + downloadController->disconnect(); + downloadController->stopDownload(); download_list[nowDownload-1].closeDownload(); httpFinished(); } @@ -958,12 +974,12 @@ void Widget::sltAppinfoFinish() void Widget::httpFinished() // 完成下载 { - file->flush(); - file->close(); - reply->deleteLater(); - reply = nullptr; - delete file; - file = nullptr; +// file->flush(); +// file->close(); +// reply->deleteLater(); +// reply = nullptr; +// delete file; +// file = nullptr; isdownload=false; isBusy=false; download_list[nowDownload-1].readyInstall(); @@ -974,14 +990,14 @@ void Widget::httpFinished() // 完成下载 nowDownload+=1; } QString fileName=download_list[nowDownload-1].getName(); - file = new QFile(fileName); - if(!file->open(QIODevice::WriteOnly)) - { - delete file; - file = nullptr; - return ; - } - startRequest(urList.at(nowDownload-1)); +// file = new QFile(fileName); +// if(!file->open(QIODevice::WriteOnly)) +// { +// delete file; +// file = nullptr; +// return ; +// } + startRequest(urList.at(nowDownload-1), fileName); } } @@ -1269,6 +1285,7 @@ void Widget::on_webEngineView_urlChanged(const QUrl &arg1) ui->pushButton_download->setEnabled(false); ui->stackedWidget->setCurrentIndex(2); qDebug()<<"https://demo-one-vert.vercel.app/"+type_name+"/"+pname; + qDebug()<< "链接地址:" << arg1; /* load.cancel();//打开并发加载线程前关闭正在执行的线程 load = QtConcurrent::run([=](){ diff --git a/src/widget.h b/src/widget.h index a1a1bf73..80f3e239 100644 --- a/src/widget.h +++ b/src/widget.h @@ -39,6 +39,7 @@ class Widget; class FlowLayout; +class DownloadController; namespace AeaQt { class HttpClient; @@ -51,7 +52,7 @@ class Widget : public DBlurEffectWidget public: explicit Widget(DBlurEffectWidget *parent = nullptr); ~Widget(); - void startRequest(QUrl url); + void startRequest(QUrl url, QString fileName); void searchApp(QString); int nowDownload=0; int allDownload=0; @@ -163,6 +164,7 @@ private: AeaQt::HttpClient *httpClient; FlowLayout *applist_grid; QHBoxLayout *main; + DownloadController *downloadController; }; #endif // WIDGET_H -- Gitee From 9cc68fac8621e21d409d01932bf2528af32d8ba1 Mon Sep 17 00:00:00 2001 From: metanoia1989 Date: Sat, 20 Feb 2021 06:47:57 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=A4=9A=E5=9F=9F?= =?UTF-8?q?=E5=90=8D=E4=B8=8B=E8=BD=BD=EF=BC=8C=E6=8F=90=E9=AB=98=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/downloadworker.cpp | 22 ++++++++++++++++++++-- src/downloadworker.h | 2 ++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp index 8ca0a133..2d95f47a 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -6,6 +6,7 @@ #include #include #include +#include DownloadWorker::DownloadWorker(QObject *parent) { @@ -87,7 +88,14 @@ void DownloadWorker::handleProcess(qint64, qint64) DownloadController::DownloadController(QObject *parent) { - this->threadNum = QThread::idealThreadCount() > 4 ? 4 : QThread::idealThreadCount(); + domains = { + "sucdn1.jerrywang.top", + "sucdn2.jerrywang.top", + "sucdn3.jerrywang.top", + "sucdn4.jerrywang.top", + "sucdn5.jerrywang.top" + }; + this->threadNum = domains.size() > 6 ? 6 : domains.size(); } DownloadController::~DownloadController() @@ -151,8 +159,9 @@ void DownloadController::startDownload(const QString &url) qDebug() << QString("第%1个下载请求:%2-%3").arg(i).arg(ranges.at(i).first).arg(ranges.at(i).second); auto worker = new DownloadWorker(this); auto range = ranges.at(i); + QString chunkUrl = replaceDomain(url, domains.at(i)); worker->setIdentifier(i); - worker->setParamter(url, range, file); + worker->setParamter(chunkUrl, range, file); workers.append(worker); connect(worker, &DownloadWorker::downloadProcess, this, &DownloadController::handleProcess); connect(worker, &DownloadWorker::workFinished, this, &DownloadController::chunkDownloadFinish); @@ -232,3 +241,12 @@ qint64 DownloadController::getFileSize(const QString& url) return fileSize; } +QString DownloadController::replaceDomain(const QString& url, const QString domain) +{ + QRegularExpression regex(R"((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])"); + if (regex.match(url).hasMatch()) { + return QString(url).replace(regex.match(url).captured(), domain); + } + return url; +} + diff --git a/src/downloadworker.h b/src/downloadworker.h index 8e719d65..72f558bb 100644 --- a/src/downloadworker.h +++ b/src/downloadworker.h @@ -50,6 +50,7 @@ public: void startDownload(const QString &url); void stopDownload(); qint64 getFileSize(const QString& url); + QString replaceDomain(const QString& url, const QString domain); public slots: void handleProcess(); @@ -68,6 +69,7 @@ private: QFile *file; QList workers; int finish = 0; + QVector domains; }; #endif // FILEDOWNLOADWORKER_H -- Gitee From 815036e28f75f2025d405fcc130c17b94b6c6129 Mon Sep 17 00:00:00 2001 From: metanoia1989 Date: Sat, 6 Mar 2021 15:18:31 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E5=B0=86=E5=9B=BE=E7=89=87=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E7=94=B1=20curl=20=E8=BD=AC=E4=B8=BA=20QtNetworkServi?= =?UTF-8?q?ce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widget.cpp | 169 +--------------------------------- src/widget.h | 1 - src/workerthreads.cpp | 207 ++++++++++++++++++++++-------------------- src/workerthreads.h | 8 ++ 4 files changed, 117 insertions(+), 268 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index d7f3f89c..eea5a78b 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -131,6 +131,7 @@ Widget::~Widget() { notify_uninit(); +// delete httpFinished; delete ui; qDebug()<<"exit"; DApplication::quit(); @@ -516,174 +517,6 @@ void Widget::updatefoot() ui->webfoot->setFixedHeight(allh-foot); } -int Widget::loadappinfo(QUrl arg1) -{ - if(arg1.isEmpty()){ - return 1; - } - - // 先隐藏详情页负责显示截图的label - ui->screen_0->hide(); - ui->screen_1->hide(); - ui->screen_2->hide(); - ui->screen_3->hide(); - ui->screen_4->hide(); - ui->label_appicon->clear(); - ui->tag_community->hide(); - ui->tag_ubuntu->hide(); - ui->tag_deepin->hide(); - ui->tag_uos->hide(); - ui->tag_dtk5->hide(); - ui->tag_dwine2->hide(); - ui->tag_dwine5->hide(); - ui->tag_a2d->hide(); - - // 重置UI状态 - ui->pushButton_uninstall->hide(); - ui->pushButton_website->setEnabled(false); - ui->pushButton->setEnabled(false); - ui->pushButton_translate->setEnabled(false); - ui->label_show->setText("Loading..."); - ui->label_show->show(); - - QProcess get_json; - QDir dir("/tmp"); - dir.mkdir("spark-store"); - QDir::setCurrent("/tmp/spark-store"); - - get_json.start("curl -o app.json "+arg1.toString()); - get_json.waitForFinished(); - if(get_json.exitCode()) - { - sendNotification(tr("Failed to download app info. Please check internet connection.")); - } - - QFile app_json("app.json"); - if(app_json.open(QIODevice::ReadOnly)){ - // 成功得到json文件 - QByteArray json_array=app_json.readAll(); - // 将路径转化为相应源的下载路径 - urladdress=arg1.toString().left(arg1.toString().length()-8); - QStringList downloadurl=urladdress.split("/"); - urladdress=ui->comboBox_server->currentText(); - QString deburl=urladdress; - deburl=deburl.left(urladdress.length()-1); - urladdress="https://cdn.jsdelivr.net/gh/Jerrywang959/jsonpng@master/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 - urladdress=urladdress.left(urladdress.length()-1); - - for (int i=3;ilabel_appname->setText(appName); - system("rm -r *.png"); - ui->label_show->show(); - // 软件信息加载 - QString info; - info= tr("PkgName: ")+json["Pkgname"].toString()+"\n"; - info+=tr("Version: ")+json["Version"].toString()+"\n"; - if(json["Author"].toString()!="" && json["Author"].toString()!=" "){ - info+=tr("Author: ")+json["Author"].toString()+"\n"; - } - - if(json["Website"].toString()!="" && json["Website"].toString()!=" "){ - info+=tr("Official Site: ")+json["Website"].toString()+"\n"; - ui->pushButton_website->show(); - appweb=json["Website"].toString(); - } - info+=tr("Contributor: ")+json["Contributor"].toString()+"\n"; - info+=tr("Update Time: ")+json["Update"].toString()+"\n"; - info+=tr("Installed Size: ")+json["Size"].toString()+"\n"; - ui->label_info->setText(info); - ui->label_more->setText(json["More"].toString()); - QProcess isInstall; - pkgName=json["Pkgname"].toString(); - isInstall.start("dpkg -s "+json["Pkgname"].toString()); - isInstall.waitForFinished(); - int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); - if(error==0){ - ui->pushButton_download->setText(tr("Reinstall")); - ui->pushButton_uninstall->show(); - - }else { - ui->pushButton_download->setText(tr("Install")); - } - //tag加载 - QString tags=json["Tags"].toString(); - QStringList tagList=tags.split(";"); - for (int i=0;itag_community->show(); - if(tagList[i]=="ubuntu") - ui->tag_ubuntu->show(); - if(tagList[i]=="deepin") - ui->tag_deepin->show(); - if(tagList[i]=="uos") - ui->tag_uos->show(); - if(tagList[i]=="dtk5") - ui->tag_dtk5->show(); - if(tagList[i]=="dwine2") - ui->tag_dwine2->show(); - if(tagList[i]=="dwine5") - ui->tag_dwine5->show(); - if(tagList[i]=="a2d") - ui->tag_a2d->show(); - } - // 图标加载 - get_json.start("curl -o icon.png "+urladdress+"icon.png"); - get_json.waitForFinished(); - if(!get_json.exitCode()) { - QPixmap appicon(QString::fromUtf8(TMP_PATH)+"/icon.png"); - ui->label_appicon->setPixmap(appicon); - ui->pushButton_download->setEnabled(true); - ui->pushButton->setEnabled(true); - ui->pushButton_translate->setEnabled(true); - ui->pushButton_website->setEnabled(true); - } - else - sendNotification(tr("Failed to load application icon.")); - - - // 截图展示加载 - QList label_screen; - label_screen << ui->screen_0 << ui->screen_1 << ui->screen_2 << ui->screen_3 << ui->screen_4; - for (int i = 0; i < 5; i++) { - QString cmd = "curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png"; - get_json.terminate(); - get_json.start(cmd); - get_json.waitForFinished(); - bool s = screen[i].load("screen_"+QString::number(i+1)+".png"); - if(s){ - label_screen[i]->setImage(screen[i]); - label_screen[i]->show(); - /* - switch(i){ // 故意为之,为了清除多余截图 - case 0: - label_screen[1]->hide(); - case 1: - label_screen[2]->hide(); - case 2: - label_screen[3]->hide(); - case 3: - label_screen[4]->hide(); - - }*/ - }else{ - QFile::remove("screen_"+QString::number(i+1)+".png"); - break; - } - } - ui->label_show->setText(""); - ui->label_show->hide(); - } - return 0; -} - void Widget::on_pushButton_download_clicked() { chooseLeftMenu(13); diff --git a/src/widget.h b/src/widget.h index 80f3e239..c44355c0 100644 --- a/src/widget.h +++ b/src/widget.h @@ -123,7 +123,6 @@ public: private: void initUI(); void initConfig(); - int loadappinfo(QUrl); void chooseLeftMenu(int index); void setfoot(int); void updatefoot(); diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp index 2f6eef5f..9adbe636 100644 --- a/src/workerthreads.cpp +++ b/src/workerthreads.cpp @@ -5,115 +5,124 @@ #include #include "workerthreads.h" #include "widget.h" +#include "HttpClient.h" void SpkAppInfoLoaderThread::run() { emit requestResetUi(); - QProcess get_json; - QString urladdress, deatils, more, packagename, appweb; - QDir dir("/tmp"); - bool isInstalled; - dir.mkdir("spark-store"); - QDir::setCurrent("/tmp/spark-store"); - - get_json.start("curl -o app.json " + targetUrl.toString()); - if(waitDownload(get_json) == -1) - return; - if(get_json.exitCode()) - { - Widget::sendNotification(tr("Failed to download app info. Please check internet connection.")); - } + httpClient = new AeaQt::HttpClient; - QFile app_json("app.json"); - if(app_json.open(QIODevice::ReadOnly)){ - // 成功得到json文件 - QByteArray json_array = app_json.readAll(); - // 将路径转化为相应源的下载路径 - urladdress = targetUrl.toString().left(targetUrl.toString().length()-8); - QStringList downloadurl=urladdress.split("/"); - - QString deburl = serverUrl; - deburl = deburl.left(urladdress.length()-1); - urladdress = "https://cdn.jsdelivr.net/gh/Jerrywang959/jsonpng@master/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 - urladdress = urladdress.left(urladdress.length()-1); - - for (int i=3;iget(targetUrl.toString()) + .header("content-type", "application/json") + .onResponse([this](QByteArray json_array) { + QString urladdress, deatils, more, packagename, appweb; + bool isInstalled; - // 路径转化完成 - QJsonObject json= QJsonDocument::fromJson(json_array).object(); - QString appName = json["Name"].toString(); - QUrl fileUrl = deburl + json["Filename"].toString(); - - // 软件信息加载 - QString details; - details = tr("PkgName: ") + json["Pkgname"].toString()+"\n"; - details += tr("Version: ") + json["Version"].toString()+"\n"; - if(json["Author"].toString() != "" && json["Author"].toString() != " "){ - details += tr("Author: ") + json["Author"].toString() + "\n"; - } + // 将路径转化为相应源的下载路径 + urladdress = targetUrl.toString().left(targetUrl.toString().length()-8); + QStringList downloadurl=urladdress.split("/"); - if(json["Website"].toString() != "" && json["Website"].toString() != " "){ - details += tr("Official Site: ") + json["Website"].toString() + "\n"; - //ui->pushButton_website->show(); move to setinfo slot - appweb=json["Website"].toString(); - } - details+=tr("Contributor: ")+json["Contributor"].toString()+"\n"; - details+=tr("Update Time: ")+json["Update"].toString()+"\n"; - details+=tr("Installed Size: ")+json["Size"].toString()+"\n"; - more = json["More"].toString(); - - QProcess isInstall; - packagename = json["Pkgname"].toString(); - isInstall.start("dpkg -s "+json["Pkgname"].toString()); - isInstall.waitForFinished(); - int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); - if(error==0) - isInstalled = true; - else - isInstalled = false; - - emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled); - - //tag加载 - QString tags=json["Tags"].toString(); - QStringList tagList=tags.split(";"); - emit requestSetTags(&tagList); - - // 图标加载 - get_json.start("curl -o icon.png "+urladdress+"icon.png"); - if(waitDownload(get_json) == -1) - return; - if(!get_json.exitCode()) { - QPixmap appicon("icon.png"); - emit finishedIconLoad(&appicon); - } - else - Widget::sendNotification(tr("Failed to load application icon.")); - - - // 截图展示加载 - QPixmap screenshotCache[5]; - for (int i = 0; i < 5; i++) { - QString cmd = "curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png"; - get_json.start(cmd); - if(waitDownload(get_json) == -1) - return; - bool s = screenshotCache[i].load(QString(TMP_PATH) + "/screen_"+QString::number(i+1)+".png"); - if(s){ - emit finishedScreenshotLoad(&screenshotCache[i], i); - }else{ - emit finishedScreenshotLoad(nullptr, i); - QFile::remove("screen_"+QString::number(i+1)+".png"); - break; + QString deburl = serverUrl; + deburl = deburl.left(urladdress.length()-1); + urladdress = "https://cdn.jsdelivr.net/gh/Jerrywang959/jsonpng@master/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 + urladdress = urladdress.left(urladdress.length()-1); + + for (int i=3;ipushButton_website->show(); move to setinfo slot + appweb=json["Website"].toString(); + } + details+=tr("Contributor: ")+json["Contributor"].toString()+"\n"; + details+=tr("Update Time: ")+json["Update"].toString()+"\n"; + details+=tr("Installed Size: ")+json["Size"].toString()+"\n"; + more = json["More"].toString(); + + QProcess isInstall; + packagename = json["Pkgname"].toString(); + isInstall.start("dpkg -s "+json["Pkgname"].toString()); + isInstall.waitForFinished(); + int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); + if(error==0) + isInstalled = true; + else + isInstalled = false; + + emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled); + + //tag加载 + QString tags=json["Tags"].toString(); + QStringList tagList=tags.split(";"); + emit requestSetTags(&tagList); + + // 图标加载 + httpClient->get(urladdress+"icon.png") + .onResponse([this](QByteArray imgData){ + QPixmap appicon; + appicon.loadFromData(imgData); + emit finishedIconLoad(&appicon); + }) + .onError([this](QString errorStr) { + Widget::sendNotification(tr("Failed to load application icon.")); + }) + .timeout(10 * 100) + .exec(); + + + // 截图展示加载 + QPixmap screenshotCache[5]; + for (int i = 0; i < 5; i++) { + httpClient->get(urladdress+"screen_"+QString::number(i+1)+".png") + .onResponse([this, i, &screenshotCache](QByteArray imgData){ + bool s = screenshotCache[i].loadFromData(imgData); + if(s){ + emit finishedScreenshotLoad(&screenshotCache[i], i); + }else{ + emit finishedScreenshotLoad(nullptr, i); + } + }) + .onError([this](QString errorStr) { + qDebug() << "截图下载失败"; +// Widget::sendNotification(tr("Failed to load application screenshot.")); + }) + .timeout(10 * 100) + .exec(); + } + emit finishAllLoading(); + + }) + .onError([](QString errorStr) { + Widget::sendNotification(tr("Failed to download app info. Please check internet connection.")); + }) + .timeout(10 * 100) + .exec(); + +} + +SpkAppInfoLoaderThread::~SpkAppInfoLoaderThread() +{ + if (httpClient) { + httpClient->deleteLater(); + httpClient = nullptr; + } } void SpkAppInfoLoaderThread::setUrl(const QUrl &url) diff --git a/src/workerthreads.h b/src/workerthreads.h index 399fd32d..1ccf232b 100644 --- a/src/workerthreads.h +++ b/src/workerthreads.h @@ -6,12 +6,18 @@ #include #include + +namespace AeaQt { + class HttpClient; +} + class SpkAppInfoLoaderThread Q_DECL_FINAL : public QThread { Q_OBJECT public: //explicit SpkAppInfoLoaderThread() = default; void run() Q_DECL_OVERRIDE; + ~SpkAppInfoLoaderThread(); public slots: void setUrl(const QUrl &url); void setServer(const QString &server); @@ -31,6 +37,8 @@ private: QString serverUrl; bool finishedDownload = false; int downloaderRetval = 0; + + AeaQt::HttpClient *httpClient; }; #endif // WORKERTHREADS_H -- Gitee From 4ccc8c0daee16f19e45a9d10c03f50c2864c2043 Mon Sep 17 00:00:00 2001 From: metanoia1989 Date: Sat, 6 Mar 2021 17:00:55 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/downloadworker.cpp | 53 ++++++++++++++++++++++++------------------ src/widget.cpp | 17 -------------- src/workerthreads.cpp | 18 +++++++------- src/workerthreads.h | 1 - 4 files changed, 38 insertions(+), 51 deletions(-) diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp index 2d95f47a..e02af2e7 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include DownloadWorker::DownloadWorker(QObject *parent) { @@ -49,19 +51,22 @@ void DownloadWorker::doWork() } }); connect(reply, &QNetworkReply::finished, mgr, &QNetworkAccessManager::deleteLater); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::readyRead, this, &DownloadWorker::dataReady); connect(reply, &QNetworkReply::finished, this, &DownloadWorker::slotFinish); connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWorker::handleProcess); +// connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); + connect(reply, &QNetworkReply::finished, this, &DownloadWorker::doStop); } void DownloadWorker::doStop() { - reply->disconnect(); - reply->aboutToClose(); - reply->deleteLater(); - reply = nullptr; + if (reply) { + reply->disconnect(); + reply->aboutToClose(); + reply->deleteLater(); + reply = nullptr; + } } void DownloadWorker::dataReady() @@ -95,17 +100,19 @@ DownloadController::DownloadController(QObject *parent) "sucdn4.jerrywang.top", "sucdn5.jerrywang.top" }; - this->threadNum = domains.size() > 6 ? 6 : domains.size(); + this->threadNum = domains.size() > 4 ? 4 : domains.size(); } DownloadController::~DownloadController() { - for(int i = 0; i < workers.size(); i++) { - workers.at(i)->doStop(); - workers.at(i)->disconnect(); - workers.at(i)->deleteLater(); + if (workers.size() > 0) { + for(int i = 0; i < workers.size(); i++) { + workers.at(i)->doStop(); + workers.at(i)->disconnect(); + workers.at(i)->deleteLater(); + } + workers.clear(); } - workers.clear(); } void DownloadController::setFilename(QString filename) @@ -123,6 +130,10 @@ void DownloadController::setThreadNum(int threadNum) */ void DownloadController::startDownload(const QString &url) { + + + finish = 0; + // 下载任务等分,计算每个线程的下载数据 fileSize = getFileSize(url); if (fileSize == 0) { @@ -141,8 +152,10 @@ void DownloadController::startDownload(const QString &url) ranges[threadNum-1].second = fileSize; // 余数部分加入最后一个 // 打开文件 + QDir tmpdir("/tmp/spark-store"); file = new QFile; - file->setFileName(filename); + file->setFileName(tmpdir.absoluteFilePath(filename)); + if (file->exists()) file->remove(); if (!file->open(QIODevice::WriteOnly)) { @@ -180,7 +193,9 @@ void DownloadController::stopDownload() workers.at(i)->deleteLater(); } workers.clear(); -// file->flush(); + + qDebug() << "文件下载路径:" << QFileInfo(file->fileName()).absoluteFilePath(); + file->flush(); file->close(); delete file; file = nullptr; @@ -200,17 +215,9 @@ void DownloadController::handleProcess() void DownloadController::chunkDownloadFinish() { finish++; + qDebug() << QString("已下载了%1块,共%2块!!!").arg(finish).arg(threadNum); if (finish == threadNum) { - file->flush(); - file->close(); - delete file; - file = nullptr; - for(int i = 0; i < workers.size(); i++) { - workers.at(i)->doStop(); - workers.at(i)->disconnect(); - workers.at(i)->deleteLater(); - } - workers.clear(); + stopDownload(); emit downloadFinished(); } } diff --git a/src/widget.cpp b/src/widget.cpp index eea5a78b..f3c05bca 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -566,10 +566,6 @@ void Widget::startRequest(QUrl url, QString fileName) isdownload=true; download_list[allDownload-1].free=false; -// reply = manager->get(QNetworkRequest(url)); -// connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); -// connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); -// connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64))); connect(downloadController, &DownloadController::downloadProcess, this, &Widget::updateDataReadProgress); connect(downloadController, &DownloadController::downloadFinished, this, &Widget::httpFinished); connect(downloadController, &DownloadController::errorOccur, [this](QString msg){ @@ -807,12 +803,6 @@ void Widget::sltAppinfoFinish() void Widget::httpFinished() // 完成下载 { -// file->flush(); -// file->close(); -// reply->deleteLater(); -// reply = nullptr; -// delete file; -// file = nullptr; isdownload=false; isBusy=false; download_list[nowDownload-1].readyInstall(); @@ -823,13 +813,6 @@ void Widget::httpFinished() // 完成下载 nowDownload+=1; } QString fileName=download_list[nowDownload-1].getName(); -// file = new QFile(fileName); -// if(!file->open(QIODevice::WriteOnly)) -// { -// delete file; -// file = nullptr; -// return ; -// } startRequest(urList.at(nowDownload-1), fileName); } } diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp index 9adbe636..a869cd5a 100644 --- a/src/workerthreads.cpp +++ b/src/workerthreads.cpp @@ -16,6 +16,7 @@ void SpkAppInfoLoaderThread::run() httpClient->get(targetUrl.toString()) .header("content-type", "application/json") .onResponse([this](QByteArray json_array) { + qDebug() << "请求应用信息 " << json_array; QString urladdress, deatils, more, packagename, appweb; bool isInstalled; @@ -83,7 +84,8 @@ void SpkAppInfoLoaderThread::run() .onError([this](QString errorStr) { Widget::sendNotification(tr("Failed to load application icon.")); }) - .timeout(10 * 100) + .block() + .timeout(5 * 100) .exec(); @@ -103,27 +105,23 @@ void SpkAppInfoLoaderThread::run() qDebug() << "截图下载失败"; // Widget::sendNotification(tr("Failed to load application screenshot.")); }) - .timeout(10 * 100) + .block() + .timeout(4 * 100) .exec(); } emit finishAllLoading(); + httpClient->deleteLater(); }) .onError([](QString errorStr) { Widget::sendNotification(tr("Failed to download app info. Please check internet connection.")); }) - .timeout(10 * 100) + .timeout(5 * 100) + .block() .exec(); } -SpkAppInfoLoaderThread::~SpkAppInfoLoaderThread() -{ - if (httpClient) { - httpClient->deleteLater(); - httpClient = nullptr; - } -} void SpkAppInfoLoaderThread::setUrl(const QUrl &url) { diff --git a/src/workerthreads.h b/src/workerthreads.h index 1ccf232b..dc3535fa 100644 --- a/src/workerthreads.h +++ b/src/workerthreads.h @@ -17,7 +17,6 @@ class SpkAppInfoLoaderThread Q_DECL_FINAL : public QThread public: //explicit SpkAppInfoLoaderThread() = default; void run() Q_DECL_OVERRIDE; - ~SpkAppInfoLoaderThread(); public slots: void setUrl(const QUrl &url); void setServer(const QString &server); -- Gitee From 01d1543cc41eb63e9293ebaf8dc231d9d5328e68 Mon Sep 17 00:00:00 2001 From: Jerry <767729940@qq.com> Date: Fri, 16 Apr 2021 12:19:22 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E4=B8=8B=E8=BD=BD=E5=9F=9F=E5=90=8D=E5=92=8C=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/downloadworker.cpp | 10 +++++----- src/workerthreads.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp index e02af2e7..fbece6e7 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -94,11 +94,11 @@ void DownloadWorker::handleProcess(qint64, qint64) DownloadController::DownloadController(QObject *parent) { domains = { - "sucdn1.jerrywang.top", - "sucdn2.jerrywang.top", - "sucdn3.jerrywang.top", - "sucdn4.jerrywang.top", - "sucdn5.jerrywang.top" + "d1.store.deepinos.org.cn", + "d2.store.deepinos.org.cn", + "d3.store.deepinos.org.cn", + "d4.store.deepinos.org.cn", + "d5.store.deepinos.org.cn" }; this->threadNum = domains.size() > 4 ? 4 : domains.size(); } diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp index a869cd5a..52413639 100644 --- a/src/workerthreads.cpp +++ b/src/workerthreads.cpp @@ -26,7 +26,7 @@ void SpkAppInfoLoaderThread::run() QString deburl = serverUrl; deburl = deburl.left(urladdress.length()-1); - urladdress = "https://cdn.jsdelivr.net/gh/Jerrywang959/jsonpng@master/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 + urladdress = "https://img.jerrywang.top/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 urladdress = urladdress.left(urladdress.length()-1); for (int i=3;i Date: Fri, 16 Apr 2021 18:48:01 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index f3c05bca..ab19adf1 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -237,7 +237,7 @@ void Widget::initConfig() ui->comboBox_server->addItem(QString::fromStdString(lineTmp)); } }else { - ui->comboBox_server->addItem("http://sucdn.jerrywang.top/"); + ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/"); } // 读取服务器URL并初始化菜单项的链接 @@ -246,7 +246,7 @@ void Widget::initConfig() ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString()); appinfoLoadThread.setServer(serverUrl=readConfig.value("server/choose").toString()); }else { - appinfoLoadThread.setServer(serverUrl="http://sucdn.jerrywang.top/"); // 默认URL + appinfoLoadThread.setServer(serverUrl="https://d.store.deenos.org.cn/"); // 默认URL } configCanSave=true; // 防止触发保存配置信号 menuUrl[0]=serverUrl + "store/#/"; @@ -890,7 +890,7 @@ void Widget::on_pushButton_updateServer_clicked() ui->comboBox_server->addItem(QString::fromStdString(lineTmp)); } }else { - ui->comboBox_server->addItem("http://sucdn.jerrywang.top/"); + ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/"); } ui->pushButton_updateServer->setEnabled(true); ui->comboBox_server->setCurrentIndex(0); -- Gitee From 96cd1b991881dd0404b64fac3d546f988c793efb Mon Sep 17 00:00:00 2001 From: Jerry <767729940@qq.com> Date: Fri, 16 Apr 2021 19:05:30 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=BA=BF=E8=B7=AF=E7=9A=84=E5=9F=9F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget.cpp b/src/widget.cpp index ab19adf1..059468dc 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -881,7 +881,7 @@ void Widget::on_pushButton_updateServer_clicked() ui->pushButton_updateServer->setEnabled(false); ui->comboBox_server->clear(); QFile::remove(QDir::homePath().toUtf8()+"/.config/spark-store/server.list"); - system("curl -o "+QDir::homePath().toUtf8()+"/.config/spark-store/server.list http://dcstore.shenmo.tech/store/server.list"); + system("curl -o "+QDir::homePath().toUtf8()+"/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server.list"); std::fstream server; server.open(QDir::homePath().toUtf8()+"/.config/spark-store/server.list",std::ios::in); std::string lineTmp; -- Gitee From d164aec86d353babce8378a1eddaee1d5448b56c Mon Sep 17 00:00:00 2001 From: zty199 <46324746+zty199@users.noreply.github.com> Date: Sat, 17 Apr 2021 00:53:26 +0800 Subject: [PATCH 08/15] Improve Features Fix a bug that annotations in server list can be chosen in combobox; Fix a bug that index page don't follow system theme; Disable qDebug/qWarning output in Release version; Update default server list. --- spark-store-project.pro | 2 +- src/spark-store.pro | 3 +++ src/widget.cpp | 19 +++++++++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/spark-store-project.pro b/spark-store-project.pro index 329b0969..254ea6c9 100644 --- a/spark-store-project.pro +++ b/spark-store-project.pro @@ -4,4 +4,4 @@ CONFIG += ordered SUBDIRS = third-party/QtNetworkService \ src/spark-store.pro -spark-store.depends = third-party/QtNetworkService \ No newline at end of file +spark-store.depends = third-party/QtNetworkService diff --git a/src/spark-store.pro b/src/spark-store.pro index 14407ec8..fcf5be58 100644 --- a/src/spark-store.pro +++ b/src/spark-store.pro @@ -25,6 +25,9 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +# 禁止输出 qWarning / qDebug 信息 +CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT + SOURCES += main.cpp\ appitem.cpp \ downloadworker.cpp \ diff --git a/src/widget.cpp b/src/widget.cpp index 059468dc..b67cc188 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -236,6 +236,13 @@ void Widget::initConfig() while (getline(serverList,lineTmp)) { ui->comboBox_server->addItem(QString::fromStdString(lineTmp)); } + for(int i = 0; i < ui->comboBox_server->count(); i++) + { + if(ui->comboBox_server->itemText(i) == "开发者模式 Dev only") + { + ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1); + } + } }else { ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/"); } @@ -271,8 +278,8 @@ void Widget::initConfig() ui->webfoot->hide(); //初始化首页 - ui->webEngineView->setUrl(menuUrl[0]); - // ui->webEngineView->setUrl(menuUrl[1]); + chooseLeftMenu(0); + // ui->webEngineView->setUrl(menuUrl[0]); //给下载列表赋值到数组,方便调用 for (int i =0; ipushButton_updateServer->setEnabled(true); ui->comboBox_server->setCurrentIndex(0); + + for(int i = 0; i < ui->comboBox_server->count(); i++) + { + if(ui->comboBox_server->itemText(i) == "开发者模式 Dev only") + { + ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1); + } + } }); } -- Gitee From e12f617f59295c9bbccf4a3e76589bef850fb7a1 Mon Sep 17 00:00:00 2001 From: zty199 <46324746+zty199@users.noreply.github.com> Date: Sat, 17 Apr 2021 01:16:01 +0800 Subject: [PATCH 09/15] Update README.md --- README.md | 5 +- translations/spark-store_en.qm | Bin 0 -> 149 bytes translations/spark-store_en.ts | 117 +++++++++--------------------- translations/spark-store_zh_CN.qm | Bin 0 -> 13973 bytes translations/spark-store_zh_CN.ts | 99 +++++++++++-------------- 5 files changed, 81 insertions(+), 140 deletions(-) create mode 100644 translations/spark-store_en.qm create mode 100644 translations/spark-store_zh_CN.qm diff --git a/README.md b/README.md index e864a50e..80627245 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,8 @@ web页面部分正在开发当中,详情请见[web仓库](https://gitee.com/de 当前服务器线路列表(项目中包含): ``` -http://sucdn.jerrywang.top/ -http://store.jerrywang.top/ -http://dcstore.spark-app.store/ +https://d.store.deepinos.org.cn/ +https://store.deepinos.org.cn/ ``` #### 调用参数(spk规则) diff --git a/translations/spark-store_en.qm b/translations/spark-store_en.qm new file mode 100644 index 0000000000000000000000000000000000000000..8a774d57b5d488697744a57ba2a805208c62a8d9 GIT binary patch literal 149 zcmcE7ks@*G{hX<16=n7(EZlo{IRgU&Q)-?QkP={EUhN4nrnG9z!-< SBWrL*Vo@rx-VTs)jEn$GR2x13 literal 0 HcmV?d00001 diff --git a/translations/spark-store_en.ts b/translations/spark-store_en.ts index 24aa7bbf..cdf08706 100644 --- a/translations/spark-store_en.ts +++ b/translations/spark-store_en.ts @@ -28,47 +28,47 @@ SpkAppInfoLoaderThread - + Failed to download app info. Please check internet connection. - + PkgName: - + Version: - + Author: - + Official Site: - + Contributor: - + Update Time: - + Installed Size: - + Failed to load application icon. @@ -127,8 +127,7 @@ - - + Install @@ -411,128 +410,82 @@ 0B - + Spark Store - + Search or enter spk:// - + Submit App - + Settings - + Not Exist - - - - - + + + + + Spark\ Store - - Failed to download app info. Please check internet connection. - - - - - PkgName: - - - - - Version: - - - - - Author: - - - - - Official Site: - - - - - Contributor: - - - - - Update Time: - - - - - Installed Size: - - - - - - + + Reinstall - - Failed to load application icon. - - - - + Failed to get the name to the file to be downloaded. - + Updating, please wait... - + Apt has reported an error. Please use apt update in terminal to locate the problem. - + Unknown error! - + Yes - + No - + Information for Contributors - + Currently the translation contribution is limited to English, and you will be redirected to our Gitee repository at which you are supposed to be creating pull requests to contribute app info @@ -543,27 +496,27 @@ Click yes to continue. - + Uninstall succeeded - + Relative apps Not Found! - + Request Error: %1 - + Temporary cache was cleaned - + The URL has been copied to the clipboard diff --git a/translations/spark-store_zh_CN.qm b/translations/spark-store_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..5d801916edd6dcb28a90bf734b07fd999665c006 GIT binary patch literal 13973 zcmcgz3wTu3wcdeDm`o-Kz7X-jF%%Lp$s{N!0aGBzqrw?7GbF@7l6jn&Ib`OX@jNCZ zC;<&Em_Wj95vtrO{j_4erCe|AzI-QhX6?1tT6^ua{qq!}?H^e)dy}zQkFnu!R|L;0>T>EGE!Dh$ZAH9h2HIA=e48C~}Ii8Urr}LoW7Z*MPeLg6dyTOn3 zUQ)2_{@w7CU_sxbP2ltQf}fU2j7{z@cy*lz_IkYF-3b_1>@0Yn8-)KHDfsBK@T+Tn z?_@0#A=g&t3i)No!#R_)K7;jo%lS?JBCO|Z=My<9_!c>zzP}ds`E?;XZi51x`Ml=g z!p%2>Z(+P>#+<{@yST_T|0>A2xX2|{!mi1p*N(tHE5%}L1?X{KvF9p$Z~LIQbs^*} zT3vki<3Y%CS@FM=fUf$M;wSgaz~`;Sf4}4pkWUriyiZLW!aqC4vpiz5OjhEP@W-UZ ziNs1xi0429b}{p^1oJb6wKJ~eOM2PbWi9)xF$La)UuoyOnyd&kG_QV@KOn?tWX`wP zLZ%vHCC1?|jdijZ6WC3xl!cj$oujb|ycby)-qx^cRt0K}Eg11_2fh(mghlbbhRp-T z0*tQJtHE(8z7sG)1ShVu)>~75+V@nlCoLmpcUkk-;!^-RxETHA$LJ_N37CnbA?_MD zshGospAO@vGBuhsufUiDe(0SB*=ekcBstHqB%9xmWmu~5*=i1?AzML)@bpAGtx7BN z9^LZvr|6xUYd~-PIxMi9tzoP1Y+%^<5tF}<=mY@wR)OPs28#)O+n!?L7R zsA88;Q(cwN78oBp1ThlTYUWifD6L&AasEU?B{$#_a)+P@AuiC#g#;lXN?cHm$8|~6 zIv2W#Y3;&*;;LQf=c0-bzNs{-X$iH)I|aJ zfvBamUc*I0LQ;sy2|-aagdj=Q=z*B1Mj^5;g#?9LzGfBIaGkLe>fM2jLQpeyg5AA- zt8Hi+Dzw4mMT9fDWUb zox^Otp#KhX?XH5B{@ypXJnQ~_o7_~rYvz!%_xAB(Q(^JR9pr3eiBIY^k1oo!V^~D(mpS)61HGhnh@{%*2)$sP_{oVB$EQ;OX zuox8mF>uh%g@f1TE6m`KzotFH`{U;@)){_JI3k?d`(DQQ!nKKzUlTZ=crHBb%8E#N z#`ydOI5CWP7VR@)`-G|`MtE)%LlFV)obhGF!l)LH)h>*}U9m3%a;UR*VIsA)T=>If zzH%94XXdl=41C0Rgj1E^O(iuh%^y)+{yCuvHI8MhOh}Ou%s7rY+~+ul6>`pdrd8)S zlNsaAdzy1KT1aa@?>Wv{l@3u7=KTLmGxwi9jULb?O+W8x&UImQSsl+D$P{lNMHA$R z0}c@!i2_XcSqPB8gefxq?lk^Ru-g7(VHeNZYmul!pi2Xu3P2PBJ_4I#!m=S})18q6 z?zWa>>|i9nvCQ4Am&O0l^0nJP^jzvax?`2HV#wb9%ceWq4w>IE9e_wTK$t$1Kjd_` z?PEK)ZTstvReM%<6JR^zZ0a}H-DQ9bNM}3)07PktUBjALdFbA;chce%Jg6|djxtl_ z$}ra{>zp4bLRUp8!kKHx$qFZHQKV)`mMT)9A|$GsB9{}r8kO}}2<#FuISo2eTmeEr zp>V1Y3s;^c&|qnfpV!iiZK}DHuK$mhOpwWgzag7YyfvFeR6`NMX?wCss`ZvsaOEpCp;eg1XnPJtz~ZJ zZT@!4HmsBg_PH#rYW&RYw?jdJOlE0XIj4~mj0LtYJgY_MEeaHJ6(Ns+snAUP*-~#^5@Ov$% zdk?$Yh;DN^&-mF}ez@zTdp%!6e58RPC(rII54$3)>$>K9lRZ@v#s+B1o!^RH#M$T8bvDbx?A|*Sb+egvvR;6yj7pk&qP) zgTP5gRhMGwPhg-d$A}qle+H9Eu90YU;P6f^fl3_H8Z%KwB_6~pEGnwT#Q+OAe~P|c3~xVc9%Ugo>lKZW=6rVi{c|i#&mofa?*P8 zHN)@sZ}T1{de8G+C-}h~(bfe28vkbV2WWf{deYe@eR^9?vS-)T>i9Cl7tge+FojWL ztAHbB#~~}A!n8_xhrmU|B-xl&+8?0>ipmmj4jKxueMeNLQrzqh7=etex=NJvP29~v zIVMNYOF3IKzI%LDP2tR?%*SqFDe%(!ei}zcSM3WB%!mkgeW!I_gf;hd@5a9K-rF~x z-N3eeirvU`9JkbWi-A1KP1lMGeo5s-jq5NlUeph(1q2Q43Qh=z(W>CkPFQO8nU)G_ zyCx^No28_v$Wk1+>#SCqczQfmBL8YhV#L_Zx)LOT;nwEp<|VZ+OIR&m7?H_LWorw{AeR^5o2L2Yl zf{=o5oymdr2SvjEmwRURALD0pR}43F(^!JLa>$9*ui-!6`v~owWKX2P`#g3M+tuO8 z;~#ChLoZAAP}Bs^DO+vy-uq*|hUmwXUoTyi`C8A1?8ouBLTAq=Hk$m^#$~W5% zMe342PxkCs#n(`0(D%8HLE-|xoP}zW8pazD`NF6hCE#M!s68d1WSK3(uMUbBo-$hA zl`M#79OEK1&RhZaG|G_F((-Wkgxrru>gu;Qe{U@L;Ki+N?~<3${IE>n=7V9^2(Njv z_aJ!g9k{UnS78_RN8RgvPnoj}eB55r|Dqc<^gK{6WOHZr_~E)AL{scWb^|cuJT@Po z>pC_UM+hU^{O64Gb6*@gDj`8qwjJ3CFX1wK-&G4rYI(OW)l)WdrkrjtYJxvr&TZ6< z4B9SG)q{j-@-*JcNUNz#9rsI}W_)+0(30Az;tXaa{x(uQr4Q9$lgcl~TSb?Qxo6#` z%i037<82(um@ls8%x8HDSOgR*t|_Gq1AR>fLZBKOsYs2QCAbjQV?ZV*>L{l&9ABcH zuAzgPpdKcg`zbLf*y3B0M>z(8Jzxu|8;eQxFM)C<2fUvPFj8 zr3Sgtl{PS!u40816To0?sCOW2N&txoWOW1Wq?RzEKz=e1(US<~w~$TlfWqiikU=;V zgQ*8Eb8#I|iC|Ks6WL5rI%yI70a=G`IC;P)%LHztWuYWRKtcoHrPjdk$FL#*nPE}@ z45gEt2-CnX%G0ZfCObaRIP~}xshq%G6> z#E9b`?_v}mQCL_Js5XJ^aGWS8imX^?Pw*vxWi3_97#=4maZ!RxLVfa0gc#bbDGxJF zjPlZF7?9T9|I3Esp1j*PTZ&Cy;>U3oM$_1ctaN58Xy+H~-`~C4JH;AeUn2N*O$?7F z?X2Y=jNLyl%_7aMLrlx&=%8|OAV2WmL&Jp5x~NPz9*AA2$sUj^*}A$cp0+x;xRgzE zAyp*ZANC$)E<$PE7rwm18Zo7AL}j1=9-CV>i$#tj`L<`Z0TZ5~GML!V;o+VC5WbK; zKr{;%mPa+Cv&tU=?DRUJmHu9_pjB1mbF zqCi47!q#m%5~PudM$~^sMTt{e#|VMdN{3Ix!Fdz-2I-_;G{SliXRO!&P%ezaU)l+f z(MUwbOxSQ-82*wmoe|Y24Goi!Fe4?(oQpPY1o=Zp<1-kPan53H*a#&J*))Qq&XA-N z5uLUpTo%= z@r>6de1SjZE6h5czJB<4nj$<|Ov0%y2|LnySfcddxe&^fKI0J8x;>K-pQIZD#kW@T zYbBF=!E9L4-=&KnMl`u_BSIjFL2$jBgE{lsdZ4p2kkm zv-inv$)YTzpvier<6~Ql;yOF|cI#RM2Yl0AM>V;inqoM9gE}Tt0~t%G z0#wsZ{CC>uxv(l&sXYWRDfFS@{Ah~ zqhu=zcv~55C)yoN^DXjA-2kkX&vRyg8!M64C;8Vhbjx#Nc_h_<-ihAFVEinMoG&Yk}TeDo?5sZM&-Aurz zhMQTPJ<`73-Lf_?yWtaSOo10+7zIaE)<$`MQRs?0N&-`8>Av(y@F8o=6fb~2stYO# z=qeAYj&@wB%9t!8D&%>MMso&%5f?`8MEjXGVUf{8YNy^%h8Q+46^_|VJq;)L8tOfn zTbJLR-ne`L>itFhpjUNwBh42EZt)xJ}! zPUx(`D@v%5C}M|1G_D1u&n_(5La%uOF!sWX^BU#| zjO?WAfwToEaaglCjUK`J5jQtS46##NCSz+myhgb~$DY~R6w%rcZ(or#XFK%SO?j#v7Gc8L8n-7OQqk=}RcT@iz7ES(I=?uZrPIQ6Ep8GA@i!55ytHGckgoIJ* zJ0i0?293}+99)amO6?MGnOX0R5$TW+Km^ni@bUN(H+Vs-PnqrDn!5<6nlJ8AEdEUS!7C6nng{#dlbe<<*uG?2?22o`V50w JfiZKP{}=aCm@5DP literal 0 HcmV?d00001 diff --git a/translations/spark-store_zh_CN.ts b/translations/spark-store_zh_CN.ts index 8cb86d86..24908735 100644 --- a/translations/spark-store_zh_CN.ts +++ b/translations/spark-store_zh_CN.ts @@ -48,47 +48,47 @@ SpkAppInfoLoaderThread - + Failed to download app info. Please check internet connection. 下载应用程序详细信息失败,请检查网络连接。 - + PkgName: 包名: - + Version: 版本: - + Author: 作者: - + Official Site: 官网: - + Contributor: 投稿者: - + Update Time: 更新时间: - + Installed Size: 大小: - + Failed to load application icon. 加载应用程序图标失败。 @@ -190,8 +190,7 @@ - - + Install 安装 @@ -471,103 +470,93 @@ - + Spark Store Spark 应用商店 - + Search or enter spk:// 搜索或打开链接 - + Submit App 投递应用 - + Settings 设置 - + Not Exist 不存在 - - - - - + + + + + Spark\ Store 星火应用商店 - Failed to download app info. Please check internet connection. - 下载应用程序详细信息失败,请检查网络连接。 + 下载应用程序详细信息失败,请检查网络连接。 - PkgName: - 包名: + 包名: - Version: - 版本: + 版本: - Author: - 作者: + 作者: - Official Site: - 官网: + 官网: - Contributor: - 投稿者: + 投稿者: - Update Time: - 更新时间: + 更新时间: - Installed Size: - 大小: + 大小: - - - + + Reinstall 重新安装 - Failed to load application icon. - 加载应用程序图标失败。 + 加载应用程序图标失败。 - + Failed to get the name to the file to be downloaded. 获取安装包文件名失败。 - + Relative apps Not Found! 相关应用未找到! - + Request Error: %1 请求错误:%1 @@ -576,37 +565,37 @@ 目前仅支持商店专用链接的打开,搜索功能正在开发,请期待以后的版本! - + Updating, please wait... 正在更新,请稍候…… - + Apt has reported an error. Please use apt update in terminal to locate the problem. 更新中发生错误,请在终端使用apt update来查看错误原因。 - + Unknown error! 未知错误! - + Yes - + No - + Information for Contributors 贡献者须知 - + Currently the translation contribution is limited to English, and you will be redirected to our Gitee repository at which you are supposed to be creating pull requests to contribute app info @@ -642,17 +631,17 @@ Click yes to continue. 服务器未知错误 - + Uninstall succeeded 卸载成功 - + Temporary cache was cleaned 缓存目录已清空 - + The URL has been copied to the clipboard 链接已复制到剪贴板 -- Gitee From 3ff363d7b180edfd94167a4f3ed2e3365dd73479 Mon Sep 17 00:00:00 2001 From: Jerry <767729940@qq.com> Date: Sat, 17 Apr 2021 03:16:22 +0800 Subject: [PATCH 10/15] =?UTF-8?q?4=E7=BA=BF=E7=A8=8B=E5=88=87=E5=88=B05?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/downloadworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp index fbece6e7..8f38cbe3 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -100,7 +100,7 @@ DownloadController::DownloadController(QObject *parent) "d4.store.deepinos.org.cn", "d5.store.deepinos.org.cn" }; - this->threadNum = domains.size() > 4 ? 4 : domains.size(); + this->threadNum = domains.size() > 5 ? 5 : domains.size(); } DownloadController::~DownloadController() -- Gitee From ebf30e67f9741450ccbca51d33aef55c77e7ce8d Mon Sep 17 00:00:00 2001 From: Jerry <767729940@qq.com> Date: Sat, 17 Apr 2021 03:19:38 +0800 Subject: [PATCH 11/15] =?UTF-8?q?4=E7=BA=BF=E7=A8=8B=E5=88=B05=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/downloadworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp index fbece6e7..8f38cbe3 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -100,7 +100,7 @@ DownloadController::DownloadController(QObject *parent) "d4.store.deepinos.org.cn", "d5.store.deepinos.org.cn" }; - this->threadNum = domains.size() > 4 ? 4 : domains.size(); + this->threadNum = domains.size() > 5 ? 5 : domains.size(); } DownloadController::~DownloadController() -- Gitee From 6fd3c40e9725ae9d6471828716ae35e7c04f6080 Mon Sep 17 00:00:00 2001 From: zty199 <46324746+zty199@users.noreply.github.com> Date: Sat, 17 Apr 2021 04:30:28 +0800 Subject: [PATCH 12/15] Reorganize part of codes Reorganize spark-store.pro, widget.h and widget.cpp. --- src/spark-store.pro | 45 +-- src/widget.cpp | 793 +++++++++++++++++++++++++++----------------- src/widget.h | 27 +- 3 files changed, 521 insertions(+), 344 deletions(-) diff --git a/src/spark-store.pro b/src/spark-store.pro index fcf5be58..c1737fda 100644 --- a/src/spark-store.pro +++ b/src/spark-store.pro @@ -8,9 +8,6 @@ QT += core gui network concurrent webenginewidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -CONFIG += c++11 link_pkgconfig -PKGCONFIG += dtkwidget glib-2.0 gdk-pixbuf-2.0 libnotify - TARGET = spark-store TEMPLATE = app @@ -25,35 +22,42 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +DEFINES += QT_APP_DEBUG +include(../third-party/QtNetworkService/QtNetworkService.pri) + +CONFIG += c++11 link_pkgconfig +PKGCONFIG += dtkwidget glib-2.0 gdk-pixbuf-2.0 libnotify + # 禁止输出 qWarning / qDebug 信息 CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT -SOURCES += main.cpp\ +SOURCES += \ appitem.cpp \ - downloadworker.cpp \ - widget.cpp \ + big_image.cpp \ downloadlist.cpp \ + downloadworker.cpp \ + flowlayout.cpp \ image_show.cpp \ - big_image.cpp \ + main.cpp \ progressload.cpp \ - flowlayout.cpp \ + widget.cpp \ workerthreads.cpp -HEADERS += \ +HEADERS += \ appitem.h \ - downloadworker.h \ - widget.h \ + big_image.h \ downloadlist.h \ + downloadworker.h \ + flowlayout.h \ image_show.h \ - big_image.h \ progressload.h \ - flowlayout.h \ + widget.h \ workerthreads.h FORMS += \ appitem.ui \ - widget.ui \ - downloadlist.ui + downloadlist.ui \ + widget.ui RESOURCES += \ ../assets/icons.qrc @@ -73,10 +77,7 @@ DISTFILES += \ ../assets/tags/logo_icon.svg \ ../assets/tags/uos.svg -TRANSLATIONS = ../translations/spark-store_en.ts \ - ../translations/spark-store_zh_CN.ts - ../translations/spark-store_fr.ts\ - -DEFINES += QT_APP_DEBUG -include(../third-party/QtNetworkService/QtNetworkService.pri) - +TRANSLATIONS += \ + ../translations/spark-store_en.ts \ + ../translations/spark-store_fr.ts \ + ../translations/spark-store_zh_CN.ts diff --git a/src/widget.cpp b/src/widget.cpp index b67cc188..55dd9ebd 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1,38 +1,35 @@ +#include #include + #include "widget.h" #include "ui_widget.h" -#include + +#include +#include +#include +#include +#include #include +#include +#include #include #include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include // 并发 #include -#include #include -#include -#include -#include -#include -#include -#include "image_show.h" -#include -#include +#include // 并发 + #include #include +#include +#include +#include #include -#include -#include "HttpClient.h" + #include "appitem.h" #include "flowlayout.h" + +#include "HttpClient.h" #include "downloadworker.h" DWIDGET_USE_NAMESPACE @@ -42,31 +39,31 @@ Widget::Widget(DBlurEffectWidget *parent) : ui(new Ui::Widget) { ui->setupUi(this); + initUI(); initConfig(); - manager = new QNetworkAccessManager(this);//下载管理 + + manager = new QNetworkAccessManager(this); // 下载管理 m_loadweb=ui->progressload; m_loadweb->show(); httpClient = new AeaQt::HttpClient; - // 并发下载 - downloadController = new DownloadController(this); - - connect(ui->menu_main,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(0);}); - connect(ui->menu_network,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(1);}); - connect(ui->menu_chat,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(2);}); - connect(ui->menu_music,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(3);}); - connect(ui->menu_video,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(4);}); - connect(ui->menu_photo,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(5);}); - connect(ui->menu_game,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(6);}); - connect(ui->menu_office,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(7);}); - connect(ui->menu_read,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(8);}); - connect(ui->menu_dev,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(9);}); - connect(ui->menu_system,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(10);}); - connect(ui->menu_theme,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(11);}); - connect(ui->menu_other,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(12);}); - connect(ui->menu_download,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(13);}); - // connect((ui->titlebar)) + downloadController = new DownloadController(this); // 并发下载 + + connect(ui->menu_main, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(0);}); + connect(ui->menu_network, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(1);}); + connect(ui->menu_chat, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(2);}); + connect(ui->menu_music, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(3);}); + connect(ui->menu_video, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(4);}); + connect(ui->menu_photo, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(5);}); + connect(ui->menu_game, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(6);}); + connect(ui->menu_office, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(7);}); + connect(ui->menu_read, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(8);}); + connect(ui->menu_dev, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(9);}); + connect(ui->menu_system, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(10);}); + connect(ui->menu_theme, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(11);}); + connect(ui->menu_other, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(12);}); + connect(ui->menu_download, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(13);}); connect(&appinfoLoadThread, SIGNAL(requestResetUi()), this, SLOT(sltAppinfoResetUi()), Qt::ConnectionType::BlockingQueuedConnection); connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetTags, this, &Widget::sltAppinfoTags, Qt::ConnectionType::BlockingQueuedConnection); @@ -75,13 +72,12 @@ Widget::Widget(DBlurEffectWidget *parent) : connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishedScreenshotLoad, this, &Widget::sltAppinfoScreenshot, Qt::ConnectionType::BlockingQueuedConnection); connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishAllLoading, this, &Widget::sltAppinfoFinish, Qt::ConnectionType::BlockingQueuedConnection); - // 搜索事件 connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() { qDebug() << "触发了搜索,呜啦啦啦!"; QString searchtext = searchEdit->text(); - if(searchtext != "") + if(!searchtext.isEmpty()) { qDebug() << searchEdit->text(); searchApp(searchtext); @@ -89,38 +85,53 @@ Widget::Widget(DBlurEffectWidget *parent) : this->setFocus(); }); - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) { + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) + { + // 获取系统活动色 QColor main_color; - main_color=DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); - if(themeType==DGuiApplicationHelper::DarkType){ - qDebug()<<"Dark"; - setTheme(true,main_color); - }else { - qDebug()<<"Light"; - setTheme(false,main_color); + main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); + + if(themeType == DGuiApplicationHelper::DarkType) + { + qDebug() << "Dark"; + setTheme(true, main_color); + } + else + { + qDebug() << "Light"; + setTheme(false, main_color); } }); // 计算显示下载速度 download_speed.setInterval(1000); download_speed.start(); - connect(&download_speed,&QTimer::timeout,[=](){ - if(isdownload){ - size1=download_size; + connect(&download_speed,&QTimer::timeout,[=]() + { + if(isdownload) + { + size1 = download_size; QString theSpeed; double bspeed; - bspeed=size1-size2; - if(bspeed<1024){ - theSpeed=QString::number(bspeed)+"B/s"; - }else if (bspeed<(1024*1024)) { - theSpeed=QString::number(0.01*int(100*(bspeed/1024)))+"KB/s"; - }else if (bspeed<(1024*1024*1024)) { - theSpeed=QString::number(0.01*int(100*(bspeed/(1024*1024))))+"MB/s"; - }else { - theSpeed=QString::number(0.01*int(100*(bspeed/(1024*1024*1024))))+"GB/s"; + bspeed = size1 - size2; + if(bspeed < 1024) + { + theSpeed = QString::number(bspeed) + "B/s"; + } + else if(bspeed < 1024 * 1024) + { + theSpeed = QString::number(0.01 * int(100 * (bspeed / 1024))) + "KB/s"; + } + else if(bspeed < 1024 * 1024 * 1024) + { + theSpeed = QString::number(0.01 * int(100 * (bspeed / (1024 * 1024)))) + "MB/s"; } - download_list[nowDownload-1].setSpeed(theSpeed); - size2=download_size; + else + { + theSpeed = QString::number(0.01 * int(100 * (bspeed / (1024 * 1024 * 1024)))) + "GB/s"; + } + download_list[nowDownload - 1].setSpeed(theSpeed); + size2 = download_size; } }); @@ -131,9 +142,10 @@ Widget::~Widget() { notify_uninit(); -// delete httpFinished; + // delete httpFinished; delete ui; - qDebug()<<"exit"; + + qDebug() << "exit"; DApplication::quit(); } @@ -153,20 +165,20 @@ void Widget::initUI() label_screen << ui->screen_0 << ui->screen_1 << ui->screen_2 << ui->screen_3 << ui->screen_4; // 初始化分界线 - QGraphicsOpacityEffect *opacityEffect_1=new QGraphicsOpacityEffect; + QGraphicsOpacityEffect *opacityEffect_1 = new QGraphicsOpacityEffect; opacityEffect_1->setOpacity(0.1); ui->line1_widget->setGraphicsEffect(opacityEffect_1); // 搜索框 - QWidget *w_titlebar=new QWidget; - QHBoxLayout *ly_titlebar=new QHBoxLayout; + QWidget *w_titlebar = new QWidget; + QHBoxLayout *ly_titlebar = new QHBoxLayout; w_titlebar->setLayout(ly_titlebar); // ly_titlebar->addWidget(ui->pushButton_return); ly_titlebar->addStretch(); ly_titlebar->addSpacing(50); ly_titlebar->addWidget(searchEdit); ly_titlebar->addStretch(); - titlebar=ui->titlebar; + titlebar = ui->titlebar; titlebar->setCustomWidget(w_titlebar); // titlebar->setIcon(QIcon::fromTheme("spark-store")); titlebar->setTitle(tr("Spark Store")); @@ -177,23 +189,23 @@ void Widget::initUI() // 添加菜单项 QAction *actionSubmission = new QAction(tr("Submit App"), this); - QAction *setting=new QAction(tr("Settings")); - - QMenu *menu=new QMenu; + QAction *setting = new QAction(tr("Settings")); + QMenu *menu = new QMenu; menu->addAction(setting); menu->addAction(actionSubmission); titlebar->setMenu(menu); - connect(actionSubmission, &QAction::triggered, this, [ = ] () { - QDesktopServices::openUrl(QUrl("https://upload.spark-app.store/")); - }); + + connect(actionSubmission, &QAction::triggered, this, [=](){QDesktopServices::openUrl(QUrl("https://upload.spark-app.store/"));}); connect(setting, &QAction::triggered, this, &Widget::opensetting); // 载入自定义字体 int loadedFontID = QFontDatabase::addApplicationFont(":/fonts/fonts/华康少女字体.ttf"); QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID); if(!loadedFontFamilies.isEmpty()) + { font = loadedFontFamilies.at(0); + } /* 全局字体设置 * DApplication::setFont(font); */ @@ -230,10 +242,12 @@ void Widget::initConfig() { // 读取服务器列表并初始化 std::fstream serverList; - serverList.open(QDir::homePath().toUtf8()+"/.config/spark-store/server.list",std::ios::in); + serverList.open(QDir::homePath().toUtf8() + "/.config/spark-store/server.list", std::ios::in); std::string lineTmp; - if(serverList){ - while (getline(serverList,lineTmp)) { + if(serverList) + { + while(getline(serverList, lineTmp)) + { ui->comboBox_server->addItem(QString::fromStdString(lineTmp)); } for(int i = 0; i < ui->comboBox_server->count(); i++) @@ -243,55 +257,64 @@ void Widget::initConfig() ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1); } } - }else { + } + else + { ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/"); } // 读取服务器URL并初始化菜单项的链接 - QSettings readConfig(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat); - if(readConfig.value("server/choose").toString()!=""){ + QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat); + if(!readConfig.value("server/choose").toString().isEmpty()) + { ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString()); - appinfoLoadThread.setServer(serverUrl=readConfig.value("server/choose").toString()); - }else { - appinfoLoadThread.setServer(serverUrl="https://d.store.deenos.org.cn/"); // 默认URL + appinfoLoadThread.setServer(serverUrl = readConfig.value("server/choose").toString()); + } + else + { + appinfoLoadThread.setServer(serverUrl = "https://d.store.deenos.org.cn/"); // 默认URL } - configCanSave=true; // 防止触发保存配置信号 - menuUrl[0]=serverUrl + "store/#/"; - // menuUrl[0]="http://127.0.0.1:8000/#/darkprogramming"; - menuUrl[1]=serverUrl + "store/#/network"; - menuUrl[2]=serverUrl + "store/#/relations"; - menuUrl[3]=serverUrl + "store/#/musicandsound"; - menuUrl[4]=serverUrl + "store/#/videos"; - menuUrl[5]=serverUrl + "store/#/photos"; - menuUrl[6]=serverUrl + "store/#/games"; - menuUrl[7]=serverUrl + "store/#/office"; - menuUrl[8]=serverUrl + "store/#/reading"; - menuUrl[9]=serverUrl + "store/#/programming"; - menuUrl[10]=serverUrl + "store/#/tools"; - menuUrl[11]=serverUrl + "store/#/themes"; - menuUrl[12]=serverUrl + "store/#/others"; - - - //web控件初始化 - // ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); //用来激活接受linkClicked信号 - // ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true); + configCanSave = true; // 防止触发保存配置信号 + + // menuUrl[0] = "http://127.0.0.1:8000/#/darkprogramming"; + menuUrl[0] = serverUrl + "store/#/"; + menuUrl[1] = serverUrl + "store/#/network"; + menuUrl[2] = serverUrl + "store/#/relations"; + menuUrl[3] = serverUrl + "store/#/musicandsound"; + menuUrl[4] = serverUrl + "store/#/videos"; + menuUrl[5] = serverUrl + "store/#/photos"; + menuUrl[6] = serverUrl + "store/#/games"; + menuUrl[7] = serverUrl + "store/#/office"; + menuUrl[8] = serverUrl + "store/#/reading"; + menuUrl[9] = serverUrl + "store/#/programming"; + menuUrl[10] = serverUrl + "store/#/tools"; + menuUrl[11] = serverUrl + "store/#/themes"; + menuUrl[12] = serverUrl + "store/#/others"; + + // web控件初始化 + // ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); // 用来激活接受 linkClicked 信号 + // ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true); ui->webfoot->hide(); //初始化首页 - chooseLeftMenu(0); // ui->webEngineView->setUrl(menuUrl[0]); + chooseLeftMenu(0); //给下载列表赋值到数组,方便调用 - for (int i =0; ilabel_aptserver->setText(aptserver.readAll()); - }else { + } + else + { ui->label_aptserver->setText(tr("Not Exist")); } aptserver.close(); @@ -301,36 +324,44 @@ void Widget::initConfig() dir.mkdir("spark-store"); } -void Widget::setTheme(bool isDark,QColor color) +void Widget::setTheme(bool isDark, QColor color) { // 菜单图标 - if(isDark){ + if(isDark) + { // 黑色模式 - themeIsDark=true; + themeIsDark = true; ui->webEngineView->setStyleSheet("background-color:#282828"); - ui->btn_openDir->setStyleSheet("color:#8B91A1;background-color:#2E2F30;border:0px"); + ui->btn_openDir->setStyleSheet("color: #8B91A1; background-color: #2E2F30; border: 0px"); ui->webfoot->setStyleSheet("background-color:#252525"); ui->label->setStyleSheet("background-color:#252525"); // ui->scrollArea->setStyleSheet("background-color:#252525"); ui->label_show->setStyleSheet("background-color:#252525"); ui->pushButton_return->setIcon(DStyle().standardIcon(DStyle::SP_ArrowLeft)); ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page-dark.svg")); - }else { + } + else + { // 亮色模式 - themeIsDark=false; + themeIsDark = false; ui->webEngineView->setStyleSheet("background-color:#FFFFFF"); ui->webfoot->setStyleSheet("background-color:#FFFFFF"); - ui->btn_openDir->setStyleSheet("color:#505050;background-color:#FBFBFB;border:0px"); + ui->btn_openDir->setStyleSheet("color: #505050; background-color: #FBFBFB; border: 0px"); ui->label->setStyleSheet("background-color:#FFFFFF"); // ui->scrollArea->setStyleSheet("background-color:#F8F8F8"); ui->label_show->setStyleSheet("background-color:#F8F8F8"); ui->pushButton_return->setIcon(DStyle().standardIcon(DStyle::SP_ArrowLeft)); ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page.svg")); } - main_color=color; - m_loadweb->setTheme(themeIsDark,color); + + // 刷新系统活动色 + main_color = color; + m_loadweb->setTheme(themeIsDark, color); updateUI(); - if(ui->stackedWidget->currentIndex()==0){ + + // 刷新首页主题颜色 + if(ui->stackedWidget->currentIndex() == 0) + { chooseLeftMenu(nowMenu); } } @@ -350,7 +381,9 @@ void Widget::sendNotification(const QString &message, const int msTimeout, const notify_notification_set_timeout(_notify, msTimeout); } else + { notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit()); + } notify_notification_show(_notify, nullptr); } @@ -363,14 +396,17 @@ void Widget::sendNotification(const char *message, const int msTimeout, const QS notify_notification_set_timeout(_notify, msTimeout); } else + { notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message, icon.toLocal8Bit()); + } notify_notification_show(_notify, nullptr); } void Widget::updateUI() { - if(themeIsDark){ + if(themeIsDark) + { left_list[0]->setIcon(QIcon(":/icons/icons/homepage_dark.svg")); left_list[1]->setIcon(QIcon(":/icons/icons/category_network_dark.svg")); left_list[2]->setIcon(QIcon(":/icons/icons/category_chat_dark.svg")); @@ -385,7 +421,9 @@ void Widget::updateUI() left_list[11]->setIcon(QIcon(":/icons/icons/theme-symbolic_dark.svg")); left_list[12]->setIcon(QIcon(":/icons/icons/category_others_dark.svg")); left_list[13]->setIcon(QIcon(":/icons/icons/downloads-symbolic_dark.svg")); - }else { + } + else + { left_list[0]->setIcon(QIcon(":/icons/icons/homepage.svg")); left_list[1]->setIcon(QIcon(":/icons/icons/category_network.svg")); left_list[2]->setIcon(QIcon(":/icons/icons/category_chat.svg")); @@ -401,8 +439,9 @@ void Widget::updateUI() left_list[12]->setIcon(QIcon(":/icons/icons/category_others.svg")); left_list[13]->setIcon(QIcon(":/icons/icons/downloads-symbolic.svg")); } - for (int i=0;i<14;i++) { + for(int i = 0; i < 14; i++) + { /* 设置左侧菜单字体 * QFont temp = font; * temp.setPixelSize(15); @@ -410,25 +449,42 @@ void Widget::updateUI() */ left_list[i]->setFixedHeight(38); - if(themeIsDark){ + if(themeIsDark) + { // 中文环境菜单文字居中,其他则左对齐 if(QLocale::system().name() == "zh_CN") - left_list[i]->setStyleSheet("color:#FFFFFF;border:0px;"); + { + left_list[i]->setStyleSheet("color: #FFFFFF; border: 0px;"); + } else - left_list[i]->setStyleSheet("color:#FFFFFF;border:0px;text-align:left;padding-left:15px;"); - }else { + { + left_list[i]->setStyleSheet("color: #FFFFFF; border: 0px; text-align: left; padding-left: 15px;"); + } + } + else + { if(QLocale::system().name() == "zh_CN") - left_list[i]->setStyleSheet("color:#252525;border:0px;"); + { + left_list[i]->setStyleSheet("color: #252525; border: 0px;"); + } else - left_list[i]->setStyleSheet("color:#252525;border:0px;text-align:left;padding-left:15px;"); + { + left_list[i]->setStyleSheet("color: #252525; border: 0px; text-align: left; padding-left: 15px;"); + } } } if(QLocale::system().name() == "zh_CN") - left_list[nowMenu]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;"); + { + left_list[nowMenu]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px;"); + } else - left_list[nowMenu]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;text-align:left;padding-left:15px;"); - switch (nowMenu) { + { + left_list[nowMenu]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px; text-align: left; padding-left: 15px;"); + } + + switch (nowMenu) + { case 0: left_list[0]->setIcon(QIcon(":/icons/icons/homepage_dark.svg")); break; @@ -477,91 +533,114 @@ void Widget::updateUI() // 菜单切换逻辑 void Widget::chooseLeftMenu(int index) { - nowMenu=index; + nowMenu = index; // 菜单切换时,清除搜索栏的内容 - if (!searchEdit->text().isEmpty()) { + if(!searchEdit->text().isEmpty()) + { searchEdit->clear(); } updateUI(); + + /* if(QLocale::system().name() == "zh_CN") - left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;"); + { + left_list[index]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px;"); + } else - left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;text-align:left;padding-left:15px;"); - if(index<=12){ - if(themeIsDark){ - QString darkurl=menuUrl[index].toString(); - QStringList tmp=darkurl.split("/"); + { + left_list[index]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px; text-align: left; padding-left: 15px;"); + } + */ + + if(index <= 12) + { + if(themeIsDark) + { + QString darkurl = menuUrl[index].toString(); + QStringList list = darkurl.split("/"); darkurl.clear(); - for (int i=0;iwebEngineView->setUrl(darkurl); - qDebug()<webEngineView->setUrl(menuUrl[index]); - } ui->stackedWidget->setCurrentIndex(0); - }else if (index==13) { + } + else + { ui->stackedWidget->setCurrentIndex(1); } - } void Widget::setfoot(int h) { - foot=h; + foot = h; } void Widget::updatefoot() { - int allh=ui->stackedWidget->height(); - ui->webfoot->setFixedHeight(allh-foot); + int allh = ui->stackedWidget->height(); + ui->webfoot->setFixedHeight(allh - foot); } void Widget::on_pushButton_download_clicked() { chooseLeftMenu(13); - allDownload+=1; + + allDownload += 1; + QFileInfo info(url.path()); QString fileName(info.fileName()); // 获取文件名 - download_list[allDownload-1].pkgName=pkgName; + download_list[allDownload - 1].pkgName = pkgName; if(fileName.isEmpty()) { sendNotification(tr("Failed to get the name to the file to be downloaded.")); return; } - download_list[allDownload-1].setParent(ui->listWidget); - QListWidgetItem *item=new QListWidgetItem(ui->listWidget); - item->setSizeHint(download_list[allDownload-1].size()); + + download_list[allDownload - 1].setParent(ui->listWidget); + QListWidgetItem *item = new QListWidgetItem(ui->listWidget); + item->setSizeHint(download_list[allDownload - 1].size()); item->setFlags(item->flags() & ~Qt::ItemIsEnabled & ~Qt::ItemIsSelectable); - ui->listWidget->setItemWidget(item,&download_list[allDownload-1]); + ui->listWidget->setItemWidget(item, &download_list[allDownload - 1]); urList.append(url); - download_list[allDownload-1].setName(appName); - download_list[allDownload-1].setFileName(fileName); + download_list[allDownload - 1].setName(appName); + download_list[allDownload - 1].setFileName(fileName); + QPixmap icon; icon.load("icon.png"); - system("cp icon.png icon_"+QString::number(allDownload-1).toUtf8()+".png"); - download_list[allDownload-1].seticon(icon); - if(!isBusy){ -// file = new QFile(fileName); -// if(!file->open(QIODevice::WriteOnly)){ -// delete file; -// file = nullptr; -// return ; -// } - - nowDownload+=1; - - startRequest(urList.at(nowDownload-1), fileName); // 进行链接请求 + system("cp icon.png icon_" + QString::number(allDownload - 1).toUtf8() + ".png"); + download_list[allDownload - 1].seticon(icon); + + if(!isBusy) + { + /* + file = new QFile(fileName); + if(!file->open(QIODevice::WriteOnly)) + { + delete file; + file = nullptr; + return; + } + */ + + nowDownload += 1; + startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求 } - if(ui->pushButton_download->text()==tr("Reinstall")){ - download_list[allDownload-1].reinstall=true; + + if(ui->pushButton_download->text() == tr("Reinstall")) + { + download_list[allDownload - 1].reinstall = true; } } @@ -569,55 +648,61 @@ void Widget::startRequest(QUrl url, QString fileName) { ui->listWidget->show(); ui->label->hide(); - isBusy=true; - isdownload=true; - download_list[allDownload-1].free=false; + isBusy = true; + isdownload = true; + download_list[allDownload - 1].free = false; connect(downloadController, &DownloadController::downloadProcess, this, &Widget::updateDataReadProgress); connect(downloadController, &DownloadController::downloadFinished, this, &Widget::httpFinished); - connect(downloadController, &DownloadController::errorOccur, [this](QString msg){ - this->sendNotification(msg); - }); + connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);}); downloadController->setFilename(fileName); downloadController->startDownload(url.toString()); } void Widget::searchApp(QString text) { - if(text.left(6)=="spk://"){ + if(text.left(6) == "spk://") + { openUrl(text); searchEdit->clearEdit(); - } else { + } + else + { // sendNotification(tr("Spark store could only process spk:// links for now. The search feature is coming soon!")); - // ui->webView->setUrl(QUrl("http://www.baidu.com/s?wd="+text));//这东西对接百度 + // ui->webView->setUrl(QUrl("http://www.baidu.com/s?wd="+text)); // 这东西对接百度 // ui->stackedWidget->setCurrentIndex(0); // 禁止同时进行多次搜索 if(!mutex.tryLock()) + { return; + } // 关键字搜索处理 httpClient->get("https://search.deepinos.org.cn/appinfo/search") - .header("content-type", "application/json") - .queryParam("keyword", text) - .onResponse([this](QByteArray result) { - auto json = QJsonDocument::fromJson(result).array(); - if (json.empty()) { - qDebug() << "相关应用未找到!"; - sendNotification(tr("Relative apps Not Found!")); - mutex.unlock(); - return; - } - displaySearchApp(json); - }) - .onError([this](QString errorStr) { - qDebug() << "请求出错:" << errorStr; - sendNotification(QString(tr("Request Error: %1")).arg(errorStr)); + .header("content-type", "application/json") + .queryParam("keyword", text) + .onResponse([this](QByteArray result) + { + auto json = QJsonDocument::fromJson(result).array(); + if (json.empty()) + { + qDebug() << "相关应用未找到!"; + sendNotification(tr("Relative apps Not Found!")); mutex.unlock(); return; - }) - .timeout(10 * 1000) - .exec(); + } + displaySearchApp(json); + }) + .onError([this](QString errorStr) + { + qDebug() << "请求出错:" << errorStr; + sendNotification(QString(tr("Request Error: %1")).arg(errorStr)); + mutex.unlock(); + return; + }) + .timeout(10 * 1000) + .exec(); } } @@ -630,7 +715,8 @@ void Widget::displaySearchApp(QJsonArray array) // 清除原有的搜索结果 QLayoutItem *item = nullptr; - while ((item = applist_grid->takeAt(0)) != nullptr) { + while((item = applist_grid->takeAt(0)) != nullptr) + { applist_grid->removeWidget(item->widget()); item->widget()->disconnect(); item->widget()->setParent(nullptr); @@ -654,14 +740,11 @@ void Widget::displaySearchApp(QJsonArray array) appItem->setUrl(url); applist_grid->addWidget(appItem); qDebug() << "应用链接为:" << url; - connect(appItem, &AppItem::clicked, this, &Widget::openUrl); - connect(appItem, &AppItem::clicked, this, [=]() + connect(appItem, &AppItem::clicked, this, &Widget::openUrl); + connect(appItem, &AppItem::clicked, this, [=](){prePage = ui->stackedWidget->currentIndex();}); + connect(appItem, &AppItem::finished, this, [=]() { - prePage = ui->stackedWidget->currentIndex(); - }); - - connect(appItem, &AppItem::finished, this, [=](){ count++; downloadIconsFinished(array.size()); }); @@ -691,21 +774,27 @@ void Widget::httpReadyRead() void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) { - if(totalBytes <= 0) return; - download_list[nowDownload-1].setMax(10000); // 最大值 - download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值 - download_size=bytesRead; - if(download_list[nowDownload-1].close){ // 随时检测下载是否被取消 + if(totalBytes <= 0) + { + return; + } + + download_list[nowDownload - 1].setMax(10000); // 最大值 + download_list[nowDownload - 1].setValue((bytesRead * 10000) / totalBytes); // 当前值 + download_size = bytesRead; + if(download_list[nowDownload - 1].close) + { + // 随时检测下载是否被取消 downloadController->disconnect(); downloadController->stopDownload(); - download_list[nowDownload-1].closeDownload(); + download_list[nowDownload - 1].closeDownload(); httpFinished(); } } void Widget::sltAppinfoResetUi() { - // 先隐藏详情页负责显示截图的label + // 先隐藏详情页负责显示截图的 label ui->screen_0->hide(); ui->screen_1->hide(); ui->screen_2->hide(); @@ -732,23 +821,40 @@ void Widget::sltAppinfoResetUi() void Widget::sltAppinfoTags(QStringList *tagList) { - foreach (const QString &tag, *tagList) { + foreach(const QString &tag, *tagList) + { if(tag=="community") + { ui->tag_community->show(); + } else if(tag=="ubuntu") + { ui->tag_ubuntu->show(); + } else if(tag=="deepin") + { ui->tag_deepin->show(); + } else if(tag=="uos") + { ui->tag_uos->show(); + } else if(tag=="dtk5") + { ui->tag_dtk5->show(); + } else if(tag=="dwine2") + { ui->tag_dwine2->show(); + } else if(tag=="dwine5") + { ui->tag_dwine5->show(); + } else if(tag=="a2d") + { ui->tag_a2d->show(); + } } } @@ -762,13 +868,18 @@ void Widget::sltAppinfoDetails(QString *name, QString *details, QString *info, ui->label_info->show(); ui->label_more->setText(*info); ui->label_more->show(); + pkgName = *packageName; url = *fileUrl; appweb = *website; - if(isInstalled){ + + if(isInstalled) + { ui->pushButton_download->setText(tr("Reinstall")); ui->pushButton_uninstall->show(); - }else { + } + else + { ui->pushButton_download->setText(tr("Install")); } } @@ -785,11 +896,15 @@ void Widget::sltAppinfoIcon(QPixmap *icon) void Widget::sltAppinfoScreenshot(QPixmap *picture, int index) { - if(picture != nullptr) { + if(picture != nullptr) + { screen[index] = *picture; label_screen[index]->setImage(*picture); label_screen[index]->show(); - switch(index) { // 故意为之,为了清除多余截图 + + switch(index) + { + // 故意为之,为了清除多余截图 case 0: label_screen[1]->hide(); case 1: @@ -810,16 +925,19 @@ void Widget::sltAppinfoFinish() void Widget::httpFinished() // 完成下载 { - isdownload=false; - isBusy=false; - download_list[nowDownload-1].readyInstall(); - download_list[nowDownload-1].free=true; - if(nowDownloadstackedWidget->currentIndex() == 2) //如果在详情页面要重新触发UrlChanged + // 如果在详情页面要重新触发 UrlChanged + if(ui->stackedWidget->currentIndex() == 2) + { emit ui->webEngineView->urlChanged(ui->webEngineView->url()); + } else + { ui->webEngineView->reload(); + } } void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1) { - appinfoLoadThread.setServer(arg1); // 服务器信息更新 - if(configCanSave){ + appinfoLoadThread.setServer(arg1); // 服务器信息更新 + + if(configCanSave) + { ui->label_setting1->show(); - QSettings *setConfig=new QSettings(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat); - setConfig->setValue("server/choose",arg1); + QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat); + setConfig->setValue("server/choose", arg1); } } void Widget::on_pushButton_updateServer_clicked() { - QtConcurrent::run([=](){ + QtConcurrent::run([=]() + { ui->pushButton_updateServer->setEnabled(false); ui->comboBox_server->clear(); - QFile::remove(QDir::homePath().toUtf8()+"/.config/spark-store/server.list"); - system("curl -o "+QDir::homePath().toUtf8()+"/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server.list"); + + QFile::remove(QDir::homePath().toUtf8() + "/.config/spark-store/server.list"); + system("curl -o " + QDir::homePath().toUtf8() + "/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server.list"); std::fstream server; - server.open(QDir::homePath().toUtf8()+"/.config/spark-store/server.list",std::ios::in); + server.open(QDir::homePath().toUtf8() + "/.config/spark-store/server.list", std::ios::in); std::string lineTmp; - if(server){ - while (getline(server,lineTmp)) { + if(server) + { + while(getline(server, lineTmp)) + { ui->comboBox_server->addItem(QString::fromStdString(lineTmp)); } - }else { + } + else + { ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/"); } + ui->pushButton_updateServer->setEnabled(true); ui->comboBox_server->setCurrentIndex(0); @@ -914,7 +1046,8 @@ void Widget::on_pushButton_updateServer_clicked() void Widget::on_pushButton_updateApt_clicked() { - QtConcurrent::run([=](){ + QtConcurrent::run([=]() + { ui->pushButton_updateApt->setEnabled(false); ui->label_aptserver->setText(tr("Updating, please wait...")); @@ -925,10 +1058,11 @@ void Widget::on_pushButton_updateApt_clicked() tmpdir.mkpath("spark-store"); sourcesList.open(tmpPath + "/sparkstore.list", std::ios::out); - //policy.open(tmpPath + "/sparkstore", std::ios::out); - // 商店已经下架会替换系统库的包,优先级policy弃用 + // 商店已经下架会替换系统库的包,优先级 policy 弃用 + // policy.open(tmpPath + "/sparkstore", std::ios::out); - if(sourcesList /*&& policy*/) { + if(sourcesList /*&& policy*/) + { auto serverAddr = ui->comboBox_server->currentText(); sourcesList << "deb [by-hash=force] "; @@ -937,44 +1071,52 @@ void Widget::on_pushButton_updateApt_clicked() sourcesList.close(); /* - policy << "Package: *\n" - "Pin: origin *" << serverAddr.mid(serverAddr.indexOf('.')).toUtf8().toStdString() << "\n" - "Pin-Priority: 90"; // 降低星火源的优先级,防止从星火安装已存在的系统包,破坏依赖 - policy.close(); + * policy << "Package: *\n" << "Pin: origin *" << + * serverAddr.mid(serverAddr.indexOf('.')).toUtf8().toStdString() << "\n" << + * "Pin-Priority: 90"; // 降低星火源的优先级,防止从星火安装已存在的系统包,破坏依赖 + * policy.close(); */ - update.open(tmpPath + "/update.sh",std::ios::out); - if(update) { + update.open(tmpPath + "/update.sh", std::ios::out); + if(update) + { unknownError = false; - update << "#!/bin/sh\n" - "mv " + tmpPath + "/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && " - // "mv " + tmpPath + "/sparkstore /etc/apt/preferences.d/sparkstore && " + update << "#!/bin/sh\n" << + "mv " + tmpPath + "/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && " << + // "mv " + tmpPath + "/sparkstore /etc/apt/preferences.d/sparkstore && " << "apt update"; update.close(); system(("chmod +x " + tmpPath + "/update.sh").c_str()); + QProcess runupdate; - runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh")); + runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh"), QStringList()); runupdate.waitForFinished(); QString error = runupdate.readAllStandardError(); QStringList everyError = error.split("\n"); bool haveError = false; - for (int i=0; i < everyError.size(); i++) { - if(everyError[i].left(2) == "E:") { + for(int i = 0; i < everyError.size(); i++) + { + if(everyError[i].left(2) == "E:") + { haveError = true; } } - if(!haveError) { + if(!haveError) + { ui->label_aptserver->setText("deb [by-hash=force] " + ui->comboBox_server->currentText().toUtf8() + " /"); - } else { + } + else + { ui->label_aptserver->setText(tr("Apt has reported an error. Please use apt update in terminal to locate the problem.")); } } } - if(unknownError) { + if(unknownError) + { ui->label_aptserver->setText(tr("Unknown error!")); } @@ -984,16 +1126,20 @@ void Widget::on_pushButton_updateApt_clicked() void Widget::on_pushButton_uninstall_clicked() { - QtConcurrent::run([=](){ + QtConcurrent::run([=]() + { ui->pushButton_download->setEnabled(false); ui->pushButton_uninstall->setEnabled(false); + QProcess uninstall; - uninstall.start("pkexec apt purge -y "+pkgName.toLower()); + uninstall.start("pkexec apt purge -y " + pkgName.toLower(), QStringList()); uninstall.waitForFinished(); + ui->pushButton_download->setEnabled(true); ui->pushButton_download->setText("Install"); ui->pushButton_uninstall->hide(); ui->pushButton_uninstall->setEnabled(true); + updatesEnabled(); sendNotification(tr("Uninstall succeeded")); }); @@ -1001,14 +1147,18 @@ void Widget::on_pushButton_uninstall_clicked() void Widget::on_pushButton_clear_clicked() // 清空临时缓存目录 { - QtConcurrent::run([=](){ + QtConcurrent::run([=]() + { ui->pushButton_clear->setEnabled(false); + QDir tmpdir("/tmp/spark-store"); tmpdir.setFilter(QDir::Files); - int quantity=int(tmpdir.count()); - for (int i=0;ipushButton_clear->setEnabled(true); Widget::opensetting(); @@ -1019,16 +1169,16 @@ quint64 Widget::dirFileSize(const QString &path) { QDir dir(path); quint64 size = 0; - // dir.entryInfoList(QDir::Files)返回文件信息 + // dir.entryInfoList(QDir::Files); // 返回文件信息 foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files)) { // 计算文件大小 size += quint64(fileInfo.size()); } - // dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)返回所有子目录,并进行过滤 + // dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot); // 返回所有子目录,并进行过滤 foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { - // 若存在子目录,则递归调用dirFileSize()函数 + // 若存在子目录,则递归调用 dirFileSize() 函数 size += dirFileSize(path + QDir::separator() + subDir); } return size; @@ -1037,32 +1187,44 @@ quint64 Widget::dirFileSize(const QString &path) void Widget::opensetting() { // 防止下载时文件被删除 - if(isdownload){ + if(isdownload) + { ui->pushButton_clear->setEnabled(false); - }else { + } + else + { ui->pushButton_clear->setEnabled(true); } + // 显示缓存占用空间 - quint64 tmp_size=dirFileSize(QString::fromUtf8(TMP_PATH)); + quint64 tmp_size = dirFileSize(QString::fromUtf8(TMP_PATH)); QString tmp_size_str; - if(tmp_size<1024){ - tmp_size_str=QString::number(tmp_size)+"B"; - }else if (tmp_size<(1024*1024)) { - tmp_size_str=QString::number(0.01*int(100*(tmp_size/1024)))+"KB"; - }else if (tmp_size<(1024*1024*1024)) { - tmp_size_str=QString::number(0.01*int(100*(tmp_size/(1024*1024))))+"MB"; - }else { - tmp_size_str=QString::number(0.01*int(100*(tmp_size/(1024*1024*1024))))+"GB"; + if(tmp_size < 1024) + { + tmp_size_str = QString::number(tmp_size) + "B"; + } + else if(tmp_size < (1024 * 1024)) + { + tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / 1024))) + "KB"; + } + else if(tmp_size<(1024*1024*1024)) + { + tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024)))) + "MB"; + } + else + { + tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024 * 1024)))) + "GB"; } + ui->tmp_size_ui->setText(tmp_size_str); prePage = ui->stackedWidget->currentIndex(); ui->stackedWidget->setCurrentIndex(3); } -void Widget::openUrl(QUrl u) +void Widget::openUrl(QUrl url) { - QString app=serverUrl + "store"+u.path()+"/app.json"; -// ui->webEngineView->setUrl(app); + QString app = serverUrl + "store" + url.path() + "/app.json"; + // ui->webEngineView->setUrl(app); emit ui->webEngineView->urlChanged(app); } @@ -1074,9 +1236,10 @@ void Widget::on_pushButton_website_clicked() void Widget::on_pushButton_clicked() { QString share_url; - share_url="spk://store/"+type_name+"/"+pkgName; - qDebug()<<"Share"<setText(share_url); sendNotification(tr("The URL has been copied to the clipboard")); } @@ -1088,10 +1251,13 @@ void Widget::on_btn_openDir_clicked() void Widget::on_stackedWidget_currentChanged(int arg1) { - qDebug()<pushButton_return->setEnabled(false); - }else { + } + else + { ui->pushButton_return->setEnabled(true); } } @@ -1099,27 +1265,33 @@ void Widget::on_stackedWidget_currentChanged(int arg1) void Widget::on_webEngineView_urlChanged(const QUrl &arg1) { //分析出服务器中的分类名称 - QStringList url_=arg1.path().split("/"); + QStringList url_ = arg1.path().split("/"); QString pname; - if(url_.size()>3){ - type_name=url_[2]; - pname=url_[3]; + if(url_.size() > 3) + { + type_name = url_[2]; + pname = url_[3]; } //如果是app.json就打开详情页 - if(arg1.path().right(8)=="app.json"){ + if(arg1.path().right(8) == "app.json") + { prePage = ui->stackedWidget->currentIndex(); - load.cancel();//打开并发加载线程前关闭正在执行的线程 + + load.cancel(); // 打开并发加载线程前关闭正在执行的线程 m_loadweb->setValue(0); - ui->label_more->setText("");//清空详情介绍 - ui->label_info->setText(""); - ui->label_appname->setText(""); + + ui->label_more->clear(); // 清空详情介绍 + ui->label_info->clear(); + ui->label_appname->clear(); ui->pushButton_download->setEnabled(false); ui->stackedWidget->setCurrentIndex(2); - qDebug()<<"https://demo-one-vert.vercel.app/"+type_name+"/"+pname; - qDebug()<< "链接地址:" << arg1; + qDebug() << "https://demo-one-vert.vercel.app/" + type_name + "/" + pname; + qDebug() << "链接地址:" << arg1; + /* - load.cancel();//打开并发加载线程前关闭正在执行的线程 - load = QtConcurrent::run([=](){ + load.cancel(); // 打开并发加载线程前关闭正在执行的线程 + load = QtConcurrent::run([=]() + { int loadresult = loadappinfo(arg1); }); */ @@ -1141,20 +1313,23 @@ void Widget::on_webEngineView_loadStarted() void Widget::on_webEngineView_loadProgress(int progress) { m_loadweb->setValue(progress); - if(progress>=90){ + if(progress >= 90) + { m_loadweb->setValue(0); } } void Widget::on_webEngineView_loadFinished(bool arg1) { - if(arg1){ + if(arg1) + { m_loadweb->setValue(0); - }else { + } + else + { m_loadweb->setValue(0); m_loaderror->show(); } - } void Widget::on_pushButton_translate_clicked() @@ -1170,7 +1345,9 @@ void Widget::on_pushButton_translate_clicked() "Tips:You can simply click the file to edit to create a flat pull request without create a full pull request\n" "Tips:You can use github account to login to Gitee" "\nClick yes to continue.")); + if(!tipDialog.exec()) - QDesktopServices::openUrl("https://gitee.com/deepin-community-store/json/tree/master/store/" + - type_name + '/' + pkgName); + { + QDesktopServices::openUrl("https://gitee.com/deepin-community-store/json/tree/master/store/" + type_name + '/' + pkgName); + } } diff --git a/src/widget.h b/src/widget.h index c44355c0..8b0152b5 100644 --- a/src/widget.h +++ b/src/widget.h @@ -2,12 +2,10 @@ #define WIDGET_H #include -#include -#include #include #include #include -#include + #include #include #include @@ -18,40 +16,42 @@ #include #include -#include #include -#include -#include -#include #include #include -#include -#include "workerthreads.h" +#include +#include +#include + #include "image_show.h" +#include "downloadlist.h" +#include "progressload.h" +#include "workerthreads.h" -#define LIST_MAX 99 //一次最多下载数量 +#define LIST_MAX 99 // 一次最多下载数量 #define TMP_PATH "/tmp/spark-store" DWIDGET_USE_NAMESPACE + namespace Ui { class Widget; } - class FlowLayout; class DownloadController; namespace AeaQt { - class HttpClient; +class HttpClient; } class Widget : public DBlurEffectWidget { - Q_OBJECT + public: explicit Widget(DBlurEffectWidget *parent = nullptr); ~Widget(); + void startRequest(QUrl url, QString fileName); void searchApp(QString); int nowDownload=0; @@ -103,7 +103,6 @@ private slots: void on_pushButton_translate_clicked(); public: - QUrl url; downloadlist download_list[LIST_MAX]; -- Gitee From e64e7fcae2402c302d2991c4ef9abdaa5dd16a29 Mon Sep 17 00:00:00 2001 From: zty199 <46324746+zty199@users.noreply.github.com> Date: Sat, 17 Apr 2021 15:43:11 +0800 Subject: [PATCH 13/15] Reorganize codes Reorganize all parts of codes; Fix a bug that index page color is not correct when initialized. --- spark-store-project.pro | 4 +- src/appitem.cpp | 37 ++++--- src/appitem.h | 19 ++-- src/big_image.cpp | 31 +++--- src/big_image.h | 18 +-- src/downloadlist.cpp | 158 ++++++++++++++++----------- src/downloadlist.h | 54 +++++---- src/downloadworker.cpp | 114 +++++++++++-------- src/downloadworker.h | 36 +++--- src/flowlayout.cpp | 6 +- src/flowlayout.h | 4 +- src/image_show.cpp | 22 ++-- src/image_show.h | 26 ++--- src/progressload.cpp | 33 +++--- src/progressload.h | 8 +- src/widget.cpp | 71 ++++++------ src/widget.h | 22 ++-- src/workerthreads.cpp | 237 ++++++++++++++++++++++------------------ src/workerthreads.h | 31 ++++-- 19 files changed, 523 insertions(+), 408 deletions(-) diff --git a/spark-store-project.pro b/spark-store-project.pro index 254ea6c9..19a741e8 100644 --- a/spark-store-project.pro +++ b/spark-store-project.pro @@ -1,7 +1,9 @@ TEMPLATE = subdirs + CONFIG += ordered -SUBDIRS = third-party/QtNetworkService \ +SUBDIRS += \ + third-party/QtNetworkService \ src/spark-store.pro spark-store.depends = third-party/QtNetworkService diff --git a/src/appitem.cpp b/src/appitem.cpp index ec44ba4f..ed18e0a9 100644 --- a/src/appitem.cpp +++ b/src/appitem.cpp @@ -14,12 +14,12 @@ AppItem::AppItem(QWidget *parent) : { ui->setupUi(this); -// auto shadow = new QGraphicsDropShadowEffect(); -// shadow->setXOffset(0); -// shadow->setYOffset(1); -// shadow->setBlurRadius(2); -// shadow->setColor(QColor::fromRgba(qRgba(0, 0, 0, 180))); -// ui->container->setGraphicsEffect(shadow); + // auto shadow = new QGraphicsDropShadowEffect(); + // shadow->setXOffset(0); + // shadow->setYOffset(1); + // shadow->setBlurRadius(2); + // shadow->setColor(QColor::fromRgba(qRgba(0, 0, 0, 180))); + // ui->container->setGraphicsEffect(shadow); } AppItem::~AppItem() @@ -46,7 +46,8 @@ void AppItem::setDescription(QString description) void AppItem::setIcon(QString icon) { m_icon = icon; - if (!icon.isEmpty()) { + if(!icon.isEmpty()) + { downloadIcon(icon); } } @@ -58,7 +59,8 @@ void AppItem::setUrl(QString url) void AppItem::mousePressEvent(QMouseEvent *event) { - Q_UNUSED(event); + Q_UNUSED(event) + emit clicked(QUrl(m_url)); } @@ -68,8 +70,10 @@ void AppItem::mousePressEvent(QMouseEvent *event) */ void AppItem::downloadIcon(QString icon) { - QtConcurrent::run([=](){ + QtConcurrent::run([=]() + { auto reqManager = new QNetworkAccessManager(); + QUrl url(icon); QNetworkReply *reply = reqManager->get(QNetworkRequest(url)); QEventLoop loop; @@ -77,14 +81,17 @@ void AppItem::downloadIcon(QString icon) connect(reply, &QNetworkReply::finished, this, [=] () { emit finished(); }); loop.exec(); reqManager->deleteLater(); + QPixmap pixmap; pixmap.loadFromData(reply->readAll()); pixmap = pixmap.scaled(78, 78, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - if (reply->error() == QNetworkReply::NoError) { - QMetaObject::invokeMethod(this, "loadIcon", Qt::QueuedConnection, - Q_ARG(QPixmap, pixmap)); - } else { - qDebug() << reply->errorString(); + if (reply->error() == QNetworkReply::NoError) + { + QMetaObject::invokeMethod(this, "loadIcon", Qt::QueuedConnection, Q_ARG(QPixmap, pixmap)); + } + else + { + qDebug() << reply->errorString(); } }); } @@ -93,5 +100,3 @@ void AppItem::loadIcon(QPixmap pic) { ui->lbl_icon->setPixmap(pic); } - - diff --git a/src/appitem.h b/src/appitem.h index b2f67506..3d30c66a 100644 --- a/src/appitem.h +++ b/src/appitem.h @@ -14,7 +14,7 @@ class AppItem : public QWidget public: explicit AppItem(QWidget *parent = nullptr); - ~AppItem(); + ~AppItem() override; void setTitle(QString title); void setDescription(QString description); @@ -24,14 +24,6 @@ public: protected: void mousePressEvent(QMouseEvent *event) override; -signals: - void clicked(QUrl url); - void finished(); - -public slots: - void downloadIcon(QString icon); - void loadIcon(QPixmap pic); - private: Ui::AppItem *ui; @@ -39,6 +31,15 @@ private: QString m_description; QString m_icon; QString m_url; + +public slots: + void downloadIcon(QString icon); + void loadIcon(QPixmap pic); + +signals: + void clicked(QUrl url); + void finished(); + }; #endif // APPITEM_H diff --git a/src/big_image.cpp b/src/big_image.cpp index abfbefd7..9ae6f561 100644 --- a/src/big_image.cpp +++ b/src/big_image.cpp @@ -1,22 +1,30 @@ #include "big_image.h" + #include #include -big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent) + +big_image::big_image(DBlurEffectWidget *parent) : + DBlurEffectWidget(parent), + m_image(new QLabel) { -// m_image->setParent(this); - QHBoxLayout *layout=new QHBoxLayout; - setLayout(layout); - layout->addWidget(m_image); - layout->setMargin(0); - m_image->setAlignment(Qt::AlignCenter); -// m_image->setMaximumSize(1360,768); - setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);//设置图片对话框总在最前 + setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); // 设置图片对话框总在最前 setRadius(0); setMaskAlpha(60); setMaskColor(QColor("#000000")); + QHBoxLayout *layout = new QHBoxLayout; + setLayout(layout); + layout->addWidget(m_image); + layout->setMargin(0); + // m_image->setParent(this); + // m_image->setMaximumSize(1360,768); + m_image->setAlignment(Qt::AlignCenter); +} +void big_image::setimage(QPixmap image) +{ + m_image->setPixmap(image); } void big_image::mousePressEvent(QMouseEvent *) @@ -25,11 +33,6 @@ void big_image::mousePressEvent(QMouseEvent *) m_image->clear(); } -void big_image::setimage(QPixmap image) -{ - m_image->setPixmap(image); -} - void big_image::focusOutEvent(QFocusEvent *) { hide(); diff --git a/src/big_image.h b/src/big_image.h index 4a224300..c3530628 100644 --- a/src/big_image.h +++ b/src/big_image.h @@ -1,25 +1,27 @@ #ifndef BIG_IMAGE_H #define BIG_IMAGE_H -#include -#include #include #include + +#include + DWIDGET_USE_NAMESPACE class big_image : public DBlurEffectWidget { Q_OBJECT + public: explicit big_image(DBlurEffectWidget *parent = nullptr); - void mousePressEvent(QMouseEvent *event); - QLabel *m_image=new QLabel; - void setimage(QPixmap); - void focusOutEvent(QFocusEvent *event); -signals: + QLabel *m_image; + + void setimage(QPixmap); -public slots: +protected: + void mousePressEvent(QMouseEvent *event) override; + void focusOutEvent(QFocusEvent *event) override; }; #endif // BIG_IMAGE_H diff --git a/src/downloadlist.cpp b/src/downloadlist.cpp index 43793834..1a1b46a6 100644 --- a/src/downloadlist.cpp +++ b/src/downloadlist.cpp @@ -1,19 +1,27 @@ #include "downloadlist.h" #include "ui_downloadlist.h" -#include "widget.h" -#include -#include -#include + #include #include -#include -bool downloadlist::isInstall=false; + +#include "widget.h" + +bool downloadlist::isInstall = false; downloadlist::downloadlist(QWidget *parent) : QWidget(parent), - ui(new Ui::downloadlist) + reinstall(false), + close(false), + ui(new Ui::downloadlist), + menu_install(new QMenu), + action_dpkg(new QAction), + action_deepin(new QAction), + action_gdebi(new QAction), + output_w(new DDialog), + textbrowser(new QTextBrowser) { ui->setupUi(this); + ui->pushButton_install->setEnabled(false); ui->progressBar->setValue(0); ui->label_filename->hide(); @@ -22,22 +30,25 @@ downloadlist::downloadlist(QWidget *parent) : ui->widget_spinner->start(); ui->widget_spinner->hide(); action_dpkg->setText(tr("Spark Store App Installer")); - action_gdebi->setText(tr("gdebi")); action_deepin->setText(tr("deepin deb installer")); + action_gdebi->setText(tr("gdebi")); + connect(action_dpkg,&QAction::triggered,[=](){downloadlist::install(0);}); connect(action_deepin,&QAction::triggered,[=](){downloadlist::install(1);}); connect(action_gdebi,&QAction::triggered,[=](){downloadlist::install(2);}); - //ssinstall命令存在时再加入该选项 + // ssinstall 命令存在时再加入该选项 QFile ssinstall("/usr/local/bin/ssinstall"); ssinstall.open(QIODevice::ReadOnly); - if(ssinstall.isOpen()){ + if(ssinstall.isOpen()) + { menu_install->addAction(action_dpkg); } QFile deepin("/usr/bin/deepin-deb-installer"); deepin.open(QIODevice::ReadOnly); - if(deepin.isOpen()){ + if(deepin.isOpen()) + { menu_install->addAction(action_deepin); } @@ -49,18 +60,19 @@ downloadlist::~downloadlist() delete ui; } -void downloadlist::setValue(long long value) +void downloadlist::setValue(qint64 value) { - ui->progressBar->setValue(int(value)); - ui->label_2->setText(QString::number(double(value)/100)+"% ("+speed+")"); - if(ui->label_2->text().left(4)=="100%"){ + ui->progressBar->setValue(qint32(value)); + ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")"); + if(ui->label_2->text().left(4) == "100%") + { ui->label_2->setText(tr("Downloaded, waiting to install")); } } -void downloadlist::setMax(long long max) +void downloadlist::setMax(qint64 max) { - ui->progressBar->setMaximum(int(max)); + ui->progressBar->setMaximum(qint32(max)); } void downloadlist::setName(QString name) @@ -75,26 +87,28 @@ QString downloadlist::getName() void downloadlist::readyInstall() { - if(ui->progressBar->value()!= ui->progressBar->maximum() && !close){ + if(ui->progressBar->value() != ui->progressBar->maximum() && !close) + { ui->progressBar->hide(); ui->pushButton_install->show(); ui->pushButton_2->hide(); Widget::sendNotification(tr("Failed to download %1").arg(ui->label->text()), 5000, - "/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png"); + "/tmp/spark-store/icon_" + QString::number(num).toUtf8() + ".png"); ui->label_2->setText(tr("Download Failed,Check Your Connection")); ui->pushButton_install->setEnabled(false); - return; + return; } - if(!close){ + + if(!close) + { ui->progressBar->hide(); ui->pushButton_install->setEnabled(true); ui->pushButton_install->show(); ui->pushButton_2->hide(); Widget::sendNotification(tr("Finished downloading %1, awaiting to install").arg(ui->label->text()), 5000, - "/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png"); + "/tmp/spark-store/icon_" + QString::number(num).toUtf8() + ".png"); } - } void downloadlist::setFileName(QString fileName) @@ -114,79 +128,98 @@ void downloadlist::closeDownload() void downloadlist::setSpeed(QString s) { - speed=s; + speed = s; } void downloadlist::install(int t) { - if(!isInstall){ - isInstall=true; + if(!isInstall) + { + isInstall = true; ui->pushButton_install->hide(); ui->widget_spinner->show(); - qDebug()<<"/tmp/spark-store/"+ui->label_filename->text().toUtf8(); + qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8(); ui->label_2->setText(tr("Installing")); - QtConcurrent::run([=](){ + + QtConcurrent::run([=]() + { QProcess installer; - if(!reinstall){ - switch (t) { + if(!reinstall) + { + switch(t) + { case 0: - installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8()); + installer.start("pkexec ssinstall /tmp/spark-store/" + ui->label_filename->text().toUtf8()); break; case 1: - installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8()); + installer.start("deepin-deb-installer /tmp/spark-store/" + ui->label_filename->text().toUtf8()); break; case 2: - installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8()); + installer.start("pkexec gdebi -n /tmp/spark-store/" + ui->label_filename->text().toUtf8()); break; } - }else { - switch (t) { + } + else + { + switch(t) + { case 0: - installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8()); + installer.start("pkexec ssinstall /tmp/spark-store/" + ui->label_filename->text().toUtf8()); break; case 1: - installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8()); + installer.start("deepin-deb-installer /tmp/spark-store/" + ui->label_filename->text().toUtf8()); break; case 2: - installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8()); + installer.start("pkexec gdebi -n /tmp/spark-store/" + ui->label_filename->text().toUtf8()); break; } } - bool haveError=false; - bool notRoot=false; + + bool haveError = false; + bool notRoot = false; installer.waitForFinished(); - out=installer.readAllStandardOutput(); - QStringList everyOut=out.split("\n"); - for (int i=0;ipushButton_install->hide(); ui->label_2->setText(tr("Finish")); ui->pushButton_3->show(); - }else { + } + else + { ui->pushButton_install->show(); ui->pushButton_install->setText(tr("Retry")); ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again")); ui->pushButton_3->show(); } - if(notRoot){ + + if(notRoot) + { ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation")); ui->pushButton_install->show(); ui->pushButton_3->hide(); } - ui->widget_spinner->hide(); - downloadlist::isInstall=false; + ui->widget_spinner->hide(); + downloadlist::isInstall = false; }); qDebug()<label_filename->text().toUtf8(); @@ -196,7 +229,7 @@ void downloadlist::install(int t) void downloadlist::on_pushButton_install_clicked() { - //弹出菜单 + // 弹出菜单 menu_install->exec(cursor().pos()); } @@ -205,17 +238,18 @@ void downloadlist::on_pushButton_2_clicked() ui->label_2->setText(tr("Download canceled")); ui->pushButton_2->setEnabled(false); ui->progressBar->hide(); - close=true; + close = true; } void downloadlist::on_pushButton_3_clicked() { - output_w.layout()->addWidget(textbrowser); textbrowser->setLineWidth(0); textbrowser->setText(out); - output_w.layout()->setMargin(20); - output_w.setTitle(ui->label->text()); - output_w.setMinimumHeight(600); - output_w.setAttribute(Qt::WA_TranslucentBackground); - output_w.show(); + + output_w->setMinimumHeight(600); + output_w->setAttribute(Qt::WA_TranslucentBackground); + output_w->setTitle(ui->label->text()); + output_w->layout()->setMargin(20); + output_w->layout()->addWidget(textbrowser); + output_w->show(); } diff --git a/src/downloadlist.h b/src/downloadlist.h index db11116a..e9a8b8ab 100644 --- a/src/downloadlist.h +++ b/src/downloadlist.h @@ -2,11 +2,14 @@ #define DOWNLOADLIST_H #include -#include #include #include #include + +#include + DWIDGET_USE_NAMESPACE + namespace Ui { class downloadlist; } @@ -18,40 +21,45 @@ class downloadlist : public QWidget public: explicit downloadlist(QWidget *parent = nullptr); ~downloadlist(); - void setValue(long long); - void setMax(long long); + + int num; + bool free; + static bool isInstall; + bool reinstall; + QString speed; + QString out; + QString pkgName; + bool close; + + void setValue(qint64); + void setMax(qint64); void setName(QString); QString getName(); void readyInstall(); - bool free; + void setFileName(QString); void seticon(const QPixmap); void closeDownload(); void setSpeed(QString); - int num; - bool close=false; - QString out; - DDialog output_w; - QTextBrowser *textbrowser=new QTextBrowser; - bool reinstall=false; - QString pkgName; - QMenu *menu_install=new QMenu; - QAction *action_gdebi=new QAction; - QAction *action_dpkg=new QAction; - QAction *action_deepin=new QAction; + void install(int); -private slots: - void on_pushButton_install_clicked(); -// void on_pushButton_maninst_clicked(); - void on_pushButton_2_clicked(); - void on_pushButton_3_clicked(); private: Ui::downloadlist *ui; - static bool isInstall; - QString speed; + QMenu *menu_install; + QAction *action_dpkg; + QAction *action_deepin; + QAction *action_gdebi; + + DDialog *output_w; + QTextBrowser *textbrowser; + +private slots: + void on_pushButton_install_clicked(); + void on_pushButton_2_clicked(); + void on_pushButton_3_clicked(); }; -//bool downloadlist::isInstall=false; + #endif // DOWNLOADLIST_H diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp index 8f38cbe3..7a54e759 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -1,10 +1,9 @@ #include "downloadworker.h" -#include + #include #include #include #include -#include #include #include #include @@ -12,7 +11,7 @@ DownloadWorker::DownloadWorker(QObject *parent) { - + Q_UNUSED(parent) } void DownloadWorker::setIdentifier(int identifier) @@ -35,28 +34,28 @@ qint64 DownloadWorker::getReceivedPos() void DownloadWorker::doWork() { - mgr = new QNetworkAccessManager(this); - QNetworkRequest request; - request.setUrl(url); - request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); - request.setRawHeader("Range", QString("bytes=%1-%2").arg(startPos) - .arg(endPos).toLocal8Bit()); - reply = mgr->get(request); - qDebug() << "开始下载数据:" << QString(" %1~%2 -> writePos Start %3") - .arg(startPos).arg(endPos).arg(receivedPos); - connect(reply, static_cast(&QNetworkReply::error), - [this](QNetworkReply::NetworkError error){ - if (error != QNetworkReply::NoError) { - qDebug() << "出错了:" << reply->errorString(); - } - }); - connect(reply, &QNetworkReply::finished, mgr, &QNetworkAccessManager::deleteLater); - connect(reply, &QNetworkReply::readyRead, this, &DownloadWorker::dataReady); - connect(reply, &QNetworkReply::finished, this, &DownloadWorker::slotFinish); - connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWorker::handleProcess); -// connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, this, &DownloadWorker::doStop); + mgr = new QNetworkAccessManager(this); + QNetworkRequest request; + request.setUrl(url); + request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); + request.setRawHeader("Range", QString("bytes=%1-%2").arg(startPos).arg(endPos).toLocal8Bit()); + reply = mgr->get(request); + qDebug() << "开始下载数据:" << QString(" %1~%2 -> writePos Start %3").arg(startPos).arg(endPos).arg(receivedPos); + connect(reply, static_cast (&QNetworkReply::error), + [this](QNetworkReply::NetworkError error) + { + if(error != QNetworkReply::NoError) + { + qDebug() << "出错了:" << reply->errorString(); + } + }); + connect(reply, &QNetworkReply::finished, mgr, &QNetworkAccessManager::deleteLater); + connect(reply, &QNetworkReply::readyRead, this, &DownloadWorker::dataReady); + connect(reply, &QNetworkReply::finished, this, &DownloadWorker::slotFinish); + connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWorker::handleProcess); + // connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); + connect(reply, &QNetworkReply::finished, this, &DownloadWorker::doStop); } void DownloadWorker::doStop() @@ -80,8 +79,7 @@ void DownloadWorker::dataReady() void DownloadWorker::slotFinish() { file->flush(); - qDebug() << "数据块下载完毕:" << QString(" %1~%2 -> writePos Start %3") - .arg(startPos).arg(endPos).arg(receivedPos); + qDebug() << "数据块下载完毕:" << QString(" %1~%2 -> writePos Start %3").arg(startPos).arg(endPos).arg(receivedPos); emit workFinished(); } @@ -93,6 +91,8 @@ void DownloadWorker::handleProcess(qint64, qint64) DownloadController::DownloadController(QObject *parent) { + Q_UNUSED(parent) + domains = { "d1.store.deepinos.org.cn", "d2.store.deepinos.org.cn", @@ -100,13 +100,15 @@ DownloadController::DownloadController(QObject *parent) "d4.store.deepinos.org.cn", "d5.store.deepinos.org.cn" }; - this->threadNum = domains.size() > 5 ? 5 : domains.size(); + this->threadNum = domains.size() > 5 ? 5 : domains.size(); } DownloadController::~DownloadController() { - if (workers.size() > 0) { - for(int i = 0; i < workers.size(); i++) { + if(workers.size() > 0) + { + for(int i = 0; i < workers.size(); i++) + { workers.at(i)->doStop(); workers.at(i)->disconnect(); workers.at(i)->deleteLater(); @@ -130,45 +132,52 @@ void DownloadController::setThreadNum(int threadNum) */ void DownloadController::startDownload(const QString &url) { - - finish = 0; // 下载任务等分,计算每个线程的下载数据 fileSize = getFileSize(url); - if (fileSize == 0) { + if(fileSize == 0) + { emit errorOccur("文件大小获取失败"); return; } + qint64 segmentSize = fileSize / threadNum; ranges.resize(threadNum); QVector receivedBytes; receivedBytes.resize(threadNum); - for (int i = 0; i < threadNum; i++) { + for(int i = 0; i < threadNum; i++) + { ranges[i].first = i * segmentSize; ranges[i].second = i * segmentSize + segmentSize - 1; receivedBytes[i] = 0; } - ranges[threadNum-1].second = fileSize; // 余数部分加入最后一个 + ranges[threadNum - 1].second = fileSize; // 余数部分加入最后一个 // 打开文件 QDir tmpdir("/tmp/spark-store"); file = new QFile; file->setFileName(tmpdir.absoluteFilePath(filename)); - if (file->exists()) + if(file->exists()) + { file->remove(); - if (!file->open(QIODevice::WriteOnly)) { + } + + if(!file->open(QIODevice::WriteOnly)) + { delete file; file = nullptr; emit errorOccur(file->errorString()); return; } + file->resize(fileSize); // 创建下载线程 workers.clear(); - for(int i = 0; i < ranges.size(); i++) { + for(int i = 0; i < ranges.size(); i++) + { qDebug() << QString("第%1个下载请求:%2-%3").arg(i).arg(ranges.at(i).first).arg(ranges.at(i).second); auto worker = new DownloadWorker(this); auto range = ranges.at(i); @@ -176,8 +185,10 @@ void DownloadController::startDownload(const QString &url) worker->setIdentifier(i); worker->setParamter(chunkUrl, range, file); workers.append(worker); + connect(worker, &DownloadWorker::downloadProcess, this, &DownloadController::handleProcess); connect(worker, &DownloadWorker::workFinished, this, &DownloadController::chunkDownloadFinish); + worker->doWork(); } } @@ -187,14 +198,15 @@ void DownloadController::startDownload(const QString &url) */ void DownloadController::stopDownload() { - for(int i = 0; i < workers.size(); i++) { + for(int i = 0; i < workers.size(); i++) + { workers.at(i)->doStop(); workers.at(i)->disconnect(); workers.at(i)->deleteLater(); } workers.clear(); - qDebug() << "文件下载路径:" << QFileInfo(file->fileName()).absoluteFilePath(); + file->flush(); file->close(); delete file; @@ -205,7 +217,8 @@ void DownloadController::stopDownload() void DownloadController::handleProcess() { qint64 bytesReceived = 0; - for(int i = 0; i < workers.size(); i++) { + for(int i = 0; i < workers.size(); i++) + { bytesReceived += workers.at(i)->getReceivedPos(); } qDebug() << QString("下载进度 %1-%2").arg(bytesReceived).arg(fileSize); @@ -216,7 +229,8 @@ void DownloadController::chunkDownloadFinish() { finish++; qDebug() << QString("已下载了%1块,共%2块!!!").arg(finish).arg(threadNum); - if (finish == threadNum) { + if(finish == threadNum) + { stopDownload(); emit downloadFinished(); } @@ -230,17 +244,21 @@ qint64 DownloadController::getFileSize(const QString& url) request.setUrl(QUrl(url)); request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); QNetworkReply *reply = requestManager.head(request); - connect(reply, static_cast(&QNetworkReply::error), - [this, reply](QNetworkReply::NetworkError error){ - if (error != QNetworkReply::NoError) { + connect(reply, static_cast (&QNetworkReply::error), + [this, reply](QNetworkReply::NetworkError error) + { + if(error != QNetworkReply::NoError) + { emit errorOccur(reply->errorString()); } }); connect(reply, &QNetworkReply::finished, &event, &QEventLoop::quit); event.exec(); + qint64 fileSize = 0; - if (reply->rawHeader("Accept-Ranges") == QByteArrayLiteral("bytes") - && reply->hasRawHeader(QString("Content-Length").toLocal8Bit())) { + if(reply->rawHeader("Accept-Ranges") == QByteArrayLiteral("bytes") + && reply->hasRawHeader(QString("Content-Length").toLocal8Bit())) + { fileSize = reply->header(QNetworkRequest::ContentLengthHeader).toUInt(); } qDebug() << "文件大小为:" << fileSize; @@ -251,9 +269,9 @@ qint64 DownloadController::getFileSize(const QString& url) QString DownloadController::replaceDomain(const QString& url, const QString domain) { QRegularExpression regex(R"((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])"); - if (regex.match(url).hasMatch()) { + if(regex.match(url).hasMatch()) + { return QString(url).replace(regex.match(url).captured(), domain); } return url; } - diff --git a/src/downloadworker.h b/src/downloadworker.h index 72f558bb..5ea0acaf 100644 --- a/src/downloadworker.h +++ b/src/downloadworker.h @@ -9,8 +9,10 @@ class DownloadWorker : public QObject { Q_OBJECT + public: explicit DownloadWorker(QObject *parent = nullptr); + void setIdentifier(int identifier); void setParamter(const QString &url, QPair range, QFile *flle); qint64 getReceivedPos(); @@ -22,12 +24,6 @@ public slots: void slotFinish(); void handleProcess(qint64, qint64); -signals: - void resultReady(int identifier, QByteArray data); - void testSignals(); - void workFinished(); - void downloadProcess(); - private: int identifier; QString url; @@ -37,14 +33,23 @@ private: QNetworkReply *reply; QNetworkAccessManager *mgr; QFile *file; + +signals: + void resultReady(int identifier, QByteArray data); + void testSignals(); + void workFinished(); + void downloadProcess(); + }; class DownloadController : public QObject { Q_OBJECT + public: explicit DownloadController(QObject *parent = nullptr); ~DownloadController(); + void setFilename(QString filename); void setThreadNum(int threadNum); void startDownload(const QString &url); @@ -52,15 +57,6 @@ public: qint64 getFileSize(const QString& url); QString replaceDomain(const QString& url, const QString domain); -public slots: - void handleProcess(); - void chunkDownloadFinish(); - -signals: - void errorOccur(const QString& msg); - void downloadProcess(qint64, qint64); - void downloadFinished(); - private: int threadNum; QString filename; @@ -70,6 +66,16 @@ private: QList workers; int finish = 0; QVector domains; + +public slots: + void handleProcess(); + void chunkDownloadFinish(); + +signals: + void errorOccur(const QString& msg); + void downloadProcess(qint64, qint64); + void downloadFinished(); + }; #endif // FILEDOWNLOADWORKER_H diff --git a/src/flowlayout.cpp b/src/flowlayout.cpp index 9203da0b..b60335c7 100644 --- a/src/flowlayout.cpp +++ b/src/flowlayout.cpp @@ -117,14 +117,14 @@ QLayoutItem *FlowLayout::takeAt(int index) if (index >= 0 && index < itemList.size()) return itemList.takeAt(index); else - return 0; + return nullptr; } //! [5] //! [6] Qt::Orientations FlowLayout::expandingDirections() const { - return 0; + return nullptr; } //! [6] @@ -215,7 +215,7 @@ int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const return -1; } else if (parent->isWidgetType()) { QWidget *pw = static_cast(parent); - return pw->style()->pixelMetric(pm, 0, pw); + return pw->style()->pixelMetric(pm, nullptr, pw); } else { return static_cast(parent)->spacing(); } diff --git a/src/flowlayout.h b/src/flowlayout.h index 920f4e63..8aa46035 100644 --- a/src/flowlayout.h +++ b/src/flowlayout.h @@ -60,7 +60,7 @@ class FlowLayout : public QLayout public: explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); - ~FlowLayout(); + ~FlowLayout() override; void addItem(QLayoutItem *item) override; int horizontalSpacing() const; @@ -85,4 +85,4 @@ private: }; //! [0] -#endif // FLOWLAYOUT_H \ No newline at end of file +#endif // FLOWLAYOUT_H diff --git a/src/image_show.cpp b/src/image_show.cpp index 4dcc7734..54ebf70c 100644 --- a/src/image_show.cpp +++ b/src/image_show.cpp @@ -1,17 +1,13 @@ #include "image_show.h" -#include // Qt5 不再建议使用 QDesktopWidget #include -#include - -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE +#include // Qt5 不再建议使用 QDesktopWidget +#include -image_show::image_show(QWidget *parent) : QWidget(parent) +image_show::image_show(QWidget *parent) : + QWidget(parent), + m_dialog(new big_image), + m_label(new QLabel) { QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(m_label); @@ -23,13 +19,12 @@ void image_show::setImage(QPixmap image) { QImage screen0; screen0 = image.toImage(); - // QPainter painter(&screen0); QImage re_screen1; QImage re_screen0 = screen0.scaled(QSize(400, 300), Qt::KeepAspectRatio, Qt::SmoothTransformation); // 获取主屏幕尺寸 - desktop_w = DApplication::primaryScreen()->geometry().width(); - desktop_h = DApplication::primaryScreen()->geometry().height(); + desktop_w = QGuiApplication::primaryScreen()->geometry().width(); + desktop_h = QGuiApplication::primaryScreen()->geometry().height(); if(screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20)) { @@ -53,5 +48,4 @@ void image_show::mousePressEvent(QMouseEvent *) m_dialog->setFixedSize(desktop_w, desktop_h); m_dialog->move(0,0); - // moveToCenter(m_dialog); } diff --git a/src/image_show.h b/src/image_show.h index 8854068c..a851dd79 100644 --- a/src/image_show.h +++ b/src/image_show.h @@ -3,30 +3,30 @@ #include #include -#include -#include -#include -#include -#include -DWIDGET_USE_NAMESPACE + +#include "big_image.h" + class image_show : public QWidget { Q_OBJECT + public: explicit image_show(QWidget *parent = nullptr); - void setImage(QPixmap); int desktop_w; int desktop_h; + + void setImage(QPixmap); + +protected: + void mousePressEvent(QMouseEvent *event) override; + private: - QLabel *m_label=new QLabel; - QPixmap m_image; + big_image *m_dialog; + QLabel *m_label; QLabel image; - big_image *m_dialog=new big_image; - void mousePressEvent(QMouseEvent *event); -signals: + QPixmap m_image; -public slots: }; #endif // IMAGE_SHOW_H diff --git a/src/progressload.cpp b/src/progressload.cpp index 3e07fb33..c335ce1a 100644 --- a/src/progressload.cpp +++ b/src/progressload.cpp @@ -1,37 +1,42 @@ #include "progressload.h" -ProgressLoad::ProgressLoad(QWidget *parent) : QWidget(parent) +ProgressLoad::ProgressLoad(QWidget *parent) : + QWidget(parent), + m_progess(new QWidget(this)), + timer(new QTimer), + value(0) { - m_progess=new QWidget(this); m_progess->move(0,0); m_progess->show(); - timer=new QTimer; - value=0; + timer->setInterval(10); timer->start(); - connect(timer,&QTimer::timeout,[=](){ - m_progess->setFixedWidth(width()/100*value); + connect(timer, &QTimer::timeout, [=]() + { + m_progess->setFixedWidth(width() / 100 * value); m_progess->setFixedHeight(height()); }); } void ProgressLoad::setValue(int v) { - value=v; - m_progess->setFixedWidth(width()/100*value); + value = v; + m_progess->setFixedWidth(width() / 100 * value); } void ProgressLoad::setTheme(bool dark, QColor color) { - if(dark){ - plt.setColor(QPalette::Background,QColor(28,28,28)); + if(dark) + { + plt.setColor(QPalette::Background, QColor(28,28,28)); setAutoFillBackground(true); setPalette(plt); - - }else { - plt.setColor(QPalette::Background,QColor(255,255,255)); + } + else + { + plt.setColor(QPalette::Background, QColor(255,255,255)); setAutoFillBackground(true); setPalette(plt); } - m_progess->setStyleSheet("background-color:"+color.name()); + m_progess->setStyleSheet("background-color: " + color.name() + ";"); } diff --git a/src/progressload.h b/src/progressload.h index ffa3c7e0..630766a7 100644 --- a/src/progressload.h +++ b/src/progressload.h @@ -4,21 +4,23 @@ #include #include #include + class ProgressLoad : public QWidget { Q_OBJECT + public: explicit ProgressLoad(QWidget *parent = nullptr); + void setValue(int v); void setTheme(bool dark,QColor color); -signals: -public slots: private: QWidget *m_progess; - int value; QTimer *timer; + int value; QPalette plt; + }; #endif // PROGRESSLOAD_H diff --git a/src/widget.cpp b/src/widget.cpp index 55dd9ebd..290f5a9d 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -65,6 +65,24 @@ Widget::Widget(DBlurEffectWidget *parent) : connect(ui->menu_other, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(12);}); connect(ui->menu_download, &QPushButton::clicked, this, [=](){Widget::chooseLeftMenu(13);}); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) + { + // 获取系统活动色 + QColor main_color; + main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); + + if(themeType == DGuiApplicationHelper::DarkType) + { + qDebug() << "Dark"; + setTheme(true, main_color); + } + else + { + qDebug() << "Light"; + setTheme(false, main_color); + } + }); + connect(&appinfoLoadThread, SIGNAL(requestResetUi()), this, SLOT(sltAppinfoResetUi()), Qt::ConnectionType::BlockingQueuedConnection); connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetTags, this, &Widget::sltAppinfoTags, Qt::ConnectionType::BlockingQueuedConnection); connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetAppInformation, this, &Widget::sltAppinfoDetails, Qt::ConnectionType::BlockingQueuedConnection); @@ -85,24 +103,6 @@ Widget::Widget(DBlurEffectWidget *parent) : this->setFocus(); }); - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) - { - // 获取系统活动色 - QColor main_color; - main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); - - if(themeType == DGuiApplicationHelper::DarkType) - { - qDebug() << "Dark"; - setTheme(true, main_color); - } - else - { - qDebug() << "Light"; - setTheme(false, main_color); - } - }); - // 计算显示下载速度 download_speed.setInterval(1000); download_speed.start(); @@ -236,6 +236,16 @@ void Widget::initUI() main->addWidget(spinner); ui->applist_scrollAreaWidget->setLayout(main); spinner->setFixedSize(80, 80); + + // 初始化主题颜色 + if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) + { + themeIsDark = true; + } + else + { + themeIsDark = false; + } } void Widget::initConfig() @@ -296,17 +306,17 @@ void Widget::initConfig() // ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true); ui->webfoot->hide(); - //初始化首页 + // 初始化首页 // ui->webEngineView->setUrl(menuUrl[0]); chooseLeftMenu(0); - //给下载列表赋值到数组,方便调用 + // 给下载列表赋值到数组,方便调用 for(int i = 0; i < LIST_MAX; i++) { download_list[i].num = i; } - // 初始化apt源显示 + // 初始化 apt 源显示 QFile aptserver("/etc/apt/sources.list.d/sparkstore.list"); aptserver.open(QIODevice::ReadOnly); if(aptserver.isOpen()) @@ -543,17 +553,6 @@ void Widget::chooseLeftMenu(int index) updateUI(); - /* - if(QLocale::system().name() == "zh_CN") - { - left_list[index]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px;"); - } - else - { - left_list[index]->setStyleSheet("color: #FFFFFF; background-color: " + main_color.name() + "; border-radius: 8; border: 0px; text-align: left; padding-left: 15px;"); - } - */ - if(index <= 12) { if(themeIsDark) @@ -810,7 +809,7 @@ void Widget::sltAppinfoResetUi() ui->tag_dwine5->hide(); ui->tag_a2d->hide(); - // 重置UI状态 + // 重置 UI 状态 ui->pushButton_uninstall->hide(); ui->pushButton_website->setEnabled(false); ui->pushButton->setEnabled(false); @@ -919,7 +918,7 @@ void Widget::sltAppinfoScreenshot(QPixmap *picture, int index) void Widget::sltAppinfoFinish() { - ui->label_show->setText(""); + ui->label_show->clear(); ui->label_show->hide(); } @@ -1090,7 +1089,7 @@ void Widget::on_pushButton_updateApt_clicked() system(("chmod +x " + tmpPath + "/update.sh").c_str()); QProcess runupdate; - runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh"), QStringList()); + runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh")); runupdate.waitForFinished(); QString error = runupdate.readAllStandardError(); @@ -1132,7 +1131,7 @@ void Widget::on_pushButton_uninstall_clicked() ui->pushButton_uninstall->setEnabled(false); QProcess uninstall; - uninstall.start("pkexec apt purge -y " + pkgName.toLower(), QStringList()); + uninstall.start("pkexec apt purge -y " + pkgName.toLower()); uninstall.waitForFinished(); ui->pushButton_download->setEnabled(true); diff --git a/src/widget.h b/src/widget.h index 8b0152b5..42d8c3d0 100644 --- a/src/widget.h +++ b/src/widget.h @@ -54,9 +54,9 @@ public: void startRequest(QUrl url, QString fileName); void searchApp(QString); - int nowDownload=0; - int allDownload=0; - int isdownload=false; + int nowDownload = 0; + int allDownload = 0; + int isdownload = false; void opensetting(); //打开设置页面 void openUrl(QUrl); void setTheme(bool,QColor); @@ -133,15 +133,15 @@ private: QPushButton * left_list[15]; QUrl menuUrl[13]; ProgressLoad *m_loadweb; - QLabel *m_loaderror=new QLabel; + QLabel *m_loaderror = new QLabel; QString serverUrl; - bool configCanSave=false; - bool isBusy=false; - int nowMenu=0; //定位当前菜单 - int prePage=0; //定位前一个页面 - long download_size=0; - long size1=0; - long size2=0; + bool configCanSave = false; + bool isBusy = false; + int nowMenu = 0; // 定位当前菜单 + int prePage = 0; // 定位前一个页面 + long download_size = 0; + long size1 = 0; + long size2 = 0; QPixmap screen[5]; QFuture load; QFutureWatcher watchScreenshotLoad; diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp index 52413639..35299f7d 100644 --- a/src/workerthreads.cpp +++ b/src/workerthreads.cpp @@ -1,9 +1,10 @@ +#include "workerthreads.h" #include #include #include #include -#include "workerthreads.h" + #include "widget.h" #include "HttpClient.h" @@ -14,112 +15,136 @@ void SpkAppInfoLoaderThread::run() httpClient = new AeaQt::HttpClient; httpClient->get(targetUrl.toString()) - .header("content-type", "application/json") - .onResponse([this](QByteArray json_array) { - qDebug() << "请求应用信息 " << json_array; - QString urladdress, deatils, more, packagename, appweb; - bool isInstalled; - - // 将路径转化为相应源的下载路径 - urladdress = targetUrl.toString().left(targetUrl.toString().length()-8); - QStringList downloadurl=urladdress.split("/"); - - QString deburl = serverUrl; - deburl = deburl.left(urladdress.length()-1); - urladdress = "https://img.jerrywang.top/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 - urladdress = urladdress.left(urladdress.length()-1); - - for (int i=3;ipushButton_website->show(); move to setinfo slot - appweb=json["Website"].toString(); - } - details+=tr("Contributor: ")+json["Contributor"].toString()+"\n"; - details+=tr("Update Time: ")+json["Update"].toString()+"\n"; - details+=tr("Installed Size: ")+json["Size"].toString()+"\n"; - more = json["More"].toString(); - - QProcess isInstall; - packagename = json["Pkgname"].toString(); - isInstall.start("dpkg -s "+json["Pkgname"].toString()); - isInstall.waitForFinished(); - int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); - if(error==0) - isInstalled = true; - else - isInstalled = false; - - emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled); - - //tag加载 - QString tags=json["Tags"].toString(); - QStringList tagList=tags.split(";"); - emit requestSetTags(&tagList); - - // 图标加载 - httpClient->get(urladdress+"icon.png") - .onResponse([this](QByteArray imgData){ - QPixmap appicon; - appicon.loadFromData(imgData); - emit finishedIconLoad(&appicon); - }) - .onError([this](QString errorStr) { - Widget::sendNotification(tr("Failed to load application icon.")); - }) - .block() - .timeout(5 * 100) - .exec(); - - - // 截图展示加载 - QPixmap screenshotCache[5]; - for (int i = 0; i < 5; i++) { - httpClient->get(urladdress+"screen_"+QString::number(i+1)+".png") - .onResponse([this, i, &screenshotCache](QByteArray imgData){ - bool s = screenshotCache[i].loadFromData(imgData); - if(s){ - emit finishedScreenshotLoad(&screenshotCache[i], i); - }else{ - emit finishedScreenshotLoad(nullptr, i); - } - }) - .onError([this](QString errorStr) { - qDebug() << "截图下载失败"; -// Widget::sendNotification(tr("Failed to load application screenshot.")); - }) - .block() - .timeout(4 * 100) - .exec(); - } - emit finishAllLoading(); + .header("content-type", "application/json") + .onResponse([this](QByteArray json_array) + { + qDebug() << "请求应用信息 " << json_array; + QString urladdress, deatils, more, packagename, appweb; + bool isInstalled; + + // 将路径转化为相应源的下载路径 + urladdress = targetUrl.toString().left(targetUrl.toString().length() - 8); + QStringList downloadurl = urladdress.split("/"); + + QString deburl = serverUrl; + deburl = deburl.left(urladdress.length() - 1); + urladdress = "https://img.jerrywang.top/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器 + urladdress = urladdress.left(urladdress.length() - 1); + + for(int i = 3; i < downloadurl.size(); i++) + { + urladdress += "/" + downloadurl[i]; + deburl += "/" + downloadurl[i]; + } + + // 路径转化完成 + QJsonObject json = QJsonDocument::fromJson(json_array).object(); + QString appName = json["Name"].toString(); + QUrl fileUrl = deburl + json["Filename"].toString(); + + // 软件信息加载 + QString details; + details = tr("PkgName: ") + json["Pkgname"].toString() + "\n"; + details += tr("Version: ") + json["Version"].toString() + "\n"; + if(!json["Author"].toString().trimmed().isEmpty()) + { + details += tr("Author: ") + json["Author"].toString() + "\n"; + } - httpClient->deleteLater(); + if(!json["Website"].toString().trimmed().isEmpty()) + { + details += tr("Official Site: ") + json["Website"].toString() + "\n"; + // ui->pushButton_website->show(); // move to setinfo slot + appweb = json["Website"].toString(); + } + details += tr("Contributor: ") + json["Contributor"].toString() + "\n"; + details += tr("Update Time: ") + json["Update"].toString() + "\n"; + details += tr("Installed Size: ") + json["Size"].toString() + "\n"; + more = json["More"].toString(); + + QProcess isInstall; + packagename = json["Pkgname"].toString(); + isInstall.start("dpkg -s " + json["Pkgname"].toString()); + isInstall.waitForFinished(); + int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); + if(error == 0) + { + isInstalled = true; + } + else + { + isInstalled = false; + } + + emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled); + + // tag 加载 + QString tags = json["Tags"].toString(); + QStringList tagList = tags.split(";"); + emit requestSetTags(&tagList); + + // 图标加载 + httpClient->get(urladdress+"icon.png") + .onResponse([this](QByteArray imgData) + { + QPixmap appicon; + appicon.loadFromData(imgData); + emit finishedIconLoad(&appicon); }) - .onError([](QString errorStr) { - Widget::sendNotification(tr("Failed to download app info. Please check internet connection.")); + .onError([this](QString errorStr) + { + Q_UNUSED(this) + Q_UNUSED(errorStr) + + Widget::sendNotification(tr("Failed to load application icon.")); }) - .timeout(5 * 100) .block() - .exec(); + .timeout(5 * 100) + .exec(); + + // 截图展示加载 + QPixmap screenshotCache[5]; + for(int i = 0; i < 5; i++) + { + httpClient->get(urladdress + "screen_" + QString::number(i + 1) + ".png") + .onResponse([this, i, &screenshotCache](QByteArray imgData) + { + bool s = screenshotCache[i].loadFromData(imgData); + if(s) + { + emit finishedScreenshotLoad(&screenshotCache[i], i); + } + else + { + emit finishedScreenshotLoad(nullptr, i); + } + }) + .onError([this](QString errorStr) + { + Q_UNUSED(this) + Q_UNUSED(errorStr) + + qDebug() << "截图下载失败"; + // Widget::sendNotification(tr("Failed to load application screenshot.")); + }) + .block() + .timeout(4 * 100) + .exec(); + } + emit finishAllLoading(); + + httpClient->deleteLater(); + }) + .onError([](QString errorStr) + { + Q_UNUSED(errorStr) + + Widget::sendNotification(tr("Failed to download app info. Please check internet connection.")); + }) + .timeout(5 * 100) + .block() + .exec(); } @@ -135,8 +160,9 @@ void SpkAppInfoLoaderThread::setServer(const QString &server) void SpkAppInfoLoaderThread::downloadFinished(int exitcode, QProcess::ExitStatus status) { - Q_UNUSED(exitcode); - Q_UNUSED(status); + Q_UNUSED(exitcode) + Q_UNUSED(status) + qDebug() << "Finish one download"; finishedDownload = true; } @@ -146,7 +172,10 @@ int SpkAppInfoLoaderThread::waitDownload(QProcess& downloader) while(!downloader.waitForFinished(100)) { if(downloader.state() == QProcess::NotRunning) + { return -1; + } + if(this->isInterruptionRequested()) { downloader.terminate(); diff --git a/src/workerthreads.h b/src/workerthreads.h index dc3535fa..d66d7485 100644 --- a/src/workerthreads.h +++ b/src/workerthreads.h @@ -6,21 +6,35 @@ #include #include - namespace AeaQt { - class HttpClient; +class HttpClient; } class SpkAppInfoLoaderThread Q_DECL_FINAL : public QThread { Q_OBJECT + public: - //explicit SpkAppInfoLoaderThread() = default; + // explicit SpkAppInfoLoaderThread() = default; + +protected: void run() Q_DECL_OVERRIDE; + +private: + QUrl targetUrl; + QString serverUrl; + bool finishedDownload = false; + int downloaderRetval = 0; + + AeaQt::HttpClient *httpClient; + + int waitDownload(QProcess& downloader); + public slots: void setUrl(const QUrl &url); void setServer(const QString &server); void downloadFinished(int exitcode, QProcess::ExitStatus status); + signals: void requestResetUi(); void requestSetTags(QStringList *tagList); @@ -28,16 +42,9 @@ signals: QString *website, QString *packageName, QUrl *fileUrl, bool isInstalled); void finishedIconLoad(QPixmap *icon); - void finishedScreenshotLoad(QPixmap *icon, int index); // 该信号必须以BlockingQueued方式连接 - void finishAllLoading(); // 该信号必须以BlockingQueued方式连接 -private: - int waitDownload(QProcess& downloader); - QUrl targetUrl; - QString serverUrl; - bool finishedDownload = false; - int downloaderRetval = 0; + void finishedScreenshotLoad(QPixmap *icon, int index); // 该信号必须以 BlockingQueued 方式连接 + void finishAllLoading(); // 该信号必须以 BlockingQueued 方式连接 - AeaQt::HttpClient *httpClient; }; #endif // WORKERTHREADS_H -- Gitee From e5fe80cb76e8d3850ecf67d95d3afedaeb947ec8 Mon Sep 17 00:00:00 2001 From: Jerry <767729940@qq.com> Date: Tue, 20 Apr 2021 16:04:42 +0800 Subject: [PATCH 14/15] add jenkins from master --- .gitee/Dockerfile | 2 ++ .gitee/callback.py | 31 ++++++++++++++++ Jenkinsfile | 33 ++++++++++++++++++ .../fonts/hksnzt.ttf | Bin assets/icons.qrc | 2 +- 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 .gitee/Dockerfile create mode 100644 .gitee/callback.py create mode 100644 Jenkinsfile rename "assets/fonts/\345\215\216\345\272\267\345\260\221\345\245\263\345\255\227\344\275\223.ttf" => assets/fonts/hksnzt.ttf (100%) diff --git a/.gitee/Dockerfile b/.gitee/Dockerfile new file mode 100644 index 00000000..88afd34c --- /dev/null +++ b/.gitee/Dockerfile @@ -0,0 +1,2 @@ +FROM python:3 +RUN pip3 install requests \ No newline at end of file diff --git a/.gitee/callback.py b/.gitee/callback.py new file mode 100644 index 00000000..b52d7020 --- /dev/null +++ b/.gitee/callback.py @@ -0,0 +1,31 @@ +import os +import requests +import json + + +# sha=os.system("git rev-parse HEAD") +sha = os.getenv("GIT_COMMIT") +# sha = '48fed26c51a8c42554e45f72f43e49703e04c97f' +#get sha from environment +url = "https://gitee.com/api/v5/repos/deepin-community-store/spark-store/commits/{}/comments".format(sha) + +token = os.getenv("gitee_token") + +# process = os.popen("git symbolic-ref --short -q HEAD") + +body = "构建详情请见" + os.getenv("JENKINS_URL") + "blue/organizations/jenkins/" + os.getenv("JOB_NAME").replace("/", "/detail/") + "/" + str(os.getenv("BUILD_ID")) + +# process.close() + +d = { + 'access_token': token, + "body": body +} + +h = { + "Content-Type": "application/json;charset=UTF-8" +} + +res = requests.post(url,headers=h, data=json.dumps(d)) +# print(res.status_code) +# print(res.content) \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..dab36e40 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,33 @@ +pipeline { + agent any + stages { + stage('build') { + agent { + docker { + image 'jerry979/dtke:5.11' + } + + } + steps { + sh 'mkdir build && cd build && qmake .. && make ' + archiveArtifacts(artifacts: 'build/src/spark-store', allowEmptyArchive: true, defaultExcludes: true) + } + } + + stage('send') { + agent { + dockerfile { + filename '.gitee/Dockerfile' + } + + } + environment { + gitee_token = credentials('1') + } + steps { + sh "python3 .gitee/callback.py" + } + } + + } +} \ No newline at end of file diff --git "a/assets/fonts/\345\215\216\345\272\267\345\260\221\345\245\263\345\255\227\344\275\223.ttf" b/assets/fonts/hksnzt.ttf similarity index 100% rename from "assets/fonts/\345\215\216\345\272\267\345\260\221\345\245\263\345\255\227\344\275\223.ttf" rename to assets/fonts/hksnzt.ttf diff --git a/assets/icons.qrc b/assets/icons.qrc index 6c797cbe..9c8ed019 100644 --- a/assets/icons.qrc +++ b/assets/icons.qrc @@ -64,6 +64,6 @@ tags/dwine2-small.png - fonts/华康少女字体.ttf + fonts/hksnzt.ttf -- Gitee From 9a3d32ee118d56c09b443948f28cba77e190500e Mon Sep 17 00:00:00 2001 From: zty199 <46324746+zty199@users.noreply.github.com> Date: Tue, 20 Apr 2021 18:49:17 +0800 Subject: [PATCH 15/15] Improve Features Support save current theme setting when exit; Use QScreen::primaryScreen() instead of QDesktopWidget to get desktop size; Ensure only one instance will be running at the same time. --- src/main.cpp | 63 ++++++++++++++++++++-------------- src/progressload.cpp | 6 ++-- src/progressload.h | 2 +- src/widget.cpp | 82 +++++++++++++++++++++++--------------------- src/widget.ui | 12 +++---- 5 files changed, 92 insertions(+), 73 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b059f425..d2138612 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,19 +1,19 @@ #include -#include //Dtk::Widget::moveToCenter(&w); 要调用它,就得引用DWidgetUtil -#include -#include -#include -#include -#include "appitem.h" +#include +#include // Dtk::Widget::moveToCenter(&w); 要调用它,就得引用 DWidgetUtil + +#include + +#include "widget.h" DWIDGET_USE_NAMESPACE int main(int argc, char *argv[]) { - DApplication::loadDXcbPlugin(); //让bar处在标题栏中 + // DApplication::loadDXcbPlugin(); // 让 bar 处在标题栏中 DApplication a(argc, argv); a.setAttribute(Qt::AA_UseHighDpiPixmaps); - a.loadTranslator();//载入翻译 + a.loadTranslator(); // 载入翻译 /* Customized DAboutDialog (Can't work on other distro like Ubuntu...) * @@ -21,7 +21,7 @@ int main(int argc, char *argv[]) * a.setAboutDialog(&dialog); * dialog.setLicense(QObject::tr("We publish this program under GPL V3")); * dialog.setVersion(DApplication::buildVersion("Version 2.0.2.5")); - * dialog.setProductIcon(QIcon::fromTheme("spark-store")); //设置Logo + * dialog.setProductIcon(QIcon::fromTheme("spark-store")); // 设置Logo * dialog.setProductName(QLabel::tr("Spark Store")); * dialog.setDescription( * QObject::tr( @@ -52,36 +52,49 @@ int main(int argc, char *argv[]) ) ); + // 限制单实例运行 + if(!a.setSingleInstance("spark-store")) + { + return -1; + } + + // 保存窗口主题设置 + DApplicationSettings settings; + Widget w; - QDesktopWidget *s=DApplication::desktop(); - int d_w=s->width(); - int d_h=s->height(); - if(d_w<=1366){ + QScreen *s = DApplication::primaryScreen(); + int d_w = s->geometry().width(); + int d_h = s->geometry().height(); + + if(d_w <= 1366) + { w.setMinimumWidth(925); w.resize(925,650); - }else if(d_w<=1920){ - w.setMinimumWidth(1180); - w.resize(1180,760); - }else { + } + else + { w.setMinimumWidth(1180); w.resize(1180,760); } - if(d_h<=768){ + + if(d_h <= 768) + { w.setMinimumHeight(650); w.resize(925,650); - }else if(d_h<=1080){ - w.setMinimumHeight(760); - w.resize(1180,760); - }else { + } + else + { w.setMinimumHeight(760); w.resize(1180,760); } - QString arg1=argv[1]; - if(arg1.left(6)=="spk://"){ + QString arg1 = argv[1]; + if(arg1.left(6)=="spk://") + { w.openUrl(QUrl(argv[1])); } - //让打开时界面显示在正中 + + // 让打开时界面显示在正中 Dtk::Widget::moveToCenter(&w); w.show(); diff --git a/src/progressload.cpp b/src/progressload.cpp index c335ce1a..c2fac28b 100644 --- a/src/progressload.cpp +++ b/src/progressload.cpp @@ -1,5 +1,7 @@ #include "progressload.h" +#include + ProgressLoad::ProgressLoad(QWidget *parent) : QWidget(parent), m_progess(new QWidget(this)), @@ -28,13 +30,13 @@ void ProgressLoad::setTheme(bool dark, QColor color) { if(dark) { - plt.setColor(QPalette::Background, QColor(28,28,28)); + plt.setColor(QPalette::Background, QColor(40, 40, 40)); setAutoFillBackground(true); setPalette(plt); } else { - plt.setColor(QPalette::Background, QColor(255,255,255)); + plt.setColor(QPalette::Background, QColor(255, 255, 255)); setAutoFillBackground(true); setPalette(plt); } diff --git a/src/progressload.h b/src/progressload.h index 630766a7..b1bb0ff8 100644 --- a/src/progressload.h +++ b/src/progressload.h @@ -13,7 +13,7 @@ public: explicit ProgressLoad(QWidget *parent = nullptr); void setValue(int v); - void setTheme(bool dark,QColor color); + void setTheme(bool dark, QColor color); private: QWidget *m_progess; diff --git a/src/widget.cpp b/src/widget.cpp index 290f5a9d..cb9eb05b 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -44,8 +44,6 @@ Widget::Widget(DBlurEffectWidget *parent) : initConfig(); manager = new QNetworkAccessManager(this); // 下载管理 - m_loadweb=ui->progressload; - m_loadweb->show(); httpClient = new AeaQt::HttpClient; downloadController = new DownloadController(this); // 并发下载 @@ -68,19 +66,21 @@ Widget::Widget(DBlurEffectWidget *parent) : connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) { // 获取系统活动色 - QColor main_color; main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); if(themeType == DGuiApplicationHelper::DarkType) { qDebug() << "Dark"; - setTheme(true, main_color); + themeIsDark = true; } - else + else if(themeType == DGuiApplicationHelper::LightType) { qDebug() << "Light"; - setTheme(false, main_color); + themeIsDark = false; } + + // 设置 UI 主题 + setTheme(themeIsDark, main_color); }); connect(&appinfoLoadThread, SIGNAL(requestResetUi()), this, SLOT(sltAppinfoResetUi()), Qt::ConnectionType::BlockingQueuedConnection); @@ -152,7 +152,7 @@ Widget::~Widget() void Widget::initUI() { // ui初始化 - setMaskAlpha(220); + setMaskAlpha(200); ui->webfoot->setFixedHeight(0); ui->stackedWidget->setCurrentIndex(0); ui->listWidget->hide(); @@ -160,7 +160,9 @@ void Widget::initUI() ui->pushButton_uninstall->hide(); ui->line1_widget->setStyleSheet("background-color:#808080"); ui->icon->setPixmap(QIcon::fromTheme("spark-store").pixmap(36,36)); - ui->titlebar->setFixedHeight(50); + ui->titlebar->setFixedHeight(48); + + m_loadweb = ui->progressload; label_screen << ui->screen_0 << ui->screen_1 << ui->screen_2 << ui->screen_3 << ui->screen_4; @@ -196,11 +198,11 @@ void Widget::initUI() menu->addAction(actionSubmission); titlebar->setMenu(menu); - connect(actionSubmission, &QAction::triggered, this, [=](){QDesktopServices::openUrl(QUrl("https://upload.spark-app.store/"));}); + connect(actionSubmission, &QAction::triggered, this, [=]{QDesktopServices::openUrl(QUrl("https://upload.spark-app.store/"));}); connect(setting, &QAction::triggered, this, &Widget::opensetting); // 载入自定义字体 - int loadedFontID = QFontDatabase::addApplicationFont(":/fonts/fonts/华康少女字体.ttf"); + int loadedFontID = QFontDatabase::addApplicationFont(":/fonts/fonts/hksnzt.ttf"); QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID); if(!loadedFontFamilies.isEmpty()) { @@ -211,20 +213,20 @@ void Widget::initUI() */ // 初始化菜单数组 - left_list[0]=ui->menu_main; - left_list[1]=ui->menu_network; - left_list[2]=ui->menu_chat; - left_list[3]=ui->menu_music; - left_list[4]=ui->menu_video; - left_list[5]=ui->menu_photo; - left_list[6]=ui->menu_game; - left_list[7]=ui->menu_office; - left_list[8]=ui->menu_read; - left_list[9]=ui->menu_dev; - left_list[10]=ui->menu_system; - left_list[11]=ui->menu_theme; - left_list[12]=ui->menu_other; - left_list[13]=ui->menu_download; + left_list[0] = ui->menu_main; + left_list[1] = ui->menu_network; + left_list[2] = ui->menu_chat; + left_list[3] = ui->menu_music; + left_list[4] = ui->menu_video; + left_list[5] = ui->menu_photo; + left_list[6] = ui->menu_game; + left_list[7] = ui->menu_office; + left_list[8] = ui->menu_read; + left_list[9] = ui->menu_dev; + left_list[10] = ui->menu_system; + left_list[11] = ui->menu_theme; + left_list[12] = ui->menu_other; + left_list[13] = ui->menu_download; ui->label_show->hide(); @@ -237,7 +239,8 @@ void Widget::initUI() ui->applist_scrollAreaWidget->setLayout(main); spinner->setFixedSize(80, 80); - // 初始化主题颜色 + // 初始化系统活动色和主题颜色 + main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { themeIsDark = true; @@ -246,6 +249,7 @@ void Widget::initUI() { themeIsDark = false; } + setTheme(themeIsDark, main_color); } void Widget::initConfig() @@ -303,7 +307,7 @@ void Widget::initConfig() // web控件初始化 // ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); // 用来激活接受 linkClicked 信号 - // ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true); + // ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, true); ui->webfoot->hide(); // 初始化首页 @@ -341,12 +345,12 @@ void Widget::setTheme(bool isDark, QColor color) { // 黑色模式 themeIsDark = true; - ui->webEngineView->setStyleSheet("background-color:#282828"); - ui->btn_openDir->setStyleSheet("color: #8B91A1; background-color: #2E2F30; border: 0px"); - ui->webfoot->setStyleSheet("background-color:#252525"); - ui->label->setStyleSheet("background-color:#252525"); - // ui->scrollArea->setStyleSheet("background-color:#252525"); - ui->label_show->setStyleSheet("background-color:#252525"); + ui->webEngineView->setStyleSheet("background-color: #252525;"); + ui->webfoot->setStyleSheet("background-color: #252525;"); + ui->btn_openDir->setStyleSheet("color: #AFAFAF; background-color: #2C2C2C; border: 0px;"); + ui->label->setStyleSheet("background-color: #252525;"); + // ui->scrollArea->setStyleSheet("background-color: #2C2C2C;"); + ui->label_show->setStyleSheet("background-color: #2C2C2C;"); ui->pushButton_return->setIcon(DStyle().standardIcon(DStyle::SP_ArrowLeft)); ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page-dark.svg")); } @@ -354,12 +358,12 @@ void Widget::setTheme(bool isDark, QColor color) { // 亮色模式 themeIsDark = false; - ui->webEngineView->setStyleSheet("background-color:#FFFFFF"); - ui->webfoot->setStyleSheet("background-color:#FFFFFF"); - ui->btn_openDir->setStyleSheet("color: #505050; background-color: #FBFBFB; border: 0px"); - ui->label->setStyleSheet("background-color:#FFFFFF"); - // ui->scrollArea->setStyleSheet("background-color:#F8F8F8"); - ui->label_show->setStyleSheet("background-color:#F8F8F8"); + ui->webEngineView->setStyleSheet("background-color: #FFFFFF;"); + ui->webfoot->setStyleSheet("background-color: #FFFFFF;"); + ui->btn_openDir->setStyleSheet("color: #505050; background-color: #F8F8F8; border: 0px;"); + ui->label->setStyleSheet("background-color: #FFFFFF;"); + // ui->scrollArea->setStyleSheet("background-color: #F8F8F8;"); + ui->label_show->setStyleSheet("background-color: #F8F8F8;"); ui->pushButton_return->setIcon(DStyle().standardIcon(DStyle::SP_ArrowLeft)); ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page.svg")); } @@ -369,7 +373,7 @@ void Widget::setTheme(bool isDark, QColor color) m_loadweb->setTheme(themeIsDark, color); updateUI(); - // 刷新首页主题颜色 + // 刷新网页主题颜色 if(ui->stackedWidget->currentIndex() == 0) { chooseLeftMenu(nowMenu); diff --git a/src/widget.ui b/src/widget.ui index eecd7518..a7004afb 100644 --- a/src/widget.ui +++ b/src/widget.ui @@ -489,8 +489,8 @@ 0 0 - 606 - 854 + 582 + 849 @@ -984,8 +984,8 @@ 0 0 - 568 - 323 + 98 + 28 @@ -1114,8 +1114,8 @@ 0 0 - 743 - 902 + 738 + 886 -- Gitee