summaryrefslogtreecommitdiffstats
path: root/kview/modules/presenter
diff options
context:
space:
mode:
Diffstat (limited to 'kview/modules/presenter')
-rw-r--r--kview/modules/presenter/DESIGN42
-rw-r--r--kview/modules/presenter/Makefile.am17
-rw-r--r--kview/modules/presenter/config/Makefile.am17
-rw-r--r--kview/modules/presenter/config/kviewpresenterconfig.cpp72
-rw-r--r--kview/modules/presenter/config/kviewpresenterconfig.desktop120
-rw-r--r--kview/modules/presenter/config/kviewpresenterconfig.h46
-rw-r--r--kview/modules/presenter/imagelistdialog.ui289
-rw-r--r--kview/modules/presenter/imagelistdialog.ui.h23
-rw-r--r--kview/modules/presenter/imagelistitem.cpp82
-rw-r--r--kview/modules/presenter/imagelistitem.h49
-rw-r--r--kview/modules/presenter/kviewpresenter.cpp492
-rw-r--r--kview/modules/presenter/kviewpresenter.desktop118
-rw-r--r--kview/modules/presenter/kviewpresenter.h103
-rw-r--r--kview/modules/presenter/kviewpresenter.rc20
-rw-r--r--kview/modules/presenter/kviewpresenterconfmodule.cpp60
-rw-r--r--kview/modules/presenter/kviewpresenterconfmodule.h49
16 files changed, 1599 insertions, 0 deletions
diff --git a/kview/modules/presenter/DESIGN b/kview/modules/presenter/DESIGN
new file mode 100644
index 00000000..11d77121
--- /dev/null
+++ b/kview/modules/presenter/DESIGN
@@ -0,0 +1,42 @@
+Presenter Plugin:
+- Features:
+ - a playlist with image infos:
+ - possibly get info from KFileMetaInfo
+ - image infos are readable for the user
+ - image infos for the program
+ - keeps track of images that were opened
+ - new action to load multiple files into the 'playlist'
+ - shuffle functions:
+ - shuffle the playlist
+ - load a random picture from the list (don't show the same image
+ again, though)
+ - order the items in the list via DnD
+ - order items alphabetically
+ - slideshow:
+ - configurable interval between images (in msecs)
+ - blending effects (put those effects in the imagecanvas)
+ - optionally keep image size <= canvas size
+ - preload next image (optionally)
+
+- Implementation:
+ - Playlist:
+ - KListView
+ - Items:
+ - derived from KListViewItem
+ - load Info in the background
+ - keep local copy of downloaded files
+ - delete local copy on destruction
+ - API:
+ QImage * image();
+ KURL url();
+ QString file(); //returns local filename or QString::null
+ - when loading an item from the playlist first ask for a
+ QImage, if that's not available ask for a local file, if
+ that's also not available take the url.
+ - API:
+ QImage * image();
+ QString file();
+ KURL url();
+ void setRandom(bool);
+ void randomizeList();
+ void orderAlphabetically();
diff --git a/kview/modules/presenter/Makefile.am b/kview/modules/presenter/Makefile.am
new file mode 100644
index 00000000..905bd1fc
--- /dev/null
+++ b/kview/modules/presenter/Makefile.am
@@ -0,0 +1,17 @@
+SUBDIRS = .
+
+INCLUDES = -I$(top_srcdir)/kview $(all_includes)
+
+kde_module_LTLIBRARIES = kview_presenterplugin.la
+
+kview_presenterplugin_la_SOURCES = imagelistitem.cpp imagelistdialog.ui kviewpresenter.cpp
+kview_presenterplugin_la_LIBADD = $(LIB_KIO) $(LIB_KPARTS)
+kview_presenterplugin_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+plugdir = $(kde_datadir)/kview/kpartplugins
+plug_DATA = kviewpresenter.desktop kviewpresenter.rc
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kviewpresenterplugin.pot
diff --git a/kview/modules/presenter/config/Makefile.am b/kview/modules/presenter/config/Makefile.am
new file mode 100644
index 00000000..8c212e7f
--- /dev/null
+++ b/kview/modules/presenter/config/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_kviewpresenterconfig.la
+
+noinst_HEADERS = kviewpresenterconfig.h
+
+kcm_kviewpresenterconfig_la_SOURCES = kviewpresenterconfig.cpp
+kcm_kviewpresenterconfig_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kcm_kviewpresenterconfig_la_LIBADD = $(LIB_KUTILS)
+
+kcm_kviewpresenterconfig_DATA = kviewpresenterconfig.desktop
+kcm_kviewpresenterconfigdir = $(kde_servicesdir)/kconfiguredialog
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kcm_kviewpresenterconfig.pot
diff --git a/kview/modules/presenter/config/kviewpresenterconfig.cpp b/kview/modules/presenter/config/kviewpresenterconfig.cpp
new file mode 100644
index 00000000..92dd8627
--- /dev/null
+++ b/kview/modules/presenter/config/kviewpresenterconfig.cpp
@@ -0,0 +1,72 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002-2003 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+#include "kviewpresenterconfig.h"
+
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kgenericfactory.h>
+
+typedef KGenericFactory<KViewPresenterConfig, QWidget> KViewPresenterConfigFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kviewpresenterconfig, KViewPresenterConfigFactory( "kcm_kviewpresenterconfig" ) )
+
+KViewPresenterConfig::KViewPresenterConfig( QWidget * parent, const char *, const QStringList & args )
+ : KCModule( KViewPresenterConfigFactory::instance(), parent, args )
+{
+ QBoxLayout * layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+
+ m_pCheckBox = new QCheckBox( "This is only for testing...", this );
+ connect( m_pCheckBox, SIGNAL( clicked() ), this, SLOT( checkChanged() ) );
+}
+
+KViewPresenterConfig::~KViewPresenterConfig()
+{
+}
+
+void KViewPresenterConfig::checkChanged()
+{
+ if( m_pCheckBox->isChecked() )
+ emit changed( true );
+ else
+ emit changed( false );
+}
+
+void KViewPresenterConfig::load()
+{
+ emit changed( false );
+}
+
+void KViewPresenterConfig::save()
+{
+ emit changed( false );
+}
+
+void KViewPresenterConfig::defaults()
+{
+}
+
+// vim:sw=4:ts=4
+
+#include "kviewpresenterconfig.moc"
diff --git a/kview/modules/presenter/config/kviewpresenterconfig.desktop b/kview/modules/presenter/config/kviewpresenterconfig.desktop
new file mode 100644
index 00000000..77bb3481
--- /dev/null
+++ b/kview/modules/presenter/config/kviewpresenterconfig.desktop
@@ -0,0 +1,120 @@
+[Desktop Entry]
+Icon=kpresenter
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=kviewpresenterconfig
+X-KDE-FactoryName=KViewPresenterConfigFactory
+X-KDE-ParentComponents=kviewpresenter
+
+Name=Name
+Name[ar]=اسم
+Name[bg]=Име
+Name[br]=Anv
+Name[bs]=Ime
+Name[ca]=Nom
+Name[cy]=Enw
+Name[da]=Navn
+Name[el]=Όνομα
+Name[eo]=Nomo
+Name[es]=Nombre
+Name[et]=Nimi
+Name[eu]=Izena
+Name[fa]=نام
+Name[fi]=Nimi
+Name[fr]=Nom
+Name[ga]=Ainm
+Name[gl]=Nome
+Name[he]=שם
+Name[hi]=नाम
+Name[hu]=Név
+Name[is]=Heiti
+Name[it]=Nome
+Name[ja]=名前
+Name[kk]=Атауы
+Name[km]=ឈ្មោះ
+Name[lt]=Pavadinimas
+Name[ms]=Nama
+Name[nb]=Navn
+Name[nds]=Naam
+Name[ne]=नाम
+Name[nl]=Naam
+Name[nn]=Namn
+Name[pa]=ਨਾਂ
+Name[pl]=Nazwa
+Name[pt]=Nome
+Name[pt_BR]=Nome
+Name[ro]=Nume
+Name[ru]=Имя
+Name[se]=Namma
+Name[sk]=Meno
+Name[sl]=Ime
+Name[sr]=Име
+Name[sr@Latn]=Ime
+Name[sv]=Namn
+Name[ta]=பெயர்
+Name[tg]=Ном
+Name[uk]=Назва
+Name[uz]=Nomi
+Name[uz@cyrillic]=Номи
+Name[wa]=No
+Name[zh_CN]=名称
+Name[zh_HK]=名稱
+Name[zh_TW]=名稱
+Comment=Comment
+Comment[ar]=تعليق
+Comment[bg]=Коментар
+Comment[br]=Askelenn
+Comment[bs]=Komentar
+Comment[ca]=Comentari
+Comment[cy]=Sylwad
+Comment[da]=Kommentar
+Comment[de]=Kommentar
+Comment[el]=Σχόλιο
+Comment[eo]=Komento
+Comment[es]=Comentario
+Comment[et]=Kommentaar
+Comment[eu]=Iruzkina
+Comment[fa]=توضیح
+Comment[fi]=Kommentti
+Comment[fr]=Commentaire
+Comment[ga]=Nóta
+Comment[gl]=Comentario
+Comment[he]=הערה
+Comment[hi]=टिप्पणी
+Comment[hu]=Megjegyzés
+Comment[is]=Athugasemd
+Comment[it]=Commento
+Comment[ja]=コメント
+Comment[kk]=Түсініктемесі
+Comment[km]=សេចក្ដី​អធិប្បាយ
+Comment[lt]=Komentaras
+Comment[ms]=Komen
+Comment[nb]=Kommentar
+Comment[nds]=Kommentar
+Comment[ne]=टिप्पणी
+Comment[nl]=Omschrijving
+Comment[nn]=Kommentar
+Comment[pa]=ਟਿੱਪਣੀ
+Comment[pl]=Komentarz
+Comment[pt]=Comentário
+Comment[pt_BR]=Comentário
+Comment[ro]=Comentariu
+Comment[ru]=Комментарий
+Comment[se]=Kommeanta
+Comment[sk]=Komentár
+Comment[sl]=Komentar
+Comment[sr]=Коментар
+Comment[sr@Latn]=Komentar
+Comment[sv]=Kommentar
+Comment[ta]=குறிப்பு
+Comment[tg]=Эзоҳ
+Comment[tr]=Açıklama
+Comment[uk]=Коментар
+Comment[uz]=Izoh
+Comment[uz@cyrillic]=Изоҳ
+Comment[wa]=Rawete
+Comment[zh_CN]=注释
+Comment[zh_HK]=註解
+Comment[zh_TW]=註解
diff --git a/kview/modules/presenter/config/kviewpresenterconfig.h b/kview/modules/presenter/config/kviewpresenterconfig.h
new file mode 100644
index 00000000..c839690a
--- /dev/null
+++ b/kview/modules/presenter/config/kviewpresenterconfig.h
@@ -0,0 +1,46 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002-2003 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+#ifndef KVIEWPRESENTERCONFIG_H
+#define KVIEWPRESENTERCONFIG_H
+
+#include <kcmodule.h>
+
+class QCheckBox;
+
+class KViewPresenterConfig : public KCModule
+{
+ Q_OBJECT
+ public:
+ KViewPresenterConfig( QWidget * parent, const char * name = 0, const QStringList & args = QStringList() );
+ ~KViewPresenterConfig();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+ private slots:
+ void checkChanged();
+
+ private:
+ QCheckBox * m_pCheckBox;
+};
+
+// vim:sw=4:ts=4
+
+#endif // KVIEWPRESENTERCONFIG_H
diff --git a/kview/modules/presenter/imagelistdialog.ui b/kview/modules/presenter/imagelistdialog.ui
new file mode 100644
index 00000000..66d9e9b5
--- /dev/null
+++ b/kview/modules/presenter/imagelistdialog.ui
@@ -0,0 +1,289 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>ImageListDialog</class>
+<author>Matthias Kretz &lt;kretz@kde.org&gt;</author>
+<widget class="KDialog">
+ <property name="name">
+ <cstring>ImageListDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>724</width>
+ <height>409</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Image List</string>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>URL</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Dimensions</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_pListView</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pPrevious</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Previous</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pNext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Next</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pShuffle</cstring>
+ </property>
+ <property name="text">
+ <string>Shu&amp;ffle</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pSlideshow</cstring>
+ </property>
+ <property name="text">
+ <string>Start &amp;Slideshow</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_pInterval</cstring>
+ </property>
+ <property name="label">
+ <string>Slideshow interval:</string>
+ </property>
+ <property name="value">
+ <number>5000</number>
+ </property>
+ <property name="suffix">
+ <string> ms</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the interval the program will wait before showing the next image in the slideshow.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pCloseAll</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close All</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pSave</cstring>
+ </property>
+ <property name="text">
+ <string>Sa&amp;ve List...</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_pLoad</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Load List...</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>m_pListView</sender>
+ <signal>aboutToMove()</signal>
+ <receiver>ImageListDialog</receiver>
+ <slot>noSort()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">kdialog.h</include>
+ <include location="global" impldecl="in implementation">kdebug.h</include>
+ <include location="global" impldecl="in implementation">kimageviewer/viewer.h</include>
+ <include location="global" impldecl="in implementation">kio/netaccess.h</include>
+ <include location="global" impldecl="in implementation">kurl.h</include>
+ <include location="global" impldecl="in implementation">kfiledialog.h</include>
+ <include location="global" impldecl="in implementation">qstring.h</include>
+ <include location="global" impldecl="in implementation">kmessagebox.h</include>
+ <include location="local" impldecl="in implementation">imagelistitem.h</include>
+ <include location="local" impldecl="in implementation">imagelistdialog.ui.h</include>
+</includes>
+<forwards>
+ <forward>class KURL</forward>
+</forwards>
+<slots>
+ <slot access="private" specifier="non virtual">init()</slot>
+ <slot specifier="non virtual">noSort()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kdialog.h</includehint>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kview/modules/presenter/imagelistdialog.ui.h b/kview/modules/presenter/imagelistdialog.ui.h
new file mode 100644
index 00000000..ce97754e
--- /dev/null
+++ b/kview/modules/presenter/imagelistdialog.ui.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+void ImageListDialog::init()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ m_pInterval->setRange( 0, 60000, 1000 );
+ noSort();
+}
+
+
+void ImageListDialog::noSort()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ m_pListView->setSorting( 1000 );
+}
+
+
diff --git a/kview/modules/presenter/imagelistitem.cpp b/kview/modules/presenter/imagelistitem.cpp
new file mode 100644
index 00000000..4236dfe7
--- /dev/null
+++ b/kview/modules/presenter/imagelistitem.cpp
@@ -0,0 +1,82 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+// $Id$
+
+#include "imagelistitem.h"
+
+#include <qimage.h>
+
+#include <klistview.h>
+
+ImageListItem::ImageListItem( KListView * parent, const KURL & url )
+ : KListViewItem( parent, parent->lastItem(), url.prettyURL() )
+ , m_pImage( 0 )
+ , m_filename( QString::null )
+ , m_url( url )
+{
+ setDragEnabled( true );
+ if( m_url.isLocalFile() )
+ {
+ m_filename = m_url.path();
+ }
+ else
+ {
+ // download file
+ /*
+ QString extension;
+ QString fileName = m_url.fileName();
+ int extensionPos = fileName.findRev( '.' );
+ if ( extensionPos != -1 )
+ extension = fileName.mid( extensionPos ); // keep the '.'
+ delete m_pTempFile;
+ m_pTempFile = new KTempFile( QString::null, extension );
+ m_filename = m_pTempFile->name();
+
+ m_pJob = KIO::get( m_url, m_pExtension->urlArgs().reload, false );
+ */
+ }
+}
+
+ImageListItem::~ImageListItem()
+{
+ if( ! m_url.isLocalFile() )
+ {
+ // remove downloaded tempfile
+ //KIO::NetAccess::removeTempFile( m_filename );
+ }
+}
+
+const QImage * ImageListItem::image() const
+{
+ return m_pImage;
+}
+
+const QString & ImageListItem::file() const
+{
+ if( m_url.isLocalFile() )
+ return QString::null;
+ return m_filename;
+}
+
+const KURL & ImageListItem::url() const
+{
+ return m_url;
+}
+
+// vim:sw=4:ts=4
diff --git a/kview/modules/presenter/imagelistitem.h b/kview/modules/presenter/imagelistitem.h
new file mode 100644
index 00000000..63761af8
--- /dev/null
+++ b/kview/modules/presenter/imagelistitem.h
@@ -0,0 +1,49 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+// $Id$
+
+#ifndef IMAGELISTITEM_H
+#define IMAGELISTITEM_H
+
+#include <klistview.h>
+#include <kurl.h>
+#include <qstring.h>
+
+class QImage;
+
+class ImageListItem : public KListViewItem
+{
+ public:
+ ImageListItem( KListView * parent, const KURL & url );
+ ~ImageListItem();
+
+ const QImage * image() const;
+ const QString & file() const;
+ const KURL & url() const;
+
+ virtual int rtti() const { return 48294; }
+
+ private:
+ QImage * m_pImage;
+ QString m_filename;
+ KURL m_url;
+};
+
+// vim:sw=4:ts=4
+#endif // IMAGELISTITEM_H
diff --git a/kview/modules/presenter/kviewpresenter.cpp b/kview/modules/presenter/kviewpresenter.cpp
new file mode 100644
index 00000000..bbc5e8eb
--- /dev/null
+++ b/kview/modules/presenter/kviewpresenter.cpp
@@ -0,0 +1,492 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+/* $Id$ */
+
+#include "kviewpresenter.h"
+#include "imagelistdialog.h"
+#include "imagelistitem.h"
+
+#include <qvbox.h>
+#include <qobjectlist.h>
+#include <qsignalslotimp.h>
+#include <qtimer.h>
+#include <qevent.h>
+#include <qdragobject.h>
+#include <qstringlist.h>
+
+#include <kpushbutton.h>
+#include <kapplication.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <knuminput.h>
+#include <kfiledialog.h>
+#include <kimageio.h>
+#include <kimageviewer/viewer.h>
+#include <kimageviewer/canvas.h>
+#include <kio/netaccess.h>
+#include <kmessagebox.h>
+#include <ktempfile.h>
+#include <kurldrag.h>
+
+typedef KGenericFactory<KViewPresenter> KViewPresenterFactory;
+K_EXPORT_COMPONENT_FACTORY( kview_presenterplugin, KViewPresenterFactory( "kviewpresenterplugin" ) )
+
+KViewPresenter::KViewPresenter( QObject* parent, const char* name, const QStringList & )
+ : Plugin( parent, name )
+ , m_pImageList( new ImageListDialog() )
+ , m_paFileOpen( 0 )
+ , m_bDontAdd( false )
+ , m_pCurrentItem( 0 )
+ , m_pSlideshowTimer( new QTimer( this ) )
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ m_imagelist.setAutoDelete( true );
+
+ QObjectList * viewerList = parent->queryList( 0, "KImageViewer Part", false, false );
+ m_pViewer = static_cast<KImageViewer::Viewer *>( viewerList->getFirst() );
+ delete viewerList;
+ if( m_pViewer )
+ {
+ ( void ) new KAction( i18n( "&Image List..." ), 0, 0,
+ this, SLOT( slotImageList() ),
+ actionCollection(), "plugin_presenter_imageList" );
+ m_paSlideshow = new KToggleAction( i18n( "Start &Slideshow" ), Key_S, actionCollection(), "plugin_presenter_slideshow" );
+ ( void ) new KAction( i18n( "&Previous Image in List" ), "previous", ALT+Key_Left,
+ this, SLOT( prev() ),
+ actionCollection(), "plugin_presenter_prev" );
+ ( void ) new KAction( i18n( "&Next Image in List" ), "next", ALT+Key_Right,
+ this, SLOT( next() ),
+ actionCollection(), "plugin_presenter_next" );
+
+ connect( m_paSlideshow, SIGNAL( toggled( bool ) ), m_pImageList->m_pSlideshow, SLOT( setOn( bool ) ) );
+ connect( m_pImageList->m_pSlideshow, SIGNAL( toggled( bool ) ), m_paSlideshow, SLOT( setChecked( bool ) ) );
+
+ // search for file_open action
+ KXMLGUIClient * parentClient = static_cast<KXMLGUIClient*>( parent->qt_cast( "KXMLGUIClient" ) );
+ if( parentClient )
+ {
+ m_paFileOpen = parentClient->actionCollection()->action( "file_open" );
+ m_paFileClose = parentClient->actionCollection()->action( "file_close" );
+ }
+ if( m_paFileClose )
+ connect( m_paFileClose, SIGNAL( activated() ), this, SLOT( slotClose() ) );
+ if( m_paFileOpen )
+ {
+ disconnect( m_paFileOpen, SIGNAL( activated() ), parent, SLOT( slotOpenFile() ) );
+ connect( m_paFileOpen, SIGNAL( activated() ), this, SLOT( slotOpenFiles() ) );
+ }
+ else
+ {
+ (void) new KAction( i18n( "Open &Multiple Files..." ), "queue", CTRL+SHIFT+Key_O,
+ this, SLOT( slotOpenFiles() ),
+ actionCollection(), "plugin_presenter_openFiles" );
+ }
+ connect( m_pViewer, SIGNAL( imageOpened( const KURL & ) ),
+ SLOT( slotImageOpened( const KURL & ) ) );
+ }
+ else
+ kdWarning( 4630 ) << "no KImageViewer interface found - the presenter plugin won't work" << endl;
+
+ //( void )new KViewPresenterConfModule( this );
+
+ connect( m_pImageList->m_pListView, SIGNAL( executed( QListViewItem* ) ),
+ this, SLOT( changeItem( QListViewItem* ) ) );
+ connect( m_pImageList->m_pPrevious, SIGNAL( clicked() ),
+ this, SLOT( prev() ) );
+ connect( m_pImageList->m_pNext, SIGNAL( clicked() ),
+ this, SLOT( next() ) );
+ connect( m_pImageList->m_pListView, SIGNAL( spacePressed( QListViewItem* ) ),
+ this, SLOT( changeItem( QListViewItem* ) ) );
+ connect( m_pImageList->m_pListView, SIGNAL( returnPressed( QListViewItem* ) ),
+ this, SLOT( changeItem( QListViewItem* ) ) );
+ connect( m_pImageList->m_pSlideshow, SIGNAL( toggled( bool ) ),
+ this, SLOT( slideshow( bool ) ) );
+ connect( m_pImageList->m_pInterval, SIGNAL( valueChanged( int ) ),
+ this, SLOT( setSlideshowInterval( int ) ) );
+ connect( m_pImageList->m_pShuffle, SIGNAL( clicked() ),
+ this, SLOT( shuffle() ) );
+ connect( m_pImageList->m_pLoad, SIGNAL( clicked() ),
+ this, SLOT( loadList() ) );
+ connect( m_pImageList->m_pSave, SIGNAL( clicked() ),
+ this, SLOT( saveList() ) );
+ connect( m_pImageList->m_pCloseAll, SIGNAL( clicked() ),
+ this, SLOT( closeAll() ) );
+
+ // allow drop on the dialog
+ m_pImageList->installEventFilter( this );
+ m_pImageList->m_pListView->installEventFilter( this );
+ m_pImageList->m_pListView->viewport()->installEventFilter( this );
+
+ // grab drops on the main view
+ m_pViewer->widget()->installEventFilter( this );
+
+ connect( m_pSlideshowTimer, SIGNAL( timeout() ),
+ this, SLOT( next() ) );
+}
+
+KViewPresenter::~KViewPresenter()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ if( m_paFileOpen )
+ {
+ disconnect( m_paFileOpen, SIGNAL( activated() ), this, SLOT( slotOpenFiles() ) );
+ // If the parent() doesn't exist we either leave the "File Open" action
+ // in an unusable state or KView was just shutting down and therefor we
+ // can ignore this. I've only seen the second one happening and to get
+ // rid of the QObject::connect warning we do the parent() check.
+ if( parent() )
+ connect( m_paFileOpen, SIGNAL( activated() ), parent(), SLOT( slotOpenFile() ) );
+ }
+}
+
+bool KViewPresenter::eventFilter( QObject *obj, QEvent *ev )
+{
+ if( obj == m_pImageList || obj == m_pImageList->m_pListView || obj == m_pImageList->m_pListView->viewport() || obj == m_pViewer->widget() )
+ {
+ switch( ev->type() )
+ {
+ case QEvent::DragEnter:
+ case QEvent::DragMove:
+ {
+ // drag enter event in the image list
+ //kdDebug( 4630 ) << "DragEnterEvent in the image list: " << obj->className() << endl;
+ QDragEnterEvent * e = static_cast<QDragEnterEvent*>( ev );
+ //for( int i = 0; e->format( i ); ++i )
+ //kdDebug( 4630 ) << " - " << e->format( i ) << endl;
+ if( KURLDrag::canDecode( e ) )// || QImageDrag::canDecode( e ) )
+ {
+ e->accept();
+ return true;
+ }
+ }
+ case QEvent::Drop:
+ {
+ // drop event in the image list
+ kdDebug( 4630 ) << "DropEvent in the image list: " << obj->className() << endl;
+ QDropEvent * e = static_cast<QDropEvent*>( ev );
+ QStringList l;
+ //QImage image;
+ if( KURLDrag::decodeToUnicodeUris( e, l ) )
+ {
+ for( QStringList::const_iterator it = l.begin(); it != l.end(); ++it )
+ {
+ ImageInfo * info = new ImageInfo( KURL( *it ) );
+ if( ! m_imagelist.contains( info ) )
+ {
+ m_imagelist.inSort( info );
+ ( void )new ImageListItem( m_pImageList->m_pListView, KURL( *it ) );
+ }
+ else
+ delete info;
+ }
+ return true;
+ }
+ //else if( QImageDrag::decode( e, image ) )
+ //newImage( image );
+ }
+ default: // do nothing
+ break;
+ }
+ }
+ return KParts::Plugin::eventFilter( obj, ev );
+}
+
+void KViewPresenter::slotImageOpened( const KURL & url )
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ if( ! m_bDontAdd )
+ {
+ kdDebug( 4630 ) << k_funcinfo << "imagelist:" << endl;
+ ImageInfo * info = new ImageInfo( url );
+ if( ! m_imagelist.contains( info ) )
+ {
+ m_imagelist.inSort( info );
+ QListViewItem * item = new ImageListItem( m_pImageList->m_pListView, url );
+ makeCurrent( item );
+ }
+ else
+ delete info;
+ }
+}
+
+void KViewPresenter::slotImageList()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ m_pImageList->show();
+}
+
+void KViewPresenter::slotOpenFiles()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ KURL::List urls = KFileDialog::getOpenURLs( ":load_image", KImageIO::pattern( KImageIO::Reading ), m_pViewer->widget() );
+
+ if( urls.isEmpty() )
+ return;
+
+ KURL::List::Iterator it = urls.begin();
+ m_pViewer->openURL( *it );
+ for( ++it; it != urls.end(); ++it )
+ {
+ ImageInfo * info = new ImageInfo( *it );
+ if( ! m_imagelist.contains( info ) )
+ {
+ m_imagelist.inSort( info );
+ ( void )new ImageListItem( m_pImageList->m_pListView, *it );
+ }
+ else
+ delete info;
+ }
+}
+
+void KViewPresenter::slotClose()
+{
+ QListViewItem * next = m_pCurrentItem->itemBelow() ? m_pCurrentItem->itemBelow() : m_pImageList->m_pListView->firstChild();
+ if( next == m_pCurrentItem )
+ next = 0;
+
+ ImageInfo info( m_pCurrentItem->url() );
+ m_imagelist.remove( &info );
+ delete m_pCurrentItem;
+ m_pCurrentItem = 0;
+
+ if( next )
+ changeItem( next );
+}
+
+void KViewPresenter::changeItem( QListViewItem * qitem )
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ if( qitem->rtti() == 48294 )
+ {
+ ImageListItem * item = static_cast<ImageListItem*>( qitem );
+ if( ! item->url().isEmpty() )
+ {
+ if( item->url().isLocalFile() && ! QFile::exists( item->url().path() ) )
+ {
+ kdDebug( 4630 ) << "file doesn't exist. removed." << endl;
+ ImageInfo info( item->url() );
+ m_imagelist.remove( &info );
+ if( m_pCurrentItem == item )
+ {
+ QListViewItem * next = m_pCurrentItem->itemBelow() ? m_pCurrentItem->itemBelow() : m_pImageList->m_pListView->firstChild();
+ if( next->rtti() != 48294 )
+ kdWarning( 4630 ) << "unknown ListView item" << endl;
+ else
+ m_pCurrentItem = static_cast<ImageListItem*>( next );
+
+ if( m_pCurrentItem == item )
+ m_pCurrentItem = 0; // don't create a dangling pointer
+ delete item;
+ if( m_pCurrentItem )
+ changeItem( m_pCurrentItem );
+ }
+ else
+ {
+ delete item;
+ next();
+ }
+ return;
+ }
+ kdDebug( 4630 ) << "got url" << endl;
+ makeCurrent( qitem );
+
+ bool dontadd = m_bDontAdd;
+ m_bDontAdd = true;
+ m_pViewer->openURL( item->url() );
+ m_bDontAdd = dontadd;
+ }
+ else
+ kdWarning( 4630 ) << "got nothing" << endl;
+ }
+ else
+ kdWarning( 4630 ) << "unknown ListView item" << endl;
+}
+
+void KViewPresenter::prev()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ if( m_pCurrentItem )
+ {
+ QListViewItem * prev = m_pCurrentItem->itemAbove() ? m_pCurrentItem->itemAbove() : m_pImageList->m_pListView->lastItem();
+ if( prev )
+ changeItem( prev );
+ }
+}
+
+void KViewPresenter::next()
+{
+ kdDebug( 4630 ) << k_funcinfo << endl;
+ if( m_pCurrentItem )
+ {
+ QListViewItem * next = m_pCurrentItem->itemBelow() ? m_pCurrentItem->itemBelow() : m_pImageList->m_pListView->firstChild();
+ if( next )
+ changeItem( next );
+ }
+}
+
+void KViewPresenter::makeCurrent( QListViewItem * item )
+{
+ if( m_pCurrentItem )
+ m_pCurrentItem->setPixmap( 0, QPixmap() );
+ if( item->rtti() != 48294 )
+ kdWarning( 4630 ) << "unknown ListView item" << endl;
+ else
+ {
+ m_pCurrentItem = static_cast<ImageListItem*>( item );
+ m_pCurrentItem->setPixmap( 0, KGlobal::iconLoader()->loadIcon( "1rightarrow", KIcon::Small ) );
+ m_pImageList->m_pListView->ensureItemVisible( m_pCurrentItem );
+ }
+}
+
+void KViewPresenter::slideshow( bool running )
+{
+ if( running )
+ {
+ m_pSlideshowTimer->start( m_pImageList->m_pInterval->value() );
+ actionCollection()->action( "plugin_presenter_slideshow" )->setText( i18n( "Stop &Slideshow" ) );
+ m_pImageList->m_pSlideshow->setText( i18n( "Stop &Slideshow" ) );
+ }
+ else
+ {
+ m_pSlideshowTimer->stop();
+ actionCollection()->action( "plugin_presenter_slideshow" )->setText( i18n( "Start &Slideshow" ) );
+ m_pImageList->m_pSlideshow->setText( i18n( "Start &Slideshow" ) );
+ }
+}
+
+void KViewPresenter::setSlideshowInterval( int msec )
+{
+ if( m_pSlideshowTimer->isActive() )
+ m_pSlideshowTimer->changeInterval( msec );
+}
+
+void KViewPresenter::shuffle()
+{
+ m_pImageList->noSort();
+ KListView * listview = m_pImageList->m_pListView;
+ QPtrList<QListViewItem> items;
+ for( QListViewItem * item = listview->firstChild(); item; item = listview->firstChild() )
+ {
+ items.append( item );
+ listview->takeItem( item );
+ }
+ while( ! items.isEmpty() )
+ listview->insertItem( items.take( KApplication::random() % items.count() ) );
+}
+
+void KViewPresenter::closeAll()
+{
+ m_imagelist.clear();
+ m_pImageList->m_pListView->clear();
+ m_pCurrentItem = 0;
+ if( m_pViewer->closeURL() )
+ m_pViewer->canvas()->clear();
+}
+
+void KViewPresenter::loadList()
+{
+ KURL url = KFileDialog::getOpenURL( ":load_list", QString::null, m_pImageList );
+ if( url.isEmpty() )
+ return;
+
+ QString tempfile;
+ if( ! KIO::NetAccess::download( url, tempfile, m_pViewer->widget() ) )
+ {
+ KMessageBox::error( m_pImageList, i18n( "Could not load\n%1" ).arg( url.prettyURL() ) );
+ return;
+ }
+ QFile file( tempfile );
+ if( file.open( IO_ReadOnly ) )
+ {
+ QTextStream t( &file );
+ if( t.readLine() == "[KView Image List]" )
+ {
+ //clear old image list
+ closeAll();
+
+ QStringList list;
+ if( ! t.eof() )
+ m_pViewer->openURL( KURL( t.readLine() ) );
+ while( ! t.eof() )
+ {
+ KURL url ( t.readLine() );
+ ImageInfo * info = new ImageInfo( url );
+ if( ! m_imagelist.contains( info ) )
+ {
+ m_imagelist.inSort( info );
+ ( void )new ImageListItem( m_pImageList->m_pListView, url );
+ }
+ else
+ delete info;
+ }
+ }
+ else
+ {
+ KMessageBox::error( m_pImageList, i18n( "Wrong format\n%1" ).arg( url.prettyURL() ) );
+ }
+ file.close();
+ }
+ KIO::NetAccess::removeTempFile( tempfile );
+}
+
+void KViewPresenter::saveList()
+{
+ KURL url = KFileDialog::getSaveURL( ":save_list", QString::null, m_pImageList );
+
+ if( url.isEmpty() )
+ return;
+
+ QString tempfile;
+ if( url.isLocalFile() )
+ tempfile = url.path();
+ else
+ {
+ KTempFile ktempf;
+ tempfile = ktempf.name();
+ }
+
+ QFile file( tempfile );
+ if( file.open( IO_WriteOnly ) )
+ {
+ QTextStream t( &file );
+ // write header
+ t << "[KView Image List]" << endl;
+ QListViewItem * item = m_pImageList->m_pListView->firstChild();
+ while( item )
+ {
+ if( item->rtti() == 48294 )
+ t << static_cast<ImageListItem*>( item )->url().url() << endl;
+ item = item->itemBelow();
+ }
+ file.close();
+
+ if( ! url.isLocalFile() )
+ {
+ KIO::NetAccess::upload( tempfile, url, m_pViewer->widget() );
+ KIO::NetAccess::removeTempFile( tempfile );
+ }
+ }
+}
+
+// vim:sw=4:ts=4
+#include "kviewpresenter.moc"
diff --git a/kview/modules/presenter/kviewpresenter.desktop b/kview/modules/presenter/kviewpresenter.desktop
new file mode 100644
index 00000000..7059caba
--- /dev/null
+++ b/kview/modules/presenter/kviewpresenter.desktop
@@ -0,0 +1,118 @@
+[Desktop Entry]
+Icon=presenter
+Type=Service
+ServiceTypes=KPluginInfo
+
+X-KDE-PluginInfo-Author=Matthias Kretz
+X-KDE-PluginInfo-Email=kretz@kde.org
+X-KDE-PluginInfo-Name=kviewpresenter
+X-KDE-PluginInfo-Version=1.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Name=Presenter
+Name[ar]=المقدّم
+Name[bg]=Презентация
+Name[br]=Emginniger
+Name[bs]=Prezentator
+Name[ca]=Presentador
+Name[cs]=Prezentace
+Name[cy]=Cyflwynydd
+Name[de]=Präsentationsprogramm
+Name[el]=Παρουσιαστής
+Name[eo]=Prezentilo
+Name[et]=Esitleja
+Name[eu]=Aurkezlea
+Name[fa]=ارائه‌کننده
+Name[fi]=Esitysohjelma
+Name[fr]=Présentateur
+Name[ga]=Láithreoir
+Name[gl]=Escaparate
+Name[he]=מצגות
+Name[hi]=प्रस्तुतकर्ता
+Name[hr]=Prezentator
+Name[hu]=Bemutató
+Name[it]=Presentazione
+Name[ja]=プレゼンタ
+Name[kk]=Презентатор
+Name[km]=កម្មវិធី​បង្ហាញ
+Name[lt]=Pristatytojas
+Name[ms]=Penyampai
+Name[nds]=Präsentatschoonprogramm
+Name[ne]=प्रस्तोता
+Name[nl]=Presentatieprogramma
+Name[nso]=Mohlagisi
+Name[pa]=ਪੇਸ਼ਕਾਰ
+Name[pl]=Prezenter
+Name[pt]=Apresentador
+Name[pt_BR]=Apresentador
+Name[ro]=Prezentare
+Name[ru]=Презентатор
+Name[sk]=Vytvorenie prezentácie
+Name[sl]=Predstavitelj
+Name[sr]=Презентер
+Name[sr@Latn]=Prezenter
+Name[sv]=Presentationer
+Name[ta]=வழங்குபவர்
+Name[tg]=Презентатор
+Name[tr]=Sunum Aracı
+Name[ven]=Mulanguli
+Name[xh]=Umbonisi
+Name[zh_CN]=演示板
+Name[zh_HK]=簡報器
+Name[zh_TW]=簡報
+Name[zu]=Umnikeli
+Comment=Creates an imagelist and enables you to create a slideshow
+Comment[ar]=ينشئ قائمة صور ويمكنك من استعراض الصور تلقائيا
+Comment[bg]=Създаване на списък с изображения и слайдшоу от тях
+Comment[bs]=Pravi listu slika i omogućuje vam da napravite slide show
+Comment[ca]=Crea una llista d'imatges i us permet crear un passi de diapositives
+Comment[cs]=Vytvoří seznam obrázků a umožní vám z nich vytvořit slideshow.
+Comment[cy]=Creu rhestr delweddau ac alluogi i chi greu sioe haenluniau
+Comment[da]=Laver en billedliste og giver dig muligheden for at lave et diasshow
+Comment[de]=Erzeugt eine Bilderliste und ermöglicht das Erstellen von Diashows
+Comment[el]=Δημιουργεί μια λίστα εικόνων και σας επιτρέπει να δημιουργήσετε μια προβολή σλάιντ
+Comment[es]=Crea una lista de imágenes ofreciendole la posibilidad de crear una animación de diapositivas
+Comment[et]=Loob piltide nimekirja ja laseb selle põhjal luua slaidiseansi
+Comment[eu]=Irudi-zerrenda bat sortzen du eta diapositiba-aurkezpena egiten du
+Comment[fa]=یک فهرست تصویر ایجاد می‌کند و شما را قادر به ایجاد یک نمایش اسلاید می‌کند
+Comment[fi]=Luo kuvalistan ja mahdollistaa esityksen luomisen
+Comment[fr]=Crée une liste d'images et vous permet de créer un diaporama
+Comment[gl]=Crea unha lista de imaxes e permite crear unha moviola
+Comment[he]=יוצר רשימת תמונות ומאפשר לך ליצור מצגת שקופיות
+Comment[hi]=एक छवि-सूची बनाता है तथा आपको एक स्लाइड-शो तैयार करने में सक्षम बनाता है
+Comment[hu]=Képsorozat összeállítását és bemutatását teszi lehetővé
+Comment[is]=Býr til myndlista og gerir þér kleyft að búa til myndsýningu
+Comment[it]=Crea una lista di immagini e permette di creare una presentazione
+Comment[ja]=画像リストを作成し、スライドショーを作成します
+Comment[kk]=Слайд-шоу көрсетуге кескіндер тізімін дайындау
+Comment[km]=បង្កើត​បញ្ជី​រូបភាព ហើយ​អាច​ឲ្យ​អ្នក​បង្កើត​ជា​ការ​បញ្ចាំង​ស្លាយ
+Comment[lt]=Sukuria paveikslėlių sąrašą ir leidžia jums sukurti skaidrių peržiūrą
+Comment[ms]=Cipta senarai imej dan membolehkan anda mencipta tayangan slaid
+Comment[nb]=Oppretter en bildeliste og lar deg lage en lysbildeserie
+Comment[nds]=Stellt en Bildlist op un lett Di en Diaschau opstellen
+Comment[ne]=छवि सूची सिर्जना गर्दछ र तपाईँलाई स्लाइड प्रर्दशन सिर्जना गर्न सक्षम पार्दछ
+Comment[nl]=Maakt een afbeeldingenlijst waarmee u een diashow kunt maken
+Comment[nn]=Lagar ei biletliste du kan bruka til framvising
+Comment[nso]=Hlagisa palo ya ponagalo gape ego dumelela go hlagisa slidesshow
+Comment[pl]=Tworzy listę obrazków i umożliwia tworzenie z niej pokazu slajdów
+Comment[pt]=Cria uma lista de imagens e permite-lhe criar uma apresentação
+Comment[pt_BR]=Cria uma lista de imagens e habilita você a criar uma exibição de slides
+Comment[ro]=Creează o listă de imagini şi vă permite să reallizaţi o succesiune de imagini
+Comment[ru]=Создание галерей изображений и просмотр их в качестве слайдов
+Comment[se]=Ráhkada govvalisttu ja diktá du ráhkadit govvačájeheami
+Comment[sk]=Vytvorí zoznam obrázok a umožní z nich vytvoriť prezentáciu
+Comment[sl]=Ustvari seznam slik in vam omogoča ustvariti predstavitev
+Comment[sr]=Прави листу слика и омогућава вам да направите слајд-шоу
+Comment[sr@Latn]=Pravi listu slika i omogućava vam da napravite slajd-šou
+Comment[sv]=Skapar en bildlista och ger dig möjlighet att göra ett bildspel
+Comment[ta]=திரைக் காட்சிக்கான பிம்ப பட்டியலை உருவாக்கலாம்
+Comment[tg]=Эҷоди нигористони тасвирот ва намоиши онҳо ҳамчун слайд
+Comment[tr]=Bir resim listesi oluşturur ve slayt gösterisi yapmanıza olanak tanır
+Comment[uk]=Створює список зображень та дозволяє створювати презентацію слайдів
+Comment[ven]=Iita mutevhe wa tshifanyiso ya dovha yani tendela uita tsumbedzo ya tshilaidi
+Comment[xh]=Yenza uluhlu lwemifanekiso ekuvumela ukwazi ukwenza umboniso wotyibiliko
+Comment[zh_CN]=创建图像列表,并能为您创建幻灯片
+Comment[zh_HK]=建立圖像清單並讓您能建立幻燈片式放映
+Comment[zh_TW]=建立影像清單並讓您能建立幻燈片式放映
+Comment[zu]=Idala uhlu lwesithombe futhi ikuvumela wena ukuba udale umbukiso wesithombe esishibilikayo
diff --git a/kview/modules/presenter/kviewpresenter.h b/kview/modules/presenter/kviewpresenter.h
new file mode 100644
index 00000000..29fc106b
--- /dev/null
+++ b/kview/modules/presenter/kviewpresenter.h
@@ -0,0 +1,103 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+/* $Id$ */
+
+#ifndef __kviewpresenter_h
+#define __kviewpresenter_h
+
+#include <kparts/plugin.h>
+#include <kurl.h>
+
+#include <qsortedlist.h>
+
+namespace KImageViewer { class Viewer; }
+
+class ImageListDialog;
+class ImageListItem;
+class QListViewItem;
+class QTimer;
+class KToggleAction;
+class KAction;
+
+class KViewPresenter : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+ KViewPresenter( QObject* parent, const char* name, const QStringList & );
+ virtual ~KViewPresenter();
+
+protected:
+ struct ImageInfo
+ {
+ KURL url;
+ ImageInfo( const KURL & url )
+ : url( url )
+ {
+ }
+ bool operator==( const ImageInfo & i1 )
+ {
+ return url.prettyURL() == i1.url.prettyURL();
+ }
+ bool operator!=( const ImageInfo & i1 )
+ {
+ return url.prettyURL() == i1.url.prettyURL();
+ }
+ bool operator>( const ImageInfo & i1 )
+ {
+ return url.prettyURL() > i1.url.prettyURL();
+ }
+ bool operator<( const ImageInfo & i1 )
+ {
+ return url.prettyURL() < i1.url.prettyURL();
+ }
+ };
+ bool eventFilter( QObject *, QEvent * );
+
+private slots:
+ void slotImageOpened( const KURL & );
+ void slotImageList();
+ void slotOpenFiles();
+ void slotClose();
+ void changeItem( QListViewItem * );
+ void prev();
+ void next();
+ void slideshow( bool );
+ void setSlideshowInterval( int );
+ void shuffle();
+ void closeAll();
+ void loadList();
+ void saveList();
+
+private:
+ void makeCurrent( QListViewItem * );
+
+ KImageViewer::Viewer * m_pViewer;
+ ImageListDialog * m_pImageList;
+ KToggleAction * m_paSlideshow;
+ KAction * m_paFileOpen;
+ KAction * m_paFileClose;
+
+ QSortedList<ImageInfo> m_imagelist;
+ bool m_bDontAdd;
+ ImageListItem * m_pCurrentItem;
+ QTimer * m_pSlideshowTimer;
+};
+
+// vim:sw=4:ts=4:cindent
+#endif
diff --git a/kview/modules/presenter/kviewpresenter.rc b/kview/modules/presenter/kviewpresenter.rc
new file mode 100644
index 00000000..92879d02
--- /dev/null
+++ b/kview/modules/presenter/kviewpresenter.rc
@@ -0,0 +1,20 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="kviewpresenter" library="kview_presenterplugin" version="3">
+ <MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Action name="plugin_presenter_openFiles" group="open_merge_group"/>
+ </Menu>
+ <Menu name="view"><text>&amp;View</text>
+ </Menu>
+
+ <Menu name="go_document"><Text>&amp;Go</Text>
+ <Action name="plugin_presenter_imageList"/>
+ <Action name="plugin_presenter_slideshow"/>
+ <Action name="plugin_presenter_prev"/>
+ <Action name="plugin_presenter_next"/>
+ </Menu>
+ </MenuBar>
+ <Menu name="popupmenu">
+ <Action name="plugin_presenter_slideshow"/>
+ </Menu>
+</kpartplugin>
diff --git a/kview/modules/presenter/kviewpresenterconfmodule.cpp b/kview/modules/presenter/kviewpresenterconfmodule.cpp
new file mode 100644
index 00000000..a39ea378
--- /dev/null
+++ b/kview/modules/presenter/kviewpresenterconfmodule.cpp
@@ -0,0 +1,60 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+// $Id$
+
+#include "kviewpresenterconfmodule.h"
+
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+KViewPresenterConfModule::KViewPresenterConfModule( QObject * parent )
+ : KPreferencesModule( "kviewpresenter", parent, "KView Presenter Config Module" )
+{
+}
+
+KViewPresenterConfModule::~KViewPresenterConfModule()
+{
+}
+
+void KViewPresenterConfModule::applyChanges()
+{
+ emit configChanged();
+}
+
+void KViewPresenterConfModule::reset()
+{
+}
+
+void KViewPresenterConfModule::createPage( QFrame * page )
+{
+ QBoxLayout * layout = new QVBoxLayout( page, KDialog::marginHint(), KDialog::spacingHint() );
+ layout->setAutoAdd( true );
+
+ m_pCheckBox = new QCheckBox( "This is only for testing...", page );
+}
+
+// vim:sw=4:ts=4
+
+#include "kviewpresenterconfmodule.moc"
diff --git a/kview/modules/presenter/kviewpresenterconfmodule.h b/kview/modules/presenter/kviewpresenterconfmodule.h
new file mode 100644
index 00000000..dd7e5cf2
--- /dev/null
+++ b/kview/modules/presenter/kviewpresenterconfmodule.h
@@ -0,0 +1,49 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+
+*/
+
+// $Id$
+
+#ifndef KVIEWPRESENTERCONFMODULE_H
+#define KVIEWPRESENTERCONFMODULE_H
+
+#include "kpreferencesmodule.h"
+
+class QCheckBox;
+
+class KViewPresenterConfModule : public KPreferencesModule
+{
+ Q_OBJECT
+ public:
+ KViewPresenterConfModule( QObject * parent );
+ ~KViewPresenterConfModule();
+
+ signals:
+ void configChanged();
+
+ protected:
+ virtual void applyChanges();
+ virtual void reset();
+ virtual void createPage( QFrame * page );
+
+ private:
+ QCheckBox * m_pCheckBox;
+};
+
+// vim:sw=4:ts=4
+
+#endif // KVIEWPRESENTERCONFMODULE_H