Cleanup a little CMakeLists.txt
[kdeartwork.git] / kscreensaver / kpartsaver / kpartsaver.cpp
blob7fa68923a2366dc99707b6446e68764aa4389ef0
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 "configwidget.h"
53 #include "kpartsaver.h"
54 #include <kiconloader.h>
55 #include <kglobal.h>
58 Q3PtrList<KPartSaver> g_savers;
59 bool g_inited = false;
62 class KPartSaverInterface : public KScreenSaverInterface
66 public:
67 virtual KAboutData* aboutData() {
68 return new KAboutData( "kpartsaver", I18N_NOOP( "KPart Screen Saver" ), "1.0", I18N_NOOP( "KPart Screen Saver" ) );
72 virtual KScreenSaver* create( WId d )
74 KGlobal::locale()->insertCatalog("kpartsaver");
75 return new KPartSaver( d );
78 virtual QDialog* setup()
80 KGlobal::locale()->insertCatalog("kpartsaver");
81 return new SaverConfig;
85 int main( int argc, char *argv[] )
87 KPartSaverInterface kss;
88 return kScreenSaverMain( argc, argv, kss );
92 void exitHandler( int )
94 kDebug() << "exitHandler" << endl;
95 g_savers.clear();
96 KLibLoader::self()->cleanUp();
97 exit(0);
101 KPartSaver::KPartSaver( WId id )
102 : KScreenSaver( id ), m_timer(), m_part(0), m_current(-1), m_back(0)
104 // install signal handlers to make sure that nspluginviewer is shutdown correctly
105 // move this into the nspluginviewer kpart code
106 if( !g_inited ) {
107 g_inited = true;
108 g_savers.setAutoDelete( true );
110 srand( time(0) );
112 // install signal handler
113 signal( SIGINT, exitHandler ); // Ctrl-C will cause a clean exit...
114 signal( SIGTERM, exitHandler ); // "kill"...
115 signal( SIGHUP, exitHandler ); // "kill -HUP" (hangup)...
116 signal( SIGKILL, exitHandler ); // "kill -KILL"
117 //atexit( ( void (*)(void) ) exitHandler );
120 g_savers.append( this );
122 closeURL();
124 // load config
125 KConfig *cfg = KGlobal::config();
126 cfg->setGroup( "Misc" );
128 m_single = cfg->readBoolEntry( "Single", true );
129 m_delay = cfg->readNumEntry( "Delay", 60 );
130 m_random = cfg->readBoolEntry( "Random", false );
131 m_files = cfg->readListEntry( "Files" );
133 if( m_files.count()==0 ) {
135 // create background widget
136 m_back = new QLabel( i18n("The screen saver is not configured yet."), this );
138 m_back->setAlignment( Qt::AlignCenter );
139 embed( m_back );
140 m_back->show();
142 } else {
144 // queue files
145 for( int n=0; n<m_files.count(); n++ )
146 queue( KUrl::fromPathOrUrl( m_files[n] ) );
148 // play files
149 if( m_single )
150 next( m_random );
151 else {
152 next( m_random );
153 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
159 KPartSaver::~KPartSaver()
161 g_savers.take( g_savers.findRef( this ));
162 closeURL();
166 void KPartSaver::closeURL()
168 if( m_part ) {
169 m_part->closeURL();
170 delete m_part;
171 m_part = 0;
176 bool KPartSaver::openURL( KUrl url )
178 if( m_part )
179 closeURL();
181 // find mime type
182 QString mime = KMimeType::findByURL( url )->name();
184 // load part
185 m_part = KParts::ComponentFactory::createPartInstanceFromQuery<KParts::ReadOnlyPart>(
186 mime, QString(), this, this );
188 if( !m_part ) {
189 kDebug() << "Part for " << url << " can't be constructed" << endl;
190 closeURL();
191 return false;
192 } else
193 embed( m_part->widget() );
195 // show kpart
196 delete m_back;
197 m_back = 0;
199 show();
200 m_part->widget()->show();
202 // load url
203 if( !m_part->openURL( url ) ) {
204 kDebug() << "Can't load " << url.url() << endl;
205 delete m_part;
206 m_part = 0;
207 closeURL();
208 return false;
211 return true;
215 void KPartSaver::queue( KUrl url )
217 Medium medium;
218 medium.url = url;
219 medium.failed = false;
220 m_media.append( medium );
224 void KPartSaver::timeout()
226 next( m_random );
227 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
231 void KPartSaver::next( bool random )
233 // try to find working media
234 while( m_media.count()>0 ) {
236 if( random )
237 m_current = rand() % m_media.count();
238 else
239 m_current++;
241 if( m_current>=(int)m_media.count() )
242 m_current = 0;
244 kDebug() << "Trying medium " << m_media[m_current].url.url() << endl;
246 // either start immediately or start mimejob first
247 if( !openURL( m_media[m_current].url ) ) {
248 m_media.remove( m_media.at(m_current) );
249 m_current--;
250 } else
251 return;
255 // create background widget
256 m_back = new QLabel( i18n("All of your files are unsupported"), this );
258 m_back->setAlignment( Qt::AlignCenter );
259 embed( m_back );
260 m_back->show();
262 // nothing found, set to invalid
263 m_current = -1;
267 /*******************************************************************************/
270 SaverConfig::SaverConfig( QWidget* parent, const char* name )
271 : ConfigWidget( parent, name, true )
273 connect( m_ok, SIGNAL(clicked()), SLOT(apply()) );
274 connect( m_ok, SIGNAL(clicked()), SLOT(accept()) );
275 connect( m_cancel, SIGNAL(clicked()), SLOT(reject()) );
277 connect( m_multiple, SIGNAL(toggled(bool)), m_delayLabel, SLOT(setEnabled(bool)) );
278 connect( m_multiple, SIGNAL(toggled(bool)), m_delay, SLOT(setEnabled(bool)) );
279 connect( m_multiple, SIGNAL(toggled(bool)), m_secondsLabel, SLOT(setEnabled(bool)) );
280 connect( m_multiple, SIGNAL(toggled(bool)), m_random, SLOT(setEnabled(bool)) );
282 connect( m_files, SIGNAL(selectionChanged()), SLOT(select()) );
283 connect( m_add, SIGNAL(clicked()), SLOT(add()) );
284 connect( m_remove, SIGNAL(clicked()), SLOT(remove()) );
285 connect( m_up, SIGNAL(clicked()), SLOT(up()) );
286 connect( m_down, SIGNAL(clicked()), SLOT(down()) );
288 m_up->setIcon( SmallIconSet("up") );
289 m_down->setIcon( SmallIconSet("down") );
291 // load config
292 KConfig *cfg = KGlobal::config();
293 cfg->setGroup( "Misc" );
295 bool single = cfg->readBoolEntry( "Single", true );
296 m_single->setChecked( single );
297 m_multiple->setChecked( !single );
298 m_delay->setMinimum( 1 );
299 m_delay->setMaximum( 10000 );
300 m_delay->setValue( cfg->readNumEntry( "Delay", 60 ) );
301 m_random->setChecked( cfg->readBoolEntry( "Random", false ) );
302 m_files->insertStringList( cfg->readListEntry( "Files" ) );
304 // update buttons
305 select();
309 SaverConfig::~SaverConfig()
314 void SaverConfig::apply()
316 kDebug() << "apply" << endl;
318 KConfig *cfg = KGlobal::config();
319 cfg->setGroup( "Misc" );
321 cfg->writeEntry( "Single", m_single->isChecked() );
322 cfg->writeEntry( "Delay", m_delay->value() );
323 cfg->writeEntry( "Random", m_random->isChecked() );
325 int num = m_files->count();
326 QStringList files;
327 for( int n=0; n<num; n++ )
328 files << m_files->text(n);
330 cfg->writeEntry( "Files", files );
332 cfg->sync();
336 void SaverConfig::add()
338 KUrl::List files = KFileDialog::getOpenUrls( KUrl(), QString::null,
339 this, i18n("Select Media Files") );
340 for( int n=0; n<files.count(); n++ )
341 m_files->insertItem( files[n].prettyUrl(), -1 );
345 void SaverConfig::remove()
347 int current = m_files->currentItem();
348 if( current!=-1 )
349 m_files->removeItem( current );
353 void SaverConfig::select()
355 bool enabled = m_files->currentItem()!=-1;
356 m_remove->setEnabled( enabled );
357 m_up->setEnabled( enabled && m_files->currentItem()!=0 );
358 m_down->setEnabled( enabled && m_files->currentItem()!=(int)m_files->count()-1 );
362 void SaverConfig::up()
364 int current = m_files->currentItem();
365 if ( current>0 ) {
366 QString txt = m_files->currentText();
367 m_files->removeItem( current );
368 m_files->insertItem( txt, current-1 );
369 m_files->setCurrentItem( current-1 );
374 void SaverConfig::down()
376 int current = m_files->currentItem();
377 if ( current!=-1 && current<(int)m_files->count()-1 ) {
378 QString txt = m_files->currentText();
379 m_files->removeItem( current );
380 m_files->insertItem( txt, current+1 );
381 m_files->setCurrentItem( current+1 );
385 #include "kpartsaver.moc"