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