Skip to content

Commit

Permalink
add cancel button for ongoing docset downloads
Browse files Browse the repository at this point in the history
  • Loading branch information
nishanthkarthik committed Nov 4, 2018
1 parent 7fe9e72 commit 07ee97a
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 4 deletions.
32 changes: 29 additions & 3 deletions src/libs/ui/docsetsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ constexpr int CacheTimeout = 24 * 60 * 60 * 1000; // 24 hours in microseconds
const char DocsetNameProperty[] = "docsetName";
const char DownloadTypeProperty[] = "downloadType";
const char DownloadPreviousReceived[] = "downloadPreviousReceived";
const char DownloadTotalSize[] = "downloadTotalSize";
const char ListItemIndexProperty[] = "listItem";
}

Expand Down Expand Up @@ -437,11 +438,12 @@ void DocsetsDialog::downloadProgress(qint64 received, qint64 total)

qint64 previousReceived = 0;
const QVariant previousReceivedVariant = reply->property(DownloadPreviousReceived);
if (!previousReceivedVariant.isValid())
if (!previousReceivedVariant.isValid()) {
reply->setProperty(DownloadTotalSize, total);
m_combinedTotal += total;
else
} else {
previousReceived = previousReceivedVariant.toLongLong();

}
m_combinedReceived += received - previousReceived;
reply->setProperty(DownloadPreviousReceived, received);

Expand Down Expand Up @@ -572,6 +574,8 @@ void DocsetsDialog::setupAvailableDocsetsTab()
using Registry::DocsetRegistry;

ui->availableDocsetList->setItemDelegate(new ProgressItemDelegate(this));
ProgressItemDelegate* del = static_cast<ProgressItemDelegate*>(ui->availableDocsetList->itemDelegate());
connect(del, &ProgressItemDelegate::cancelButtonClicked, this, &DocsetsDialog::cancelDownload);

connect(m_docsetRegistry, &DocsetRegistry::docsetUnloaded, this, [this](const QString name) {
QListWidgetItem *item = findDocsetListItem(name);
Expand Down Expand Up @@ -702,6 +706,28 @@ QNetworkReply *DocsetsDialog::download(const QUrl &url)
return reply;
}

void DocsetsDialog::cancelDownload(const QModelIndex &index)
{
// Find and delete download jobs corresponding to index
for (QNetworkReply *reply : m_replies) {
if (reply->property(ListItemIndexProperty).toInt() == index.row()
&& reply->property(DownloadTypeProperty).toInt() == DownloadDocset) {
QListWidgetItem *listItem = ui->availableDocsetList->item(index.row());
listItem->setData(ProgressItemDelegate::ShowProgressRole, false);
delete m_tmpFiles.take(reply->property(DocsetNameProperty).toString());
reply->abort();

m_combinedReceived -= reply->property(DownloadPreviousReceived).toLongLong();
m_combinedTotal -= reply->property(DownloadTotalSize).toLongLong();
}
}

// As the current download is cancelled, unselect the current selected item
// This also triggers selectionChanged() and the state of downloadDocsetsButton
// is recomputed on the next selection
ui->availableDocsetList->selectionModel()->clearSelection();
}

void DocsetsDialog::cancelDownloads()
{
for (QNetworkReply *reply : m_replies) {
Expand Down
1 change: 1 addition & 0 deletions src/libs/ui/docsetsdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ private slots:
bool updatesAvailable() const;

QNetworkReply *download(const QUrl &url);
void cancelDownload(const QModelIndex &index);
void cancelDownloads();

void loadUserFeedList();
Expand Down
26 changes: 25 additions & 1 deletion src/libs/ui/progressitemdelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@
#include "progressitemdelegate.h"

#include <QPainter>
#include <QEvent>
#include <QProgressBar>
#include <QPushButton>
#include <QMouseEvent>

using namespace Zeal::WidgetUi;

Expand All @@ -51,7 +54,7 @@ void ProgressItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &

// Adjust maximum text width
QStyleOptionViewItem styleOption = option;
styleOption.rect.setRight(styleOption.rect.right() - progressBarWidth);
styleOption.rect.setRight(styleOption.rect.right() - progressBarWidth - cancelButtonWidth);

// Size progress bar
QScopedPointer<QProgressBar> renderer(new QProgressBar());
Expand All @@ -69,7 +72,28 @@ void ProgressItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
painter->translate(styleOption.rect.topRight());
renderer->render(painter);

// Button
QScopedPointer<QPushButton> buttonRenderer(new QPushButton(tr("Cancel")));
buttonRenderer->resize(cancelButtonWidth, styleOption.rect.height());

painter->translate(progressBarWidth, 0);
buttonRenderer->render(painter);
painter->restore();

QStyledItemDelegate::paint(painter, styleOption, index);
}

bool ProgressItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index)
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
QRect cancelBounds = option.rect;
cancelBounds.setLeft(cancelBounds.right() - cancelButtonWidth);

if (event->type() == QEvent::MouseButtonRelease
&& index.model()->data(index, ShowProgressRole).toBool()
&& cancelBounds.contains(mouseEvent->pos()))
emit cancelButtonClicked(index);

return QStyledItemDelegate::editorEvent(event, model, option, index);
}
7 changes: 7 additions & 0 deletions src/libs/ui/progressitemdelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,15 @@ class ProgressItemDelegate : public QStyledItemDelegate
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;

bool editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index) override;

signals:
void cancelButtonClicked(const QModelIndex& index);

private:
static const int progressBarWidth = 150;
static const int cancelButtonWidth = 50;
};

} // namespace WidgetUi
Expand Down

0 comments on commit 07ee97a

Please sign in to comment.