1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include "modlistversiondelegate.h"
#include "log.h"
#include "modlistview.h"
#include "settings.h"
ModListVersionDelegate::ModListVersionDelegate(ModListView* view, Settings& settings)
: QItemDelegate(view), m_view(view), m_settings(settings)
{}
void ModListVersionDelegate::paint(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
m_view->itemDelegate()->paint(painter, option, index);
if (m_view->hasCollapsibleSeparators() && m_view->model()->hasChildren(index) &&
m_settings.interface().collapsibleSeparatorsIcons(ModList::COL_VERSION) &&
!m_view->isExpanded(index.sibling(index.row(), 0))) {
auto* model = m_view->model();
bool downgrade = false, upgrade = false;
for (int i = 0; i < model->rowCount(index); ++i) {
const auto mIndex =
model->index(i, index.column(), index).data(ModList::IndexRole);
if (mIndex.isValid()) {
auto info = ModInfo::getByIndex(mIndex.toInt());
downgrade = downgrade || info->downgradeAvailable();
upgrade = upgrade || info->updateAvailable();
}
}
const int margin =
m_view->style()->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, m_view) + 1;
QStyleOptionViewItem opt(option);
const int sz =
m_view->style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, m_view);
opt.decorationSize = QSize(sz, sz);
opt.decorationAlignment = Qt::AlignCenter;
if (upgrade) {
QIcon icon(":/MO/gui/update_available");
QPixmap pixmap = decoration(opt, icon);
QSize pm = icon.actualSize(opt.decorationSize);
pm.rwidth() += 2 * margin;
opt.rect.setRect(opt.rect.x(), opt.rect.y(), pm.width(), opt.rect.height());
drawDecoration(painter, opt, opt.rect, pixmap);
// add margin for next icon (if any)
opt.rect.adjust(opt.decorationSize.width() + margin, 0, 0, 0);
}
if (downgrade) {
QIcon icon(":/MO/gui/warning");
QPixmap pixmap = decoration(opt, icon);
QSize pm = icon.actualSize(opt.decorationSize);
pm.rwidth() += 2 * margin;
opt.rect.setRect(opt.rect.x(), opt.rect.y(), pm.width(), opt.rect.height());
drawDecoration(painter, opt, opt.rect, pixmap);
}
}
}
|