/*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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 .
*/
#include
#include
#include
#include
#include "UBDownloadWidget.h"
#include "core/UBApplication.h"
#include "core/memcheck.h"
/**
* \brief Constructor
* @param parent as the parent widget
* @param name as the widget object name
*/
UBDownloadWidget::UBDownloadWidget(QWidget *parent, const char *name):QWidget(parent)
, mpLayout(NULL)
, mpBttnLayout(NULL)
, mpTree(NULL)
, mpCancelBttn(NULL)
, mpItem(NULL)
{
setObjectName(name);
setWindowTitle(tr("Downloading files"));
setAttribute(Qt::WA_StyledBackground, true);
setStyleSheet(UBApplication::globalStyleSheet());
resize(400, 300);
mpLayout = new QVBoxLayout(this);
setLayout(mpLayout);
mpTree = new QTreeWidget(this);
mpTree->setRootIsDecorated(false);
mpTree->setColumnCount(2);
mpTree->header()->setStretchLastSection(false);
mpTree->header()->setResizeMode(eItemColumn_Desc, QHeaderView::Stretch);
mpTree->header()->setResizeMode(eItemColumn_Close, QHeaderView::Custom);
mpTree->resizeColumnToContents(eItemColumn_Close);
mpTree->header()->close();
mpLayout->addWidget(mpTree, 1);
mpBttnLayout = new QHBoxLayout();
mpBttnLayout->addStretch(1);
mpCancelBttn = new QPushButton(tr("Cancel"), this);
mpCancelBttn->setObjectName("DockPaletteWidgetButton");
mpBttnLayout->addWidget(mpCancelBttn, 0);
mpLayout->addLayout(mpBttnLayout);
connect(UBDownloadManager::downloadManager(), SIGNAL(fileAddedToDownload()), this, SLOT(onFileAddedToDownload()));
connect(UBDownloadManager::downloadManager(), SIGNAL(downloadUpdated(int,qint64,qint64)), this, SLOT(onDownloadUpdated(int,qint64,qint64)));
connect(UBDownloadManager::downloadManager(), SIGNAL(downloadFinished(int)), this, SLOT(onDownloadFinished(int)));
connect(mpCancelBttn, SIGNAL(clicked()), this, SLOT(onCancelClicked()));
connect(mpTree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(onItemClicked(QTreeWidgetItem*,int)));
}
/**
* \brief Destructor
*/
UBDownloadWidget::~UBDownloadWidget()
{
if(NULL != mpCancelBttn)
{
delete mpCancelBttn;
mpCancelBttn = NULL;
}
if(NULL != mpTree)
{
delete mpTree;
mpTree = NULL;
}
if(NULL != mpBttnLayout)
{
delete mpBttnLayout;
mpBttnLayout = NULL;
}
if(NULL != mpLayout)
{
delete mpLayout;
mpLayout = NULL;
}
}
/**
* \brief Refresh the tree of downloaded files
*/
void UBDownloadWidget::onFileAddedToDownload()
{
if(NULL != mpTree)
{
mpTree->clear();
addCurrentDownloads();
addPendingDownloads();
}
}
/**
* \brief Add the current downloads
*/
void UBDownloadWidget::addCurrentDownloads()
{
QVector actualDL = UBDownloadManager::downloadManager()->currentDownloads();
qDebug() << "Actual downloads size: " << actualDL.size();
for(int i=0; isetText(eItemColumn_Desc, actualDL.at(i).name);
mpItem->setData(eItemColumn_Desc, Qt::UserRole, QVariant(actualDL.at(i).id));
mpItem->setIcon(eItemColumn_Close, QIcon(":images/close.svg"));
mpTree->addTopLevelItem(mpItem);
mpItem = new QTreeWidgetItem(mpTree);
mpItem->setData(eItemColumn_Desc, Qt::UserRole, actualDL.at(i).currentSize);
mpItem->setData(eItemColumn_Desc, Qt::UserRole + 1, actualDL.at(i).totalSize);
mpItem->setData(eItemColumn_Desc, Qt::UserRole + 2, actualDL.at(i).id);
mpTree->addTopLevelItem(mpItem);
mpTree->setItemDelegateForRow(((i+1)*2)-1, &mProgressBarDelegate);
}
}
/**
* \brief Add the pending downloads
*/
void UBDownloadWidget::addPendingDownloads()
{
QVector pendingDL = UBDownloadManager::downloadManager()->pendingDownloads();
for(int i=0; isetText(eItemColumn_Desc, pendingDL.at(i).name);
mpItem->setData(eItemColumn_Desc, Qt::UserRole, QVariant(pendingDL.at(i).id));
mpTree->addTopLevelItem(mpItem);
}
}
/**
* \brief Update the progress bar
* @param id as the downloaded file id
* @param crnt as the current transfered size
* @param total as the total size of the file
*/
void UBDownloadWidget::onDownloadUpdated(int id, qint64 crnt, qint64 total)
{
if(NULL != mpTree)
{
QAbstractItemModel* model = mpTree->model();
if(NULL != model)
{
for(int i=0; i< model->rowCount(); i++)
{
QModelIndex currentIndex = model->index(i, eItemColumn_Desc);
if(id == currentIndex.data(Qt::UserRole + 2))
{
// We found the right item, now we update the progress bar
model->setData(currentIndex, crnt, Qt::UserRole);
model->setData(currentIndex, total, Qt::UserRole + 1);
break;
}
}
}
}
}
/**
* \brief Handles the download finish notification
* @param id as the downloaded file id
*/
void UBDownloadWidget::onDownloadFinished(int id)
{
Q_UNUSED(id);
// Refresh the file's list
onFileAddedToDownload();
}
/**
* \brief Handles the Cancel button action
*/
void UBDownloadWidget::onCancelClicked()
{
UBDownloadManager::downloadManager()->cancelDownloads();
}
/**
* \brief Handles the item click notification
* @param pItem as the item clicked
* @param col as the column containing the item clicked
*/
void UBDownloadWidget::onItemClicked(QTreeWidgetItem *pItem, int col)
{
if( eItemColumn_Close == col
&& "" != pItem->text(eItemColumn_Desc)){
// Stop the download of the clicked item and remove it from the list
UBDownloadManager::downloadManager()->cancelDownload(pItem->data(eItemColumn_Desc, Qt::UserRole).toInt());
}
}
// ---------------------------------------------------------------------------------------------
UBDownloadProgressDelegate::UBDownloadProgressDelegate(QObject *parent):QItemDelegate(parent)
{
}
void UBDownloadProgressDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionProgressBarV2 opt;
opt.rect = option.rect;
opt.minimum = 0;
opt.maximum = index.data(Qt::UserRole + 1).toInt();
opt.progress = index.data(Qt::UserRole).toInt();
if(0 == index.column()){
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &opt, painter, 0);
}
}