downloaddelegate.cpp Example File
documentshare/downloaddelegate.cpp
#include "downloaddelegate.h"
#include "download.h"
#include "downloadmodel.h"
#include <QtGui>
DownloadDelegate::DownloadDelegate(QObject *parent)
: QAbstractItemDelegate(parent)
{
}
DownloadDelegate::~DownloadDelegate()
{
}
void DownloadDelegate::paint(
QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyle *style = QApplication::style();
int state = index.data(DownloadModel::StateRole).toInt();
int hMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, &option);
int vMargin = style->pixelMetric(QStyle::PM_FocusFrameVMargin, &option);
QRect rect = option.rect;
if (option.state & QStyle::State_Selected)
painter->fillRect(rect, option.palette.highlight());
rect.adjust(hMargin, vMargin, -hMargin, -vMargin);
QString text = stateText(state, index.data(Qt::DisplayRole).toString());
QStyleOptionProgressBarV2 progressOption;
progressOption.minimum = 0;
progressOption.maximum = index.data(DownloadModel::MaximumProgressRole).toInt();
progressOption.progress = index.data(DownloadModel::CurrentProgressRole).toInt();
progressOption.orientation = Qt::Horizontal;
progressOption.rect = rect;
progressOption.palette = option.palette;
progressOption.palette.setColor(
QPalette::Highlight, option.palette.color(QPalette::AlternateBase));
style->drawControl(QStyle::CE_ProgressBar, &progressOption, painter);
QRect textRect = style->subElementRect(QStyle::SE_ProgressBarContents, &progressOption);
style->drawItemText(painter, textRect, 0, option.palette, true, text);
}
QSize DownloadDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyle *style = QApplication::style();
int state = index.data(DownloadModel::StateRole).toInt();
int hMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, &option);
int vMargin = style->pixelMetric(QStyle::PM_FocusFrameVMargin, &option);
QString text = stateText(state, index.data(Qt::DisplayRole).toString());
QRect textRect = style->itemTextRect(
option.fontMetrics, option.rect, option.displayAlignment, true, text);
textRect.adjust(-hMargin, -vMargin, hMargin, vMargin);
QStyleOptionProgressBarV2 progressOption;
progressOption.minimum = 0;
progressOption.maximum = index.data(DownloadModel::MaximumProgressRole).toInt();
progressOption.progress = index.data(DownloadModel::CurrentProgressRole).toInt();
progressOption.orientation = Qt::Horizontal;
progressOption.rect = option.rect;
QSize size = style->sizeFromContents(
QStyle::CT_ProgressBar, &progressOption, textRect.size());
size.rwidth() += 2 * hMargin;
size.rheight() += 2 * vMargin;
return size;
}
QString DownloadDelegate::stateText(int state, const QString &displayText) const
{
switch (state) {
case Download::Downloading:
return tr("Downloading:\n %1").arg(displayText);
case Download::Finalizing:
return tr("Registering:\n %1").arg(displayText);
case Download::Finished:
return tr("Download Finished:\n %1").arg(displayText);
case Download::DownloadError:
return tr("Download Failed:\n %1").arg(displayText);
case Download::ItemError:
return tr("Registration Failed:\n %1").arg(displayText);
default:
return QString();
}
}