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 <kio/jobclasses.h>
46 #include <kmimetype.h>
47 #include <kmimetypetrader.h>
49 #include <kscreensaver.h>
51 #include "kpartsaver.h"
52 #include <kiconloader.h>
56 QList
<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
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 );
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
);
141 for( int n
=0; n
<m_files
.count(); n
++ )
142 queue( KUrl( m_files
[n
] ) );
149 QTimer::singleShot( m_delay
*1000, this, SLOT(timeout()) );
155 KPartSaver::~KPartSaver()
157 g_savers
.removeAll( this );
162 void KPartSaver::closeUrl()
172 bool KPartSaver::openUrl( const KUrl
&url
)
178 QString mime
= KMimeType::findByUrl( url
)->name();
181 m_part
= KMimeTypeTrader::createPartInstanceFromQuery
<KParts::ReadOnlyPart
>(
182 mime
, this, this, QString() );
185 kDebug() << "Part for " << url
<< " can't be constructed";
189 embed( m_part
->widget() );
196 m_part
->widget()->show();
199 if( !m_part
->openUrl( url
) ) {
200 kDebug() << "Can't load " << url
.url();
211 void KPartSaver::queue( const KUrl
&url
)
215 medium
.failed
= false;
216 m_media
.append( medium
);
220 void KPartSaver::timeout()
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 ) {
233 m_current
= rand() % m_media
.count();
237 if( m_current
>=(int)m_media
.count() )
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
) );
251 // create background widget
252 m_back
= new QLabel( i18n("All of your files are unsupported"), this );
254 m_back
->setAlignment( Qt::AlignCenter
);
258 // nothing found, set to invalid
263 /*******************************************************************************/
266 SaverConfig::SaverConfig( QWidget
* parent
)
267 : ConfigWidget( parent
)
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") );
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() ) );
305 SaverConfig::~SaverConfig()
310 void SaverConfig::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();
322 for( int n
=0; n
<num
; n
++ )
323 files
<< m_files
->item(n
)->text();
325 cfg
.writeEntry( "Files", files
);
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();
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();
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"