quarkai/src/upgradedialog.cpp

506 lines
19 KiB
C++

/*
* Copyright (C) 2013 ~ 2015 National University of Defense Technology(NUDT) & Kylin Ltd.
*
* Authors:
* Kobe Lee xiangli@ubuntukylin.com/kobe24_lixiang@126.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "QDesktopWidget"
#include "upgradedialog.h"
#include "../component/loadinglabel.h"
#include "../component/utils.h"
#include <QtGui>
#include <QDebug>
//20161228
UpgradeDialog::UpgradeDialog(QWidget *parent, /*const QString &version, */QString skin, QString arch, QString os) :
QDialog(parent)
{
this->setWindowFlags(Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint);
this->setFixedSize(334, 470);
this->setStyleSheet("QDialog{border: 1px solid white;border-radius:1px;background-color: #ffffff;}");
isBusy = false;
upgradeOver = false;
// cur_version = version;
cur_version = qApp->applicationVersion();
baseWidget = new QWidget(this);
baseWidget->setGeometry(QRect(0, 0, 334, 191));
baseWidget->setAutoFillBackground(true);
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(QPixmap(skin)));
baseWidget->setPalette(palette);
close_btn = new SystemButton(baseWidget);
close_btn->setFocusPolicy(Qt::NoFocus);
close_btn->loadPixmap(":/sys/res/sysBtn/close_button.png");
if (arch == "aarch64" || os == "Kylin"|| os == "YHKylin") {//20161228
close_btn->move(334-36, 0);
}
else {
close_btn->move(0, 0);
}
m_appNameLabel = new QLabel(baseWidget);
m_appNameLabel->setGeometry(QRect(37, 0, 260, 30));
m_appNameLabel->setStyleSheet("QLabel{color:#ffffff;font-family: 方正黑体_GBK;font-size: 12px;text-align: center;font-weight:bold;}");
m_appNameLabel->setAlignment(Qt::AlignCenter);
m_appNameLabel->setText(tr("check and update"));
// msg_label = new QLabel(baseWidget);
// msg_label->setGeometry(QRect(10, 40, 324, 20));
// msg_label->setStyleSheet("QLabel{color:#FF0000;font-family: 方正黑体_GBK;font-size: 14px;text-align: center;}");
// msg_label->setAlignment(Qt::AlignCenter);
// msg_label->setText(tr("Is working, please wait a moment."));
// msg_label->hide();
net_icon_label = new QLabel(this);
net_icon_label->setGeometry(QRect(76, 64, 182, 181));
net_icon_label->setStyleSheet("QLabel{background-image:url(':/res/no-net.png')}");
net_icon_label->hide();
normal_icon_label = new QLabel(this);
normal_icon_label->setGeometry(QRect(76, 64, 182, 181));
normal_icon_label->setStyleSheet("QLabel{background-image:url(':/res/upgrade-normal.png');color:#ffffff;font-family: 方正黑体_GBK;font-size: 22px;text-align: center;}");
normal_icon_label->setAlignment(Qt::AlignCenter);
normal_icon_label->hide();
ok_icon_label = new QLabel(this);
ok_icon_label->setGeometry(QRect(76, 64, 182, 181));
ok_icon_label->setStyleSheet("QLabel{background-image:url(':/res/upgrade-ok.png')}");
ok_icon_label->hide();
work_loading_label = new LoadingLabel(this, "working");
work_loading_label->setGeometry(QRect(76, 64, 182, 181));
work_loading_label->show();
upgrade_loading_label = new LoadingLabel(this, "upgrading");
upgrade_loading_label->setGeometry(QRect(76, 64, 182, 181));
upgrade_loading_label->hide();
// movie_label = new QLabel(this);
// movie_label->setGeometry(QRect(76, 91, 182, 181));
// movie = new QMovie("://res/move.gif");
// movie_label->setMovie(movie);
// timer = new QTimer(this);
version_label = new QLabel(this);
version_label->setObjectName("smallgrayLabel");
version_label->setGeometry(QRect(10, 440, 324, 20));
version_label->setText(tr("Current verison:") + qApp->applicationVersion());
doing_label = new QLabel(this);
doing_label->setWordWrap(true);//QLabel自动换行
doing_label->setStyleSheet("QLabel{color:#000000;font-family: 方正黑体_GBK;font-size: 22px;text-align: center;}");
doing_label->setAlignment(Qt::AlignCenter);
doing_label->setGeometry(QRect(10, 264, 324, 30));
error_label = new QLabel(this);
error_label->setGeometry(QRect(10, 264, 324, 30));
error_label->setWordWrap(true);//QLabel自动换行
error_label->setStyleSheet("QLabel{color:#000000;font-family: 方正黑体_GBK;font-size: 22px;text-align: center;}");
error_label->setAlignment(Qt::AlignCenter);
error_label->hide();
tip_label = new QLabel(this);
tip_label->setGeometry(QRect(10, 294, 324, 30));
tip_label->setWordWrap(true);//QLabel自动换行
tip_label->setStyleSheet("QLabel{color:#999999;font-family: 方正黑体_GBK;font-size: 12px;text-align: center;}");
tip_label->setAlignment(Qt::AlignCenter);
tip_label->hide();
visit_label = new QLabel(this);
visit_label->setGeometry(QRect(10, 294, 324, 30));
visit_label->setWordWrap(true);//QLabel自动换行
visit_label->setStyleSheet("QLabel{color:#999999;font-family: 方正黑体_GBK;font-size: 12px;text-align: center;}");
visit_label->setAlignment(Qt::AlignCenter);
// visit_label->hide();
new_widget = new QWidget(this);
new_widget->setGeometry(QRect(17, 264, 300, 80));
new_widget->setStyleSheet("QWidget{background:transparent; border:1px solid #3f96e4;}");
new_widget->hide();
official_label = new QLabel(new_widget);
official_label->setWordWrap(true);//QLabel自动换行
official_label->setStyleSheet("QLabel{border:none;color:#000000;font-family: 方正黑体_GBK;font-size: 13px;text-align: center;}");//background: transparent;
official_label->setAlignment(Qt::AlignCenter);
official_label->setGeometry(QRect(0, 15, 60, 30));
official_label->setText(tr("Official version"));
hook_label = new QLabel(new_widget);
// hook_label->setGeometry(QRect(18, 32, 23, 16));
hook_label->setGeometry(QRect(18, 50, 23, 16));
hook_label->setStyleSheet("QLabel{background: transparent;border:none;background-image:url(':/res/hook.png')}");
vline = new QLabel(new_widget);
vline->setGeometry(QRect(60, 0, 1, 80));
vline->setStyleSheet("QLabel{background-color:#3f96e4;}");
// new_label = new QLabel(this);
new_label = new QLabel(new_widget);
new_label->setWordWrap(true);//QLabel自动换行
new_label->setStyleSheet("QLabel{border:none;color:#000000;font-family: 方正黑体_GBK;font-size: 16px;text-align: left;}");//background: transparent;
new_label->setGeometry(QRect(70, 10, 220, 30));
new_label->setText(tr("New version:"));
// new_label->setGeometry(QRect(10, 264, 324, 20));
// new_label->hide();
new_num_label = new QLabel(new_widget);
new_num_label->setWordWrap(true);//QLabel自动换行
// new_num_label->setObjectName("smallgrayLabel");
new_num_label->setStyleSheet("QLabel{border:none;color:#000000;font-family: 方正黑体_GBK;font-size: 16px;text-align: left;}");//background: transparent;
new_num_label->setGeometry(QRect(70, 40, 220, 30));
error_label->setText(tr("An error occurred!"));
tip_label->setText(tr("Network or local sources anomaly"));
doing_label->setText(tr("Testing network and local sources..."));
// visit_label->setText(tr("you can visit ") + QString::fromLocal8Bit("<a style='color: green;' href = https://launchpad.net/youker-assistant> UK official website </a>") + tr("to download the lastest deb package"));
// visit_label->setText(tr("you can visit ") + tr("<a style='color: green;' href = https://launchpad.net/youker-assistant> UK official website </a>") + tr("to download the lastest deb package"));
visit_label->setText(tr("you can visit the<a style='color: #3f96e4;' href = http://www.ubuntukylin.com> UK official website</a> to download the lastest deb package"));
retryBtn = new QPushButton(this);
retryBtn->setFocusPolicy(Qt::NoFocus);
retryBtn->setStyleSheet("QPushButton{background-image:url('://res/retry.png');border:0px;color:#ffffff;font-family: 方正黑体_GBK;font-size: 30px;}QPushButton:hover{background:url('://res/retry-hover.png');}QPushButton:pressed{background:url('://res/retry-press.png');}");
retryBtn->hide();
retryBtn->setText(tr("Retry"));
retryBtn->setGeometry(QRect(74, 350, 186, 56));
progressbar = new QProgressBar(this);
progressbar->setValue(0);
progressbar->setGeometry(QRect(30, 340, 284, 30));
progressbar->hide();
progressbar->setStyleSheet("QProgressBar{background-color:#ffffff;border:1px solid #aaaaaa;border-radius:0px;color:#666666;font-family: 方正黑体_GBK;text-align:center;}"
"QProgressBar:chunk{background-color:#b1dcff;}");
okBtn = new QPushButton(this);
okBtn->setFocusPolicy(Qt::NoFocus);
okBtn->setStyleSheet("QPushButton{background-image:url('://res/retry.png');border:0px;color:#ffffff;font-family: 方正黑体_GBK;font-size: 30px;}QPushButton:hover{background:url('://res/retry-hover.png');}QPushButton:pressed{background:url('://res/retry-press.png');}");
okBtn->hide();
okBtn->setText(tr("Finish"));
okBtn->setGeometry(QRect(74, 350, 186, 56));
upgradeBtn = new QPushButton(this);
upgradeBtn->setFocusPolicy(Qt::NoFocus);
upgradeBtn->setGeometry(QRect(234, 437, 91, 25));
upgradeBtn->setObjectName("blackButton");
upgradeBtn->setText(tr("Upgrade"));
upgradeBtn->hide();
splitlabel = new QLabel(this);
splitlabel->setGeometry(QRect(0, 430, 334, 1));
splitlabel->setFixedHeight(1);
splitlabel->setStyleSheet("QLabel{background:#e0e0e0;}");
this->initConnect();
}
UpgradeDialog::~UpgradeDialog()
{
// if(movie != NULL) {
// delete movie;
// movie = NULL;
// }
// if (timer != NULL) {
// disconnect(timer,SIGNAL(timeout()),this,SLOT(slotDisappearTip()));
// if(timer->isActive()) {
// timer->stop();
// }
// delete timer;
// timer = NULL;
// }
}
void UpgradeDialog::initConnect()
{
connect(close_btn, SIGNAL(clicked()), this, SLOT(onCloseBtnClicked()));
connect(retryBtn, SIGNAL(clicked()), this, SLOT(onRetryBtnClicked()));
connect(upgradeBtn, SIGNAL(clicked()), this, SLOT(onUpgradeBtnClicked()));
connect(okBtn, SIGNAL(clicked()), this, SIGNAL(close_signal()));
// connect(timer, SIGNAL(timeout()), this, SLOT(slotDisappearTip()));
connect(visit_label,SIGNAL(linkActivated(QString)),this,SLOT(openUrl(QString)));
}
//void UpgradeDialog::slotDisappearTip()
//{
// msg_label->hide();
//}
void UpgradeDialog::openUrl(QString url)
{
QDesktopServices::openUrl(QUrl(url));
}
void UpgradeDialog::startAccessData()
{
QTimer::singleShot(100, this, SLOT(checkLastestVersion()));
}
void UpgradeDialog::showErrorComponents()
{
error_label->show();
tip_label->show();
retryBtn->show();
doing_label->hide();
visit_label->hide();
}
void UpgradeDialog::showUpdateSourceComponents()
{
doing_label->setText(tr("Start to update the local sources"));
visit_label->show();
progressbar->setValue(0);
progressbar->show();
}
void UpgradeDialog::checkLastestVersion()
{
//check source list valid or not
this->isBusy = true;
work_loading_label->startLoading();
// movie->start();
sessionProxy->start_check_source_useable_qt();
}
void UpgradeDialog::onRetryBtnClicked()
{
this->isBusy = true;
net_icon_label->hide();
error_label->hide();
tip_label->hide();
retryBtn->hide();
work_loading_label->show();
work_loading_label->startLoading();
doing_label->setText(tr("Testing network and local sources..."));
doing_label->show();
visit_label->show();
// movie_label->show();
// movie->start();
sessionProxy->start_check_source_useable_qt();
}
void UpgradeDialog::receiveCheckResultSignal(bool result)
{
if(result == false) {
this->isBusy = false;
work_loading_label->stopLoading();
work_loading_label->hide();
// movie->stop();
// movie_label->hide();
net_icon_label->show();
this->showErrorComponents();
}
else {
this->isBusy = true;
this->showUpdateSourceComponents();
systemProxy->update_source();
//test by kobe
// progressbar->hide();
// visit_label->hide();
// work_loading_label->stopLoading();
// work_loading_label->hide();
// normal_icon_label->show();
// doing_label->setText(tr("Local sources updated"));
// QStringList version_list = sessionProxy->checkNewVersion();
// qDebug() << version_list;//("1.2.0-0ubuntu1", "1.2.0-0ubuntu1", "1.3.1-0ubuntu1", "1")
// if(version_list.length() == 4) {
// if(version_list.at(3) == "1") {
// normal_icon_label->setText(tr("Found a new version"));
// new_widget->show();
// this->cur_version = version_list.at(2);
// new_num_label->setText(this->cur_version);
// upgradeBtn->show();
// doing_label->hide();
// }
// else {
// normal_icon_label->setText(tr("Not found"));
// }
// }
}
}
void UpgradeDialog::receiveFetchSignal(QString msg_type, QStringList msg)
{
if(msg_type == "down_start")
{
if( msg.length() == 3 && msg.at(0) == "kylin-assistant" && msg.at(2) == "install") {
if(msg.at(1) == "0") {
doing_label->setText(tr("Start to download"));
}
}
else if( msg.length() == 3 && msg.at(0) == "#update" && msg.at(1) == "0" && msg.at(2) == "update") {
doing_label->setText(tr("Start to update the local sources"));
}
}
else if(msg_type == "down_stop")
{
if( msg.length() == 3 && msg.at(0) == "kylin-assistant" && msg.at(2) == "install") {
if(msg.at(1) == "0") {
doing_label->setText(tr("Download completely"));
}
}
else if( msg.length() == 3 && msg.at(0) == "#update" && msg.at(1) == "200" && msg.at(2) == "update") {
progressbar->hide();
visit_label->hide();
// movie->stop();
// movie_label->hide();
work_loading_label->stopLoading();
work_loading_label->hide();
normal_icon_label->show();
doing_label->setText(tr("Local sources updated"));
QStringList version_list = sessionProxy->checkNewVersion();
// qDebug() << version_list << "=====" << version_list.length();//("1.2.0-0ubuntu1", "1.2.0-0ubuntu1", "1.3.1-0ubuntu1", "1")
if(version_list.length() == 1) {
// version_label->setText(version_list.at(0));
normal_icon_label->setText(tr("Not found"));
}
else if(version_list.length() == 4) {
// version_label->setText(version_list.at(2));
if(version_list.at(3) == "1") {
normal_icon_label->setText(tr("Found a new version"));
// new_label->show();
new_widget->show();
this->cur_version = version_list.at(2);
new_num_label->setText(this->cur_version);
upgradeBtn->show();
doing_label->hide();
}
else {
normal_icon_label->setText(tr("Not found"));
}
}
this->isBusy = false;
}
}
else if(msg_type == "down_fetch" || msg_type == "down_done") {
if(msg.length() == 3 && msg.at(0) == "#update" && msg.at(2) == "update") {
doing_label->setText(tr("Updating local sources...") + QString::number(int(msg.at(1).toDouble())) + "%");
progressbar->setValue(msg.at(1).toFloat());
}
}
}
void UpgradeDialog::receiveAptSignal(QString msg_type, QStringList msg)
{
if(msg_type == "apt_finish")
{
if( msg.length() == 3 && msg.at(0) == "kylin-assistant" && msg.at(1) == "200" && msg.at(2) == "install") {
this->isBusy = false;
this->upgradeOver = true;
ok_icon_label->show();
okBtn->show();
doing_label->setText(tr("Kylin Assistant is the latest version"));
version_label->setText(tr("Current verison:") + this->cur_version);
upgrade_loading_label->stopLoading();
upgrade_loading_label->hide();
progressbar->setValue(100);
progressbar->hide();
emit this->showBackendBtnSignal(true);
// visit_label->hide();
}
}
else if(msg_type == "apt_start")
{
if( msg.length() == 3 && msg.at(0) == "kylin-assistant" && msg.at(1) == "0" && msg.at(2) == "install") {
doing_label->setText(tr("Start to install"));
progressbar->setValue(0);
}
}
else if(msg_type == "apt_pulse")
{
if( msg.length() == 4){
//installing
doing_label->setText(tr("Upgrading the main program...") + QString::number(int(msg.at(1).toDouble())) + "%");
progressbar->setValue(msg.at(1).toFloat());
}
}
else {
qDebug() << "apt->" << msg_type;
qDebug() << msg;
}
}
void UpgradeDialog::resetTitleSkin(QString skin)
{
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(QPixmap(skin)));
baseWidget->setPalette(palette);
}
void UpgradeDialog::resetVersionNumber(QStringList version_list)
{
qDebug() << "new version->" << version_list;
}
void UpgradeDialog::onCloseBtnClicked()
{
// if (timer->isActive())
// timer->stop();
if(this->isBusy) {
emit this->showBackendBtnSignal(false);
}
else if(this->upgradeOver) {
emit this->close_signal();
}
this->close();
// if(this->isBusy) {
// msg_label->show();
// timer->start(3000);
// }
// else {
// if (timer->isActive())
// timer->stop();
// this->close();
// }
}
void UpgradeDialog::onUpgradeBtnClicked()
{
this->isBusy = true;
// new_label->hide();
new_widget->hide();
upgradeBtn->hide();
normal_icon_label->hide();
upgrade_loading_label->show();
upgrade_loading_label->startLoading();
doing_label->show();
doing_label->setText(tr("Start to upgrade the main program"));
visit_label->show();
progressbar->setValue(0);
progressbar->show();
// net_icon_label->hide();
// movie_label->show();
// movie->start();
systemProxy->update_myself();
}
void UpgradeDialog::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_mousePressed = true;
m_dragPosition = event->globalPos() - this->frameGeometry().topLeft();
event->accept();
}
}
void UpgradeDialog::mouseReleaseEvent(QMouseEvent *)
{
m_mousePressed = false;
}
void UpgradeDialog::mouseMoveEvent(QMouseEvent *event)
{
if(m_mousePressed)
{
QPoint move_pos = event->globalPos();
move(move_pos - m_dragPosition);
event->accept();
}
}