|
|
|
/*
|
|
|
|
Copyright (C) 2000,2002 Carsten Pfeiffer <pfeiffer@kde.org>
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
Boston, MA 02110-1301, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <tqbuttongroup.h>
|
|
|
|
#include <tqlabel.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqradiobutton.h>
|
|
|
|
#include <tqslider.h>
|
|
|
|
#include <tqvbox.h>
|
|
|
|
|
|
|
|
#include <dcopclient.h>
|
|
|
|
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kcombobox.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <knotifydialog.h>
|
|
|
|
#include <kparts/genericfactory.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include <kurlcompletion.h>
|
|
|
|
#include <kurlrequester.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include "knotify.h"
|
|
|
|
#include "playersettings.h"
|
|
|
|
|
|
|
|
static const int COL_FILENAME = 1;
|
|
|
|
|
|
|
|
typedef KGenericFactory<KCMKNotify, TQWidget> NotifyFactory;
|
|
|
|
K_EXPORT_COMPONENT_FACTORY( kcm_knotify, NotifyFactory("kcmnotify") )
|
|
|
|
|
|
|
|
using namespace KNotify;
|
|
|
|
|
|
|
|
KCMKNotify::KCMKNotify(TQWidget *parent, const char *name, const TQStringList & )
|
|
|
|
: KCModule(NotifyFactory::instance(), parent, name),
|
|
|
|
m_playerSettings( 0L )
|
|
|
|
{
|
|
|
|
setButtons( Help | Default | Apply );
|
|
|
|
|
|
|
|
setQuickHelp( i18n("<h1>System Notifications</h1>"
|
|
|
|
"KDE allows for a great deal of control over how you "
|
|
|
|
"will be notified when certain events occur. There are "
|
|
|
|
"several choices as to how you are notified:"
|
|
|
|
"<ul><li>As the application was originally designed."
|
|
|
|
"<li>With a beep or other noise."
|
|
|
|
"<li>Via a popup dialog box with additional information."
|
|
|
|
"<li>By recording the event in a logfile without "
|
|
|
|
"any additional visual or audible alert."
|
|
|
|
"</ul>"));
|
|
|
|
|
|
|
|
TQVBoxLayout *layout = new TQVBoxLayout( this, 0, KDialog::spacingHint() );
|
|
|
|
|
|
|
|
TQLabel *label = new TQLabel( i18n( "Event source:" ), this );
|
|
|
|
m_appCombo = new KComboBox( false, this, "app combo" );
|
|
|
|
|
|
|
|
TQHBoxLayout *hbox = new TQHBoxLayout( layout );
|
|
|
|
hbox->addWidget( label );
|
|
|
|
hbox->addWidget( m_appCombo, 10 );
|
|
|
|
|
|
|
|
m_notifyWidget = new KNotifyWidget( this, "knotify widget", true );
|
|
|
|
connect( m_notifyWidget, TQT_SIGNAL( changed( bool )), TQT_SIGNAL( changed(bool)));
|
|
|
|
|
|
|
|
layout->addWidget( m_notifyWidget );
|
|
|
|
|
|
|
|
connect( m_appCombo, TQT_SIGNAL( activated( const TQString& ) ),
|
|
|
|
TQT_SLOT( slotAppActivated( const TQString& )) );
|
|
|
|
|
|
|
|
connect( m_notifyWidget->m_playerButton, TQT_SIGNAL( clicked() ),
|
|
|
|
TQT_SLOT( slotPlayerSettings()));
|
|
|
|
|
|
|
|
KAboutData* ab = new KAboutData(
|
|
|
|
"kcmknotify", I18N_NOOP("KNotify"), "3.0",
|
|
|
|
I18N_NOOP("System Notification Control Panel Module"),
|
|
|
|
KAboutData::License_GPL, "(c) 2002 Carsten Pfeiffer", 0, 0 );
|
|
|
|
ab->addAuthor( "Carsten Pfeiffer", 0, "pfeiffer@kde.org" );
|
|
|
|
ab->addCredit( "Charles Samuels", I18N_NOOP("Original implementation"),
|
|
|
|
"charles@altair.dhs.org" );
|
|
|
|
setAboutData( ab );
|
|
|
|
|
|
|
|
load();
|
|
|
|
}
|
|
|
|
|
|
|
|
KCMKNotify::~KCMKNotify()
|
|
|
|
{
|
|
|
|
KConfig config( "knotifyrc", false, false );
|
|
|
|
config.setGroup( "Misc" );
|
|
|
|
ApplicationList allApps = m_notifyWidget->allApps();
|
|
|
|
ApplicationListIterator appIt( allApps );
|
|
|
|
for ( ; appIt.current(); ++appIt )
|
|
|
|
{
|
|
|
|
if( appIt.current()->text() == m_appCombo->currentText())
|
|
|
|
config.writeEntry( "LastConfiguredApp", appIt.current()->appName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Application * KCMKNotify::applicationByDescription( const TQString& text )
|
|
|
|
{
|
|
|
|
// not really efficient, but this is not really time-critical
|
|
|
|
ApplicationList& allApps = m_notifyWidget->allApps();
|
|
|
|
ApplicationListIterator it ( allApps );
|
|
|
|
for ( ; it.current(); ++it )
|
|
|
|
{
|
|
|
|
if ( it.current()->text() == text )
|
|
|
|
return it.current();
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0L;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KCMKNotify::slotAppActivated( const TQString& text )
|
|
|
|
{
|
|
|
|
Application *app = applicationByDescription( text );
|
|
|
|
if ( app )
|
|
|
|
{
|
|
|
|
m_notifyWidget->clearVisible();
|
|
|
|
m_notifyWidget->addVisibleApp( app );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KCMKNotify::slotPlayerSettings()
|
|
|
|
{
|
|
|
|
// kcmshell is a modal dialog, and apparently, we can't put a non-modal
|
|
|
|
// dialog besides a modal dialog. sigh.
|
|
|
|
if ( !m_playerSettings )
|
|
|
|
m_playerSettings = new PlayerSettingsDialog( this, true );
|
|
|
|
|
|
|
|
m_playerSettings->exec();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KCMKNotify::defaults()
|
|
|
|
{
|
|
|
|
m_notifyWidget->resetDefaults( true ); // ask user
|
|
|
|
load( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KCMKNotify::load()
|
|
|
|
{
|
|
|
|
load( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KCMKNotify::load( bool useDefaults )
|
|
|
|
{
|
|
|
|
setEnabled( false );
|
|
|
|
|
|
|
|
m_appCombo->clear();
|
|
|
|
m_notifyWidget->clear();
|
|
|
|
|
|
|
|
TQStringList fullpaths =
|
|
|
|
KGlobal::dirs()->findAllResources("data", "*/eventsrc", false, true );
|
|
|
|
|
|
|
|
TQStringList::ConstIterator it = fullpaths.begin();
|
|
|
|
for ( ; it != fullpaths.end(); ++it)
|
|
|
|
m_notifyWidget->addApplicationEvents( *it );
|
|
|
|
|
|
|
|
ApplicationList allApps = m_notifyWidget->allApps();
|
|
|
|
allApps.sort();
|
|
|
|
m_notifyWidget->setEnabled( !allApps.isEmpty() );
|
|
|
|
|
|
|
|
KConfig config( "knotifyrc", true, false );
|
|
|
|
config.setReadDefaults( useDefaults );
|
|
|
|
config.setGroup( "Misc" );
|
|
|
|
TQString select = config.readEntry( "LastConfiguredApp" );
|
|
|
|
if( select.isEmpty())
|
|
|
|
select = "knotify"; // default to system notifications
|
|
|
|
bool selected = false;
|
|
|
|
|
|
|
|
ApplicationListIterator appIt( allApps );
|
|
|
|
for ( ; appIt.current(); ++appIt )
|
|
|
|
{
|
|
|
|
m_appCombo->insertItem( appIt.current()->text() );
|
|
|
|
if( appIt.current()->appName() == select )
|
|
|
|
{
|
|
|
|
m_appCombo->setCurrentItem( appIt.current()->text());
|
|
|
|
selected = true;
|
|
|
|
}
|
|
|
|
else if( !selected && appIt.current()->appName() == "knotify" )
|
|
|
|
m_appCombo->setCurrentItem( appIt.current()->text());
|
|
|
|
}
|
|
|
|
|
|
|
|
// sets the applicationEvents for KNotifyWidget
|
|
|
|
slotAppActivated( m_appCombo->currentText() );
|
|
|
|
|
|
|
|
// unsetCursor(); // unsetting doesn't work. sigh.
|
|
|
|
setEnabled( true );
|
|
|
|
emit changed( useDefaults );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KCMKNotify::save()
|
|
|
|
{
|
|
|
|
if ( m_playerSettings )
|
|
|
|
m_playerSettings->save();
|
|
|
|
|
|
|
|
m_notifyWidget->save(); // will dcop knotify about its new config
|
|
|
|
|
|
|
|
emit changed( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
PlayerSettingsDialog::PlayerSettingsDialog( TQWidget *parent, bool modal )
|
|
|
|
: KDialogBase( parent, "player settings dialog", modal,
|
|
|
|
i18n("Player Settings"), Ok|Apply|Cancel, Ok, true )
|
|
|
|
{
|
|
|
|
TQFrame *frame = makeMainWidget();
|
|
|
|
|
|
|
|
TQVBoxLayout *topLayout = new TQVBoxLayout( frame, 0,
|
|
|
|
KDialog::spacingHint() );
|
|
|
|
|
|
|
|
m_ui = new PlayerSettingsUI(frame);
|
|
|
|
topLayout->addWidget(m_ui);
|
|
|
|
|
|
|
|
load( false );
|
|
|
|
dataChanged = false;
|
|
|
|
enableButton(Apply, false);
|
|
|
|
|
|
|
|
connect( m_ui->cbExternal, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( externalToggled( bool ) ) );
|
|
|
|
connect( m_ui->grpPlayers, TQT_SIGNAL( clicked( int ) ), this, TQT_SLOT( slotChanged() ) );
|
|
|
|
connect( m_ui->volumeSlider, TQT_SIGNAL( valueChanged ( int ) ), this, TQT_SLOT( slotChanged() ) );
|
|
|
|
connect( m_ui->reqExternal, TQT_SIGNAL( textChanged( const TQString& ) ), this, TQT_SLOT( slotChanged() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlayerSettingsDialog::load( bool useDefaults )
|
|
|
|
{
|
|
|
|
KConfig config( "knotifyrc", true, false );
|
|
|
|
config.setReadDefaults( useDefaults );
|
|
|
|
config.setGroup( "Misc" );
|
|
|
|
bool useExternal = config.readBoolEntry( "Use external player", false );
|
|
|
|
m_ui->cbExternal->setChecked( useExternal );
|
|
|
|
m_ui->reqExternal->setURL( config.readPathEntry( "External player" ) );
|
|
|
|
m_ui->volumeSlider->setValue( config.readNumEntry( "Volume", 100 ) );
|
|
|
|
|
|
|
|
if ( !m_ui->cbExternal->isChecked() )
|
|
|
|
{
|
|
|
|
config.setGroup( "StartProgress" );
|
|
|
|
if ( config.readBoolEntry( "Use Arts", true ) )
|
|
|
|
{
|
|
|
|
m_ui->cbArts->setChecked( true );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_ui->cbNone->setChecked( true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlayerSettingsDialog::save()
|
|
|
|
{
|
|
|
|
// see tdelibs/arts/knotify/knotify.cpp
|
|
|
|
KConfig config( "knotifyrc", false, false );
|
|
|
|
config.setGroup( "Misc" );
|
|
|
|
|
|
|
|
config.writePathEntry( "External player", m_ui->reqExternal->url() );
|
|
|
|
config.writeEntry( "Use external player", m_ui->cbExternal->isChecked() );
|
|
|
|
config.writeEntry( "Volume", m_ui->volumeSlider->value() );
|
|
|
|
|
|
|
|
config.setGroup( "StartProgress" );
|
|
|
|
|
|
|
|
if ( m_ui->cbNone->isChecked() )
|
|
|
|
{
|
|
|
|
// user explicitly says "no sound!"
|
|
|
|
config.writeEntry( "Use Arts", false );
|
|
|
|
}
|
|
|
|
else if ( m_ui->cbArts->isChecked() )
|
|
|
|
{
|
|
|
|
// use explicitly said to use aRts so we turn it back on
|
|
|
|
// we don't want to always set this to the value of
|
|
|
|
// m_ui->cbArts->isChecked() since we don't want to
|
|
|
|
// turn off aRts support just because they also chose
|
|
|
|
// an external player
|
|
|
|
config.writeEntry( "Use Arts", true );
|
|
|
|
config.writeEntry( "Arts Init", true ); // reset it for the next time
|
|
|
|
}
|
|
|
|
|
|
|
|
config.sync();
|
|
|
|
}
|
|
|
|
|
|
|
|
// reimplements KDialogBase::slotApply()
|
|
|
|
void PlayerSettingsDialog::slotApply()
|
|
|
|
{
|
|
|
|
save();
|
|
|
|
dataChanged = false;
|
|
|
|
enableButton(Apply, false);
|
|
|
|
kapp->dcopClient()->send("knotify", "", "reconfigure()", TQString(""));
|
|
|
|
|
|
|
|
KDialogBase::slotApply();
|
|
|
|
}
|
|
|
|
|
|
|
|
// reimplements KDialogBase::slotOk()
|
|
|
|
void PlayerSettingsDialog::slotOk()
|
|
|
|
{
|
|
|
|
if( dataChanged )
|
|
|
|
slotApply();
|
|
|
|
KDialogBase::slotOk();
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlayerSettingsDialog::slotChanged()
|
|
|
|
{
|
|
|
|
dataChanged = true;
|
|
|
|
enableButton(Apply, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlayerSettingsDialog::externalToggled( bool on )
|
|
|
|
{
|
|
|
|
if ( on )
|
|
|
|
m_ui->reqExternal->setFocus();
|
|
|
|
else
|
|
|
|
m_ui->reqExternal->clearFocus();
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "knotify.moc"
|