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.
tdeutils/superkaramba/src/imagelabel.cpp

633 lines
14 KiB

/****************************************************************************
* imagelabel.cpp - ImageLabel meter
*
* Copyright (C) 2003 Hans Karlsson <karlsson.h@home.se>
* Copyright (c) 2004 Petri Damstén <damu@iki.fi>
*
* This file is part of SuperKaramba.
*
* SuperKaramba 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 option) any later version.
*
* SuperKaramba 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 SuperKaramba; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
****************************************************************************/
#include <tqpixmap.h>
#include <tqtimer.h>
#include <tqtooltip.h>
#include <kpixmapeffect.h>
#include <kdebug.h>
#include <kimageeffect.h>
#include <tdetempfile.h>
#include <tdeio/job.h>
#include "karambaapp.h"
#include "imagelabel.h"
// Effect
Effect::Effect(ImageLabel* img, int msec) :
myImage(img)
{
if (msec > 0)
{
// remove the effect after the given time
//TQTimer::singleShot (millisec, myImage, TQ_SLOT(slotEffectExpired()));
//timer -> changeInterval(millisec);
millisec = msec;
}
else
{
millisec = msec;
}
}
Effect::~Effect()
{
}
void Effect::startTimer()
{
if (millisec > 0)
{
TQTimer::singleShot (millisec, myImage, TQ_SLOT(slotEffectExpired()));
millisec = 0;
}
}
// Intensity
Intensity::Intensity(ImageLabel* img, float r, int millisec) :
Effect(img, millisec)
{
ratio = r;
ratio = (ratio > 1) ? 1 : ratio;
ratio = (ratio < -1) ? -1 : ratio;
}
KPixmap Intensity::apply(KPixmap pixmap)
{
return KPixmapEffect::intensity(pixmap, ratio);
}
// ChannelIntensity
ChannelIntensity::ChannelIntensity(ImageLabel* img, float r, TQString c,
int millisec) :
Effect(img, millisec)
{
ratio = r;
ratio = (ratio > 1) ? 1 : ratio;
ratio = (ratio < -1) ? -1 : ratio;
channel = 0;
if (c.find("red", 0 , false))
{
channel = 0;
}
else if (c.find("green", 0, false))
{
channel = 1;
}
else if (c.find("blue", 0, false))
{
channel = 2;
}
}
KPixmap ChannelIntensity::apply(KPixmap pixmap)
{
return KPixmapEffect::channelIntensity(pixmap, ratio,
(KPixmapEffect::RGBComponent)channel);
}
// ToGray
ToGray::ToGray(ImageLabel* img, int millisec) : Effect(img, millisec)
{
}
KPixmap ToGray::apply(KPixmap pixmap)
{
return KPixmapEffect::toGray(pixmap);
}
/***********************************************************************/
ImageLabel::ImageLabel(karamba* k, int ix,int iy,int iw,int ih) :
Meter(k, ix,iy,iw,ih), zoomed(false), rollover(false)
{
background = 0;
cblend = 0;
//scaleMat.reset();
//rotMat.reset();
scale_w = 1;
scale_h = 1;
rot_angle = 0;
doScale = false;
doRotate = false;
imageEffect = 0;
}
ImageLabel::ImageLabel(karamba* k) :
Meter(k), zoomed(false), rollover(false)
{
cblend = 0;
background = 0;
}
ImageLabel::~ImageLabel()
{
if (imageEffect != 0)
{
delete imageEffect;
imageEffect = 0;
}
if(!old_tip_rect.isNull())
{
TQToolTip::remove(m_karamba, old_tip_rect);
}
}
void ImageLabel::setValue(long v)
{
setValue( TQString::number( v ) );
}
void ImageLabel::show()
{
Meter::show();
setEnabled(true);
}
void ImageLabel::hide()
{
Meter::hide();
setEnabled(false);
}
void ImageLabel::rotate(int deg)
{
doRotate = !(deg == 0);
rot_angle = deg;
applyTransformations();
}
void ImageLabel::scale(int w, int h)
{
doScale = !(w == realpixmap.width() && h == realpixmap.height());
scale_w = w;
scale_h = h;
applyTransformations();
}
void ImageLabel::smoothScale(int w, int h)
{
doScale = !(w == realpixmap.width() && h == realpixmap.height());
scale_w = w;
scale_h = h;
applyTransformations(true);
// double widthFactor = ((double)w) / ((double)realpixmap.width());
// double heightFactor = ((double)h) / ((double)realpixmap.height());
// pixmap.convertFromImage(realpixmap.convertToImage().smoothScale(w, h));
// setWidth(pixmap.width());
// setHeight(pixmap.height());
}
void ImageLabel::removeImageTransformations()
{
doScale = false;
doRotate = false;
scale_w = 1;
scale_h = 1;
rot_angle = 0;
pixmap = realpixmap;
}
void ImageLabel::applyTransformations(bool useSmoothScale)
{
pixmap = realpixmap;
if (doRotate)
{
// KDE and QT seem to miss a high quality image rotation
TQWMatrix rotMat;
rotMat.rotate(rot_angle);
pixmap = pixmap.xForm(rotMat);
}
if (doScale)
{
if (m_karamba -> useSmoothTransforms() || useSmoothScale)
{
pixmap.convertFromImage(
pixmap.convertToImage().smoothScale(scale_w, scale_h));
}
else
{
double widthFactor = ((double)scale_w) / ((double)pixmap.width());
double heightFactor = ((double)scale_h) / ((double)pixmap.height());
TQWMatrix scaleMat;
scaleMat.scale(widthFactor, heightFactor);
pixmap = pixmap.xForm(scaleMat);
}
}
if (imageEffect != 0)
{
pixmap = imageEffect -> apply(pixmap);
}
setWidth(pixmap.width());
setHeight(pixmap.height());
}
void ImageLabel::slotCopyResult(TDEIO::Job* job)
{
TQString tempFile = ((TDEIO::FileCopyJob*)job)->destURL().path();
if(job->error() == 0)
{
setValue(tempFile);
imagePath = ((TDEIO::FileCopyJob*)job)->srcURL().path();
emit pixmapLoaded();
}
else
{
tqWarning("Error downloading (%s): %s", job->errorText().ascii(),
tempFile.ascii());
}
TDEIO::NetAccess::removeTempFile(tempFile);
}
void ImageLabel::setValue(TQString fn)
{
// use the first line
TQStringList sList = TQStringList::split( "\n", fn );
TQString fileName = *sList.begin();
KURL url(fileName);
TQRegExp rx("^[a-zA-Z]{1,5}:/",false);
bool protocol = (rx.search(fileName)!=-1)?true:false;
TQPixmap pm;
if(protocol && url.isLocalFile() == false)
{
KTempFile tmpFile;
TDEIO::FileCopyJob* copy = TDEIO::file_copy(fileName, tmpFile.name(), 0600,
true, false, false);
connect(copy, TQ_SIGNAL(result(TDEIO::Job*)),
this, TQ_SLOT(slotCopyResult(TDEIO::Job*)));
return;
}
else
{
if(m_karamba->theme().isThemeFile(fileName))
{
TQByteArray ba = m_karamba->theme().readThemeFile(fileName);
pm.loadFromData(ba);
}
else
{
pm.load(fileName);
}
imagePath = fileName;
}
setValue(pm);
}
//Matthew Kay: a new version of setValue to be used by createTaskIcon()
/**
* set the internal pixmap of this image to the given TQPixmap pix
*/
void ImageLabel::setValue(TQPixmap& pix)
{
realpixmap = KPixmap(pix);
pixmap = realpixmap;
setWidth(pixmap.width());
setHeight(pixmap.height());
pixmapWidth = pixmap.width();
pixmapHeight = pixmap.height();
rect_off = TQRect(getX(),getY(),pixmapWidth,pixmapHeight);
}
void ImageLabel::mUpdate(TQPainter* p, int backgroundUpdate)
{
if (backgroundUpdate == 1)
{
//only draw image if not hidden
if (hidden == 0)
{
if (cblend == 0)
//draw the pixmap
p->drawPixmap(getX(),getY(),pixmap);
else
{
//Blend this image with a color
TQImage image = pixmap.convertToImage();
TQImage result = KImageEffect::blend(TQColor(255,0,0), image, 0.5f);
p->drawImage(getX(),getY(),result);
//p->drawRect(boundingBox);
}
}
// start Timer
if (imageEffect != 0)
{
imageEffect -> startTimer();
}
}
}
void ImageLabel::mUpdate(TQPainter* p)
{
//only draw image if not hidden
if (hidden == 0 && background == 0)
{
if (cblend == 0)
{
//draw the pixmap
p->drawPixmap(getX(),getY(),pixmap);
}
else
{
//Blend this image with a color
TQImage image = pixmap.convertToImage();
TQImage result = KImageEffect::blend(TQColor(255,0,0), image, 0.5f);
p->drawImage(getX(),getY(),result);
//p->drawRect(boundingBox);
}
}
// start Timer
if (imageEffect != 0)
{
imageEffect -> startTimer();
}
}
bool ImageLabel::click(TQMouseEvent* e)
{
if (getBoundingBox().contains(e -> x(), e -> y()) && isEnabled())
{
TQString program;
if (e -> button() == TQt::LeftButton)
{
program = leftButtonAction;
}
else if (e -> button() == TQt::MidButton)
{
program = middleButtonAction;
}
else if (e -> button() == TQt::RightButton)
{
program = rightButtonAction;
}
if( !program.isEmpty() )
{
KRun::runCommand(program);
}
else
{
return true;
}
}
return false;
}
void ImageLabel::parseImages(TQString fn, TQString fn_roll, int _xoff,
int _yoff, int _xon, int _yon)
{
//fn = filename;
//fn_roll = filename_roll;
xoff = _xoff;
yoff = _yoff;
xon = _xon;
yon = _yon;
// use the first line
TQStringList sList = TQStringList::split( "\n", fn );
TQString fileName = *sList.begin();
TQFileInfo fileInfo( fileName );
TQString path;
TQRegExp rx("^http://",false);
bool fileOnNet = (rx.search(fileName)!=-1)?true:false;
if( fileInfo.isRelative() && !fileOnNet )
{
path = m_karamba->theme().path() + "/" + fileName;
}
else
{
path = fileName;
}
if ( fileOnNet )
{
TQString tmpFile;
#if defined(KDE_3_2)
if(TDEIO::NetAccess::download(KURL(path), tmpFile, karambaApp->parentWindow()))
#else
if(TDEIO::NetAccess::download(KURL(path), tmpFile))
#endif
{
pixmap_off = KPixmap(tmpFile);
TDEIO::NetAccess::removeTempFile(tmpFile);
tqDebug( "Downloaded: %s to %s", path.ascii(), tmpFile.ascii() );
}
else
{
tqDebug( "Error Downloading: %s", path.ascii());
}
}
else
{
pixmap_off = KPixmap( path );
}
pixmapOffWidth = pixmap.width();
pixmapOffHeight = pixmap.height();
rect_off = TQRect(xoff,yoff,pixmapWidth,pixmapHeight);
/////////////////////////////
if (fn_roll.isEmpty())
return;
rollover=true;
sList = TQStringList::split( "\n", fn_roll );
fileName = *sList.begin();
fileInfo = TQFileInfo( fileName );
fileOnNet = (rx.search(fileName)!=-1)?true:false;
if( fileInfo.isRelative() && !fileOnNet )
{
path = m_karamba->theme().path() + "/" + fileName;
}
else
{
path = fileName;
}
if ( fileOnNet )
{
TQString tmpFile;
#if defined(KDE_3_2)
if(TDEIO::NetAccess::download(KURL(path), tmpFile, karambaApp->parentWindow()))
#else
if(TDEIO::NetAccess::download(KURL(path), tmpFile))
#endif
{
pixmap_on = KPixmap(tmpFile);
TDEIO::NetAccess::removeTempFile(tmpFile);
tqDebug( "Downloaded: %s to %s", path.ascii(), tmpFile.ascii());
}
else
{
tqDebug( "Error Downloading: %s", path.ascii());
}
}
else
{
pixmap_on = KPixmap( path );
}
pixmapOnWidth = pixmap_on.width();
pixmapOnHeight = pixmap_on.height();
rect_on = TQRect(xon,yon,pixmapOnWidth,pixmapOnHeight);
}
void ImageLabel::setBackground(int b)
{
background = b;
}
void ImageLabel::rolloverImage(TQMouseEvent *e)
{
if (!rollover)
return;
if (zoomed)
{
if (!rect_off.contains(e->pos()))
{
// rollover the image to the zoomed image
//setValue(fn_roll);
setX(xoff);
setY(yoff);
pixmap = pixmap_off;
pixmapWidth = pixmapOffWidth;
pixmapHeight = pixmapOffHeight;
zoomed = false;
m_karamba->step();
}
}
else
{
if (rect_off.contains(e->pos()))
{
// rollover the image to the zoomed image
//setValue(fn_roll);
setX(xon);
setY(yon);
pixmap = pixmap_on;
pixmapWidth = pixmapOnWidth;
pixmapHeight = pixmapOnHeight;
zoomed = true;
m_karamba->step();
}
}
}
void ImageLabel::setTooltip(TQString txt)
{
TQRect rect(getX(),getY(),pixmapWidth,pixmapHeight);
TQToolTip::add(m_karamba, rect, txt);
old_tip_rect = TQRect(rect.topLeft(), rect.bottomRight());
}
void ImageLabel::removeEffects()
{
if (imageEffect != 0)
{
delete imageEffect;
imageEffect = 0;
}
applyTransformations();
}
void ImageLabel::intensity(float ratio, int millisec)
{
if (imageEffect != 0)
{
delete imageEffect;
imageEffect = 0;
}
//KPixmapEffect::intensity(pixmap, ratio);
imageEffect = new Intensity(this, ratio, millisec);
applyTransformations();
}
void ImageLabel::channelIntensity(float ratio, TQString channel, int millisec)
{
if (imageEffect != 0)
{
delete imageEffect;
imageEffect = 0;
}
//KPixmapEffect::channelIntensity(pixmap, ratio, rgbChannel);
imageEffect = new ChannelIntensity(this, ratio, channel, millisec);
applyTransformations();
}
void ImageLabel::toGray(int millisec)
{
if (imageEffect != 0)
{
delete imageEffect;
imageEffect = 0;
}
//KPixmapEffect::toGray(pixmap);
imageEffect = new ToGray(this, millisec);
applyTransformations();
}
void ImageLabel::slotEffectExpired()
{
removeEffects();
m_karamba -> externalStep();
}
void ImageLabel::attachClickArea(TQString leftMouseButton,
TQString middleMouseButton,
TQString rightMouseButton)
{
leftButtonAction = leftMouseButton;
middleButtonAction = middleMouseButton;
rightButtonAction = rightMouseButton;
}
#include "imagelabel.moc"