SVN_SILENT made messages (.desktop file)
[kdeartwork.git] / kscreensaver / kpartsaver / kpartsaver.cpp
blob6d3fdc4fb0c14c70dafef0503cc6b85bc79bd097
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 <QList>
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 <kio/jobclasses.h>
45 #include <kio/job.h>
46 #include <kmimetype.h>
47 #include <kmimetypetrader.h>
49 #include <kscreensaver.h>
51 #include "kpartsaver.h"
52 #include <kiconloader.h>
53 #include <kglobal.h>
56 QList<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 qDeleteAll(g_savers);
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;
107 srand( time(0) );
109 // install signal handler
110 signal( SIGINT, exitHandler ); // Ctrl-C will cause a clean exit...
111 signal( SIGTERM, exitHandler ); // "kill"...
112 signal( SIGHUP, exitHandler ); // "kill -HUP" (hangup)...
113 signal( SIGKILL, exitHandler ); // "kill -KILL"
114 //atexit( ( void (*)(void) ) exitHandler );
117 g_savers.append( this );
119 closeUrl();
121 // load config
122 KConfigGroup cfg(KGlobal::config(), "Misc");
124 m_single = cfg.readEntry( "Single", true );
125 m_delay = cfg.readEntry( "Delay", 60 );
126 m_random = cfg.readEntry( "Random", false );
127 m_files = cfg.readEntry( "Files",QStringList() );
129 if( m_files.count()==0 ) {
131 // create background widget
132 m_back = new QLabel( i18n("The screen saver is not configured yet."), this );
134 m_back->setAlignment( Qt::AlignCenter );
135 embed( m_back );
136 m_back->show();
138 } else {
140 // queue files
141 for( int n=0; n<m_files.count(); n++ )
142 queue( KUrl( m_files[n] ) );
144 // play files
145 if( m_single )
146 next( m_random );
147 else {
148 next( m_random );
149 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
155 KPartSaver::~KPartSaver()
157 g_savers.removeAll( this );
158 closeUrl();
162 void KPartSaver::closeUrl()
164 if( m_part ) {
165 m_part->closeUrl();
166 delete m_part;
167 m_part = 0;
172 bool KPartSaver::openUrl( const KUrl &url )
174 if( m_part )
175 closeUrl();
177 // find mime type
178 QString mime = KMimeType::findByUrl( url )->name();
180 // load part
181 m_part = KMimeTypeTrader::createPartInstanceFromQuery<KParts::ReadOnlyPart>(
182 mime, this, this, QString() );
184 if( !m_part ) {
185 kDebug() << "Part for " << url << " can't be constructed";
186 closeUrl();
187 return false;
188 } else
189 embed( m_part->widget() );
191 // show kpart
192 delete m_back;
193 m_back = 0;
195 show();
196 m_part->widget()->show();
198 // load url
199 if( !m_part->openUrl( url ) ) {
200 kDebug() << "Can't load " << url.url();
201 delete m_part;
202 m_part = 0;
203 closeUrl();
204 return false;
207 return true;
211 void KPartSaver::queue( const KUrl &url )
213 Medium medium;
214 medium.url = url;
215 medium.failed = false;
216 m_media.append( medium );
220 void KPartSaver::timeout()
222 next( m_random );
223 QTimer::singleShot( m_delay*1000, this, SLOT(timeout()) );
227 void KPartSaver::next( bool random )
229 // try to find working media
230 while( m_media.count()>0 ) {
232 if( random )
233 m_current = rand() % m_media.count();
234 else
235 m_current++;
237 if( m_current>=(int)m_media.count() )
238 m_current = 0;
240 kDebug() << "Trying medium " << m_media[m_current].url.url();
242 // either start immediately or start mimejob first
243 if( !openUrl( m_media[m_current].url ) ) {
244 m_media.removeAll( m_media.at(m_current) );
245 m_current--;
246 } else
247 return;
251 // create background widget
252 m_back = new QLabel( i18n("All of your files are unsupported"), this );
254 m_back->setAlignment( Qt::AlignCenter );
255 embed( m_back );
256 m_back->show();
258 // nothing found, set to invalid
259 m_current = -1;
263 /*******************************************************************************/
266 SaverConfig::SaverConfig( QWidget* parent )
267 : ConfigWidget( parent )
269 setModal(true);
270 connect( m_ok, SIGNAL(clicked()), SLOT(apply()) );
271 connect( m_ok, SIGNAL(clicked()), SLOT(accept()) );
272 connect( m_cancel, SIGNAL(clicked()), SLOT(reject()) );
274 connect( m_multiple, SIGNAL(toggled(bool)), m_delayLabel, SLOT(setEnabled(bool)) );
275 connect( m_multiple, SIGNAL(toggled(bool)), m_delay, SLOT(setEnabled(bool)) );
276 connect( m_multiple, SIGNAL(toggled(bool)), m_secondsLabel, SLOT(setEnabled(bool)) );
277 connect( m_multiple, SIGNAL(toggled(bool)), m_random, SLOT(setEnabled(bool)) );
279 connect( m_files, SIGNAL(itemSelectionChanged()), SLOT(select()) );
280 connect( m_add, SIGNAL(clicked()), SLOT(add()) );
281 connect( m_remove, SIGNAL(clicked()), SLOT(remove()) );
282 connect( m_up, SIGNAL(clicked()), SLOT(up()) );
283 connect( m_down, SIGNAL(clicked()), SLOT(down()) );
285 m_up->setIcon( KIcon("go-up") );
286 m_down->setIcon( KIcon("go-down") );
288 // load config
289 KConfigGroup cfg(KGlobal::config(), "Misc");
291 bool single = cfg.readEntry( "Single", true );
292 m_single->setChecked( single );
293 m_multiple->setChecked( !single );
294 m_delay->setMinimum( 1 );
295 m_delay->setMaximum( 10000 );
296 m_delay->setValue( cfg.readEntry( "Delay", 60 ) );
297 m_random->setChecked( cfg.readEntry( "Random", false ) );
298 m_files->addItems( cfg.readEntry( "Files",QStringList() ) );
300 // update buttons
301 select();
305 SaverConfig::~SaverConfig()
310 void SaverConfig::apply()
312 kDebug() << "apply";
314 KConfigGroup cfg(KGlobal::config(), "Misc");
316 cfg.writeEntry( "Single", m_single->isChecked() );
317 cfg.writeEntry( "Delay", m_delay->value() );
318 cfg.writeEntry( "Random", m_random->isChecked() );
320 int num = m_files->count();
321 QStringList files;
322 for( int n=0; n<num; n++ )
323 files << m_files->item(n)->text();
325 cfg.writeEntry( "Files", files );
327 cfg.sync();
331 void SaverConfig::add()
333 KUrl::List files = KFileDialog::getOpenUrls( KUrl(), QString(),
334 this, i18n("Select Media Files") );
335 for( int n=0; n<files.count(); n++ )
336 m_files->addItem( files[n].prettyUrl() );
340 void SaverConfig::remove()
342 int current = m_files->currentRow();
343 if( current!=-1 )
344 m_files->takeItem( current );
348 void SaverConfig::select()
350 bool enabled = m_files->currentRow()!=-1;
351 m_remove->setEnabled( enabled );
352 m_up->setEnabled( enabled && m_files->currentRow()!=0 );
353 m_down->setEnabled( enabled && m_files->currentRow()!=(int)m_files->count()-1 );
357 void SaverConfig::up()
359 int current = m_files->currentRow();
360 if ( current>0 ) {
361 QString txt = m_files->currentItem()->text();
362 m_files->takeItem( current );
363 m_files->insertItem( current-1, txt );
364 m_files->setCurrentRow( current-1 );
369 void SaverConfig::down()
371 int current = m_files->currentRow();
372 if ( current!=-1 && current<(int)m_files->count()-1 ) {
373 QString txt = m_files->currentItem()->text();
374 m_files->takeItem( current );
375 m_files->insertItem( current+1, txt );
376 m_files->setCurrentRow( current+1 );
380 #include "kpartsaver.moc"