~ubuntu-branches/ubuntu/feisty/digikam/feisty

« back to all changes in this revision

Viewing changes to digikam/albumiconitem.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Achim Bohnet
  • Date: 2005-03-10 02:39:02 UTC
  • mfrom: (1.2.1 upstream) (2.1.1 hoary)
  • Revision ID: james.westby@ubuntu.com-20050310023902-023nymfst5mg696c
Tags: 0.7.2-2
* debian/TODO: clean
* digikam manpage: better --detect-camera description

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <qapplication.h>
2
 
#include <qimage.h>
3
 
#include <qpainter.h>
4
 
#include <qpixmap.h>
5
 
#include <qpalette.h>
6
 
#include <qpen.h>
7
 
#include <qfontmetrics.h>
8
 
#include <qfont.h>
9
 
#include <qdatetime.h>
10
 
#include <qstringlist.h>
11
 
 
12
 
#include <kfileitem.h>
13
 
#include <kmimetype.h>
14
 
#include <kurl.h>
15
 
#include <kio/global.h>
16
 
#include <klocale.h>
17
 
 
18
 
#include "albumsettings.h"
19
 
#include "albumiconview.h"
20
 
#include "albumiconitem.h"
21
 
 
22
 
 
23
 
AlbumIconItem::AlbumIconItem(AlbumIconView* parent,
24
 
                             const QString& text,
25
 
                             const QPixmap& pix,
26
 
                             int size,
27
 
                             const KFileItem* fileItem,
28
 
                             int imageWidth, int imageHeight)
29
 
    : ThumbItem(parent, text, pix)
30
 
{
31
 
    view_ = parent;
32
 
    size_ = size;
33
 
    fileItem_ = fileItem;
34
 
    imageWidth_ = imageWidth;
35
 
    imageHeight_ = imageHeight;
36
 
    updateExtraText();
37
 
    calcRect();
38
 
}
39
 
 
40
 
 
41
 
AlbumIconItem::~AlbumIconItem()
42
 
{
43
 
}
44
 
 
45
 
 
46
 
void AlbumIconItem::setPixmap(const QImage& thumbnail)
47
 
{
48
 
    QPainter painter;
49
 
    painter.begin(pixmap());
50
 
    painter.fillRect(0, 0, size_, size_,
51
 
                     QBrush(iconView()->colorGroup().base()));
52
 
    painter.drawImage((size_-thumbnail.width())/2,
53
 
                      (size_-thumbnail.height())/2,
54
 
                      thumbnail);
55
 
    painter.end();
56
 
 
57
 
    QRect pRect(iconView()->contentsRectToViewport(pixmapRect(false)));
58
 
    if (pRect.intersects(iconView()->visibleRect())) {
59
 
        pRect.moveBy(-1,-1);
60
 
        pRect.setWidth(pRect.width()+2);
61
 
        pRect.setHeight(pRect.height()+2);
62
 
        painter.begin(iconView()->viewport());
63
 
        painter.drawPixmap(pRect.x()+1, pRect.y()+1, *pixmap());
64
 
        painter.end();
65
 
    }
66
 
 
67
 
}
68
 
 
69
 
void AlbumIconItem::setPixmap(const QPixmap& thumbnail)
70
 
{
71
 
    QPainter painter;
72
 
    painter.begin(pixmap());
73
 
    painter.fillRect(0, 0, size_, size_,
74
 
                     QBrush(iconView()->colorGroup().base()));
75
 
    painter.drawPixmap((size_-thumbnail.width())/2,
76
 
                      (size_-thumbnail.height())/2,
77
 
                      thumbnail);
78
 
    painter.end();
79
 
 
80
 
    QRect pRect(iconView()->contentsRectToViewport(pixmapRect(false)));
81
 
    if (pRect.intersects(iconView()->visibleRect())) {
82
 
        pRect.moveBy(-1,-1);
83
 
        pRect.setWidth(pRect.width()+2);
84
 
        pRect.setHeight(pRect.height()+2);
85
 
        bitBlt(iconView()->viewport(), pRect.x()+1, pRect.y()+1,
86
 
               pixmap(), 0, 0, pRect.width(), pRect.height());
87
 
        //painter.begin(iconView()->viewport());
88
 
        //painter.drawPixmap(pRect.x()+1, pRect.y()+1, *pixmap());
89
 
        //painter.end();
90
 
    }
91
 
}
92
 
 
93
 
