Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_categorized_item_delegate.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
4 * SPDX-FileCopyrightText: 2014 Mohit Goyal <mohit.bits2011@gmail.com>
5 *
6 * SPDX-License-Identifier: LGPL-2.1-or-later
7 */
8
11
12#include <QPainter>
13#include <QStyle>
14#include <QStyleOptionMenuItem>
15#include <QStyleOptionViewItem>
16#include <QApplication>
17#include <QTransform>
18
19#include <KoIcon.h>
20
21#include <kis_icon.h>
22#include "kis_debug.h"
23
25 : QStyledItemDelegate(parent),
26 m_minimumItemHeight(0)
27{
28}
29
30void KisCategorizedItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
31{
32 painter->resetTransform();
33
34 if(!index.data(__CategorizedListModelBase::IsHeaderRole).toBool()) {
35 QStyleOptionViewItem sovi(option);
36
37 if (index.data(__CategorizedListModelBase::isLockableRole).toBool()) {
38
39 const int iconSize = qMax(16, m_minimumItemHeight - 2);
40 bool locked = index.data(__CategorizedListModelBase::isLockedRole).toBool();
41
42
43 QIcon icon = locked ? KisIconUtils::loadIcon(koIconName("layer-locked")) : KisIconUtils::loadIcon(koIconName("layer-unlocked"));
44
45 // to be able to make an icon more transparent. we need to create a new image
46 // and use the QPainter to make a more transparent version of it.
47 QImage image(iconSize, iconSize, QImage::Format_ARGB32_Premultiplied);
48 image.fill(Qt::transparent); // needs to happen, otherwise 'junk' pixels are used (looks bad)
49
50 QPainter p(&image);
51 p.setCompositionMode(QPainter::CompositionMode_Source);
52
53
54 // make unlocked icons more hidden
55 if (locked) {
56 p.setOpacity(1.0);
57 } else {
58 p.setOpacity(0.14);
59 }
60
61 p.drawPixmap(0, 0, icon.pixmap(iconSize, QIcon::Normal) );
62 p.end();
63
64 icon = QIcon( QPixmap::fromImage(image) ); // the new icon is ready
65
66
67
68 sovi.decorationPosition = QStyleOptionViewItem::Right;
69 sovi.decorationAlignment = Qt::AlignRight;
70 sovi.decorationSize = QSize(iconSize, iconSize);
71 sovi.features |= QStyleOptionViewItem::HasDecoration;
72 sovi.icon = icon;
73
74 }
75
76 QStyledItemDelegate::paint(painter, sovi, index);
77 painter->setOpacity(1);
78 }
79 else {
80 QPalette palette = QApplication::palette();
81 if(option.state & QStyle::State_MouseOver)
82 painter->fillRect(option.rect, palette.midlight());
83 else
84 painter->fillRect(option.rect, palette.button());
85
86 painter->setBrush(palette.buttonText());
87 painter->drawText(option.rect, index.data().toString(), QTextOption(Qt::AlignVCenter|Qt::AlignHCenter));
88
90 painter,
91 option.rect.x(),
92 option.rect.y(),
93 option.rect.height(),
95 );
96 }
97 painter->resetTransform();
98}
99
100QSize KisCategorizedItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
101{
102 //on first calling this calculates the minimal height of the items
103 if (m_minimumItemHeight == 0) {
104 for(int i=0; i<index.model()->rowCount(); i++) {
105 QSize indexSize = QStyledItemDelegate::sizeHint(option, index.model()->index(i, 0));
106 m_minimumItemHeight = qMax(m_minimumItemHeight, indexSize.height());
107
112 QStyle *style = QApplication::style();
113 QStyleOptionButton so;
114 QSize size = style->sizeFromContents(QStyle::CT_CheckBox, &so, QSize(), 0);
115
116 m_minimumItemHeight = qMax(size.height(), m_minimumItemHeight);
117 }
118 }
119
120 int width = QStyledItemDelegate::sizeHint(option, index).width();
121
122 if (index.data(__CategorizedListModelBase::isLockableRole).toBool()) {
123 width += m_minimumItemHeight;
124 }
125
126 return QSize(width, m_minimumItemHeight);
127}
128
129void KisCategorizedItemDelegate::paintTriangle(QPainter* painter, qint32 x, qint32 y, qint32 size, bool rotate) const
130{
131 QPolygonF triangle;
132 triangle.push_back(QPointF(-0.2,-0.2));
133 triangle.push_back(QPointF( 0.2,-0.2));
134 triangle.push_back(QPointF( 0.0, 0.2));
135
136 QTransform transform;
137 transform.translate(x + size/2, y + size/2);
138 transform.scale(size, size);
139
140 if(rotate)
141 transform.rotate(-90);
142
143 QPalette palette = QApplication::palette();
144 painter->setBrush(palette.buttonText());
145 painter->drawPolygon(transform.map(triangle));
146}
147
const Params2D p
int iconSize(qreal width, qreal height)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
void paintTriangle(QPainter *painter, qint32 x, qint32 y, qint32 size, bool rotate) const
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
#define koIconName(name)
Definition kis_icon.h:27
QIcon loadIcon(const QString &name)
rgba palette[MAX_PALETTE]
Definition palette.c:35