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.
1215 lines
29 KiB
1215 lines
29 KiB
/* ============================================================
|
|
*
|
|
* This file is a part of kipi-plugins project
|
|
* http://www.kipi-plugins.org
|
|
*
|
|
* Date : 2003-02-16
|
|
* Description : a kipi plugin to slide images.
|
|
*
|
|
* Copyright (C) 2006-2007 by Valerio Fuoglio <valerio dot fuoglio at gmail dot com>
|
|
* Copyright (C) 2003-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
|
|
*
|
|
* 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, or (at your option) 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.
|
|
*
|
|
* ============================================================ */
|
|
|
|
// C++ includes.
|
|
|
|
#include <cstdlib>
|
|
#include <cassert>
|
|
#include <cmath>
|
|
#include <ctime>
|
|
|
|
// TQt includes.
|
|
|
|
#include <tqtimer.h>
|
|
#include <tqpainter.h>
|
|
#include <tqpixmap.h>
|
|
#include <tqimage.h>
|
|
#include <tqapplication.h>
|
|
#include <tqdesktopwidget.h>
|
|
#include <tqevent.h>
|
|
#include <tqcursor.h>
|
|
#include <tqfont.h>
|
|
#include <tqwmatrix.h>
|
|
#include <tqtextcodec.h>
|
|
|
|
// KDE includes.
|
|
|
|
#include <tdelocale.h>
|
|
#include <tdeversion.h>
|
|
#include <tdeglobalsettings.h>
|
|
#include <kdebug.h>
|
|
#include <kurl.h>
|
|
|
|
// Local includes.
|
|
|
|
#include "toolbar.h"
|
|
#include "slideshow.h"
|
|
#include "slideshow.moc"
|
|
|
|
namespace KIPISlideShowPlugin
|
|
{
|
|
|
|
SlideShow::SlideShow(const FileList& fileList, const TQStringList& commentsList, bool ImagesHasComments)
|
|
: TQWidget(0, 0, WStyle_StaysOnTop | WType_Popup | WX11BypassWM | WDestructiveClose)
|
|
{
|
|
#if KDE_IS_VERSION(3,2,0)
|
|
TQRect deskRect = TDEGlobalSettings::desktopGeometry(this);
|
|
m_deskX = deskRect.x();
|
|
m_deskY = deskRect.y();
|
|
m_deskWidth = deskRect.width();
|
|
m_deskHeight = deskRect.height();
|
|
#else
|
|
TQRect deskRect = TQApplication::desktop()->screenGeometry(this);
|
|
m_deskX = deskRect.x();
|
|
m_deskY = deskRect.y();
|
|
m_deskWidth = deskRect.width();
|
|
m_deskHeight = deskRect.height();
|
|
#endif
|
|
|
|
move(m_deskX, m_deskY);
|
|
resize(m_deskWidth, m_deskHeight);
|
|
setPaletteBackgroundColor(black);
|
|
|
|
m_toolBar = new ToolBar(this);
|
|
m_toolBar->hide();
|
|
if (!m_loop)
|
|
{
|
|
m_toolBar->setEnabledPrev(false);
|
|
}
|
|
connect(m_toolBar, TQT_SIGNAL(signalPause()),
|
|
this, TQT_SLOT(slotPause()));
|
|
|
|
connect(m_toolBar, TQT_SIGNAL(signalPlay()),
|
|
this, TQT_SLOT(slotPlay()));
|
|
|
|
connect(m_toolBar, TQT_SIGNAL(signalNext()),
|
|
this, TQT_SLOT(slotNext()));
|
|
|
|
connect(m_toolBar, TQT_SIGNAL(signalPrev()),
|
|
this, TQT_SLOT(slotPrev()));
|
|
|
|
connect(m_toolBar, TQT_SIGNAL(signalClose()),
|
|
this, TQT_SLOT(slotClose()));
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
m_currImage = 0;
|
|
m_fileIndex = -1; // start with -1
|
|
m_effect = 0;
|
|
m_effectRunning = false;
|
|
m_intArray = 0;
|
|
m_endOfShow = false;
|
|
|
|
m_timer = new TQTimer();
|
|
connect(m_timer, TQT_SIGNAL(timeout()),
|
|
this, TQT_SLOT(slotTimeOut()));
|
|
|
|
// --------------------------------------------------
|
|
|
|
m_fileList = fileList;
|
|
m_commentsList = commentsList;
|
|
m_ImagesHasComments = ImagesHasComments;
|
|
|
|
m_config = new TDEConfig("kipirc");
|
|
m_config->setGroup("SlideShow Settings");
|
|
|
|
readSettings();
|
|
|
|
m_imageLoader = new SlideShowLoader(m_fileList, m_cacheSize, width(), height(), m_fileIndex);
|
|
|
|
// --------------------------------------------------
|
|
|
|
registerEffects();
|
|
|
|
if (m_effectName == "Random")
|
|
m_effect = getRandomEffect();
|
|
else
|
|
{
|
|
m_effect = Effects[m_effectName];
|
|
if (!m_effect)
|
|
{
|
|
m_effect = Effects["None"];
|
|
}
|
|
}
|
|
|
|
m_timer->start(10, true);
|
|
|
|
// -- hide cursor when not moved --------------------
|
|
|
|
m_mouseMoveTimer = new TQTimer;
|
|
connect(m_mouseMoveTimer, TQT_SIGNAL(timeout()),
|
|
TQT_SLOT(slotMouseMoveTimeOut()));
|
|
|
|
setMouseTracking(true);
|
|
slotMouseMoveTimeOut();
|
|
|
|
}
|
|
|
|
SlideShow::~SlideShow()
|
|
{
|
|
m_timer->stop();
|
|
delete m_timer;
|
|
m_mouseMoveTimer->stop();
|
|
delete m_mouseMoveTimer;
|
|
|
|
if (m_painter.isActive())
|
|
m_painter.end();
|
|
|
|
if (m_intArray)
|
|
delete [] m_intArray;
|
|
|
|
if (m_currImage)
|
|
delete m_currImage;
|
|
|
|
if (m_imageLoader)
|
|
delete m_imageLoader;
|
|
|
|
if (m_config)
|
|
delete m_config;
|
|
}
|
|
|
|
void SlideShow::readSettings()
|
|
{
|
|
m_delay = m_config->readNumEntry("Delay", 1500);
|
|
m_printName = m_config->readBoolEntry("Print Filename", true);
|
|
m_printProgress = m_config->readBoolEntry("Print Progress Indicator", true);
|
|
m_printComments = m_config->readBoolEntry("Print Comments", false);
|
|
m_loop = m_config->readBoolEntry("Loop", false);
|
|
|
|
m_effectName = m_config->readEntry("Effect Name", "Random");
|
|
|
|
m_enableMouseWheel = m_config->readBoolEntry("Enable Mouse Wheel", true);
|
|
|
|
// Comments tab settings
|
|
|
|
m_commentsFont = new TQFont();
|
|
m_commentsFont->setFamily(m_config->readEntry("Comments Font Family"));
|
|
m_commentsFont->setPointSize(m_config->readNumEntry("Comments Font Size", 10 ));
|
|
m_commentsFont->setBold(m_config->readBoolEntry("Comments Font Bold", false));
|
|
m_commentsFont->setItalic(m_config->readBoolEntry("Comments Font Italic", false));
|
|
m_commentsFont->setUnderline(m_config->readBoolEntry("Comments Font Underline", false));
|
|
m_commentsFont->setOverline(m_config->readBoolEntry("Comments Font Overline", false));
|
|
m_commentsFont->setStrikeOut(m_config->readBoolEntry("Comments Font StrikeOut", false));
|
|
m_commentsFont->setFixedPitch(m_config->readBoolEntry("Comments Font FixedPitch", false));
|
|
|
|
m_commentsFontColor = m_config->readUnsignedNumEntry("Comments Font Color", 0xffffff);
|
|
m_commentsBgColor = m_config->readUnsignedNumEntry("Comments Bg Color", 0x000000);
|
|
|
|
m_commentsLinesLength = m_config->readNumEntry("Comments Lines Length", 72);
|
|
|
|
// Advanced settings
|
|
bool enableCache = m_config->readBoolEntry("Enable Cache", false);
|
|
if (enableCache)
|
|
m_cacheSize = m_config->readNumEntry("Cache Size", 1);
|
|
else
|
|
m_cacheSize = 1;
|
|
}
|
|
|
|
void SlideShow::registerEffects()
|
|
{
|
|
Effects.insert("None", &SlideShow::effectNone);
|
|
Effects.insert("Chess Board", &SlideShow::effectChessboard);
|
|
Effects.insert("Melt Down", &SlideShow::effectMeltdown);
|
|
Effects.insert("Sweep", &SlideShow::effectSweep);
|
|
Effects.insert("Noise", &SlideShow::effectRandom);
|
|
Effects.insert("Growing", &SlideShow::effectGrowing);
|
|
Effects.insert("Incom_ing Edges", &SlideShow::effectIncom_ingEdges);
|
|
Effects.insert("Horizontal Lines", &SlideShow::effectHorizLines);
|
|
Effects.insert("Vertical Lines", &SlideShow::effectVertLines);
|
|
Effects.insert("Circle Out", &SlideShow::effectCircleOut);
|
|
Effects.insert("MultiCircle Out", &SlideShow::effectMultiCircleOut);
|
|
Effects.insert("Spiral In", &SlideShow::effectSpiralIn);
|
|
Effects.insert("Blobs", &SlideShow::effectBlobs);
|
|
}
|
|
|
|
TQStringList SlideShow::effectNames()
|
|
{
|
|
TQStringList effects;
|
|
|
|
effects.append("None");
|
|
effects.append("Chess Board");
|
|
effects.append("Melt Down");
|
|
effects.append("Sweep");
|
|
effects.append("Noise");
|
|
effects.append("Growing");
|
|
effects.append("Incom_ing Edges");
|
|
effects.append("Horizontal Lines");
|
|
effects.append("Vertical Lines");
|
|
effects.append("Circle Out");
|
|
effects.append("MultiCircle Out");
|
|
effects.append("Spiral In");
|
|
effects.append("Blobs");
|
|
effects.append("Random");
|
|
|
|
return effects;
|
|
}
|
|
|
|
TQMap<TQString,TQString> SlideShow::effectNamesI18N()
|
|
{
|
|
TQMap<TQString,TQString> effects;
|
|
|
|
effects["None"] = i18n("None");
|
|
effects["Chess Board"] = i18n("Chess Board");
|
|
effects["Melt Down"] = i18n("Melt Down");
|
|
effects["Sweep"] = i18n("Sweep");
|
|
effects["Noise"] = i18n("Noise");
|
|
effects["Growing"] = i18n("Growing");
|
|
effects["Incom_ing Edges"] = i18n("Incom_ing Edges");
|
|
effects["Horizontal Lines"] = i18n("Horizontal Lines");
|
|
effects["Vertical Lines"] = i18n("Vertical Lines");
|
|
effects["Circle Out"] = i18n("Circle Out");
|
|
effects["MultiCircle Out"] = i18n("MultiCircle Out");
|
|
effects["Spiral In"] = i18n("Spiral In");
|
|
effects["Blobs"] = i18n("Blobs");
|
|
effects["Random"] = i18n("Random");
|
|
|
|
return effects;
|
|
}
|
|
|
|
void SlideShow::slotTimeOut()
|
|
{
|
|
if (!m_effect) return; // No effect -> bye !
|
|
|
|
int tmout = -1;
|
|
|
|
if (m_effectRunning) // Effect under progress ?
|
|
{
|
|
tmout = (this->*m_effect)(false);
|
|
}
|
|
else
|
|
{
|
|
loadNextImage();
|
|
|
|
if (!m_currImage || m_fileList.isEmpty()) // End of slideshow ?
|
|
{
|
|
showEndOfShow();
|
|
return;
|
|
}
|
|
|
|
if (m_effectName == "Random") // Take a random effect.
|
|
{
|
|
m_effect = getRandomEffect();
|
|
if (!m_effect) return;
|
|
}
|
|
|
|
m_effectRunning = true;
|
|
tmout = (this->*m_effect)(true);
|
|
}
|
|
|
|
if (tmout <= 0) // Effect finished -> delay.
|
|
{
|
|
tmout = m_delay;
|
|
m_effectRunning = false;
|
|
}
|
|
|
|
m_timer->start(tmout, true);
|
|
}
|
|
|
|
void SlideShow::loadNextImage()
|
|
{
|
|
if (m_currImage)
|
|
delete m_currImage;
|
|
m_currImage = 0;
|
|
|
|
m_fileIndex++;
|
|
m_imageLoader->next();
|
|
int num = m_fileList.count();
|
|
if (m_fileIndex >= num)
|
|
{
|
|
if (m_loop)
|
|
{
|
|
m_fileIndex = 0;
|
|
}
|
|
else
|
|
{
|
|
m_fileIndex = num-1;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!m_loop)
|
|
{
|
|
m_toolBar->setEnabledPrev(m_fileIndex > 0);
|
|
m_toolBar->setEnabledNext(m_fileIndex < num-1);
|
|
}
|
|
|
|
TQPixmap* oldPixmap = m_currImage;
|
|
TQPixmap* newPixmap = new TQPixmap(m_imageLoader->getCurrent());
|
|
|
|
TQPixmap pixmap(width(),height());
|
|
pixmap.fill(TQt::black);
|
|
|
|
TQPainter p(&pixmap);
|
|
p.drawPixmap((width()-newPixmap->width())/2,
|
|
(height()-newPixmap->height())/2, *newPixmap,
|
|
0, 0, newPixmap->width(), newPixmap->height());
|
|
|
|
delete newPixmap;
|
|
m_currImage = new TQPixmap(pixmap);
|
|
delete oldPixmap;
|
|
|
|
if (m_printName)
|
|
printFilename();
|
|
|
|
if (m_printProgress)
|
|
printProgress();
|
|
|
|
if (m_printComments && m_ImagesHasComments)
|
|
printComments();
|
|
}
|
|
|
|
void SlideShow::loadPrevImage()
|
|
{
|
|
if (m_currImage)
|
|
delete m_currImage;
|
|
m_currImage = 0;
|
|
|
|
m_fileIndex--;
|
|
m_imageLoader->prev();
|
|
int num = m_fileList.count();
|
|
if (m_fileIndex < 0)
|
|
{
|
|
if (m_loop)
|
|
{
|
|
m_fileIndex = num-1;
|
|
}
|
|
else
|
|
{
|
|
m_fileIndex = -1; // set this to -1.
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!m_loop)
|
|
{
|
|
m_toolBar->setEnabledPrev(m_fileIndex > 0);
|
|
m_toolBar->setEnabledNext(m_fileIndex < num-1);
|
|
}
|
|
|
|
TQPixmap* oldPixmap = m_currImage;
|
|
TQPixmap* newPixmap = new TQPixmap(m_imageLoader->getCurrent());
|
|
|
|
TQPixmap pixmap(width(),height());
|
|
pixmap.fill(TQt::black);
|
|
|
|
TQPainter p(&pixmap);
|
|
p.drawPixmap((width()-newPixmap->width())/2,
|
|
(height()-newPixmap->height())/2, *newPixmap,
|
|
0, 0, newPixmap->width(), newPixmap->height());
|
|
|
|
delete newPixmap;
|
|
m_currImage = new TQPixmap(pixmap);
|
|
delete oldPixmap;
|
|
|
|
if (m_printName)
|
|
printFilename();
|
|
|
|
if (m_printProgress)
|
|
printProgress();
|
|
|
|
if (m_printComments)
|
|
printComments();
|
|
}
|
|
|
|
void SlideShow::showCurrentImage()
|
|
{
|
|
if (!m_currImage)
|
|
return;
|
|
|
|
bitBlt(this, 0, 0, m_currImage,
|
|
0, 0, m_currImage->width(),
|
|
m_currImage->height(), TQt::CopyROP, true);
|
|
}
|
|
|
|
void SlideShow::printFilename()
|
|
{
|
|
if (!m_currImage) return;
|
|
|
|
TQPainter p;
|
|
p.begin(m_currImage);
|
|
|
|
p.setPen(TQColor("black"));
|
|
for (int x=9; x<=11; x++)
|
|
for (int y=31; y>=29; y--)
|
|
p.drawText(x, height()-y, m_imageLoader->currFileName());
|
|
|
|
p.setPen(TQColor("white"));
|
|
p.drawText(10, height()-30, m_imageLoader->currFileName());
|
|
}
|
|
|
|
void SlideShow::printComments()
|
|
{
|
|
if (!m_currImage) return;
|
|
|
|
TQString comments = m_commentsList[m_fileIndex];
|
|
|
|
int yPos = 30; // Text Y coordinate
|
|
if (m_printName) yPos = 50;
|
|
|
|
TQStringList commentsByLines;
|
|
|
|
uint commentsIndex = 0; // Comments TQString index
|
|
|
|
while (commentsIndex < comments.length())
|
|
{
|
|
TQString newLine;
|
|
bool breakLine = FALSE; // End Of Line found
|
|
uint currIndex; // Comments TQString current index
|
|
|
|
// Check minimal lines dimension
|
|
|
|
uint commentsLinesLengthLocal = m_commentsLinesLength;
|
|
|
|
for ( currIndex = commentsIndex; currIndex < comments.length() && !breakLine; currIndex++ )
|
|
if( comments[currIndex] == TQChar('\n') || comments[currIndex].isSpace() ) breakLine = TRUE;
|
|
|
|
if (commentsLinesLengthLocal <= (currIndex - commentsIndex))
|
|
commentsLinesLengthLocal = (currIndex - commentsIndex);
|
|
|
|
breakLine = FALSE;
|
|
|
|
for ( currIndex = commentsIndex; currIndex <= commentsIndex + commentsLinesLengthLocal &&
|
|
currIndex < comments.length() &&
|
|
!breakLine; currIndex++ )
|
|
{
|
|
breakLine = (comments[currIndex] == TQChar('\n')) ? TRUE : FALSE;
|
|
|
|
if (breakLine)
|
|
newLine.append( ' ' );
|
|
else
|
|
newLine.append( comments[currIndex] );
|
|
}
|
|
|
|
commentsIndex = currIndex; // The line is ended
|
|
|
|
if ( commentsIndex != comments.length() )
|
|
while ( !newLine.endsWith(" ") )
|
|
{
|
|
newLine.truncate(newLine.length() - 1);
|
|
commentsIndex--;
|
|
}
|
|
|
|
commentsByLines.prepend(newLine.stripWhiteSpace());
|
|
}
|
|
|
|
TQPainter p;
|
|
p.begin(m_currImage);
|
|
p.setFont(*m_commentsFont);
|
|
|
|
for ( int lineNumber = 0; lineNumber < (int)commentsByLines.count(); lineNumber++ ) {
|
|
|
|
p.setPen(TQColor(m_commentsBgColor));
|
|
|
|
// coefficient 1.5 is used to maintain distance between different lines
|
|
|
|
for (int x=9; x<=11; x++)
|
|
for (int y = (int)(yPos + lineNumber * 1.5 * m_commentsFont->pointSize() + 1);
|
|
y >= (int)(yPos + lineNumber* 1.5 * m_commentsFont->pointSize() - 1); y--)
|
|
p.drawText(x, height()-y, commentsByLines[lineNumber]);
|
|
|
|
p.setPen(TQColor(m_commentsFontColor));
|
|
|
|
p.drawText(10, height()-(int)(lineNumber * 1.5 * m_commentsFont->pointSize() + yPos), commentsByLines[lineNumber]);
|
|
}
|
|
}
|
|
|
|
void SlideShow::printProgress()
|
|
{
|
|
if (!m_currImage) return;
|
|
|
|
TQPainter p;
|
|
p.begin(m_currImage);
|
|
|
|
TQString progress(TQString::number(m_fileIndex+1) + "/" + TQString::number(m_fileList.count()));
|
|
|
|
int stringLength = p.fontMetrics().width(progress) * progress.length();
|
|
|
|
p.setPen(TQColor("black"));
|
|
for (int x=9; x<=11; x++)
|
|
for (int y=21; y>=19; y--)
|
|
p.drawText(x, height()-y, progress);
|
|
|
|
p.setPen(TQColor("white"));
|
|
p.drawText(width() - stringLength - 10, 20, progress);
|
|
}
|
|
|
|
EffectMethod SlideShow::getRandomEffect()
|
|
{
|
|
TQStringList effs = Effects.keys();
|
|
effs.remove("None");
|
|
|
|
int count = effs.count();
|
|
|
|
int i = rand() % count;
|
|
TQString key = effs[i];
|
|
|
|
return Effects[key];
|
|
}
|
|
|
|
void SlideShow::showEndOfShow()
|
|
{
|
|
TQPainter p;
|
|
p.begin(this);
|
|
p.fillRect(0, 0, width(), height(), TQt::black);
|
|
|
|
TQFont fn(font());
|
|
fn.setPointSize(fn.pointSize()+10);
|
|
fn.setBold(true);
|
|
|
|
p.setFont(fn);
|
|
p.setPen(TQt::white);
|
|
p.drawText(100, 100, i18n("SlideShow Completed."));
|
|
p.drawText(100, 150, i18n("Click To Exit..."));
|
|
p.end();
|
|
|
|
m_endOfShow = true;
|
|
m_toolBar->setEnabledPlay(false);
|
|
m_toolBar->setEnabledNext(false);
|
|
m_toolBar->setEnabledPrev(false);
|
|
}
|
|
|
|
void SlideShow::keyPressEvent(TQKeyEvent *event)
|
|
{
|
|
if (!event)
|
|
return;
|
|
|
|
m_toolBar->keyPressEvent(event);
|
|
}
|
|
|
|
void SlideShow::mousePressEvent(TQMouseEvent *e)
|
|
{
|
|
if (m_endOfShow)
|
|
slotClose();
|
|
|
|
if (e->button() == TQt::LeftButton)
|
|
{
|
|
m_timer->stop();
|
|
m_toolBar->setPaused(true);
|
|
slotNext();
|
|
}
|
|
else if (e->button() == TQt::RightButton && m_fileIndex-1 >= 0)
|
|
{
|
|
m_timer->stop();
|
|
m_toolBar->setPaused(true);
|
|
slotPrev();
|
|
}
|
|
}
|
|
|
|
void SlideShow::mouseMoveEvent(TQMouseEvent *e)
|
|
{
|
|
setCursor(TQCursor(TQt::ArrowCursor));
|
|
m_mouseMoveTimer->start(1000, true);
|
|
|
|
if (!m_toolBar->canHide())
|
|
return;
|
|
|
|
TQPoint pos(e->pos());
|
|
|
|
if ((pos.y() > (m_deskY+20)) &&
|
|
(pos.y() < (m_deskY+m_deskHeight-20-1)))
|
|
{
|
|
if (m_toolBar->isHidden())
|
|
return;
|
|
else
|
|
m_toolBar->hide();
|
|
return;
|
|
}
|
|
|
|
int w = m_toolBar->width();
|
|
int h = m_toolBar->height();
|
|
|
|
if (pos.y() < (m_deskY+20))
|
|
{
|
|
if (pos.x() <= (m_deskX+m_deskWidth/2))
|
|
// position top left
|
|
m_toolBar->move(m_deskX, m_deskY);
|
|
else
|
|
// position top right
|
|
m_toolBar->move(m_deskX+m_deskWidth-w-1, m_deskY);
|
|
}
|
|
else
|
|
{
|
|
if (pos.x() <= (m_deskX+m_deskWidth/2))
|
|
// position bot left
|
|
m_toolBar->move(m_deskX, m_deskY+m_deskHeight-h-1);
|
|
else
|
|
// position bot right
|
|
m_toolBar->move(m_deskX+m_deskWidth-w-1, m_deskY+m_deskHeight-h-1);
|
|
}
|
|
m_toolBar->show();
|
|
}
|
|
|
|
void SlideShow::wheelEvent(TQWheelEvent *e)
|
|
{
|
|
if (!m_enableMouseWheel) return;
|
|
|
|
if (m_endOfShow)
|
|
slotClose();
|
|
|
|
int delta = e->delta();
|
|
|
|
if (delta < 0)
|
|
{
|
|
m_timer->stop();
|
|
m_toolBar->setPaused(true);
|
|
slotNext();
|
|
}
|
|
else if (delta > 0 && m_fileIndex-1 >= 0)
|
|
{
|
|
m_timer->stop();
|
|
m_toolBar->setPaused(true);
|
|
slotPrev();
|
|
}
|
|
}
|
|
|
|
void SlideShow::slotMouseMoveTimeOut()
|
|
{
|
|
TQPoint pos(TQCursor::pos());
|
|
if ((pos.y() < (m_deskY+20)) ||
|
|
(pos.y() > (m_deskY+m_deskHeight-20-1)))
|
|
return;
|
|
|
|
setCursor(TQCursor(TQt::BlankCursor));
|
|
}
|
|
|
|
int SlideShow::effectNone(bool /* aInit */)
|
|
{
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
|
|
int SlideShow::effectChessboard(bool aInit)
|
|
{
|
|
int y;
|
|
|
|
if (aInit)
|
|
{
|
|
m_w = width();
|
|
m_h = height();
|
|
m_dx = 8; // width of one tile
|
|
m_dy = 8; // height of one tile
|
|
m_j = (m_w+m_dx-1)/m_dx; // number of tiles
|
|
m_x = m_j*m_dx; // shrinking x-offset from screen border
|
|
m_ix = 0; // growing x-offset from screen border
|
|
m_iy = 0; // 0 or m_dy for growing tiling effect
|
|
m_y = m_j&1 ? 0 : m_dy; // 0 or m_dy for shrinking tiling effect
|
|
m_wait = 800 / m_j; // timeout between effects
|
|
}
|
|
|
|
if (m_ix >= m_w)
|
|
{
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
m_ix += m_dx;
|
|
m_x -= m_dx;
|
|
m_iy = m_iy ? 0 : m_dy;
|
|
m_y = m_y ? 0 : m_dy;
|
|
|
|
for (y=0; y<m_w; y+=(m_dy<<1))
|
|
{
|
|
bitBlt(this, m_ix, y+m_iy, m_currImage, m_ix, y+m_iy,
|
|
m_dx, m_dy, CopyROP, true);
|
|
bitBlt(this, m_x, y+m_y, m_currImage, m_x, y+m_y,
|
|
m_dx, m_dy, CopyROP, true);
|
|
}
|
|
|
|
return m_wait;
|
|
}
|
|
|
|
int SlideShow::effectMeltdown(bool aInit)
|
|
{
|
|
int i, x, y;
|
|
bool done;
|
|
|
|
if (aInit)
|
|
{
|
|
delete [] m_intArray;
|
|
m_w = width();
|
|
m_h = height();
|
|
m_dx = 4;
|
|
m_dy = 16;
|
|
m_ix = m_w / m_dx;
|
|
m_intArray = new int[m_ix];
|
|
for (i=m_ix-1; i>=0; i--)
|
|
m_intArray[i] = 0;
|
|
}
|
|
|
|
done = true;
|
|
for (i=0,x=0; i<m_ix; i++,x+=m_dx)
|
|
{
|
|
y = m_intArray[i];
|
|
if (y >= m_h) continue;
|
|
done = false;
|
|
if ((rand()&15) < 6) continue;
|
|
bitBlt(this, x, y+m_dy, this, x, y, m_dx, m_h-y-m_dy, CopyROP, true);
|
|
bitBlt(this, x, y, m_currImage, x, y, m_dx, m_dy, CopyROP, true);
|
|
m_intArray[i] += m_dy;
|
|
}
|
|
|
|
if (done)
|
|
{
|
|
delete [] m_intArray;
|
|
m_intArray = NULL;
|
|
return -1;
|
|
}
|
|
|
|
return 15;
|
|
}
|
|
|
|
int SlideShow::effectSweep(bool aInit)
|
|
{
|
|
int w, h, x, y, i;
|
|
|
|
if (aInit)
|
|
{
|
|
// subtype: 0=sweep right to left, 1=sweep left to right
|
|
// 2=sweep bottom to top, 3=sweep top to bottom
|
|
m_subType = rand() % 4;
|
|
m_w = width();
|
|
m_h = height();
|
|
m_dx = (m_subType==1 ? 16 : -16);
|
|
m_dy = (m_subType==3 ? 16 : -16);
|
|
m_x = (m_subType==1 ? 0 : m_w);
|
|
m_y = (m_subType==3 ? 0 : m_h);
|
|
}
|
|
|
|
if (m_subType==0 || m_subType==1)
|
|
{
|
|
// horizontal sweep
|
|
if ((m_subType==0 && m_x < -64) ||
|
|
(m_subType==1 && m_x > m_w+64))
|
|
{
|
|
return -1;
|
|
}
|
|
for (w=2,i=4,x=m_x; i>0; i--, w<<=1, x-=m_dx)
|
|
{
|
|
bitBlt(this, x, 0, m_currImage, x, 0, w, m_h, CopyROP, true);
|
|
}
|
|
m_x += m_dx;
|
|
}
|
|
else
|
|
{
|
|
// vertical sweep
|
|
if ((m_subType==2 && m_y < -64) ||
|
|
(m_subType==3 && m_y > m_h+64))
|
|
{
|
|
return -1;
|
|
}
|
|
for (h=2,i=4,y=m_y; i>0; i--, h<<=1, y-=m_dy)
|
|
{
|
|
bitBlt(this, 0, y, m_currImage, 0, y, m_w, h, CopyROP, true);
|
|
}
|
|
m_y += m_dy;
|
|
}
|
|
|
|
return 20;
|
|
}
|
|
|
|
int SlideShow::effectRandom(bool /*aInit*/)
|
|
{
|
|
int x, y, i, w, h, fact, sz;
|
|
|
|
fact = (rand() % 3) + 1;
|
|
|
|
w = width() >> fact;
|
|
h = height() >> fact;
|
|
sz = 1 << fact;
|
|
|
|
for (i = (w*h)<<1; i > 0; i--)
|
|
{
|
|
x = (rand() % w) << fact;
|
|
y = (rand() % h) << fact;
|
|
bitBlt(this, x, y, m_currImage, x, y, sz, sz, CopyROP, true);
|
|
}
|
|
|
|
showCurrentImage();
|
|
|
|
return -1;
|
|
}
|
|
|
|
int SlideShow::effectGrowing(bool aInit)
|
|
{
|
|
if (aInit)
|
|
{
|
|
m_w = width();
|
|
m_h = height();
|
|
m_x = m_w >> 1;
|
|
m_y = m_h >> 1;
|
|
m_i = 0;
|
|
m_fx = m_x / 100.0;
|
|
m_fy = m_y / 100.0;
|
|
}
|
|
|
|
m_x = (m_w>>1) - (int)(m_i * m_fx);
|
|
m_y = (m_h>>1) - (int)(m_i * m_fy);
|
|
m_i++;
|
|
|
|
if (m_x<0 || m_y<0)
|
|
{
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
bitBlt(this, m_x, m_y, m_currImage, m_x, m_y,
|
|
m_w - (m_x<<1), m_h - (m_y<<1), CopyROP, true);
|
|
|
|
return 20;
|
|
}
|
|
|
|
int SlideShow::effectIncom_ingEdges(bool aInit)
|
|
{
|
|
int x1, y1;
|
|
|
|
if (aInit)
|
|
{
|
|
m_w = width();
|
|
m_h = height();
|
|
m_ix = m_w >> 1;
|
|
m_iy = m_h >> 1;
|
|
m_fx = m_ix / 100.0;
|
|
m_fy = m_iy / 100.0;
|
|
m_i = 0;
|
|
m_subType = rand() & 1;
|
|
}
|
|
|
|
m_x = (int)(m_fx * m_i);
|
|
m_y = (int)(m_fy * m_i);
|
|
|
|
if (m_x>m_ix || m_y>m_iy)
|
|
{
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
x1 = m_w - m_x;
|
|
y1 = m_h - m_y;
|
|
m_i++;
|
|
|
|
if (m_subType)
|
|
{
|
|
// moving image edges
|
|
bitBlt(this, 0, 0, m_currImage, m_ix-m_x, m_iy-m_y, m_x, m_y, CopyROP, true);
|
|
bitBlt(this, x1, 0, m_currImage, m_ix, m_iy-m_y, m_x, m_y, CopyROP, true);
|
|
bitBlt(this, 0, y1, m_currImage, m_ix-m_x, m_iy, m_x, m_y, CopyROP, true);
|
|
bitBlt(this, x1, y1, m_currImage, m_ix, m_iy, m_x, m_y, CopyROP, true);
|
|
}
|
|
else
|
|
{
|
|
// fixed image edges
|
|
bitBlt(this, 0, 0, m_currImage, 0, 0, m_x, m_y, CopyROP, true);
|
|
bitBlt(this, x1, 0, m_currImage, x1, 0, m_x, m_y, CopyROP, true);
|
|
bitBlt(this, 0, y1, m_currImage, 0, y1, m_x, m_y, CopyROP, true);
|
|
bitBlt(this, x1, y1, m_currImage, x1, y1, m_x, m_y, CopyROP, true);
|
|
}
|
|
return 20;
|
|
}
|
|
|
|
int SlideShow::effectHorizLines(bool aInit)
|
|
{
|
|
static int iyPos[] = { 0, 4, 2, 6, 1, 5, 3, 7, -1 };
|
|
int y;
|
|
|
|
if (aInit)
|
|
{
|
|
m_w = width();
|
|
m_h = height();
|
|
m_i = 0;
|
|
}
|
|
|
|
if (iyPos[m_i] < 0) return -1;
|
|
|
|
for (y=iyPos[m_i]; y<m_h; y+=8)
|
|
{
|
|
bitBlt(this, 0, y, m_currImage, 0, y, m_w, 1, CopyROP, true);
|
|
}
|
|
|
|
m_i++;
|
|
if (iyPos[m_i] >= 0) return 160;
|
|
return -1;
|
|
}
|
|
|
|
int SlideShow::effectVertLines(bool aInit)
|
|
{
|
|
static int ixPos[] = { 0, 4, 2, 6, 1, 5, 3, 7, -1 };
|
|
int x;
|
|
|
|
if (aInit)
|
|
{
|
|
m_w = width();
|
|
m_h = height();
|
|
m_i = 0;
|
|
}
|
|
|
|
if (ixPos[m_i] < 0) return -1;
|
|
|
|
for (x=ixPos[m_i]; x<m_w; x+=8)
|
|
{
|
|
bitBlt(this, x, 0, m_currImage, x, 0, 1, m_h, CopyROP, true);
|
|
}
|
|
|
|
m_i++;
|
|
if (ixPos[m_i] >= 0) return 160;
|
|
return -1;
|
|
}
|
|
|
|
int SlideShow::effectMultiCircleOut(bool aInit)
|
|
{
|
|
int x, y, i;
|
|
double alpha;
|
|
static TQPointArray pa(4);
|
|
|
|
if (aInit)
|
|
{
|
|
startPainter();
|
|
m_w = width();
|
|
m_h = height();
|
|
m_x = m_w;
|
|
m_y = m_h>>1;
|
|
pa.setPoint(0, m_w>>1, m_h>>1);
|
|
pa.setPoint(3, m_w>>1, m_h>>1);
|
|
m_fy = sqrt((double)m_w*m_w + m_h*m_h) / 2;
|
|
m_i = rand()%15 + 2;
|
|
m_fd = M_PI*2/m_i;
|
|
m_alpha = m_fd;
|
|
m_wait = 10 * m_i;
|
|
m_fx = M_PI/32; // divisor must be powers of 8
|
|
}
|
|
|
|
if (m_alpha < 0)
|
|
{
|
|
m_painter.end();
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
for (alpha=m_alpha, i=m_i; i>=0; i--, alpha+=m_fd)
|
|
{
|
|
x = (m_w>>1) + (int)(m_fy * cos(-alpha));
|
|
y = (m_h>>1) + (int)(m_fy * sin(-alpha));
|
|
|
|
m_x = (m_w>>1) + (int)(m_fy * cos(-alpha + m_fx));
|
|
m_y = (m_h>>1) + (int)(m_fy * sin(-alpha + m_fx));
|
|
|
|
pa.setPoint(1, x, y);
|
|
pa.setPoint(2, m_x, m_y);
|
|
|
|
m_painter.drawPolygon(pa);
|
|
}
|
|
|
|
m_alpha -= m_fx;
|
|
|
|
return m_wait;
|
|
}
|
|
|
|
int SlideShow::effectSpiralIn(bool aInit)
|
|
{
|
|
if (aInit)
|
|
{
|
|
startPainter();
|
|
m_w = width();
|
|
m_h = height();
|
|
m_ix = m_w / 8;
|
|
m_iy = m_h / 8;
|
|
m_x0 = 0;
|
|
m_x1 = m_w - m_ix;
|
|
m_y0 = m_iy;
|
|
m_y1 = m_h - m_iy;
|
|
m_dx = m_ix;
|
|
m_dy = 0;
|
|
m_i = 0;
|
|
m_j = 16 * 16;
|
|
m_x = 0;
|
|
m_y = 0;
|
|
}
|
|
|
|
if (m_i==0 && m_x0>=m_x1)
|
|
{
|
|
m_painter.end();
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
if (m_i==0 && m_x>=m_x1) // switch to: down on right side
|
|
{
|
|
m_i = 1;
|
|
m_dx = 0;
|
|
m_dy = m_iy;
|
|
m_x1 -= m_ix;
|
|
}
|
|
else if (m_i==1 && m_y>=m_y1) // switch to: right to left on bottom side
|
|
{
|
|
m_i = 2;
|
|
m_dx = -m_ix;
|
|
m_dy = 0;
|
|
m_y1 -= m_iy;
|
|
}
|
|
else if (m_i==2 && m_x<=m_x0) // switch to: up on left side
|
|
{
|
|
m_i = 3;
|
|
m_dx = 0;
|
|
m_dy = -m_iy;
|
|
m_x0 += m_ix;
|
|
}
|
|
else if (m_i==3 && m_y<=m_y0) // switch to: left to right on top side
|
|
{
|
|
m_i = 0;
|
|
m_dx = m_ix;
|
|
m_dy = 0;
|
|
m_y0 += m_iy;
|
|
}
|
|
|
|
bitBlt(this, m_x, m_y, m_currImage, m_x, m_y, m_ix, m_iy, CopyROP, true);
|
|
|
|
m_x += m_dx;
|
|
m_y += m_dy;
|
|
m_j--;
|
|
|
|
return 8;
|
|
}
|
|
|
|
int SlideShow::effectCircleOut(bool aInit)
|
|
{
|
|
int x, y;
|
|
static TQPointArray pa(4);
|
|
|
|
if (aInit)
|
|
{
|
|
startPainter();
|
|
m_w = width();
|
|
m_h = height();
|
|
m_x = m_w;
|
|
m_y = m_h>>1;
|
|
m_alpha = 2*M_PI;
|
|
pa.setPoint(0, m_w>>1, m_h>>1);
|
|
pa.setPoint(3, m_w>>1, m_h>>1);
|
|
m_fx = M_PI/16; // divisor must be powers of 8
|
|
m_fy = sqrt((double)m_w*m_w + m_h*m_h) / 2;
|
|
}
|
|
|
|
if (m_alpha < 0)
|
|
{
|
|
m_painter.end();
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
x = m_x;
|
|
y = m_y;
|
|
m_x = (m_w>>1) + (int)(m_fy * cos(m_alpha));
|
|
m_y = (m_h>>1) + (int)(m_fy * sin(m_alpha));
|
|
m_alpha -= m_fx;
|
|
|
|
pa.setPoint(1, x, y);
|
|
pa.setPoint(2, m_x, m_y);
|
|
|
|
m_painter.drawPolygon(pa);
|
|
|
|
return 20;
|
|
}
|
|
|
|
|
|
int SlideShow::effectBlobs(bool aInit)
|
|
{
|
|
int r;
|
|
|
|
if (aInit)
|
|
{
|
|
startPainter();
|
|
m_alpha = M_PI * 2;
|
|
m_w = width();
|
|
m_h = height();
|
|
m_i = 150;
|
|
}
|
|
|
|
if (m_i <= 0)
|
|
{
|
|
m_painter.end();
|
|
showCurrentImage();
|
|
return -1;
|
|
}
|
|
|
|
m_x = rand() % m_w;
|
|
m_y = rand() % m_h;
|
|
r = (rand() % 200) + 50;
|
|
|
|
m_painter.drawEllipse(m_x-r, m_y-r, r, r);
|
|
m_i--;
|
|
|
|
return 10;
|
|
}
|
|
|
|
void SlideShow::startPainter(TQt::PenStyle aPen)
|
|
{
|
|
TQBrush brush;
|
|
brush.setPixmap(*(m_currImage));
|
|
|
|
if (m_painter.isActive())
|
|
m_painter.end();
|
|
|
|
m_painter.begin(this);
|
|
m_painter.setBrush(brush);
|
|
m_painter.setPen(aPen);
|
|
}
|
|
|
|
void SlideShow::slotPause()
|
|
{
|
|
m_timer->stop();
|
|
|
|
if (m_toolBar->isHidden())
|
|
{
|
|
int w = m_toolBar->width();
|
|
m_toolBar->move(m_deskWidth-w-1,0);
|
|
m_toolBar->show();
|
|
}
|
|
}
|
|
|
|
void SlideShow::slotPlay()
|
|
{
|
|
m_toolBar->hide();
|
|
slotTimeOut();
|
|
}
|
|
|
|
void SlideShow::slotPrev()
|
|
{
|
|
loadPrevImage();
|
|
if (!m_currImage || m_fileList.isEmpty())
|
|
{
|
|
showEndOfShow();
|
|
return;
|
|
}
|
|
m_effectRunning = false;
|
|
showCurrentImage();
|
|
}
|
|
|
|
void SlideShow::slotNext()
|
|
{
|
|
loadNextImage();
|
|
if (!m_currImage || m_fileList.isEmpty())
|
|
{
|
|
showEndOfShow();
|
|
return;
|
|
}
|
|
m_effectRunning = false;
|
|
showCurrentImage();
|
|
}
|
|
|
|
void SlideShow::slotClose()
|
|
{
|
|
close();
|
|
}
|
|
|
|
} // NameSpace KIPISlideShowPlugin
|