forked from openkylin/libqapt
155 lines
5.3 KiB
C++
155 lines
5.3 KiB
C++
/***************************************************************************
|
|
* Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> *
|
|
* *
|
|
* 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; either version 2 of *
|
|
* the License or (at your option) version 3 or any later version *
|
|
* accepted by the membership of KDE e.V. (or its successor approved *
|
|
* by the membership of KDE e.V.), which shall act as a proxy *
|
|
* defined in Section 14 of version 3 of the license. *
|
|
* *
|
|
* 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 "cacheupdatewidget.h"
|
|
|
|
#include <QLabel>
|
|
#include <QListView>
|
|
#include <QProgressBar>
|
|
#include <QPushButton>
|
|
#include <QStandardItemModel>
|
|
|
|
#include <KIcon>
|
|
#include <KGlobal>
|
|
#include <KLocale>
|
|
#include <KDebug>
|
|
|
|
#include <LibQApt/Transaction>
|
|
|
|
CacheUpdateWidget::CacheUpdateWidget(QWidget *parent)
|
|
: KVBox(parent)
|
|
, m_trans(0)
|
|
, m_lastRealProgress(0)
|
|
{
|
|
m_headerLabel = new QLabel(this);
|
|
|
|
m_downloadView = new QListView(this);
|
|
|
|
m_downloadModel = new QStandardItemModel(this);
|
|
m_downloadView->setModel(m_downloadModel);
|
|
|
|
m_downloadSpeedLabel = new QLabel(this);
|
|
m_ETALabel = new QLabel(this);
|
|
m_totalProgress = new QProgressBar(this);
|
|
|
|
m_cancelButton = new QPushButton(this);
|
|
m_cancelButton->setText(i18n("Cancel"));
|
|
m_cancelButton->setIcon(KIcon("dialog-cancel"));
|
|
}
|
|
|
|
void CacheUpdateWidget::clear()
|
|
{
|
|
m_downloadModel->clear();
|
|
m_downloads.clear();
|
|
m_totalProgress->setValue(0);
|
|
}
|
|
|
|
void CacheUpdateWidget::setTransaction(QApt::Transaction *trans)
|
|
{
|
|
m_trans = trans;
|
|
clear();
|
|
m_cancelButton->setEnabled(m_trans->isCancellable());
|
|
connect(m_cancelButton, SIGNAL(pressed()),
|
|
m_trans, SLOT(cancel()));
|
|
|
|
// Listen for changes to the transaction
|
|
connect(m_trans, SIGNAL(cancellableChanged(bool)),
|
|
m_cancelButton, SLOT(setEnabled(bool)));
|
|
connect(m_trans, SIGNAL(statusChanged(QApt::TransactionStatus)),
|
|
this, SLOT(onTransactionStatusChanged(QApt::TransactionStatus)));
|
|
connect(m_trans, SIGNAL(progressChanged(int)),
|
|
this, SLOT(progressChanged(int)));
|
|
connect(m_trans, SIGNAL(downloadProgressChanged(QApt::DownloadProgress)),
|
|
this, SLOT(downloadProgressChanged(QApt::DownloadProgress)));
|
|
connect(m_trans, SIGNAL(downloadSpeedChanged(quint64)),
|
|
this, SLOT(updateDownloadSpeed(quint64)));
|
|
connect(m_trans, SIGNAL(downloadETAChanged(quint64)),
|
|
this, SLOT(updateETA(quint64)));
|
|
}
|
|
|
|
void CacheUpdateWidget::addItem(const QString &message)
|
|
{
|
|
QStandardItem *n = new QStandardItem();
|
|
n->setText(message);
|
|
m_downloadModel->appendRow(n);
|
|
m_downloadView->scrollTo(m_downloadModel->indexFromItem(n));
|
|
}
|
|
|
|
void CacheUpdateWidget::updateDownloadSpeed(quint64 speed)
|
|
{
|
|
QString downloadSpeed = i18n("Download rate: %1/s",
|
|
KFormat().formatByteSize(speed));
|
|
|
|
m_downloadSpeedLabel->setText(downloadSpeed);
|
|
}
|
|
|
|
void CacheUpdateWidget::updateETA(quint64 ETA)
|
|
{
|
|
QString timeRemaining;
|
|
int ETAMilliseconds = ETA * 1000;
|
|
|
|
if (ETAMilliseconds <= 0 || ETAMilliseconds > 14*24*60*60*1000) {
|
|
// If ETA is less than zero or bigger than 2 weeks
|
|
timeRemaining = i18n("Unknown time remaining");
|
|
} else {
|
|
timeRemaining = i18n("%1 remaining", KGlobal::locale()->prettyFormatDuration(ETAMilliseconds));
|
|
}
|
|
m_ETALabel->setText(timeRemaining);
|
|
}
|
|
|
|
void CacheUpdateWidget::onTransactionStatusChanged(QApt::TransactionStatus status)
|
|
{
|
|
QString headerText;
|
|
|
|
qDebug() << "cache widget: transaction status changed" << status;
|
|
|
|
switch (status) {
|
|
case QApt::DownloadingStatus:
|
|
if (m_trans->role == QApt::UpdateCacheRole)
|
|
headerText = i18n("<b>Updating software sources</b>");
|
|
else
|
|
headerText = i18n("<b>Downloading Packages</b>");
|
|
|
|
m_headerLabel->setText(headerText);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CacheUpdateWidget::progressChanged(int progress)
|
|
{
|
|
if (progress > 100) {
|
|
m_totalProgress->setMaximum(0);
|
|
} else if (progress > m_lastRealProgress) {
|
|
m_totalProgress->setMaximum(100);
|
|
m_totalProgress->setValue(progress);
|
|
m_lastRealProgress = progress;
|
|
}
|
|
}
|
|
|
|
void CacheUpdateWidget::downloadProgressChanged(const QApt::DownloadProgress &progress)
|
|
{
|
|
if (!m_downloads.contains(progress.uri())) {
|
|
addItem(progress.uri());
|
|
m_downloads.append(progress.uri());
|
|
}
|
|
}
|