Fix include
[kdeartwork.git] / kscreensaver / kpartsaver / kpartsaver.cpp
blob3db335ff2b54a2da4577e2310bb272d32cf38f98
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 <klocale.h>
37 #include <kapplication.h>
38 #include <kdebug.h>
39 #include <klibloader.h>
40 #include <kconfig.h>
41 #include <kfiledialog.h>
42 #include <kurl.h>
43 #include <kparts/part.h>
44 #include <kparts/componentfactory.h>
45 #include <kio/jobclasses.h>
46 #include <kio/job.h>
47 #include <kmimetype.h>
49 #include <kscreensaver.h>
51 #include "kpartsaver.h"
52 #include <kiconloader.h>
53 #include <kglobal.h>
56 Q3PtrList<KPartSaver> g_savers;
57 bool g_inited = false;
60 class KPartSaverInterface : public KScreenSaverInterface
64 public:
65 virtual KAboutData* aboutData() {
66 return new KAboutData( "kpartsaver", 0, ki18n( "KPart Screen Saver" ), "1.0", ki18n( "KPart Screen Saver" ) );
70 virtual KScreenSaver* create( WId d )
72 KGlobal::locale()->insertCatalog("kpartsaver");
73 return new KPartSaver( d );
76 virtual QDialog* setup()
78 KGlobal::locale()->insertCatalog("kpartsaver");
79 return new SaverConfig;
83 int main( int argc, char *argv[] )
85 KPartSaverInterface kss;
86 return kScreenSaverMain( argc, argv, kss );
90 void exitHandler( int )
92 kDebug() << "exitHandler";
93 g_savers.clear();
94 //KLibLoader::self()->cleanUp();
95 exit(0);
99 KPartSaver::KPartSaver( WId id )
100 : KScreenSaver( id ), m_timer(), m_part(0), m_current(-1), m_back(0)
102 // install signal handlers to make sure that nspluginviewer is shutdown correctly
103 // move this into the nspluginviewer kpart code
104 if( !g_inited ) {
105 g_inited = true;
106 g_savers.setAutoDelete( true );
108 srand( time(0) );
110 // install signal handler
111 signal( SIGINT, exitHandler ); // Ctrl-C will cause a clean exit...
112 signal( SIGTERM, exitHandler ); // "kill"...
113 signal( SIGHUP, exitHandler ); // "kill -HUP" (hangup)...
114 signal( SIGKILL, exitHandler ); // "kill -KILL"
115 //atexit( ( void (*)(void) ) exitHandler );
118 g_savers.append( this );
120 closeUrl();
122 // load config
123 KConfigGroup cfg(KGlobal::config(), "Misc");
125 m_single = cfg.readEntry( "Single", true );
126 m_delay = cfg.readEntry( "Delay", 60 );
127 m_random = cfg.readEntry( "Random", false );
128 m_files = cfg.readEntry( "Files",QStringList() );
130 if( m_files.count()==0 ) {
132 // create background widget
133 m_back = new QLabel( i18n("The screen saver is not configured yet."), this );
135 m_back->setAlignment( Qt::AlignCenter );
136 embed( m_back );
137 m_back->show();
139 } else {
141 // queue files
142 for( int n=0; n<m_files.count(); n++ )
143 queue( KUrl::fromPathOrUrl( m_files[n] ) );
145 // play files
146 if( m_single )
147 next( m_random );
148 else {
149 next( m_random );
150 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
156 KPartSaver::~KPartSaver()
158 g_savers.take( g_savers.findRef( this ));
159 closeUrl();
163 void KPartSaver::closeUrl()
165 if( m_part ) {
166 m_part->closeUrl();
167 delete m_part;
168 m_part = 0;
173 bool KPartSaver::openUrl( const KUrl &url )
175 if( m_part )
176 closeUrl();
178 // find mime type
179 QString mime = KMimeType::findByUrl( url )->name();
181 // load part
182 m_part = KParts::ComponentFactory::createPartInstanceFromQuery<KParts::ReadOnlyPart>(
183 mime, QString(), this, this );
185 if( !m_part ) {
186 kDebug() << "Part for " << url << " can't be constructed";
187 closeUrl();
188 return false;
189 } else
190 embed( m_part->widget() );
192 // show kpart
193 delete m_back;
194 m_back = 0;
196 show();
197 m_part->widget()->show();
199 // load url
200 if( !m_part->openUrl( url ) ) {
201 kDebug() << "Can't load " << url.url();
202 delete m_part;
203 m_part = 0;
204 closeUrl();
205 return false;
208 return true;
212 void KPartSaver::queue( const KUrl &url )
214 Medium medium;
215 medium.url = url;
216 medium.failed = false;
217 m_media.append( medium );
221 void KPartSaver::timeout()
223 next( m_random );
224 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
228 void KPartSaver::next( bool random )
230 // try to find working media
231 while( m_media.count()>0 ) {
233 if( random )
234 m_current = rand() % m_media.count();
235 else
236 m_current++;
238 if( m_current>=(int)m_media.count() )
239 m_current = 0;
241 kDebug() << "Trying medium " << m_media[m_current].url.url();
243 // either start immediately or start mimejob first
244 if( !openUrl( m_media[m_current].url ) ) {
245 m_media.remove( m_media.at(m_current) );
246 m_current--;
247 } else
248 return;
252 // create background widget
253 m_back = new QLabel( i18n("All of your files are unsupported"), this );
255 m_back->setAlignment( Qt::AlignCenter );
256 embed( m_back );
257 m_back->show();
259 // nothing found, set to invalid
260 m_current = -1;
264 /*******************************************************************************/
267 SaverConfig::SaverConfig( QWidget* parent )
268 : ConfigWidget( parent )
270 setModal(true);
271 connect( m_ok, SIGNAL(clicked()), SLOT(apply()) );
272 connect( m_ok, SIGNAL(clicked()), SLOT(accept()) );
273 connect( m_cancel, SIGNAL(clicked()), SLOT(reject()) );
275 connect( m_multiple, SIGNAL(toggled(bool)), m_delayLabel, SLOT(setEnabled(bool)) );
276 connect( m_multiple, SIGNAL(toggled(bool)), m_delay, SLOT(setEnabled(bool)) );
277 connect( m_multiple, SIGNAL(toggled(bool)), m_secondsLabel, SLOT(setEnabled(bool)) );
278 connect( m_multiple, SIGNAL(toggled(bool)), m_random, SLOT(setEnabled(bool)) );
280 connect( m_files, SIGNAL(selectionChanged()), SLOT(select()) );
281 connect( m_add, SIGNAL(clicked()), SLOT(add()) );
282 connect( m_remove, SIGNAL(clicked()), SLOT(remove()) );
283 connect( m_up, SIGNAL(clicked()), SLOT(up()) );
284 connect( m_down, SIGNAL(clicked()), SLOT(down()) );
286 m_up->setIcon( KIcon("go-up") );
287 m_down->setIcon( KIcon("go-down") );
289 // load config
290 KConfigGroup cfg(KGlobal::config(), "Misc");
292 bool single = cfg.readEntry( "Single", true );
293 m_single->setChecked( single );
294 m_multiple->setChecked( !single );
295 m_delay->setMinimum( 1 );
296 m_delay->setMaximum( 10000 );
297 m_delay->setValue( cfg.readEntry( "Delay", 60 ) );
298 m_random->setChecked( cfg.readEntry( "Random", false ) );
299 m_files->insertStringList( cfg.readEntry( "Files",QStringList() ) );
301 // update buttons
302 select();
306 SaverConfig::~SaverConfig()
311 void SaverConfig::apply()
313 kDebug() << "apply";
315 KConfigGroup cfg(KGlobal::config(), "Misc");
317 cfg.writeEntry( "Single", m_single->isChecked() );
318 cfg.writeEntry( "Delay", m_delay->value() );
319 cfg.writeEntry( "Random", m_random->isChecked() );
321 int num = m_files->count();
322 QStringList files;
323 for( int n=0; n<num; n++ )
324 files << m_files->text(n);
326 cfg.writeEntry( "Files", files );
328 cfg.sync();
332 void SaverConfig::add()
334 KUrl::List files = KFileDialog::getOpenUrls( KUrl(), QString(),
335 this, i18n("Select Media Files") );
336 for( int n=0; n<files.count(); n++ )
337 m_files->insertItem( files[n].prettyUrl(), -1 );
341 void SaverConfig::remove()
343 int current = m_files->currentItem();
344 if( current!=-1 )
345 m_files->removeItem( current );
349 void SaverConfig::select()
351 bool enabled = m_files->currentItem()!=-1;
352 m_remove->setEnabled( enabled );
353 m_up->setEnabled( enabled && m_files->currentItem()!=0 );
354 m_down->setEnabled( enabled && m_files->currentItem()!=(int)m_files->count()-1 );
358 void SaverConfig::up()
360 int current = m_files->currentItem();
361 if ( current>0 ) {
362 QString txt = m_files->currentText();
363 m_files->removeItem( current );
364 m_files->insertItem( txt, current-1 );
365 m_files->setCurrentItem( current-1 );
370 void SaverConfig::down()
372 int current = m_files->currentItem();
373 if ( current!=-1 && current<(int)m_files->count()-1 ) {
374 QString txt = m_files->currentText();
375 m_files->removeItem( current );
376 m_files->insertItem( txt, current+1 );
377 m_files->setCurrentItem( current+1 );
381 #include "kpartsaver.moc"