1
//=============================================================================
3
// File : KviImageDialog.cpp
4
// Creation date : Sun Dec 22 2002 19:42 by Szymon Stefanek
6
// This file is part of the KVIrc irc client distribution
7
// Copyright (C) 2002-2010 Szymon Stefanek (pragma at kvirc dot net)
9
// This program is FREE software. You can redistribute it and/or
10
// modify it under the terms of the GNU General Public License
11
// as published by the Free Software Foundation; either version 2
12
// of the License, or (at your opinion) any later version.
14
// This program is distributed in the HOPE that it will be USEFUL,
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
// See the GNU General Public License for more details.
19
// You should have received a copy of the GNU General Public License
20
// along with this program. If not, write to the Free Software Foundation,
21
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23
//=============================================================================
25
#include "KviImageDialog.h"
26
#include "KviFileUtils.h"
27
#include "KviLocale.h"
28
#include "KviIconManager.h"
29
#include "KviOptions.h"
30
#include "KviApplication.h"
33
#include <QPushButton>
40
int KviImageDialogItem::height(const KviTalListWidget *lb) const
42
return pixmap()->height() + 12 + lb->fontMetrics().lineSpacing();
45
int KviImageDialogItem::width(const KviTalListWidget *lb) const
48
if(text().isEmpty())w = 24;
49
w = lb->fontMetrics().width(text()) + 4;
52
return qMax(pixmap()->width() + 10,w);
55
void KviImageDialogItem::paint(QPainter * p)
57
const QPixmap *pm = pixmap();
58
if(pm && !pm->isNull())p->drawPixmap(5,5, *pm);
63
p->drawRect(3,3,pm->width() + 4,pm->height() + 4);
66
QRect daRect(listWidget()->visualItemRect(this));
69
p->drawRect(1,1,daRect.width() - 2,daRect.height() - 2);
71
if(text().isEmpty())return;
75
QFontMetrics fm(p->fontMetrics());
77
int wdth = fm.width(t);
80
while(wdth > (daRect.width() - 6) && idx > 3)
89
p->drawText(3,pm->height() + 8,daRect.width() - 6,daRect.height() - (pm->height() + 6),Qt::AlignLeft | Qt::AlignTop,t);
93
KviImageDialog::KviImageDialog(QWidget * par,
94
const QString &szCaption,
97
const QString &szInitialDir,
98
int maxPreviewFileSize,
103
m_szInitialPath = szInitialDir;
105
m_iMaxPreviewFileSize = maxPreviewFileSize;
107
setWindowTitle(szCaption.isEmpty() ? __tr2qs("Choose image ...") : szCaption);
109
m_pTimer = new QTimer(this);
110
connect(m_pTimer,SIGNAL(timeout()),this,SLOT(heartbeat()));
112
QGridLayout * g = new QGridLayout(this);
114
m_pTypeComboBox = new QComboBox(this);
116
g->addWidget(m_pTypeComboBox,0,0,1,3);
118
m_pTypeList = new QList<int>;
120
QString bi = __tr2qs("Builtin images");
124
if((types & KID_TYPE_ALL) == 0)types = KID_TYPE_FULL_PATH;
126
if(types & KID_TYPE_BUILTIN_IMAGES_SMALL)
129
tmp += __tr2qs("Small icons");
130
m_pTypeComboBox->insertItem(0,tmp);
131
m_pTypeList->append(KID_TYPE_BUILTIN_IMAGES_SMALL);
134
if(types & KID_TYPE_FULL_PATH)
136
m_pTypeComboBox->insertItem(m_pTypeComboBox->count(),__tr2qs("Full path"));
137
m_pTypeList->append(KID_TYPE_FULL_PATH);
140
int idx = m_pTypeList->indexOf(initialType);
143
QWidget * l = new QWidget(this);
144
g->addWidget(l,1,0,1,3);
147
m_pListBox = new KviTalListWidget(this);
148
//not supported by listwidget.. we'd need treewidget here
149
// m_pListBox->setColumnMode(KviTalListWidget::FitToWidth);
150
// m_pListBox->setRowMode(KviTalListWidget::Variable);
152
m_pTip = new KviDynamicToolTip(m_pListBox->viewport());
154
g->addWidget(m_pListBox,2,0,1,3);
156
QPushButton * b = new QPushButton(__tr2qs("Cancel"),this);
157
connect(b,SIGNAL(clicked()),this,SLOT(cancelClicked()));
160
b = new QPushButton(__tr2qs("Ok"),this);
161
connect(b,SIGNAL(clicked()),this,SLOT(okClicked()));
164
g->setRowStretch(2,1);
165
g->setColumnStretch(0,1);
167
connect(m_pTypeComboBox,SIGNAL(activated(int)),this,SLOT(jobTypeSelected(int)));
168
connect(m_pListBox,SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(itemDoubleClicked(QListWidgetItem *)));
169
connect(m_pTip,SIGNAL(tipRequest(KviDynamicToolTip *,const QPoint &)),this,SLOT(tipRequest(KviDynamicToolTip *,const QPoint &)));
171
m_pTypeComboBox->setCurrentIndex(idx);
172
jobTypeSelected(idx);
174
m_pListBox->setMinimumSize(420,350);
177
KviImageDialog::~KviImageDialog()
183
void KviImageDialog::jobTypeSelected(int index)
186
if(index >= (int)(m_pTypeList->count()))index = (int)m_pTypeList->count();
187
if(m_szInitialPath.isEmpty())
188
startJob((m_pTypeList->at(index)),KVI_OPTION_STRING(KviOption_stringLastImageDialogPath));
190
startJob((m_pTypeList->at(index)),m_szInitialPath);
191
m_szInitialPath = ""; // clear it so we will use the last path
195
void KviImageDialog::startJob(int type,const QString &szInitialPath)
200
m_iJobIndexHelper = 0;
201
if(m_iJobType == KID_TYPE_FULL_PATH)
203
QDir d(szInitialPath);
204
if(!d.exists())d = QDir::homePath();
205
if(!d.exists())d = QDir::rootPath();
206
m_szJobPath = d.absolutePath();
207
KVI_OPTION_STRING(KviOption_stringLastImageDialogPath) = m_szJobPath;
208
m_lJobFileList = d.entryList(QDir::Hidden | QDir::AllEntries,QDir::DirsFirst | QDir::Name | QDir::IgnoreCase);
211
m_pTimer->start(100);
214
void KviImageDialog::jobTerminated()
219
void KviImageDialog::heartbeat()
221
if(m_iJobIndexHelper == 0)
226
case KID_TYPE_BUILTIN_IMAGES_SMALL:
228
if(m_iJobIndexHelper >= KviIconManager::IconCount)
233
int max = m_iJobIndexHelper + 15;
234
if(max > KviIconManager::IconCount)
235
max = KviIconManager::IconCount;
236
while(m_iJobIndexHelper < max)
238
QString szId = g_pIconManager->getSmallIconName(m_iJobIndexHelper);
240
szTip = QString(__tr2qs("Builtin $icon(%1) [index %2]")).arg(szId).arg(m_iJobIndexHelper);
241
QString szImageId = "$icon(";
244
new KviImageDialogItem(m_pListBox,*(g_pIconManager->getSmallIcon(m_iJobIndexHelper)),szId,szImageId,szTip);
249
case KID_TYPE_FULL_PATH:
252
if(m_lJobFileList.isEmpty())
258
while((idx < 20) && (!m_lJobFileList.isEmpty()))
260
QString szFile = m_lJobFileList.first();
261
m_lJobFileList.removeAll(szFile);
262
QString szPath = m_szJobPath;
263
szPath += KVI_PATH_SEPARATOR;
265
QFileInfo fi(szPath);
266
idx += fi.size() / 128000; // we do less entries when have big files to read
271
QString tip = szFile;
273
tip += __tr2qs("directory");
274
new KviImageDialogItem(m_pListBox,*(g_pIconManager->getBigIcon(KVI_BIGICON_FOLDER)),szFile,szPath,tip,true);
277
if(((int)fi.size()) < m_iMaxPreviewFileSize)
280
if(i.isNull())continue;
282
if((i.width() > 80) || (i.height() > 80))pix = QPixmap::fromImage(i.scaled(80,80,Qt::KeepAspectRatio));
283
else pix = QPixmap::fromImage(i);
285
QString tip = szFile;
288
sz.setNum(i.width());
291
sz.setNum(i.height());
294
tip += __tr2qs("pixels");
296
sz.setNum(fi.size());
299
tip += __tr2qs("bytes");
302
new KviImageDialogItem(m_pListBox,pix,szFile,szPath,tip);
312
void KviImageDialog::okClicked()
314
KviTalListWidgetItem * it = (KviTalListWidgetItem*) m_pListBox->currentItem();
316
itemDoubleClicked(it);
319
void KviImageDialog::cancelClicked()
321
m_szSelectedImage = QString();
325
void KviImageDialog::closeEvent(QCloseEvent * e)
327
m_szSelectedImage = QString();
328
QDialog::closeEvent(e);
331
void KviImageDialog::itemDoubleClicked(QListWidgetItem * it)
334
KviImageDialogItem * i = (KviImageDialogItem *)it;
337
startJob(KID_TYPE_FULL_PATH,i->imageId());
339
QString szImageId = i->imageId();
340
if(szImageId.length() > 0)
342
if(szImageId.at(0) == QChar('$'))
343
m_szSelectedImage = szImageId; // it's $icon(something)
345
g_pApp->mapImageFile(m_szSelectedImage,i->imageId()); // it's a file and we need to map it to our filesystem view
351
void KviImageDialog::tipRequest(KviDynamicToolTip *,const QPoint &pnt)
353
KviTalListWidgetItem * it = (KviTalListWidgetItem *)m_pListBox->itemAt(pnt);
355
QRect r = m_pListBox->visualItemRect(it);
356
KviImageDialogItem * i = (KviImageDialogItem *)it;
357
m_pTip->tip(r,i->tipText());