summaryrefslogtreecommitdiff
path: root/src/modlistversiondelegate.cpp
blob: fbb4f03e6b41db864ed54ecb6187226fdd9c6c93 (plain)
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);
    }
  }
}