1 /* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2009-02-06
7 * Description : thumbnail bar for items - the delegate
8 *
9 * Copyright (C) 2002-2005 by Renchi Raju <renchi dot raju at gmail dot com>
10 * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
11 * Copyright (C) 2002-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
12 * Copyright (C) 2009-2011 by Andi Clemens <andi dot clemens at gmail dot com>
13 *
14 * This program is free software; you can redistribute it
15 * and/or modify it under the terms of the GNU General
16 * Public License as published by the Free Software Foundation;
17 * either version 2, or (at your option)
18 * any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * ============================================================ */
26
27 #include "itemthumbnaildelegate.h"
28 #include "itemthumbnaildelegate_p.h"
29
30 // Local includes
31
32 #include "digikam_debug.h"
33 #include "applicationsettings.h"
34 #include "itemcategorizedview.h"
35 #include "itemdelegateoverlay.h"
36 #include "itemmodel.h"
37 #include "itemfiltermodel.h"
38 #include "thumbnailloadthread.h"
39
40 namespace Digikam
41 {
42
init(ItemThumbnailDelegate * const q)43 void ItemThumbnailDelegatePrivate::init(ItemThumbnailDelegate* const q)
44 {
45 QObject::connect(ApplicationSettings::instance(), SIGNAL(setupChanged()),
46 q, SLOT(slotSetupChanged()));
47 }
48
ItemThumbnailDelegate(ItemCategorizedView * parent)49 ItemThumbnailDelegate::ItemThumbnailDelegate(ItemCategorizedView* parent)
50 : ItemDelegate(*new ItemThumbnailDelegatePrivate, parent)
51 {
52 Q_D(ItemThumbnailDelegate);
53 d->init(this);
54 }
55
~ItemThumbnailDelegate()56 ItemThumbnailDelegate::~ItemThumbnailDelegate()
57 {
58 }
59
setFlow(QListView::Flow flow)60 void ItemThumbnailDelegate::setFlow(QListView::Flow flow)
61 {
62 Q_D(ItemThumbnailDelegate);
63 d->flow = flow;
64 }
65
setDefaultViewOptions(const QStyleOptionViewItem & option)66 void ItemThumbnailDelegate::setDefaultViewOptions(const QStyleOptionViewItem& option)
67 {
68 Q_D(ItemThumbnailDelegate);
69
70 // store before calling parent class
71
72 d->viewSize = option.rect;
73 ItemDelegate::setDefaultViewOptions(option);
74 }
75
maximumSize() const76 int ItemThumbnailDelegate::maximumSize() const
77 {
78 Q_D(const ItemThumbnailDelegate);
79
80 return ThumbnailLoadThread::maximumThumbnailPixmapSize(true) + 2*d->radius + 2*d->margin;
81 }
82
minimumSize() const83 int ItemThumbnailDelegate::minimumSize() const
84 {
85 Q_D(const ItemThumbnailDelegate);
86
87 return (ThumbnailSize::Small + 2*d->radius + 2*d->margin);
88 }
89
acceptsActivation(const QPoint & pos,const QRect & visualRect,const QModelIndex & index,QRect * activationRect) const90 bool ItemThumbnailDelegate::acceptsActivation(const QPoint& pos, const QRect& visualRect,
91 const QModelIndex& index, QRect* activationRect) const
92 {
93 // reuse implementation from grandparent
94
95 return ItemViewDelegate::acceptsActivation(pos, visualRect, index, activationRect); // clazy:exclude=skipped-base-method
96 }
97
updateContentWidth()98 void ItemThumbnailDelegate::updateContentWidth()
99 {
100 Q_D(ItemThumbnailDelegate);
101 int maxSize;
102
103 if (d->flow == QListView::LeftToRight)
104 {
105 maxSize = d->viewSize.height();
106 }
107 else
108 {
109 maxSize = d->viewSize.width();
110 }
111
112 d->thumbSize = ThumbnailSize(ThumbnailLoadThread::thumbnailToPixmapSize(true, maxSize - 2*d->radius - 2*d->margin));
113
114 ItemDelegate::updateContentWidth();
115 }
116
updateRects()117 void ItemThumbnailDelegate::updateRects()
118 {
119 Q_D(ItemThumbnailDelegate);
120
121 d->rect = QRect(0, 0, d->contentWidth + 2*d->margin, d->contentWidth + 2*d->margin);
122 d->pixmapRect = QRect(d->margin, d->margin, d->contentWidth, d->contentWidth);
123 const int iconSize = qBound(16, (d->contentWidth + 2*d->margin) / 8 - 2, 48);
124 d->coordinatesRect = QRect(d->contentWidth - iconSize+2, d->pixmapRect.top(), iconSize, iconSize);
125 d->pickLabelRect = QRect(d->margin+2, d->rect.bottom() - d->margin - 18, 16, 16);
126 d->drawCoordinates = ApplicationSettings::instance()->getIconShowCoordinates();
127 d->drawImageFormat = ApplicationSettings::instance()->getIconShowImageFormat();
128 d->drawImageFormatTop = true;
129
130 if (ApplicationSettings::instance()->getIconShowRating())
131 {
132 int top = d->rect.bottom() - d->margin - d->starPolygonSize.height() - 2;
133 d->ratingRect = QRect(d->margin, top, d->contentWidth, d->starPolygonSize.height());
134 }
135
136 if (d->flow == QListView::LeftToRight)
137 {
138 d->gridSize = QSize(d->rect.width() + d->spacing, d->rect.height());
139 }
140 else
141 {
142 d->gridSize = QSize(d->rect.width(), d->rect.height() + d->spacing);
143 }
144 }
145
146 } // namespace Digikam
147