You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvirc/ui/kvi_imagedialog.cpp

368 lines
9.3 KiB

//
// File : kvi_imagedialog.cpp
// Creation date : Sun Dec 22 2002 19:42 by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2002 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your opinion) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#define __KVIRC__
#include "kvi_imagedialog.h"
#include "kvi_locale.h"
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <tqimage.h>
#include <tqfileinfo.h>
#include <tqdir.h>
#include <tqpainter.h>
#include "kvi_fileutils.h"
#include "kvi_iconmanager.h"
#include "kvi_options.h"
#include "kvi_app.h"
int KviImageDialogItem::height(const KviTalListBox *lb) const
{
return pixmap()->height() + 12 + lb->fontMetrics().lineSpacing();
}
int KviImageDialogItem::width(const KviTalListBox *lb) const
{
int w;
if(text().isEmpty())w = 24;
w = lb->fontMetrics().width(text()) + 4;
if(w > 100)w = 100;
if(w < 24)w = 24;
return TQMAX(pixmap()->width() + 10,w);
}
void KviImageDialogItem::paint(TQPainter * p)
{
const TQPixmap *pm = pixmap();
if(pm && !pm->isNull())p->drawPixmap(5,5, *pm);
if(!m_bIsFolder)
{
p->setPen(TQt::gray);
p->drawRect(3,3,pm->width() + 4,pm->height() + 4);
}
TQRect daRect(listBox()->itemRect(this));
p->setPen(TQt::black);
p->drawRect(1,1,daRect.width() - 2,daRect.height() - 2);
if(text().isEmpty())return;
TQString t = text();
TQFontMetrics fm(p->fontMetrics());
int wdth = fm.width(t);
int idx = t.length();
while(wdth > (daRect.width() - 6) && idx > 3)
{
t = text();
t.truncate(idx);
t.append("...");
wdth = fm.width(t);
idx--;
}
p->drawText(3,pm->height() + 8,daRect.width() - 6,daRect.height() - (pm->height() + 6),TQt::AlignLeft | TQt::AlignTop,t);
}
KviImageDialog::KviImageDialog(TQWidget * par,
const TQString &szCaption,
int types,
int initialType,
const TQString &szInitialDir,
int maxPreviewFileSize,bool modal)
: TQDialog(par)
{
m_szInitialPath = szInitialDir;
setModal(modal);
m_iMaxPreviewFileSize = maxPreviewFileSize;
setCaption(szCaption.isEmpty() ? __tr2qs("Choose image ...") : szCaption);
m_pTimer = new TQTimer(this);
connect(m_pTimer,TQT_SIGNAL(timeout()),this,TQT_SLOT(heartbeat()));
TQGridLayout * g = new TQGridLayout(this,4,3,5,3);
m_pTypeComboBox = new TQComboBox(this);
g->addMultiCellWidget(m_pTypeComboBox,0,0,0,2);
m_pTypeList = new KviValueList<int>;
TQString bi = __tr2qs("Builtin images");
TQString tmp = bi;
if((types & KID_TYPE_ALL) == 0)types = KID_TYPE_FULL_PATH;
if(types & KID_TYPE_BUILTIN_IMAGES_SMALL)
{
tmp += ": ";
tmp += __tr2qs("Small icons");
m_pTypeComboBox->insertItem(tmp);
m_pTypeList->append(KID_TYPE_BUILTIN_IMAGES_SMALL);
}
if(types & KID_TYPE_FULL_PATH)
{
m_pTypeComboBox->insertItem(__tr2qs("Full path"));
m_pTypeList->append(KID_TYPE_FULL_PATH);
}
int idx = m_pTypeList->findIndex(initialType);
if(idx < 0)idx = 0;
TQWidget * l = new TQWidget(this);
g->addMultiCellWidget(l,1,1,0,2);
m_pListBox = new KviTalListBox(this);
m_pListBox->setColumnMode(KviTalListBox::FitToWidth);
m_pListBox->setRowMode(KviTalListBox::Variable);
m_pTip = new KviDynamicToolTip(m_pListBox->viewport());
g->addMultiCellWidget(m_pListBox,2,2,0,2);
TQPushButton * b = new TQPushButton(__tr2qs("Cancel"),this);
connect(b,TQT_SIGNAL(clicked()),this,TQT_SLOT(cancelClicked()));
g->addWidget(b,3,1);
b = new TQPushButton(__tr2qs("Ok"),this);
connect(b,TQT_SIGNAL(clicked()),this,TQT_SLOT(okClicked()));
g->addWidget(b,3,2);
g->setRowStretch(2,1);
g->setColStretch(0,1);
connect(m_pTypeComboBox,TQT_SIGNAL(activated(int)),this,TQT_SLOT(jobTypeSelected(int)));
connect(m_pListBox,TQT_SIGNAL(doubleClicked(KviTalListBoxItem *)),this,TQT_SLOT(itemDoubleClicked(KviTalListBoxItem *)));
connect(m_pTip,TQT_SIGNAL(tipRequest(KviDynamicToolTip *,const TQPoint &)),this,TQT_SLOT(tipRequest(KviDynamicToolTip *,const TQPoint &)));
m_pTypeComboBox->setCurrentItem(idx);
jobTypeSelected(idx);
m_pListBox->setMinimumSize(420,350);
}
KviImageDialog::~KviImageDialog()
{
delete m_pTimer;
delete m_pTypeList;
}
void KviImageDialog::jobTypeSelected(int index)
{
if(index < 0)return;
if(index >= (int)(m_pTypeList->count()))index = (int)m_pTypeList->count();
if(m_szInitialPath.isEmpty())
startJob(*(m_pTypeList->at(index)),KVI_OPTION_STRING(KviOption_stringLastImageDialogPath));
else {
startJob(*(m_pTypeList->at(index)),m_szInitialPath);
m_szInitialPath = ""; // clear it so we will use the last path
}
}
void KviImageDialog::startJob(int type,const TQString &szInitialPath)
{
m_pTimer->stop();
m_iJobType = type;
m_iJobIndexHelper = 0;
if(m_iJobType == KID_TYPE_FULL_PATH)
{
TQDir d(szInitialPath);
if(!d.exists())d = TQDir::homeDirPath();
if(!d.exists())d = TQDir::rootDirPath();
m_szJobPath = d.absPath();
KVI_OPTION_STRING(KviOption_stringLastImageDialogPath) = m_szJobPath;
m_lJobFileList = d.entryList(TQDir::Hidden | TQDir::All,TQDir::DirsFirst | TQDir::Name | TQDir::IgnoreCase);
}
m_pTimer->start(100);
}
void KviImageDialog::jobTerminated()
{
m_pTimer->stop();
}
void KviImageDialog::heartbeat()
{
if(m_iJobIndexHelper == 0)m_pListBox->clear();
switch(m_iJobType)
{
case KID_TYPE_BUILTIN_IMAGES_SMALL:
{
if(m_iJobIndexHelper >= KVI_NUM_SMALL_ICONS)
{
jobTerminated();
return;
}
int max = m_iJobIndexHelper + 15;
if(max > KVI_NUM_SMALL_ICONS)max = KVI_NUM_SMALL_ICONS;
while(m_iJobIndexHelper < max)
{
TQString id = g_pIconManager->getSmallIconName(m_iJobIndexHelper);
KviImageDialogItem * it;
TQString tip;
KviTQString::sprintf(tip,__tr2qs("Builtin $icon(%Q) [index %d]"),&id,m_iJobIndexHelper);
TQString image_id = "$icon(";
image_id += id;
image_id += ")";
it = new KviImageDialogItem(m_pListBox,*(g_pIconManager->getSmallIcon(m_iJobIndexHelper)),id,image_id,tip);
m_iJobIndexHelper++;
}
}
break;
case KID_TYPE_FULL_PATH:
{
m_iJobIndexHelper++;
if(m_lJobFileList.isEmpty())
{
jobTerminated();
return;
}
int idx = 0;
while((idx < 20) && (!m_lJobFileList.isEmpty()))
{
TQString szFile = m_lJobFileList.first();
m_lJobFileList.remove(szFile);
TQString szPath = m_szJobPath;
szPath += KVI_PATH_SEPARATOR;
szPath += szFile;
TQFileInfo fi(szPath);
idx += fi.size() / 128000; // we do less entries when have big files to read
if(fi.isDir())
{
if(szFile != ".")
{
TQString tip = szFile;
tip += "<br><hr>";
tip += __tr2qs("directory");
KviImageDialogItem * it;
it = new KviImageDialogItem(m_pListBox,*(g_pIconManager->getBigIcon(KVI_BIGICON_FOLDER)),szFile,szPath,tip,true);
}
} else {
if(((int)fi.size()) < m_iMaxPreviewFileSize)
{
TQImage i(szPath);
if(i.isNull())continue;
TQPixmap pix;
#ifdef COMPILE_USE_QT4
if((i.width() > 80) || (i.height() > 80))pix = i.scaled(80,80,TQt::KeepAspectRatio);
#else
if((i.width() > 80) || (i.height() > 80))pix = i.scale(80,80,TQ_ScaleMin);
#endif
else pix = i;
TQString tip = szFile;
tip += "<br><hr>";
TQString sz;
sz.setNum(i.width());
tip += sz;
tip += " x ";
sz.setNum(i.height());
tip += sz;
tip += " ";
tip += __tr2qs("pixels");
tip += "<br>";
sz.setNum(fi.size());
tip += sz;
tip += " ";
tip += __tr2qs("bytes");
tip += "<br>";
KviImageDialogItem * it;
it = new KviImageDialogItem(m_pListBox,pix,szFile,szPath,tip);
}
}
idx++;
}
}
break;
}
}
void KviImageDialog::okClicked()
{
KviTalListBoxItem * it = 0;
int idx = m_pListBox->currentItem();
if(idx != -1)it = (KviTalListBoxItem *)m_pListBox->item(idx);
if(!it)return;
itemDoubleClicked(it);
}
void KviImageDialog::cancelClicked()
{
m_szSelectedImage = TQString();
reject();
}
void KviImageDialog::closeEvent(TQCloseEvent * e)
{
m_szSelectedImage = TQString();
TQDialog::closeEvent(e);
}
void KviImageDialog::itemDoubleClicked(KviTalListBoxItem * it)
{
if(!it)return;
KviImageDialogItem * i = (KviImageDialogItem *)it;
if(i->isFolder())
{
startJob(KID_TYPE_FULL_PATH,i->imageId());
} else {
TQString szImageId = i->imageId();
if(szImageId.length() > 0)
{
if(szImageId.at(0) == TQChar('$'))
m_szSelectedImage = szImageId; // it's $icon(something)
else
g_pApp->mapImageFile(m_szSelectedImage,i->imageId()); // it's a file and we need to map it to our filesystem view
accept();
}
}
}
void KviImageDialog::tipRequest(KviDynamicToolTip *,const TQPoint &pnt)
{
KviTalListBoxItem * it = (KviTalListBoxItem *)m_pListBox->itemAt(pnt);
if(!it)return;
TQRect r = m_pListBox->itemRect(it);
KviImageDialogItem * i = (KviImageDialogItem *)it;
m_pTip->tip(r,i->tipText());
}