void AlbumIconItem::calcRect()
94
 
{
95
 
    QRect itemIconRect = QRect(0,0,0,0);
96
 
    QRect itemTextRect = QRect(0,0,0,0);
97
 
    itemExtraRect_ = QRect(0,0,0,0);
98
 
    QRect itemRect = rect();
99
 
 
100
 
    itemRect.setWidth(100);
101
 
    itemRect.setHeight(0xFFFFFFFF);
102
 
 
103
 
    // set initial pixrect
104
 
    int pw = pixmap()->width();
105
 
    int ph = pixmap()->height();
106
 
 
107
 
    itemIconRect.setWidth(pw);
108
 
    itemIconRect.setHeight(ph);
109
 
 
110
 
    // word wrap main text
111
 
    QFontMetrics fm(view_->font());
112
 
    QRect r = QRect(fm.boundingRect(0, 0, itemIconRect.width(),
113
 
                                    0xFFFFFFFF, Qt::AlignHCenter |
114
 
                                    Qt::WordBreak | Qt::BreakAnywhere
115
 
                                    | Qt::AlignTop,
116
 
                                    text()));
117
 
    r.setWidth(r.width() + 2);
118
 
 
119
 
    itemTextRect.setWidth(r.width());
120
 
    itemTextRect.setHeight(r.height());
121
 
 
122
 
    // word wrap extra Text
123
 
    if (!extraText_.isEmpty()) {
124
 
 
125
 
        QFont font(view_->font());
126
 
        int fontSize = font.pointSize();
127
 
        if (fontSize > 0) {
128
 
            font.setPointSize(fontSize-2);
129
 
        }
130
 
        else {
131
 
            fontSize = font.pixelSize();
132
 
            font.setPixelSize(fontSize-2);
133
 
        }
134
 
        
135
 
        fm = QFontMetrics(font);
136
 
 
137
 
        r = QRect(fm.boundingRect(0, 0, itemIconRect.width(),
138
 
                                  0xFFFFFFFF, Qt::AlignHCenter |
139
 
                                  Qt::WordBreak | Qt::BreakAnywhere
140
 
                                  | Qt::AlignTop,
141
 
                                  extraText_));
142
 
        r.setWidth(r.width() + 2);
143
 
 
144
 
        itemExtraRect_.setWidth(r.width());
145
 
        itemExtraRect_.setHeight(r.height());
146
 
 
147
 
        itemTextRect.setWidth(QMAX(itemTextRect.width(), itemExtraRect_.width()));
148
 
        itemTextRect.setHeight(itemTextRect.height() + itemExtraRect_.height());
149
 
    }
150
 
 
151
 
 
152
 
    // Now start updating the rects
153
 
    int w = QMAX(itemTextRect.width(), itemIconRect.width() );
154
 
    int h = itemTextRect.height() + itemIconRect.height() + 1;
155
 
 
156
 
    itemRect.setWidth(w);
157
 
    itemRect.setHeight(h);
158
 
 
159
 
    // Center the pix and text rect
160
 
 
161
 
    itemIconRect = QRect((itemRect.width() - itemIconRect.width())/2,
162
 
                         0,
163
 
                         itemIconRect.width(), itemIconRect.height());
164
 
    itemTextRect = QRect((itemRect.width() - itemTextRect.width())/2,
165
 
                         itemRect.height() - itemTextRect.height(),
166
 
                         itemTextRect.width(), itemTextRect.height());
167
 
    if (!itemExtraRect_.isEmpty()) {
168
 
        itemExtraRect_ = QRect((itemRect.width() - itemExtraRect_.width())/2,
169
 
                               itemRect.height() - itemExtraRect_.height(),
170
 
                               itemExtraRect_.width(), itemExtraRect_.height());
171
 
    }
172
 
 
173
 
    // Update rects
174
 
    if ( itemIconRect != pixmapRect() )
175
 
        setPixmapRect( itemIconRect );
176
 
    if ( itemTextRect != textRect() )
177
 
        setTextRect( itemTextRect );
178
 
    if ( itemRect != rect() )
179
 
        setRect( itemRect );
180
 
 
181
 
}
182
 
 
183
 
void AlbumIconItem::paintItem(QPainter *, const QColorGroup& cg)
184
 
