diff --git a/spark-store-project.pro b/spark-store-project.pro index 254ea6c..19a741e 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 ec44ba4..ed18e0a 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 b2f6750..3d30c66 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 abfbefd..9ae6f56 100644 --- a/src/big_image.cpp +++ b/src/big_image.cpp @@ -1,22 +1,30 @@ #include "big_image.h" + #include <QHBoxLayout> #include <QtConcurrent> -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 4a22430..c353062 100644 --- a/src/big_image.h +++ b/src/big_image.h @@ -1,25 +1,27 @@ #ifndef BIG_IMAGE_H #define BIG_IMAGE_H -#include <QWidget> -#include <DBlurEffectWidget> #include <QMouseEvent> #include <QLabel> + +#include <DBlurEffectWidget> + 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; + + QLabel *m_image; + void setimage(QPixmap); - void focusOutEvent(QFocusEvent *event); -signals: - -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 4379383..1a1b46a 100644 --- a/src/downloadlist.cpp +++ b/src/downloadlist.cpp @@ -1,19 +1,27 @@ #include "downloadlist.h" #include "ui_downloadlist.h" -#include "widget.h" -#include <QDebug> -#include <QIcon> -#include <QPixmap> + #include <QtConcurrent> #include <QProcess> -#include <QTextBrowser> -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()); - break; - } - }else { - switch (t) { - case 0: - 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()); - 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; + else + { + switch(t) + { + case 0: + 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()); + break; + case 2: + installer.start("pkexec gdebi -n /tmp/spark-store/" + ui->label_filename->text().toUtf8()); + break; + } + } + + bool haveError = false; + bool notRoot = false; installer.waitForFinished(); - out=installer.readAllStandardOutput(); - QStringList everyOut=out.split("\n"); - for (int i=0;i<everyOut.size();i++) { - if(everyOut[i].left(2)=="E:"){ - haveError=true; + out = installer.readAllStandardOutput(); + + QStringList everyOut = out.split("\n"); + for(int i=0;i<everyOut.size();i++) + { + if(everyOut[i].left(2) == "E:") + { + haveError = true; } - if(everyOut[i].right(14)=="Not authorized"){ - notRoot=true; + if(everyOut[i].right(14) == "Not authorized") + { + notRoot = true; } } + QProcess isInstall; - isInstall.start("dpkg -s "+pkgName); + isInstall.start("dpkg -s " + pkgName); isInstall.waitForFinished(); - int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); - if(error==0){ + int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); + if(error == 0) + { ui->pushButton_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()<<ui->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 db11116..e9a8b8a 100644 --- a/src/downloadlist.h +++ b/src/downloadlist.h @@ -2,11 +2,14 @@ #define DOWNLOADLIST_H #include <QWidget> -#include <DDialog> #include <QTextBrowser> #include <QMenu> #include <QAction> + +#include <DDialog> + 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 8f38cbe..7a54e75 100644 --- a/src/downloadworker.cpp +++ b/src/downloadworker.cpp @@ -1,10 +1,9 @@ #include "downloadworker.h" -#include <QIODevice> + #include <QEventLoop> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> -#include <QDebug> #include <QThread> #include <QRegularExpression> #include <QFileInfo> @@ -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<void(QNetworkReply::*)(QNetworkReply::NetworkError)>(&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<void(QNetworkReply::*)(QNetworkReply::NetworkError) > (&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<qint64> 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<void(QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), - [this, reply](QNetworkReply::NetworkError error){ - if (error != QNetworkReply::NoError) { + connect(reply, static_cast<void(QNetworkReply::*)(QNetworkReply::NetworkError) > (&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 72f558b..5ea0aca 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<qint64, qint64> 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<DownloadWorker*> workers; int finish = 0; QVector<QString> 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 9203da0..b60335c 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<QWidget *>(parent); - return pw->style()->pixelMetric(pm, 0, pw); + return pw->style()->pixelMetric(pm, nullptr, pw); } else { return static_cast<QLayout *>(parent)->spacing(); } diff --git a/src/flowlayout.h b/src/flowlayout.h index 920f4e6..8aa4603 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 4dcc773..54ebf70 100644 --- a/src/image_show.cpp +++ b/src/image_show.cpp @@ -1,17 +1,13 @@ #include "image_show.h" -#include <QScreen> // Qt5 不再建议使用 QDesktopWidget #include <QHBoxLayout> -#include <QPainter> +#include <QScreen> // Qt5 不再建议使用 QDesktopWidget +#include <QGuiApplication> -#include <DDialog> -#include <DBlurEffectWidget> -#include <DWidgetUtil> -#include <DApplication> - -DWIDGET_USE_NAMESPACE - -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 8854068..a851dd7 100644 --- a/src/image_show.h +++ b/src/image_show.h @@ -3,30 +3,30 @@ #include <QWidget> #include <QMouseEvent> -#include <QLabel> -#include <QPixmap> -#include <DDialog> -#include <DBlurEffectWidget> -#include <big_image.h> -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; -private: - QLabel *m_label=new QLabel; - QPixmap m_image; - QLabel image; - big_image *m_dialog=new big_image; - void mousePressEvent(QMouseEvent *event); -signals: -public slots: + void setImage(QPixmap); + +protected: + void mousePressEvent(QMouseEvent *event) override; + +private: + big_image *m_dialog; + QLabel *m_label; + QLabel image; + QPixmap m_image; + }; #endif // IMAGE_SHOW_H diff --git a/src/progressload.cpp b/src/progressload.cpp index 3e07fb3..c335ce1 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)); - setAutoFillBackground(true); - setPalette(plt); - - }else { - plt.setColor(QPalette::Background,QColor(255,255,255)); + if(dark) + { + plt.setColor(QPalette::Background, QColor(28,28,28)); setAutoFillBackground(true); setPalette(plt); } - m_progess->setStyleSheet("background-color:"+color.name()); + else + { + plt.setColor(QPalette::Background, QColor(255,255,255)); + setAutoFillBackground(true); + setPalette(plt); + } + m_progess->setStyleSheet("background-color: " + color.name() + ";"); } diff --git a/src/progressload.h b/src/progressload.h index ffa3c7e..630766a 100644 --- a/src/progressload.h +++ b/src/progressload.h @@ -4,21 +4,23 @@ #include <QWidget> #include <QTimer> #include <QPalette> + 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 55dd9eb..290f5a9 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 8b0152b..42d8c3d 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<void> load; QFutureWatcher<void> watchScreenshotLoad; diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp index 5241363..35299f7 100644 --- a/src/workerthreads.cpp +++ b/src/workerthreads.cpp @@ -1,9 +1,10 @@ +#include "workerthreads.h" #include <QProcess> #include <QDir> #include <QFile> #include <QJsonDocument> -#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; + .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("/"); + // 将路径转化为相应源的下载路径 + 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); + 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]; - } + 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(); + // 路径转化完成 + 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"; - } + // 软件信息加载 + 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"; + } - 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(); + 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; + 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); + emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled); - //tag加载 - QString tags=json["Tags"].toString(); - QStringList tagList=tags.split(";"); - emit requestSetTags(&tagList); + // 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(); - - httpClient->deleteLater(); + // 图标加载 + 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 dc3535f..d66d748 100644 --- a/src/workerthreads.h +++ b/src/workerthreads.h @@ -6,21 +6,35 @@ #include <QUrl> #include <QProcess> - 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