Warning--
[kdeartwork.git] / kscreensaver / kpartsaver / kpartsaver.cpp
blob5170740e7f569939229e9b6bbfbcda0cd5b385e9
1 /*
2 * Copyright (C) 2001 Stefan Schimanski <1Stein@gmx.de>
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this program; if not, write to the Free
16 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 #include <stdlib.h>
20 #include <signal.h>
21 #include <unistd.h>
22 #include <time.h>
24 #include <qwidget.h>
25 #include <qdialog.h>
26 #include <qtimer.h>
27 #include <qstring.h>
28 #include <q3valuelist.h>
29 #include <qpushbutton.h>
30 #include <qradiobutton.h>
31 #include <qspinbox.h>
32 #include <qcheckbox.h>
33 #include <qlabel.h>
34 //Added by qt3to4:
35 #include <Q3PtrList>
36 #include <QDir>
37 #include <klocale.h>
38 #include <kapplication.h>
39 #include <kdebug.h>
40 #include <klibloader.h>
41 #include <kconfig.h>
42 #include <kfiledialog.h>
43 #include <kurl.h>
44 #include <kparts/part.h>
45 #include <kparts/componentfactory.h>
46 #include <kio/jobclasses.h>
47 #include <kio/job.h>
48 #include <kmimetype.h>
50 #include <kscreensaver.h>
52 #include "kpartsaver.h"
53 #include <kiconloader.h>
54 #include <kglobal.h>
57 Q3PtrList<KPartSaver> g_savers;
58 bool g_inited = false;
61 class KPartSaverInterface : public KScreenSaverInterface
65 public:
66 virtual KAboutData* aboutData() {
67 return new KAboutData( "kpartsaver", 0, ki18n( "KPart Screen Saver" ), "1.0", ki18n( "KPart Screen Saver" ) );
71 virtual KScreenSaver* create( WId d )
73 KGlobal::locale()->insertCatalog("kpartsaver");
74 return new KPartSaver( d );
77 virtual QDialog* setup()
79 KGlobal::locale()->insertCatalog("kpartsaver");
80 return new SaverConfig;
84 int main( int argc, char *argv[] )
86 KPartSaverInterface kss;
87 return kScreenSaverMain( argc, argv, kss );
91 void exitHandler( int )
93 kDebug() << "exitHandler";
94 g_savers.clear();
95 //KLibLoader::self()->cleanUp();
96 exit(0);
100 KPartSaver::KPartSaver( WId id )
101 : KScreenSaver( id ), m_timer(), m_part(0), m_current(-1), m_back(0)
103 // install signal handlers to make sure that nspluginviewer is shutdown correctly
104 // move this into the nspluginviewer kpart code
105 if( !g_inited ) {
106 g_inited = true;
107 g_savers.setAutoDelete( true );
109 srand( time(0) );
111 // install signal handler
112 signal( SIGINT, exitHandler ); // Ctrl-C will cause a clean exit...
113 signal( SIGTERM, exitHandler ); // "kill"...
114 signal( SIGHUP, exitHandler ); // "kill -HUP" (hangup)...
115 signal( SIGKILL, exitHandler ); // "kill -KILL"
116 //atexit( ( void (*)(void) ) exitHandler );
119 g_savers.append( this );
121 closeUrl();
123 // load config
124 KConfigGroup cfg(KGlobal::config(), "Misc");
126 m_single = cfg.readEntry( "Single", true );
127 m_delay = cfg.readEntry( "Delay", 60 );
128 m_random = cfg.readEntry( "Random", false );
129 m_files = cfg.readEntry( "Files",QStringList() );
131 if( m_files.count()==0 ) {
133 // create background widget
134 m_back = new QLabel( i18n("The screen saver is not configured yet."), this );
136 m_back->setAlignment( Qt::AlignCenter );
137 embed( m_back );
138 m_back->show();
140 } else {
142 // queue files
143 for( int n=0; n<m_files.count(); n++ )
144 queue( KUrl::fromPathOrUrl( m_files[n] ) );
146 // play files
147 if( m_single )
148 next( m_random );
149 else {
150 next( m_random );
151 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
157 KPartSaver::~KPartSaver()
159 g_savers.take( g_savers.findRef( this ));
160 closeUrl();
164 void KPartSaver::closeUrl()
166 if( m_part ) {
167 m_part->closeUrl();
168 delete m_part;
169 m_part = 0;
174 bool KPartSaver::openUrl( const KUrl &url )
176 if( m_part )
177 closeUrl();
179 // find mime type
180 QString mime = KMimeType::findByUrl( url )->name();
182 // load part
183 m_part = KParts::ComponentFactory::createPartInstanceFromQuery<KParts::ReadOnlyPart>(
184 mime, QString(), this, this );
186 if( !m_part ) {
187 kDebug() << "Part for " << url << " can't be constructed";
188 closeUrl();
189 return false;
190 } else
191 embed( m_part->widget() );
193 // show kpart
194 delete m_back;
195 m_back = 0;
197 show();
198 m_part->widget()->show();
200 // load url
201 if( !m_part->openUrl( url ) ) {
202 kDebug() << "Can't load " << url.url();
203 delete m_part;
204 m_part = 0;
205 closeUrl();
206 return false;
209 return true;
213 void KPartSaver::queue( const KUrl &url )
215 Medium medium;
216 medium.url = url;
217 medium.failed = false;
218 m_media.append( medium );
222 void KPartSaver::timeout()
224 next( m_random );
225 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
229 void KPartSaver::next( bool random )
231 // try to find working media
232 while( m_media.count()>0 ) {
234 if( random )
235 m_current = rand() % m_media.count();
236 else
237 m_current++;
239 if( m_current>=(int)m_media.count() )
240 m_current = 0;
242 kDebug() << "Trying medium " << m_media[m_current].url.url();
244 // either start immediately or start mimejob first
245 if( !openUrl( m_media[m_current].url ) ) {
246 m_media.remove( m_media.at(m_current) );
247 m_current--;
248 } else
249 return;
253 // create background widget
254 m_back = new QLabel( i18n("All of your files are unsupported"), this );
256 m_back->setAlignment( Qt::AlignCenter );
257 embed( m_back );
258 m_back->show();
260 // nothing found, set to invalid
261 m_current = -1;
265 /*******************************************************************************/
268 SaverConfig::SaverConfig( QWidget* parent )
269 : ConfigWidget( parent )
271 setModal(true);
272 connect( m_ok, SIGNAL(clicked()), SLOT(apply()) );
273 connect( m_ok, SIGNAL(clicked()), SLOT(accept()) );
274 connect( m_cancel, SIGNAL(clicked()), SLOT(reject()) );
276 connect( m_multiple, SIGNAL(toggled(bool)), m_delayLabel, SLOT(setEnabled(bool)) );
277 connect( m_multiple, SIGNAL(toggled(bool)), m_delay, SLOT(setEnabled(bool)) );
278 connect( m_multiple, SIGNAL(toggled(bool)), m_secondsLabel, SLOT(setEnabled(bool)) );
279 connect( m_multiple, SIGNAL(toggled(bool)), m_random, SLOT(setEnabled(bool)) );
281 connect( m_files, SIGNAL(selectionChanged()), SLOT(select()) );
282 connect( m_add, SIGNAL(clicked()), SLOT(add()) );
283 connect( m_remove, SIGNAL(clicked()), SLOT(remove()) );
284 connect( m_up, SIGNAL(clicked()), SLOT(up()) );
285 connect( m_down, SIGNAL(clicked()), SLOT(down()) );
287 m_up->setIcon( KIcon("go-up") );
288 m_down->setIcon( KIcon("go-down") );
290 // load config
291 KConfigGroup cfg(KGlobal::config(), "Misc");
293 bool single = cfg.readEntry( "Single", true );
294 m_single->setChecked( single );
295 m_multiple->setChecked( !single );
296 m_delay->setMinimum( 1 );
297 m_delay->setMaximum( 10000 );
298 m_delay->setValue( cfg.readEntry( "Delay", 60 ) );
299 m_random->setChecked( cfg.readEntry( "Random", false ) );
300 m_files->insertStringList( cfg.readEntry( "Files",QStringList() ) );
302 // update buttons
303 select();
307 SaverConfig::~SaverConfig()
312 void SaverConfig::apply()
314 kDebug() << "apply";
316 KConfigGroup cfg(KGlobal::config(), "Misc");
318 cfg.writeEntry( "Single", m_single->isChecked() );
319 cfg.writeEntry( "Delay", m_delay->value() );
320 cfg.writeEntry( "Random", m_random->isChecked() );
322 int num = m_files->count();
323 QStringList files;
324 for( int n=0; n<num; n++ )
325 files << m_files->text(n);
327 cfg.writeEntry( "Files", files );
329 cfg.sync();
333 void SaverConfig::add()
335 KUrl::List files = KFileDialog::getOpenUrls( KUrl(), QString(),
336 this, i18n("Select Media Files") );
337 for( int n=0; n<files.count(); n++ )
338 m_files->insertItem( files[n].prettyUrl(), -1 );
342 void SaverConfig::remove()
344 int current = m_files->currentItem();
345 if( current!=-1 )
346 m_files->removeItem( current );
350 void SaverConfig::select()
352 bool enabled = m_files->currentItem()!=-1;
353 m_remove->setEnabled( enabled );
354 m_up->setEnabled( enabled && m_files->currentItem()!=0 );
355 m_down->setEnabled( enabled && m_files->currentItem()!=(int)m_files->count()-1 );
359 void SaverConfig::up()
361 int current = m_files->currentItem();
362 if ( current>0 ) {
363 QString txt = m_files->currentText();
364 m_files->removeItem( current );
365 m_files->insertItem( txt, current-1 );
366 m_files->setCurrentItem( current-1 );
371 void SaverConfig::down()
373 int current = m_files->currentItem();
374 if ( current!=-1 && current<(int)m_files->count()-1 ) {
375 QString txt = m_files->currentText();
376 m_files->removeItem( current );
377 m_files->insertItem( txt, current+1 );
378 m_files->setCurrentItem( current+1 );
382 #include "kpartsaver.moc"