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 #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 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 -#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; + + 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 -#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()); - 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;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 db11116..e9a8b8a 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 8f38cbe..7a54e75 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 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 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 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(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 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 // Qt5 不再建议使用 QDesktopWidget #include -#include +#include // Qt5 不再建议使用 QDesktopWidget +#include -#include -#include -#include -#include - -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 #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; -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/main.cpp b/src/main.cpp index b059f42..809d5e4 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 3e07fb3..c2fac28 100644 --- a/src/progressload.cpp +++ b/src/progressload.cpp @@ -1,37 +1,44 @@ #include "progressload.h" -ProgressLoad::ProgressLoad(QWidget *parent) : QWidget(parent) +#include + +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(40, 40, 40)); 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..b1bb0ff 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: + void setValue(int v); + void setTheme(bool dark, QColor color); + 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 6aebe32..e5e713b 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); // 并发下载 @@ -65,6 +63,26 @@ 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) + { + // 获取系统活动色 + main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); + + if(themeType == DGuiApplicationHelper::DarkType) + { + qDebug() << "Dark"; + themeIsDark = true; + } + else if(themeType == DGuiApplicationHelper::LightType) + { + qDebug() << "Light"; + themeIsDark = false; + } + + // 设置 UI 主题 + setTheme(themeIsDark, 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(); @@ -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(); @@ -236,6 +238,18 @@ void Widget::initUI() main->addWidget(spinner); ui->applist_scrollAreaWidget->setLayout(main); spinner->setFixedSize(80, 80); + + // 初始化系统活动色和主题颜色 + main_color = DGuiApplicationHelper::instance()->applicationPalette().highlight().color(); + if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) + { + themeIsDark = true; + } + else + { + themeIsDark = false; + } + setTheme(themeIsDark, main_color); } void Widget::initConfig() @@ -293,20 +307,20 @@ 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(); - //初始化首页 + // 初始化首页 // 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()) @@ -331,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")); } @@ -344,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")); } @@ -359,7 +373,7 @@ void Widget::setTheme(bool isDark, QColor color) m_loadweb->setTheme(themeIsDark, color); updateUI(); - // 刷新首页主题颜色 + // 刷新网页主题颜色 if(ui->stackedWidget->currentIndex() == 0) { chooseLeftMenu(nowMenu); @@ -543,17 +557,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 +813,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 +922,7 @@ void Widget::sltAppinfoScreenshot(QPixmap *picture, int index) void Widget::sltAppinfoFinish() { - ui->label_show->setText(""); + ui->label_show->clear(); ui->label_show->hide(); } @@ -1132,7 +1135,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 load; QFutureWatcher watchScreenshotLoad; diff --git a/src/widget.ui b/src/widget.ui index eecd751..a7004af 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 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 #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; + .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;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(); + 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 #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