summaryrefslogtreecommitdiffstats
path: root/kipi-plugins/slideshow/plugin_slideshow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kipi-plugins/slideshow/plugin_slideshow.cpp')
-rw-r--r--kipi-plugins/slideshow/plugin_slideshow.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/kipi-plugins/slideshow/plugin_slideshow.cpp b/kipi-plugins/slideshow/plugin_slideshow.cpp
new file mode 100644
index 0000000..3043893
--- /dev/null
+++ b/kipi-plugins/slideshow/plugin_slideshow.cpp
@@ -0,0 +1,267 @@
+/* ============================================================
+ *
+ * This file is a part of kipi-plugins project
+ * http://www.kipi-plugins.org
+ *
+ * Date : 2003-01-31
+ * 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 Ansi includes.
+
+extern "C"
+{
+#include <sys/time.h>
+}
+
+// C++ includes.
+
+#include <ctime>
+#include <cstdlib>
+
+// Qt includes.
+
+#include <qvaluelist.h>
+#include <qpair.h>
+#include <qstringlist.h>
+
+ // KDE includes.
+
+#include <klocale.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kgenericfactory.h>
+#include <klibloader.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+
+// Lib KIPI includes.
+
+#include <libkipi/interface.h>
+#include <libkipi/imagecollection.h>
+
+// Local includes.
+
+#include "slideshow.h"
+#include "slideshowgl.h"
+#include "slideshowkb.h"
+#include "slideshowconfig.h"
+#include "plugin_slideshow.h"
+#include "plugin_slideshow.moc"
+
+typedef KGenericFactory<Plugin_SlideShow> Factory;
+
+K_EXPORT_COMPONENT_FACTORY(kipiplugin_slideshow, Factory("kipiplugin_slideshow"));
+
+Plugin_SlideShow::Plugin_SlideShow(QObject *parent, const char*,
+ const QStringList&)
+ : KIPI::Plugin( Factory::instance(), parent, "SlideShow")
+{
+ kdDebug( 51001 ) << "Plugin_SlideShow plugin loaded"
+ << endl;
+}
+
+void Plugin_SlideShow::setup( QWidget* widget )
+{
+ KIPI::Plugin::setup( widget );
+
+ m_actionSlideShow = new KAction (i18n("Advanced SlideShow..."),
+ "slideshow",
+ 0,
+ this,
+ SLOT(slotActivate()),
+ actionCollection(),
+ "slideshow");
+
+ m_interface = dynamic_cast< KIPI::Interface* >( parent() );
+
+ m_urlList = new KURL::List();
+
+ if ( !m_interface )
+ {
+ kdError( 51000 ) << "Kipi m_interface is null!" << endl;
+ return;
+ }
+
+ m_actionSlideShow->setEnabled( false );
+
+ connect( m_interface, SIGNAL( currentAlbumChanged( bool ) ),
+ SLOT( slotAlbumChanged( bool ) ) );
+
+ addAction( m_actionSlideShow );
+}
+
+Plugin_SlideShow::~Plugin_SlideShow()
+{
+ if (m_urlList)
+ delete m_urlList;
+}
+
+void Plugin_SlideShow::slotActivate()
+{
+ if ( !m_interface )
+ {
+ kdError( 51000 ) << "Kipi m_interface is null!" << endl;
+ return;
+ }
+
+ bool allowSelectedOnly = true;
+
+ KIPI::ImageCollection currSel = m_interface->currentSelection();
+ if ( !currSel.isValid() || currSel.images().isEmpty() )
+ {
+ allowSelectedOnly = false;
+ }
+
+ m_imagesHasComments = m_interface->hasFeature(KIPI::ImagesHasComments);
+
+ KIPISlideShowPlugin::SlideShowConfig *slideShowConfig
+ = new KIPISlideShowPlugin::SlideShowConfig( allowSelectedOnly, m_interface,kapp->activeWindow(),
+ i18n("Slide Show").ascii(), m_imagesHasComments,
+ m_urlList);
+
+ connect(slideShowConfig, SIGNAL(buttonStartClicked()),
+ this, SLOT(slotSlideShow()));
+
+ slideShowConfig->show();
+}
+
+void Plugin_SlideShow::slotAlbumChanged(bool anyAlbum)
+{
+ if (!anyAlbum)
+ {
+ m_actionSlideShow->setEnabled( false );
+ return;
+ }
+
+ KIPI::Interface* m_interface = dynamic_cast<KIPI::Interface*>( parent() );
+ if ( !m_interface )
+ {
+ kdError( 51000 ) << "Kipi m_interface is null!" << endl;
+ m_actionSlideShow->setEnabled( false );
+ return;
+ }
+
+ KIPI::ImageCollection currAlbum = m_interface->currentAlbum();
+ if ( !currAlbum.isValid() )
+ {
+ kdError( 51000 ) << "Current image collection is not valid." << endl;
+ m_actionSlideShow->setEnabled( false );
+ return;
+ }
+
+ m_actionSlideShow->setEnabled(true);
+}
+
+void Plugin_SlideShow::slotSlideShow()
+{
+ if ( !m_interface )
+ {
+ kdError( 51000 ) << "Kipi m_interface is null!" << endl;
+ return;
+ }
+
+ KConfig config("kipirc");
+
+ bool opengl;
+ bool shuffle;
+ bool wantKB;
+
+ config.setGroup("SlideShow Settings");
+ opengl = config.readBoolEntry("OpenGL");
+ shuffle = config.readBoolEntry("Shuffle");
+ wantKB = config.readEntry("Effect Name (OpenGL)") == QString("Ken Burns");
+
+ if ( m_urlList->isEmpty() )
+ {
+ KMessageBox::sorry(kapp->activeWindow(), i18n("There are no images to show."));
+ return;
+ }
+
+ typedef QPair<QString, int> FileAnglePair;
+ typedef QValueList<FileAnglePair > FileList;
+ FileList fileList;
+ QStringList commentsList;
+
+ for( KURL::List::Iterator urlIt = m_urlList->begin(); urlIt != m_urlList->end(); ++urlIt )
+ {
+ KIPI::ImageInfo info = m_interface->info( *urlIt );
+ fileList.append( FileAnglePair((*urlIt).path(), info.angle()) );
+ commentsList.append(info.description());
+ }
+
+ m_urlList->clear();
+
+ if (shuffle)
+ {
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ srand(tv.tv_sec);
+
+ FileList::iterator it = fileList.begin();
+ FileList::iterator it1;
+
+ QStringList::iterator itcom = commentsList.begin();
+ QStringList::iterator itcom1;
+
+ for (uint i=0; i<fileList.size(); i++)
+ {
+ int inc = (int) (float(fileList.count())*rand()/(RAND_MAX+1.0));
+
+ it1 = fileList.begin();
+ it1 += inc;
+
+ itcom1 = commentsList.begin();
+ itcom1 += inc;
+
+ qSwap(*(it++), *(it1));
+ qSwap(*(itcom++), *(itcom1));
+ }
+ }
+
+ if (!opengl) {
+ KIPISlideShowPlugin::SlideShow* slideShow = new KIPISlideShowPlugin::SlideShow(fileList, commentsList, m_imagesHasComments);
+ slideShow->show();
+ }
+ else {
+ if (!QGLFormat::hasOpenGL())
+ KMessageBox::error(kapp->activeWindow(),
+ i18n("Sorry. OpenGL support not available on your system"));
+ else {
+ if (wantKB) {
+ KIPISlideShowPlugin::SlideShowKB* slideShow =
+ new KIPISlideShowPlugin::SlideShowKB(fileList, commentsList, m_imagesHasComments);
+ slideShow->show();
+ }
+ else {
+ KIPISlideShowPlugin::SlideShowGL * slideShow =
+ new KIPISlideShowPlugin::SlideShowGL(fileList, commentsList, m_imagesHasComments);
+ slideShow->show();
+ }
+ }
+ }
+}
+
+KIPI::Category Plugin_SlideShow::category( KAction* action ) const
+{
+ if ( action == m_actionSlideShow )
+ return KIPI::TOOLSPLUGIN;
+
+ kdWarning( 51000 ) << "Unrecognized action for plugin category identification" << endl;
+ return KIPI::TOOLSPLUGIN; // no warning from compiler, please
+}