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>
37 #include <kapplication.h>
39 #include <klibloader.h>
41 #include <kfiledialog.h>
43 #include <kparts/part.h>
44 #include <kparts/componentfactory.h>
45 #include <kio/jobclasses.h>
47 #include <kmimetype.h>
49 #include <kscreensaver.h>
51 #include "kpartsaver.h"
52 #include <kiconloader.h>
56 Q3PtrList
<KPartSaver
> g_savers
;
57 bool g_inited
= false;
60 class KPartSaverInterface
: public KScreenSaverInterface
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";
94 //KLibLoader::self()->cleanUp();
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
106 g_savers
.setAutoDelete( true );
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 );
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
);
142 for( int n
=0; n
<m_files
.count(); n
++ )
143 queue( KUrl::fromPathOrUrl( m_files
[n
] ) );
150 QTimer::singleShot( m_delay
*1000, this, SLOT(timeout()) );
156 KPartSaver::~KPartSaver()
158 g_savers
.take( g_savers
.findRef( this ));
163 void KPartSaver::closeUrl()
173 bool KPartSaver::openUrl( const KUrl
&url
)
179 QString mime
= KMimeType::findByUrl( url
)->name();
182 m_part
= KParts::ComponentFactory::createPartInstanceFromQuery
<KParts::ReadOnlyPart
>(
183 mime
, QString(), this, this );
186 kDebug() << "Part for " << url
<< " can't be constructed";
190 embed( m_part
->widget() );
197 m_part
->widget()->show();
200 if( !m_part
->openUrl( url
) ) {
201 kDebug() << "Can't load " << url
.url();
212 void KPartSaver::queue( const KUrl
&url
)
216 medium
.failed
= false;
217 m_media
.append( medium
);
221 void KPartSaver::timeout()
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 ) {
234 m_current
= rand() % m_media
.count();
238 if( m_current
>=(int)m_media
.count() )
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
) );
252 // create background widget
253 m_back
= new QLabel( i18n("All of your files are unsupported"), this );
255 m_back
->setAlignment( Qt::AlignCenter
);
259 // nothing found, set to invalid
264 /*******************************************************************************/
267 SaverConfig::SaverConfig( QWidget
* parent
)
268 : ConfigWidget( parent
)
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") );
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() ) );
306 SaverConfig::~SaverConfig()
311 void SaverConfig::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();
323 for( int n
=0; n
<num
; n
++ )
324 files
<< m_files
->text(n
);
326 cfg
.writeEntry( "Files", files
);
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();
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();
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"