{
185
 
 
186
 
    QRect pRect=pixmapRect(true);
187
 
    QRect tRect=textRect(true);
188
 
 
189
 
    QPixmap pix(rect().width(), rect().height());
190
 
    pix.fill(cg.base());
191
 
    QPainter painter(&pix);
192
 
    painter.drawPixmap(pRect.x(), pRect.y(), *pixmap() );
193
 
 
194
 
    if (isSelected()) {
195
 
        QPen pen;
196
 
        pen.setColor(cg.highlight());
197
 
        painter.setPen(pen);
198
 
        painter.drawRect(0, 0, pix.width(), pix.height());
199
 
        painter.fillRect(0, tRect.y(), pix.width(),
200
 
                     tRect.height(), cg.highlight() );
201
 
        painter.setPen( QPen( cg.highlightedText() ) );
202
 
    }
203
 
    else
204
 
        painter.setPen( cg.text() );
205
 
 
206
 
    painter.drawText(tRect, Qt::WordBreak|Qt::BreakAnywhere|
207
 
                     Qt::AlignHCenter|Qt::AlignTop,text());
208
 
 
209
 
    if (!extraText_.isEmpty()) {
210
 
        QFont font(view_->font());
211
 
        int fontSize = font.pointSize();
212
 
        if (fontSize > 0) {
213
 
            font.setPointSize(fontSize-2);
214
 
        }
215
 
        else {
216
 
            fontSize = font.pixelSize();
217
 
            font.setPixelSize(fontSize-2);
218
 
        }
219
 
        painter.setFont(font);
220
 
        if (!isSelected())
221
 
            painter.setPen(QPen("steelblue"));
222
 
        painter.drawText(itemExtraRect_, Qt::WordBreak|
223
 
                         Qt::BreakAnywhere|Qt::AlignHCenter|
224
 
                         Qt::AlignTop,extraText_);
225
 
    }
226
 
 
227
 
    painter.end();
228
 
 
229
 
    QRect r(rect());
230
 
    r = QRect(view_->contentsToViewport(QPoint(r.x(), r.y())),
231
 
              QSize(r.width(), r.height()));
232
 
 
233
 
    bitBlt(view_->viewport(), r.x(), r.y(), &pix,
234
 
           0, 0, r.width(), r.height());
235
 
}
236
 
 
237
 
 
238
 
void AlbumIconItem::updateExtraText()
239
 
{
240
 
    QString extraText;
241
 
    bool firstLine = true;
242
 
 
243
 
    const AlbumSettings *settings = view_->settings();
244
 
    if (!settings) return;
245
 
 
246
 
    if (settings->getIconShowMime()) {
247
 
        firstLine = false;
248
 
        KMimeType::Ptr mimePtr =
249
 
            KMimeType::findByURL(fileItem_->url());
250
 
        extraText += mimePtr->name();
251
 
    }
252
 
 
253
 
    if (settings->getIconShowSize()) {
254
 
        if (!firstLine)
255
 
            extraText += "\n";
256
 
        else
257
 
            firstLine = false;
258
 
        extraText += KIO::convertSize(fileItem_->size());
259
 
    }
260
 
 
261
 
    if (settings->getIconShowDate()) {
262
 
        if (!firstLine)
263
 
            extraText += "\n";
264
 
        else
265
 
            firstLine = false;
266
 
        QDateTime date;
267
 
        date.setTime_t(fileItem_->time(KIO::UDS_MODIFICATION_TIME));
268
 
        extraText += date.toString();
269
 
    }
270
 
 
271
 
    if (settings->getIconShowComments()) {
272
 
        QString comments;
273
 
        view_->getItemComments(text(), comments);
274
 
        if (!comments.isEmpty()) {
275
 
            if (!firstLine)
276
 
                extraText += "\n";
277
 
            else
278
 
                firstLine = false;
279
 
            extraText += comments;
280
 
        }
281
 
    }
282
 
 
283
 
    if (imageWidth_ != 0 && imageHeight_ != 0) {
284
 
        if (!firstLine)
285
 
            extraText += "\n";
286
 
        else
287
 
            firstLine = false;
288
 
        extraText += QString::number(imageWidth_)
289
 
                     + "x"
290
 
                     + QString::number(imageHeight_)
291
 
                     + i18n("Pixels");
292
 
    }
293
 
 
294
 
    extraText_ = extraText;
295
 
 
296
 
}
297
 
 
298
 
void AlbumIconItem::setImageDimensions(int width, int height)
299
 
{
300
 
    imageWidth_  = width;
301
 
    imageHeight_ = height;
302
 
}