summaryrefslogtreecommitdiffstats
path: root/src/utilities/slideshow
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2024-11-22 18:41:30 +0900
committerMichele Calgaro <[email protected]>2024-11-22 18:41:30 +0900
commitee0d99607c14cb63d3ebdb3a970b508949fa8219 (patch)
tree94ac1efedb94cb38bf6879ba0610fe75b554216b /src/utilities/slideshow
parent4adff739380e4ae9f30e443ee95644f184456869 (diff)
downloaddigikam-ee0d99607c14cb63d3ebdb3a970b508949fa8219.tar.gz
digikam-ee0d99607c14cb63d3ebdb3a970b508949fa8219.zip
Rename 'digikam' folder to 'src'
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'src/utilities/slideshow')
-rw-r--r--src/utilities/slideshow/Makefile.am17
-rw-r--r--src/utilities/slideshow/slideshow.cpp679
-rw-r--r--src/utilities/slideshow/slideshow.h91
-rw-r--r--src/utilities/slideshow/slideshowsettings.h125
-rw-r--r--src/utilities/slideshow/toolbar.cpp217
-rw-r--r--src/utilities/slideshow/toolbar.h85
6 files changed, 1214 insertions, 0 deletions
diff --git a/src/utilities/slideshow/Makefile.am b/src/utilities/slideshow/Makefile.am
new file mode 100644
index 00000000..5340e80c
--- /dev/null
+++ b/src/utilities/slideshow/Makefile.am
@@ -0,0 +1,17 @@
+METASOURCES = AUTO
+
+INCLUDES = -I$(top_srcdir)/src/digikam \
+ -I$(top_srcdir)/src/libs/dimg \
+ -I$(top_srcdir)/src/libs/dmetadata \
+ -I$(top_srcdir)/src/libs/themeengine \
+ -I$(top_srcdir)/src/libs/threadimageio \
+ $(LIBKDCRAW_CFLAGS) \
+ $(all_includes)
+
+noinst_LTLIBRARIES = libslideshow.la
+
+libslideshow_la_SOURCES = toolbar.cpp slideshow.cpp
+
+libslideshow_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_TQT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_TDEIO) -ltdetexteditor
+
+
diff --git a/src/utilities/slideshow/slideshow.cpp b/src/utilities/slideshow/slideshow.cpp
new file mode 100644
index 00000000..33cf9edc
--- /dev/null
+++ b/src/utilities/slideshow/slideshow.cpp
@@ -0,0 +1,679 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2005-04-21
+ * Description : slide show tool using preview of pictures.
+ *
+ * Copyright (C) 2005-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+#define MAXSTRINGLEN 80
+
+// TQt includes.
+
+#include <tqtimer.h>
+#include <tqpixmap.h>
+#include <tqdesktopwidget.h>
+#include <tqevent.h>
+#include <tqcursor.h>
+#include <tqpainter.h>
+#include <tqfont.h>
+
+// KDE includes.
+
+#include <tdeapplication.h>
+#include <kiconloader.h>
+#include <tdelocale.h>
+#include <tdeversion.h>
+#include <tdeglobalsettings.h>
+
+// Local includes.
+
+#include "ddebug.h"
+#include "dimg.h"
+#include "toolbar.h"
+#include "previewloadthread.h"
+#include "slideshow.h"
+#include "slideshow.moc"
+
+namespace Digikam
+{
+
+class SlideShowPriv
+{
+public:
+
+ SlideShowPriv()
+ {
+ previewThread = 0;
+ mouseMoveTimer = 0;
+ timer = 0;
+ toolBar = 0;
+ fileIndex = -1;
+ endOfShow = false;
+ pause = false;
+ }
+
+ bool endOfShow;
+ bool pause;
+
+ int deskX;
+ int deskY;
+ int deskWidth;
+ int deskHeight;
+ int fileIndex;
+
+ TQTimer *mouseMoveTimer; // To hide cursor when not moved.
+ TQTimer *timer;
+
+ TQPixmap pixmap;
+
+ DImg preview;
+
+ KURL currentImage;
+
+ PreviewLoadThread *previewThread;
+ PreviewLoadThread *previewPreloadThread;
+
+ ToolBar *toolBar;
+
+ SlideShowSettings settings;
+};
+
+SlideShow::SlideShow(const SlideShowSettings& settings)
+ : TQWidget(0, 0, WStyle_StaysOnTop | WType_Popup |
+ WX11BypassWM | WDestructiveClose)
+{
+ d = new SlideShowPriv;
+ d->settings = settings;
+
+ // ---------------------------------------------------------------
+
+#if KDE_IS_VERSION(3,2,0)
+ TQRect deskRect = TDEGlobalSettings::desktopGeometry(this);
+ d->deskX = deskRect.x();
+ d->deskY = deskRect.y();
+ d->deskWidth = deskRect.width();
+ d->deskHeight = deskRect.height();
+#else
+ TQRect deskRect = TQApplication::desktop()->screenGeometry(this);
+ d->deskX = deskRect.x();
+ d->deskY = deskRect.y();
+ d->deskWidth = deskRect.width();
+ d->deskHeight = deskRect.height();
+#endif
+
+ move(d->deskX, d->deskY);
+ resize(d->deskWidth, d->deskHeight);
+ setPaletteBackgroundColor(TQt::black);
+
+ // ---------------------------------------------------------------
+
+ d->toolBar = new ToolBar(this);
+ d->toolBar->hide();
+ if (!d->settings.loop)
+ d->toolBar->setEnabledPrev(false);
+
+ connect(d->toolBar, TQ_SIGNAL(signalPause()),
+ this, TQ_SLOT(slotPause()));
+
+ connect(d->toolBar, TQ_SIGNAL(signalPlay()),
+ this, TQ_SLOT(slotPlay()));
+
+ connect(d->toolBar, TQ_SIGNAL(signalNext()),
+ this, TQ_SLOT(slotNext()));
+
+ connect(d->toolBar, TQ_SIGNAL(signalPrev()),
+ this, TQ_SLOT(slotPrev()));
+
+ connect(d->toolBar, TQ_SIGNAL(signalClose()),
+ this, TQ_SLOT(slotClose()));
+
+ // ---------------------------------------------------------------
+
+ d->previewThread = new PreviewLoadThread();
+ d->previewPreloadThread = new PreviewLoadThread();
+ d->timer = new TQTimer(this);
+ d->mouseMoveTimer = new TQTimer(this);
+
+ connect(d->previewThread, TQ_SIGNAL(signalImageLoaded(const LoadingDescription &, const DImg &)),
+ this, TQ_SLOT(slotGotImagePreview(const LoadingDescription &, const DImg&)));
+
+ connect(d->mouseMoveTimer, TQ_SIGNAL(timeout()),
+ this, TQ_SLOT(slotMouseMoveTimeOut()));
+
+ connect(d->timer, TQ_SIGNAL(timeout()),
+ this, TQ_SLOT(slotTimeOut()));
+
+ d->timer->start(10, true);
+
+ // ---------------------------------------------------------------
+
+ setMouseTracking(true);
+ slotMouseMoveTimeOut();
+}
+
+SlideShow::~SlideShow()
+{
+ d->timer->stop();
+ d->mouseMoveTimer->stop();
+
+ delete d->timer;
+ delete d->mouseMoveTimer;
+ delete d->previewThread;
+ delete d->previewPreloadThread;
+ delete d;
+}
+
+void SlideShow::setCurrent(const KURL& url)
+{
+ int index = d->settings.fileList.findIndex(url);
+ if (index != -1)
+ {
+ d->currentImage = url;
+ d->fileIndex = index-1;
+ }
+}
+
+void SlideShow::slotTimeOut()
+{
+ loadNextImage();
+}
+
+void SlideShow::loadNextImage()
+{
+ d->fileIndex++;
+ int num = d->settings.fileList.count();
+
+ if (d->fileIndex >= num)
+ {
+ if (d->settings.loop)
+ {
+ d->fileIndex = 0;
+ }
+ }
+
+ if (!d->settings.loop)
+ {
+ d->toolBar->setEnabledPrev(d->fileIndex > 0);
+ d->toolBar->setEnabledNext(d->fileIndex < num-1);
+ }
+
+ if (d->fileIndex < num)
+ {
+ d->currentImage = d->settings.fileList[d->fileIndex];
+ d->previewThread->load(LoadingDescription(d->currentImage.path(),
+ TQMAX(d->deskWidth, d->deskHeight), d->settings.exifRotate));
+ }
+ else
+ {
+ d->currentImage = KURL();
+ d->preview = DImg();
+ updatePixmap();
+ update();
+ }
+
+}
+
+void SlideShow::loadPrevImage()
+{
+ d->fileIndex--;
+ int num = d->settings.fileList.count();
+
+ if (d->fileIndex < 0)
+ {
+ if (d->settings.loop)
+ {
+ d->fileIndex = num-1;
+ }
+ }
+
+ if (!d->settings.loop)
+ {
+ d->toolBar->setEnabledPrev(d->fileIndex > 0);
+ d->toolBar->setEnabledNext(d->fileIndex < num-1);
+ }
+
+ if (d->fileIndex >= 0)
+ {
+ d->currentImage = d->settings.fileList[d->fileIndex];
+ d->previewThread->load(LoadingDescription(d->currentImage.path(),
+ TQMAX(d->deskWidth, d->deskHeight), d->settings.exifRotate));
+ }
+ else
+ {
+ d->currentImage = KURL();
+ d->preview = DImg();
+ updatePixmap();
+ update();
+ }
+
+}
+
+void SlideShow::slotGotImagePreview(const LoadingDescription&, const DImg& preview)
+{
+ d->preview = preview;
+
+ updatePixmap();
+ update();
+
+ if (!d->endOfShow)
+ {
+ if (!d->pause)
+ d->timer->start(d->settings.delay, true);
+ preloadNextImage();
+ }
+}
+
+void SlideShow::preloadNextImage()
+{
+ int index = d->fileIndex + 1;
+ int num = d->settings.fileList.count();
+
+ if (index >= num)
+ {
+ if (d->settings.loop)
+ {
+ index = 0;
+ }
+ }
+
+ if (index < num)
+ {
+ d->previewPreloadThread->load(LoadingDescription(d->settings.fileList[index].path(),
+ TQMAX(d->deskWidth, d->deskHeight), d->settings.exifRotate));
+ }
+}
+
+void SlideShow::updatePixmap()
+{
+ d->pixmap = TQPixmap(size());
+ d->pixmap.fill(TQt::black);
+ TQPainter p(&(d->pixmap));
+
+ if (!d->currentImage.path().isEmpty())
+ {
+ if (!d->preview.isNull())
+ {
+ // Preview extraction is complete... Draw the image.
+
+ TQPixmap pix(d->preview.smoothScale(width(), height(), TQSize::ScaleMin).convertToPixmap());
+ p.drawPixmap((width()-pix.width())/2,
+ (height()-pix.height())/2, pix,
+ 0, 0, pix.width(), pix.height());
+
+ TQString str;
+ PhotoInfoContainer photoInfo = d->settings.pictInfoMap[d->currentImage].photoInfo;
+ int offset = 0;
+
+ // Display the Comments.
+
+ if (d->settings.printComment)
+ {
+ str = d->settings.pictInfoMap[d->currentImage].comment;
+ printComments(p, offset, str);
+ }
+
+ // Display the Make and Model.
+
+ if (d->settings.printMakeModel)
+ {
+ str = TQString();
+
+ if (!photoInfo.make.isEmpty())
+ str = photoInfo.make;
+
+ if (!photoInfo.model.isEmpty())
+ {
+ if (!photoInfo.make.isEmpty())
+ str += TQString(" / ");
+
+ str += photoInfo.model;
+ }
+
+ printInfoText(p, offset, str);
+ }
+
+ // Display the Exposure and Sensitivity.
+
+ if (d->settings.printExpoSensitivity)
+ {
+ str = TQString();
+
+ if (!photoInfo.exposureTime.isEmpty())
+ str = photoInfo.exposureTime;
+
+ if (!photoInfo.sensitivity.isEmpty())
+ {
+ if (!photoInfo.exposureTime.isEmpty())
+ str += TQString(" / ");
+
+ str += i18n("%1 ISO").arg(photoInfo.sensitivity);
+ }
+
+ printInfoText(p, offset, str);
+ }
+
+ // Display the Aperture and Focal.
+
+ if (d->settings.printApertureFocal)
+ {
+ str = TQString();
+
+ if (!photoInfo.aperture.isEmpty())
+ str = photoInfo.aperture;
+
+ if (photoInfo.focalLength35mm.isEmpty())
+ {
+ if (!photoInfo.focalLength.isEmpty())
+ {
+ if (!photoInfo.aperture.isEmpty())
+ str += TQString(" / ");
+
+ str += photoInfo.focalLength;
+ }
+ }
+ else
+ {
+ if (!photoInfo.aperture.isEmpty())
+ str += TQString(" / ");
+
+ if (!photoInfo.focalLength.isEmpty())
+ str += TQString("%1 (35mm: %2)").arg(photoInfo.focalLength).arg(photoInfo.focalLength35mm);
+ else
+ str += TQString("35mm: %1)").arg(photoInfo.focalLength35mm);
+ }
+
+ printInfoText(p, offset, str);
+ }
+
+ // Display the Creation Date.
+
+ if (d->settings.printDate)
+ {
+ if (photoInfo.dateTime.isValid())
+ {
+ str = TDEGlobal::locale()->formatDateTime(photoInfo.dateTime, true, true);
+ printInfoText(p, offset, str);
+ }
+ }
+
+ // Display the image File Name.
+
+ if (d->settings.printName)
+ {
+ str = TQString("%1 (%2/%3)").arg(d->currentImage.filename())
+ .arg(TQString::number(d->fileIndex + 1))
+ .arg(TQString::number(d->settings.fileList.count()));
+
+ printInfoText(p, offset, str);
+ }
+ }
+ else
+ {
+ // ...or preview extraction is failed.
+
+ p.setPen(TQt::white);
+ p.drawText(0, 0, d->pixmap.width(), d->pixmap.height(),
+ TQt::AlignCenter|TQt::WordBreak,
+ i18n("Cannot display image\n\"%1\"")
+ .arg(d->currentImage.fileName()));
+ }
+ }
+ else
+ {
+ // End of Slide Show.
+
+ TQPixmap logo = kapp->iconLoader()->loadIcon("digikam", TDEIcon::NoGroup, 128,
+ TDEIcon::DefaultState, 0, true);
+
+ TQFont fn(font());
+ fn.setPointSize(fn.pointSize()+10);
+ fn.setBold(true);
+
+ p.setFont(fn);
+ p.setPen(TQt::white);
+ p.drawPixmap(50, 100, logo);
+ p.drawText(60 + logo.width(), 100 + logo.height()/3, i18n("SlideShow Completed."));
+ p.drawText(60 + logo.width(), 100 + 2*logo.height()/3, i18n("Click To Exit..."));
+
+ d->endOfShow = true;
+ d->toolBar->setEnabledPlay(false);
+ d->toolBar->setEnabledNext(false);
+ d->toolBar->setEnabledPrev(false);
+ }
+}
+
+void SlideShow::printInfoText(TQPainter &p, int &offset, const TQString& str)
+{
+ if (!str.isEmpty())
+ {
+ offset += 20;
+ p.setPen(TQt::black);
+ for (int x=9; x<=11; x++)
+ for (int y=offset+1; y>=offset-1; y--)
+ p.drawText(x, height()-y, str);
+
+ p.setPen(TQt::white);
+ p.drawText(10, height()-offset, str);
+ }
+}
+
+void SlideShow::printComments(TQPainter &p, int &offset, const TQString& comments)
+{
+ 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 miminal lines dimension
+
+ uint commentsLinesLengthLocal = MAXSTRINGLEN;
+
+ 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(TQString(" "));
+ 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());
+ }
+
+ for (int i = 0 ; i < (int)commentsByLines.count() ; i++ )
+ {
+ printInfoText(p, offset, commentsByLines[i]);
+ }
+}
+
+void SlideShow::paintEvent(TQPaintEvent *)
+{
+ bitBlt(this, 0, 0, static_cast<TQPaintDevice*>(&d->pixmap),
+ 0, 0, d->pixmap.width(),
+ d->pixmap.height(), TQt::CopyROP, true);
+}
+
+void SlideShow::slotPause()
+{
+ d->timer->stop();
+ d->pause = true;
+
+ if (d->toolBar->isHidden())
+ {
+ int w = d->toolBar->width();
+ d->toolBar->move(d->deskWidth-w-1,0);
+ d->toolBar->show();
+ }
+}
+
+void SlideShow::slotPlay()
+{
+ d->toolBar->hide();
+ d->pause = false;
+ slotTimeOut();
+}
+
+void SlideShow::slotPrev()
+{
+ loadPrevImage();
+}
+
+void SlideShow::slotNext()
+{
+ loadNextImage();
+}
+
+void SlideShow::slotClose()
+{
+ close();
+}
+
+void SlideShow::wheelEvent(TQWheelEvent * e)
+{
+ if (e->delta() < 0)
+ {
+ d->timer->stop();
+ d->pause = true;
+ d->toolBar->setPaused(true);
+ slotNext();
+ }
+
+ if (e->delta() > 0 && d->fileIndex-1 >= 0)
+ {
+ d->timer->stop();
+ d->pause = true;
+ d->toolBar->setPaused(true);
+ slotPrev();
+ }
+}
+
+void SlideShow::mousePressEvent(TQMouseEvent *e)
+{
+ if (d->endOfShow)
+ close();
+
+ if (e->button() == TQt::LeftButton)
+ {
+ d->timer->stop();
+ d->pause = true;
+ d->toolBar->setPaused(true);
+ slotNext();
+ }
+ else if (e->button() == TQt::RightButton && d->fileIndex-1 >= 0)
+ {
+ d->timer->stop();
+ d->pause = true;
+ d->toolBar->setPaused(true);
+ slotPrev();
+ }
+}
+
+void SlideShow::keyPressEvent(TQKeyEvent *event)
+{
+ if (!event)
+ return;
+
+ d->toolBar->keyPressEvent(event);
+}
+
+void SlideShow::mouseMoveEvent(TQMouseEvent *e)
+{
+ setCursor(TQCursor(TQt::ArrowCursor));
+ d->mouseMoveTimer->start(1000, true);
+
+ if (!d->toolBar->canHide())
+ return;
+
+ TQPoint pos(e->pos());
+
+ if ((pos.y() > (d->deskY+20)) &&
+ (pos.y() < (d->deskY+d->deskHeight-20-1)))
+ {
+ if (d->toolBar->isHidden())
+ return;
+ else
+ d->toolBar->hide();
+ return;
+ }
+
+ int w = d->toolBar->width();
+ int h = d->toolBar->height();
+
+ if (pos.y() < (d->deskY+20))
+ {
+ if (pos.x() <= (d->deskX+d->deskWidth/2))
+ // position top left
+ d->toolBar->move(d->deskX, d->deskY);
+ else
+ // position top right
+ d->toolBar->move(d->deskX+d->deskWidth-w-1, d->deskY);
+ }
+ else
+ {
+ if (pos.x() <= (d->deskX+d->deskWidth/2))
+ // position bot left
+ d->toolBar->move(d->deskX, d->deskY+d->deskHeight-h-1);
+ else
+ // position bot right
+ d->toolBar->move(d->deskX+d->deskWidth-w-1, d->deskY+d->deskHeight-h-1);
+ }
+ d->toolBar->show();
+}
+
+void SlideShow::slotMouseMoveTimeOut()
+{
+ TQPoint pos(TQCursor::pos());
+ if ((pos.y() < (d->deskY+20)) ||
+ (pos.y() > (d->deskY+d->deskHeight-20-1)))
+ return;
+
+ setCursor(TQCursor(TQt::BlankCursor));
+}
+
+} // NameSpace Digikam
diff --git a/src/utilities/slideshow/slideshow.h b/src/utilities/slideshow/slideshow.h
new file mode 100644
index 00000000..dc15ce1c
--- /dev/null
+++ b/src/utilities/slideshow/slideshow.h
@@ -0,0 +1,91 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2005-04-21
+ * Description : slide show tool using preview of pictures.
+ *
+ * Copyright (C) 2005-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+#ifndef SLIDE_SHOW_H
+#define SLIDE_SHOW_H
+
+// TQt includes.
+
+#include <tqwidget.h>
+
+// Local includes.
+
+#include "digikam_export.h"
+#include "loadingdescription.h"
+#include "slideshowsettings.h"
+
+namespace Digikam
+{
+
+class DImg;
+class SlideShowPriv;
+
+class DIGIKAM_EXPORT SlideShow : public TQWidget
+{
+ TQ_OBJECT
+
+
+public:
+
+ SlideShow(const SlideShowSettings& settings);
+ ~SlideShow();
+
+ void setCurrent(const KURL& url);
+
+protected:
+
+ void paintEvent(TQPaintEvent *);
+ void mousePressEvent(TQMouseEvent *);
+ void mouseMoveEvent(TQMouseEvent *);
+ void keyPressEvent(TQKeyEvent *);
+ void wheelEvent(TQWheelEvent *);
+
+private slots:
+
+ void slotTimeOut();
+ void slotMouseMoveTimeOut();
+ void slotGotImagePreview(const LoadingDescription &, const DImg &);
+
+ void slotPause();
+ void slotPlay();
+ void slotPrev();
+ void slotNext();
+ void slotClose();
+
+private:
+
+ void loadNextImage();
+ void loadPrevImage();
+ void preloadNextImage();
+ void updatePixmap();
+ void printInfoText(TQPainter &p, int &offset, const TQString& str);
+ void printComments(TQPainter &p, int &offset, const TQString& comments);
+
+private:
+
+ SlideShowPriv *d;
+};
+
+} // NameSpace Digikam
+
+#endif /* SLIDE_SHOW_H */
diff --git a/src/utilities/slideshow/slideshowsettings.h b/src/utilities/slideshow/slideshowsettings.h
new file mode 100644
index 00000000..85057f27
--- /dev/null
+++ b/src/utilities/slideshow/slideshowsettings.h
@@ -0,0 +1,125 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2007-02-13
+ * Description : slide show settings container.
+ *
+ * Copyright (C) 2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+#ifndef SLIDESHOWSETTINGSCONTAINER_H
+#define SLIDESHOWSETTINGSCONTAINER_H
+
+// TQt includes.
+
+#include <tqmap.h>
+
+// KDE includes.
+
+#include <kurl.h>
+
+// Local includes.
+
+#include "photoinfocontainer.h"
+#include "digikam_export.h"
+
+namespace Digikam
+{
+
+/** This class contain the information of one picture to slide */
+class DIGIKAM_EXPORT SlidePictureInfo
+{
+
+public:
+
+ SlidePictureInfo(){};
+
+ ~SlidePictureInfo(){};
+
+public:
+
+ /** Image Comment */
+ TQString comment;
+
+ /** Exif photo info of picture */
+ PhotoInfoContainer photoInfo;
+};
+
+// --------------------------------------------------------------------------------
+
+/** This class contain all settings to perform a slide show of a group of pictures */
+class DIGIKAM_EXPORT SlideShowSettings
+{
+
+public:
+
+ SlideShowSettings()
+ {
+ exifRotate = true;
+ printName = true;
+ printDate = false;
+ printComment = false;
+ printApertureFocal = false;
+ printMakeModel = false;
+ printExpoSensitivity = false;
+ loop = false;
+ delay = 5;
+ };
+
+ ~SlideShowSettings(){};
+
+public:
+
+ // Global Slide Show Settings
+
+ /** Auto-rotate image accordinly with Exif Rotation tag */
+ bool exifRotate;
+
+ /** Print picture file name during slide */
+ bool printName;
+
+ /** Print picture creation date during slide */
+ bool printDate;
+
+ /** Print camera Aperture and Focal during slide */
+ bool printApertureFocal;
+
+ /** Print camera Make and Model during slide */
+ bool printMakeModel;
+
+ /** Print camera Exposure and Sensitivity during slide */
+ bool printExpoSensitivity;
+
+ /** Print picture comment during slide */
+ bool printComment;
+
+ /** Slide pictures in loop */
+ bool loop;
+
+ /** Delay in seconds */
+ int delay;
+
+ /** List of pictures URL to slide */
+ KURL::List fileList;
+
+ /** Map of pictures information to slide */
+ TQMap<KURL, SlidePictureInfo> pictInfoMap;
+};
+
+} // namespace Digikam
+
+#endif // SLIDESHOWSETTINGSCONTAINER_H
diff --git a/src/utilities/slideshow/toolbar.cpp b/src/utilities/slideshow/toolbar.cpp
new file mode 100644
index 00000000..dbecd4ad
--- /dev/null
+++ b/src/utilities/slideshow/toolbar.cpp
@@ -0,0 +1,217 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2004-10-05
+ * Description : a tool bar for slideshow
+ *
+ * Copyright (C) 2004-2005 by Renchi Raju <[email protected]>
+ * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+// TQt includes.
+
+#include <tqtoolbutton.h>
+#include <tqlayout.h>
+#include <tqpixmap.h>
+
+// KDE includes.
+
+#include <tdeapplication.h>
+#include <kiconloader.h>
+#include <tdelocale.h>
+
+// Local includes.
+
+#include "toolbar.h"
+#include "toolbar.moc"
+
+namespace Digikam
+{
+
+class ToolBarPriv
+{
+public:
+
+ ToolBarPriv()
+ {
+ playBtn = 0;
+ stopBtn = 0;
+ nextBtn = 0;
+ prevBtn = 0;
+ canHide = true;
+ }
+
+ bool canHide;
+
+ TQToolButton *playBtn;
+ TQToolButton *stopBtn;
+ TQToolButton *nextBtn;
+ TQToolButton *prevBtn;
+};
+
+ToolBar::ToolBar(TQWidget* parent)
+ : TQWidget(parent)
+{
+ d = new ToolBarPriv;
+
+ TQHBoxLayout* lay = new TQHBoxLayout(this);
+ d->playBtn = new TQToolButton(this);
+ d->prevBtn = new TQToolButton(this);
+ d->nextBtn = new TQToolButton(this);
+ d->stopBtn = new TQToolButton(this);
+ d->playBtn->setToggleButton(true);
+
+ TDEIconLoader* loader = kapp->iconLoader();
+ d->playBtn->setIconSet(loader->loadIcon("media-playback-pause", TDEIcon::NoGroup, 22));
+ d->prevBtn->setIconSet(loader->loadIcon("back", TDEIcon::NoGroup, 22));
+ d->nextBtn->setIconSet(loader->loadIcon("forward", TDEIcon::NoGroup, 22));
+ d->stopBtn->setIconSet(loader->loadIcon("process-stop", TDEIcon::NoGroup, 22));
+
+ lay->addWidget(d->playBtn);
+ lay->addWidget(d->prevBtn);
+ lay->addWidget(d->nextBtn);
+ lay->addWidget(d->stopBtn);
+
+ setBackgroundMode(TQt::NoBackground);
+ adjustSize();
+ setSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed);
+
+ connect(d->playBtn, TQ_SIGNAL(toggled(bool)),
+ this, TQ_SLOT(slotPlayBtnToggled()));
+
+ connect(d->nextBtn, TQ_SIGNAL(clicked()),
+ this, TQ_SLOT(slotNexPrevClicked()));
+
+ connect(d->prevBtn, TQ_SIGNAL(clicked()),
+ this, TQ_SLOT(slotNexPrevClicked()));
+
+ connect(d->nextBtn, TQ_SIGNAL(clicked()),
+ this, TQ_SIGNAL(signalNext()));
+
+ connect(d->prevBtn, TQ_SIGNAL(clicked()),
+ this, TQ_SIGNAL(signalPrev()));
+
+ connect(d->stopBtn, TQ_SIGNAL(clicked()),
+ this, TQ_SIGNAL(signalClose()));
+}
+
+ToolBar::~ToolBar()
+{
+ delete d;
+}
+
+bool ToolBar::canHide() const
+{
+ return d->canHide;
+}
+
+bool ToolBar::isPaused() const
+{
+ return d->playBtn->isOn();
+}
+
+void ToolBar::setPaused(bool val)
+{
+ if (val == isPaused())
+ return;
+
+ d->playBtn->setOn(val);
+ slotPlayBtnToggled();
+}
+
+void ToolBar::setEnabledPlay(bool val)
+{
+ d->playBtn->setEnabled(val);
+}
+
+void ToolBar::setEnabledNext(bool val)
+{
+ d->nextBtn->setEnabled(val);
+}
+
+void ToolBar::setEnabledPrev(bool val)
+{
+ d->prevBtn->setEnabled(val);
+}
+
+void ToolBar::slotPlayBtnToggled()
+{
+ if (d->playBtn->isOn())
+ {
+ d->canHide = false;
+ TDEIconLoader* loader = kapp->iconLoader();
+ d->playBtn->setIconSet(loader->loadIcon("media-playback-start", TDEIcon::NoGroup, 22));
+ emit signalPause();
+ }
+ else
+ {
+ d->canHide = true;
+ TDEIconLoader* loader = kapp->iconLoader();
+ d->playBtn->setIconSet(loader->loadIcon("media-playback-pause", TDEIcon::NoGroup, 22));
+ emit signalPlay();
+ }
+}
+
+void ToolBar::slotNexPrevClicked()
+{
+ if (!d->playBtn->isOn())
+ {
+ d->playBtn->setOn(true);
+ d->canHide = false;
+ TDEIconLoader* loader = kapp->iconLoader();
+ d->playBtn->setIconSet(loader->loadIcon("media-playback-start", TDEIcon::NoGroup, 22));
+ emit signalPause();
+ }
+}
+
+void ToolBar::keyPressEvent(TQKeyEvent *event)
+{
+ switch(event->key())
+ {
+ case(TQt::Key_Space):
+ {
+ if (d->playBtn->isEnabled())
+ d->playBtn->animateClick();
+ break;
+ }
+ case(TQt::Key_Prior):
+ {
+ if (d->prevBtn->isEnabled())
+ d->prevBtn->animateClick();
+ break;
+ }
+ case(TQt::Key_Next):
+ {
+ if (d->nextBtn->isEnabled())
+ d->nextBtn->animateClick();
+ break;
+ }
+ case(TQt::Key_Escape):
+ {
+ if (d->stopBtn->isEnabled())
+ d->stopBtn->animateClick();
+ break;
+ }
+ default:
+ break;
+ }
+
+ event->accept();
+}
+
+} // Namespace Digikam
+
diff --git a/src/utilities/slideshow/toolbar.h b/src/utilities/slideshow/toolbar.h
new file mode 100644
index 00000000..97262c12
--- /dev/null
+++ b/src/utilities/slideshow/toolbar.h
@@ -0,0 +1,85 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date : 2004-10-05
+ * Description : a tool bar for slideshow
+ *
+ * Copyright (C) 2004-2005 by Renchi Raju <[email protected]>
+ * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+#ifndef TOOL_BAR_H
+#define TOOL_BAR_H
+
+#include <tqwidget.h>
+
+// Local includes.
+
+#include "digikam_export.h"
+
+class TQToolButton;
+
+namespace Digikam
+{
+
+class ToolBarPriv;
+
+class DIGIKAM_EXPORT ToolBar : public TQWidget
+{
+ TQ_OBJECT
+
+
+public:
+
+ ToolBar(TQWidget* parent);
+ ~ToolBar();
+
+ bool canHide() const;
+ bool isPaused() const;
+ void setPaused(bool val);
+
+ void setEnabledPlay(bool val);
+ void setEnabledNext(bool val);
+ void setEnabledPrev(bool val);
+
+protected:
+
+ void keyPressEvent(TQKeyEvent *event);
+
+signals:
+
+ void signalNext();
+ void signalPrev();
+ void signalClose();
+ void signalPlay();
+ void signalPause();
+
+private slots:
+
+ void slotPlayBtnToggled();
+ void slotNexPrevClicked();
+
+private:
+
+ ToolBarPriv *d;
+
+ friend class SlideShow;
+};
+
+} // Namespace Digikam
+
+#endif /* TOOL_BAR_H */