Krita Source Code Documentation
Loading...
Searching...
No Matches
KisResourceThumbnailPainter Class Reference

The resource item delegate for rendering the resource preview. More...

#include <KisResourceThumbnailPainter.h>

+ Inheritance diagram for KisResourceThumbnailPainter:

Public Member Functions

QImage getReadyThumbnail (const QModelIndex &index, QSize rect, const QPalette &palette) const
 
 KisResourceThumbnailPainter (QObject *parent=0)
 
void paint (QPainter *painter, const QModelIndex &index, QRect rect, const QPalette &palette, bool selected, bool addMargin) const
 
 ~KisResourceThumbnailPainter () override
 

Private Attributes

KoCheckerBoardPainter m_checkerPainter
 

Detailed Description

The resource item delegate for rendering the resource preview.

Definition at line 20 of file KisResourceThumbnailPainter.h.

Constructor & Destructor Documentation

◆ KisResourceThumbnailPainter()

KisResourceThumbnailPainter::KisResourceThumbnailPainter ( QObject * parent = 0)
explicit

Definition at line 16 of file KisResourceThumbnailPainter.cpp.

17 : QObject(parent)
19{
20}

◆ ~KisResourceThumbnailPainter()

KisResourceThumbnailPainter::~KisResourceThumbnailPainter ( )
inlineoverride

Definition at line 25 of file KisResourceThumbnailPainter.h.

25{}

Member Function Documentation

◆ getReadyThumbnail()

QImage KisResourceThumbnailPainter::getReadyThumbnail ( const QModelIndex & index,
QSize rect,
const QPalette & palette ) const

Definition at line 22 of file KisResourceThumbnailPainter.cpp.

23{
24 QImage thumbLabel = QImage(size, QImage::Format_ARGB32);
25 thumbLabel.fill(Qt::white);
26 QPainter painter(&thumbLabel);
27 paint(&painter, index, QRect(QPoint(0, 0), size), palette, false, false);
28 return thumbLabel;
29}
void paint(QPainter *painter, const QModelIndex &index, QRect rect, const QPalette &palette, bool selected, bool addMargin) const
rgba palette[MAX_PALETTE]
Definition palette.c:35

References paint(), and palette.

◆ paint()

void KisResourceThumbnailPainter::paint ( QPainter * painter,
const QModelIndex & index,
QRect rect,
const QPalette & palette,
bool selected,
bool addMargin ) const

Definition at line 31 of file KisResourceThumbnailPainter.cpp.

32{
33 const qreal devicePixelRatioF = painter->device()->devicePixelRatioF();
34
35 QImage thumbnail = KisResourceThumbnailCache::instance()->getImage(index);
36 thumbnail.setDevicePixelRatio(devicePixelRatioF);
37
38 const QString resourceType = index.data(Qt::UserRole + KisAbstractResourceModel::ResourceType).toString();
39 const QString name = index.data(Qt::UserRole + KisAbstractResourceModel::Tooltip).toString();
40
41 painter->save();
42
43 if(addMargin) {
44 // margin has empty space...which we want to be the color palette background
45 painter->fillRect(rect, palette.window());
46 }
47
48 if (selected) {
49 painter->fillRect(rect, palette.highlight());
50 }
51
52 QRect innerRect = addMargin ? rect.adjusted(2, 2, -2, -2) : rect;
53 QSize innerRectSizeDPI = innerRect.size() * devicePixelRatioF;
54
55 painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
56
57 if (resourceType == ResourceType::Gradients) {
58 m_checkerPainter.paint(*painter, innerRect, innerRect.topLeft());
59 if (!thumbnail.isNull()) {
61 innerRectSizeDPI,
62 Qt::IgnoreAspectRatio,
63 Qt::SmoothTransformation);
64 thumbnail.setDevicePixelRatio(devicePixelRatioF);
65 painter->drawImage(innerRect.topLeft(), thumbnail);
66 }
67 } else if (resourceType == ResourceType::Patterns) {
68 painter->fillRect(innerRect, Qt::white); // no checkers, they are confusing with patterns.
69 // for large patterns, scale down to no less than 50% zoom and crop it,
70 // to see distinguishing details without being too zoomed in
71 double scale = qMin(double(thumbnail.height()) / innerRectSizeDPI.height(), double(thumbnail.width()) / innerRectSizeDPI.width());
72 if (!thumbnail.isNull() && (scale >= 1.0)) {
73 scale = qMin(scale, 2.0);
74 QRect sourceRect = QRect(0, 0, innerRectSizeDPI.width() * scale, innerRectSizeDPI.height() * scale);
75 painter->drawImage(innerRect, thumbnail, sourceRect);
76 } else {
77 // crisply transform small patterns, which get scaled up to user-space,
78 // preventing them from being too tiny to see on hi-dpi
79 painter->setRenderHint(QPainter::SmoothPixmapTransform, false);
80 QBrush patternBrush(thumbnail);
81 painter->setBrushOrigin(innerRect.topLeft());
82 painter->fillRect(innerRect, patternBrush);
83 }
84 } else if (resourceType == ResourceType::WindowLayouts) {
85 // TODO: thumbnails for window layouts?
86 painter->fillRect(innerRect, Qt::white);
87 QPen before = painter->pen();
88 painter->setPen(Qt::black);
89 painter->drawText(innerRect, Qt::TextWordWrap, name.split("_").join(" "));
90 painter->setPen(before);
91 } else {
92 painter->fillRect(innerRect, Qt::white); // no checkers, they are confusing with patterns.
93 if (!thumbnail.isNull() && !(thumbnail.height() == innerRectSizeDPI.height() &&
94 thumbnail.width() == innerRectSizeDPI.width())) {
95 bool needsUpscaling = thumbnail.height() < innerRectSizeDPI.height()
96 || thumbnail.width() < innerRectSizeDPI.width();
97
99 innerRectSizeDPI,
100 Qt::KeepAspectRatio,
101 needsUpscaling ? Qt::FastTransformation
102 : Qt::SmoothTransformation);
103 thumbnail.setDevicePixelRatio(devicePixelRatioF);
104 }
105 QPoint topleft(innerRect.topLeft());
106
107 if (thumbnail.width() < innerRectSizeDPI.width()) {
108 topleft.setX(topleft.x() + (innerRect.width() - thumbnail.width()/devicePixelRatioF) / 2);
109 }
110 if (thumbnail.height() < innerRectSizeDPI.height()) {
111 topleft.setY(topleft.y() + (innerRect.height() - thumbnail.height()/devicePixelRatioF) / 2);
112 }
113 painter->drawImage(topleft, thumbnail);
114 }
115
116 painter->restore();
117}
static KisResourceThumbnailCache * instance()
QImage getImage(const QModelIndex &index, const QSize size=QSize(-1, -1), Qt::AspectRatioMode aspectMode=Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode=Qt::FastTransformation)
void paint(QPainter &painter, const QRectF &rect, const QPointF &patternOrigin) const
const char * name(StandardAction id)
const QString Patterns
const QString Gradients
const QString WindowLayouts

References KisResourceThumbnailCache::getImage(), ResourceType::Gradients, KisResourceThumbnailCache::instance(), m_checkerPainter, KoCheckerBoardPainter::paint(), palette, ResourceType::Patterns, KisAbstractResourceModel::ResourceType, KisAbstractResourceModel::Tooltip, and ResourceType::WindowLayouts.

Member Data Documentation

◆ m_checkerPainter

KoCheckerBoardPainter KisResourceThumbnailPainter::m_checkerPainter
private

Definition at line 38 of file KisResourceThumbnailPainter.h.


The documentation for this class was generated from the following files: