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.
28 #include <q3valuelist.h>
29 #include <qpushbutton.h>
30 #include <qradiobutton.h>
32 #include <qcheckbox.h>
38 #include <kapplication.h>
40 #include <klibloader.h>
42 #include <kfiledialog.h>
44 #include <kparts/part.h>
45 #include <kparts/componentfactory.h>
46 #include <kio/jobclasses.h>
48 #include <kmimetype.h>
50 #include <kscreensaver.h>
52 #include "kpartsaver.h"
53 #include <kiconloader.h>
57 Q3PtrList
<KPartSaver
> g_savers
;
58 bool g_inited
= false;
61 class KPartSaverInterface
: public KScreenSaverInterface
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";
95 //KLibLoader::self()->cleanUp();
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
107 g_savers
.setAutoDelete( true );
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 );
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
);
143 for( int n
=0; n
<m_files
.count(); n
++ )
144 queue( KUrl::fromPathOrUrl( m_files
[n
] ) );
151 QTimer::singleShot( m_delay
*1000, this, SLOT(timeout()) );
157 KPartSaver::~KPartSaver()
159 g_savers
.take( g_savers
.findRef( this ));
164 void KPartSaver::closeUrl()
174 bool KPartSaver::openUrl( const KUrl
&url
)
180 QString mime
= KMimeType::findByUrl( url
)->name();
183 m_part
= KParts::ComponentFactory::createPartInstanceFromQuery
<KParts::ReadOnlyPart
>(
184 mime
, QString(), this, this );
187 kDebug() << "Part for " << url
<< " can't be constructed";
191 embed( m_part
->widget() );
198 m_part
->widget()->show();
201 if( !m_part
->openUrl( url
) ) {
202 kDebug() << "Can't load " << url
.url();
213 void KPartSaver::queue( const KUrl
&url
)
217 medium
.failed
= false;
218 m_media
.append( medium
);
222 void KPartSaver::timeout()
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 ) {
235 m_current
= rand() % m_media
.count();
239 if( m_current
>=(int)m_media
.count() )
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
) );
253 // create background widget
254 m_back
= new QLabel( i18n("All of your files are unsupported"), this );
256 m_back
->setAlignment( Qt::AlignCenter
);
260 // nothing found, set to invalid
265 /*******************************************************************************/
268 SaverConfig::SaverConfig( QWidget
* parent
)
269 : ConfigWidget( parent
)
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") );
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() ) );
307 SaverConfig::~SaverConfig()
312 void SaverConfig::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();
324 for( int n
=0; n
<num
; n
++ )
325 files
<< m_files
->text(n
);
327 cfg
.writeEntry( "Files", files
);
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();
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();
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"