1 | /* -*- C++ -*- |
2 | This file implements the SMIVItemDelegate class. |
3 | |
4 | SPDX-FileCopyrightText: 2005 Mirko Boehm <mirko@kde.org> |
5 | |
6 | SPDX-License-Identifier: LGPL-2.0-or-later |
7 | |
8 | License: LGPL with the following explicit clarification: |
9 | This code may be linked against any version of the Qt toolkit |
10 | from Trolltech, Norway. |
11 | |
12 | $Id: SMIVItemDelegate.cpp 30 2005-08-16 16:16:04Z mirko $ |
13 | */ |
14 | |
15 | #include <QModelIndex> |
16 | #include <QPainter> |
17 | |
18 | #include "Image.h" |
19 | #include "ItemDelegate.h" |
20 | #include "Model.h" |
21 | |
22 | const int ItemDelegate::FrameWidth = 2; |
23 | const int ItemDelegate::TextMargin = 6; |
24 | const int ItemDelegate::Margin = 3; |
25 | |
26 | ItemDelegate::ItemDelegate(QObject *parent) |
27 | : QItemDelegate(parent) |
28 | { |
29 | } |
30 | |
31 | void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const |
32 | { |
33 | const bool itemIsSelected = option.showDecorationSelected && (option.state & QStyle::State_Selected); |
34 | const Image *image = index.data(arole: Model::Role_ImageRole).value<const Image *>(); |
35 | // calculate some constants: |
36 | const int y0 = option.rect.top(); |
37 | const int x0 = option.rect.left(); |
38 | const int width = option.rect.width(); |
39 | // const int height = option.rect.height(); |
40 | |
41 | painter->save(); |
42 | |
43 | // draw the background color, depending on focus: |
44 | if (itemIsSelected) { |
45 | QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; |
46 | painter->fillRect(option.rect, option.palette.brush(cg, cr: QPalette::Highlight)); |
47 | } |
48 | |
49 | // draw the image frame: |
50 | painter->setPen(Qt::blue); |
51 | painter->setBrush(Qt::white); |
52 | painter->drawRect(x: x0 + FrameWidth + Margin, y: y0 + FrameWidth + Margin, w: Image::ThumbWidth + 1, h: Image::ThumbHeight + 1); |
53 | |
54 | // draw the image: |
55 | if (image->progress().first >= Image::Step_LoadImage) { |
56 | const QImage &thumb = image->thumbNail(); |
57 | QPoint orig = QPoint(x0 + FrameWidth + Margin + 1, y0 + FrameWidth + Margin + 1); |
58 | painter->drawImage(p: orig, image: thumb, sr: QRect(0, qMax(a: 0, b: (thumb.height() - Image::ThumbHeight) / 2), Image::ThumbWidth, Image::ThumbHeight)); |
59 | } |
60 | |
61 | // render the text next to the image: |
62 | painter->setPen(Qt::black); |
63 | QFontMetrics font1Metrics(option.font); |
64 | int textx0 = x0 + FrameWidth + Margin + Image::ThumbWidth + TextMargin; |
65 | QRect text1Rect = QRect(textx0, y0 + TextMargin, width - TextMargin - textx0, font1Metrics.lineSpacing()); |
66 | painter->drawText(r: text1Rect, text: image->description()); |
67 | if (itemIsSelected) { |
68 | painter->setPen(Qt::white); |
69 | } else { |
70 | painter->setPen(Qt::darkGray); |
71 | } |
72 | QFont font2 = option.font; |
73 | font2.setPointSize((int)(0.9 * option.font.pointSize())); |
74 | painter->setFont(font2); |
75 | QFontMetrics font2Metrics(font2); |
76 | QRect text2Rect = text1Rect.adjusted(xp1: 0, yp1: font1Metrics.lineSpacing(), xp2: 0, yp2: font2Metrics.lineSpacing()); |
77 | painter->drawText(r: text2Rect, text: image->details()); |
78 | QRect text3Rect = text2Rect.adjusted(xp1: 0, yp1: font2Metrics.lineSpacing(), xp2: 0, yp2: font2Metrics.lineSpacing()); |
79 | painter->drawText(r: text3Rect, text: image->details2()); |
80 | |
81 | painter->restore(); |
82 | } |
83 | |
84 | QSize ItemDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const |
85 | { |
86 | static const int Width = Image::ThumbWidth + 2 * FrameWidth + 2 * Margin + 2; |
87 | static const int Height = Image::ThumbHeight + 2 * FrameWidth + 2 * Margin + 2; |
88 | return QSize(Width, Height); |
89 | } |
90 | |
91 | #include "moc_ItemDelegate.cpp" |
92 | |