/*************************************************************************** * Copyright (C) 2005 Paul Cifarelli * * * * 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "helix-configdialog.h" #include "helix-engine.h" #include "config/helixconfig.h" #include #include #define DEBUG_PREFIX "helix-engine" #define indent helix_indent #include "debug.h" using namespace std; HelixConfigDialogBase *HelixConfigDialog::instance = NULL; HelixConfigEntry::HelixConfigEntry( TQWidget *parent, Amarok::PluginConfig *pluginConfig, int row, const TQString & description, const char *defaultvalue, const TQString & tooltip) : m_w(0) , m_valueChanged( false ) , m_stringValue( defaultvalue ) { TQGridLayout *grid = (TQGridLayout*)parent->tqlayout(); m_w = new KLineEdit( m_stringValue, parent ); connect( (TQWidget *) m_w, TQT_SIGNAL(textChanged( const TQString& )), this, TQT_SLOT(slotStringChanged( const TQString& )) ); connect( (TQWidget *) m_w, TQT_SIGNAL(textChanged( const TQString& )), pluginConfig, TQT_SIGNAL(viewChanged()) ); TQToolTip::add( (TQWidget *) m_w, "" + tooltip ); TQLabel* d = new TQLabel( description + ':', parent ); d->tqsetAlignment( TQLabel::WordBreak | TQLabel::AlignVCenter ); grid->addWidget( (TQWidget *) m_w, row, 1 ); grid->addWidget( d, row, 0 ); } HelixConfigEntry::HelixConfigEntry( TQWidget *parent, TQString &str, Amarok::PluginConfig *pluginConfig, int row, const TQString & description, const char *defaultvalue, const TQString & tooltip) : m_w(0) , m_valueChanged( false ) , m_stringValue( defaultvalue ) { TQGridLayout *grid = (TQGridLayout*)parent->tqlayout(); m_key = str; m_w = new KLineEdit( str, parent ); connect( m_w, TQT_SIGNAL(textChanged( const TQString& )), this, TQT_SLOT(slotStringChanged( const TQString& )) ); connect( m_w, TQT_SIGNAL(textChanged( const TQString& )), pluginConfig, TQT_SIGNAL(viewChanged()) ); TQToolTip::add( m_w, "" + tooltip ); TQLabel* d = new TQLabel( description + ':', parent ); d->tqsetAlignment( TQLabel::WordBreak | TQLabel::AlignVCenter ); grid->addWidget( m_w, row, 1 ); grid->addWidget( d, row, 0 ); } inline void HelixConfigEntry::slotStringChanged( const TQString& ) { m_stringValue = m_w->text(); m_valueChanged = true; } HelixSoundDevice::HelixSoundDevice( TQWidget *parent, Amarok::PluginConfig *pluginConfig, int &row, HelixEngine *engine ) : deviceComboBox(0), checkBox_outputDevice(0), lineEdit_outputDevice(0), m_changed(false), m_engine(engine) { TQGridLayout *grid = (TQGridLayout*)parent->tqlayout(); deviceComboBox = new KComboBox( false, parent, "deviceComboBox" ); deviceComboBox->insertItem("oss"); // I believe these are not subject to translation (they don't seem to be in xine, #ifdef USE_HELIX_ALSA deviceComboBox->insertItem("alsa"); // and neither are the equivalents in gst (osssink and alsasink) #endif deviceComboBox->setCurrentItem(HelixConfig::outputplugin()); TQLabel* op = new TQLabel( i18n("Output plugin:"), parent ); op->tqsetAlignment( TQLabel::WordBreak | TQLabel::AlignVCenter ); grid->addWidget( op, row, 0 ); grid->addWidget( deviceComboBox, row, 1); connect( (TQWidget *)deviceComboBox, TQT_SIGNAL( activated( const TQString& ) ), this, TQT_SLOT( slotNewDevice( const TQString& )) ); connect( (TQWidget *)deviceComboBox, TQT_SIGNAL( activated( const TQString& )), pluginConfig, TQT_SIGNAL(viewChanged()) ); ++row; checkBox_outputDevice = new TQCheckBox( parent, "checkBox_outputDevice" ); checkBox_outputDevice->tqsetSizePolicy( TQSizePolicy( (TQSizePolicy::SizeType)5, (TQSizePolicy::SizeType)5, 0, 0, checkBox_outputDevice->sizePolicy().hasHeightForWidth() ) ); grid->addWidget( checkBox_outputDevice, row, 0 ); checkBox_outputDevice->setText( i18n( "Device:" ) ); lineEdit_outputDevice = new KLineEdit( HelixConfig::device(), parent ); connect( (TQWidget *) lineEdit_outputDevice, TQT_SIGNAL(textChanged( const TQString& )), this, TQT_SLOT(slotStringChanged( const TQString& )) ); connect( (TQWidget *) lineEdit_outputDevice, TQT_SIGNAL( textChanged( const TQString& )), pluginConfig, TQT_SIGNAL(viewChanged()) ); connect( checkBox_outputDevice, TQT_SIGNAL( toggled(bool) ), lineEdit_outputDevice, TQT_SLOT( setEnabled(bool) ) ); connect( checkBox_outputDevice, TQT_SIGNAL( toggled(bool) ), pluginConfig, TQT_SIGNAL(viewChanged()) ); connect( checkBox_outputDevice, TQT_SIGNAL( toggled(bool) ), this, TQT_SLOT( slotDeviceChecked(bool) ) ); grid->addWidget( (TQWidget *) lineEdit_outputDevice, row, 1 ); if (HelixConfig::deviceenabled()) { checkBox_outputDevice->setChecked( true ); lineEdit_outputDevice->setEnabled( true ); } else { checkBox_outputDevice->setChecked( false ); lineEdit_outputDevice->setEnabled( false ); } if (HelixConfig::outputplugin() == "oss") { checkBox_outputDevice->setEnabled( false ); lineEdit_outputDevice->setEnabled( false ); } } void HelixSoundDevice::slotNewDevice( const TQString &dev ) { if (dev == "oss") { checkBox_outputDevice->setEnabled( false ); lineEdit_outputDevice->setEnabled(false); } else { checkBox_outputDevice->setEnabled( true ); if (checkBox_outputDevice->isChecked()) lineEdit_outputDevice->setEnabled( true ); else lineEdit_outputDevice->setEnabled( false ); } m_changed = true; } void HelixSoundDevice::slotStringChanged( const TQString& ) { m_changed = true; } void HelixSoundDevice::slotDeviceChecked( bool checked ) { checkBox_outputDevice->setChecked( checked ); if (checked) lineEdit_outputDevice->setEnabled( true ); else lineEdit_outputDevice->setEnabled( false ); m_changed = true; } bool HelixSoundDevice::save() { if (m_changed) { HelixConfig::setOutputplugin(deviceComboBox->currentText()); if (deviceComboBox->currentText() == "oss") m_engine->setOutputSink(HelixSimplePlayer::OSS); else m_engine->setOutputSink(HelixSimplePlayer::ALSA); HelixConfig::setDevice( lineEdit_outputDevice->text() ); if (checkBox_outputDevice->isChecked()) m_engine->setDevice( lineEdit_outputDevice->text().utf8() ); else m_engine->setDevice("default"); HelixConfig::setDeviceenabled( checkBox_outputDevice->isChecked() ); } return m_changed; } void HelixSoundDevice::setSoundSystem( int api ) { switch (api) { case HelixSimplePlayer::OSS: deviceComboBox->setCurrentItem("oss"); checkBox_outputDevice->setEnabled( false ); lineEdit_outputDevice->setEnabled(false); break; case HelixSimplePlayer::ALSA: deviceComboBox->setCurrentItem("alsa"); checkBox_outputDevice->setEnabled( true ); if (checkBox_outputDevice->isChecked()) lineEdit_outputDevice->setEnabled( true ); else lineEdit_outputDevice->setEnabled( false ); break; }; HelixConfig::setOutputplugin(deviceComboBox->currentText()); HelixConfig::writeConfig(); } void HelixConfigDialogBase::setSoundSystem( int api ) { m_device->setSoundSystem(api); } HelixConfigDialogBase::HelixConfigDialogBase( HelixEngine *engine, Amarok::PluginConfig *config, TQWidget *p ) : TQTabWidget( p ) , m_core(0) , m_plugin(0) , m_codec(0) , m_device(0) , m_engine( engine ) { int row = 0; TQString currentPage; TQWidget *parent = 0; TQGridLayout *grid = 0; TQScrollView *sv = 0; TQString pageName( i18n("Main") ); addTab( sv = new TQScrollView, pageName ); parent = new TQWidget( sv->viewport() ); sv->setResizePolicy( TQScrollView::AutoOneFit ); sv->setHScrollBarMode( TQScrollView::AlwaysOff ); sv->setFrameShape( TQFrame::NoFrame ); sv->addChild( parent ); grid = new TQGridLayout( parent, /*rows*/20, /*cols*/2, /*margin*/10, /*spacing*/10 ); grid->setColStretch( 0, 1 ); grid->setColStretch( 1, 1 ); if( sv ) sv->setMinimumWidth( grid->tqsizeHint().width() + 20 ); engine->m_coredir = HelixConfig::coreDirectory(); m_core = new HelixConfigEntry( parent, engine->m_coredir, config, row, i18n("Helix/Realplay core directory"), HelixConfig::coreDirectory().utf8(), i18n("This is the directory where clntcore.so is located")); ++row; engine->m_pluginsdir = HelixConfig::pluginDirectory(); m_plugin = new HelixConfigEntry( parent, engine->m_pluginsdir, config, row, i18n("Helix/Realplay plugins directory"), HelixConfig::pluginDirectory().utf8(), i18n("This is the directory where, for example, vorbisrend.so is located")); ++row; engine->m_codecsdir = HelixConfig::codecsDirectory(); m_codec = new HelixConfigEntry( parent, engine->m_codecsdir, config, row, i18n("Helix/Realplay codecs directory"), HelixConfig::codecsDirectory().utf8(), i18n("This is the directory where, for example, cvt1.so is located")); ++row; grid->addMultiCellWidget( new KSeparator( KSeparator::Horizontal, parent ), row, row, 0, 1 ); ++row; m_device = new HelixSoundDevice( parent, config, row, engine ); // lets find the logo if we can TQPixmap *pm = 0; TQString logo = HelixConfig::coreDirectory(); if (logo.isEmpty()) logo = HELIX_LIBS "/common"; logo.append("/../share/"); TQString tmp = logo; tmp.append("hxplay/logo.png"); if (TQFileInfo(tmp).exists()) { logo = tmp; pm = new TQPixmap(logo); } else { tmp = logo; tmp.append("realplay/logo.png"); if (TQFileInfo(tmp).exists()) { logo = tmp; pm = new TQPixmap(logo); } } if (pm) { TQLabel *l = new TQLabel(parent); l->setPixmap(*pm); grid->addMultiCellWidget( l, 20, 20, 1, 1, TQt::AlignRight ); } entries.setAutoDelete( true ); pageName = i18n("Plugins"); addTab( sv = new TQScrollView, pageName ); parent = new TQWidget( sv->viewport() ); sv->setResizePolicy( TQScrollView::AutoOneFit ); sv->addChild( parent ); TQTextEdit *le = new TQTextEdit( parent ); if( sv ) sv->setMinimumWidth( le->tqsizeHint().width() ); grid = new TQGridLayout( parent, /*rows*/1, /*cols*/1, /*margin*/2, /*spacing*/1 ); grid->addMultiCellWidget( le, 0, 1, 0, 1, 0 ); le->setWordWrap(TQTextEdit::NoWrap); int n = engine->numPlugins(); const char *description, *copyright, *moreinfourl; row = 0; for (int i=0; igetPluginInfo(i, description, copyright, moreinfourl)) { le->append(TQString(description)); le->append(TQString(copyright)); le->append(TQString(moreinfourl)); le->append(TQString(" ")); } } le->setReadOnly(true); le->setContentsPos(0,0); } HelixConfigDialogBase::~HelixConfigDialogBase() { delete m_core; delete m_plugin; delete m_codec; delete m_device; } bool HelixConfigDialogBase::hasChanged() const { for( TQPtrListIterator it( entries ); *it != 0; ++it ) if ( (*it)->isChanged() ) return true; if (m_core->isChanged() || m_plugin->isChanged() || m_codec->isChanged() || m_device->isChanged()) return true; return false; } bool HelixConfigDialogBase::isDefault() const { return false; } void HelixConfigDialogBase::save() { bool writeIt = false; if (m_core->isChanged()) { m_engine->m_coredir = m_core->stringValue(); HelixConfig::setCoreDirectory(m_engine->m_coredir); writeIt = true; } if (m_plugin->isChanged()) { m_engine->m_pluginsdir = m_plugin->stringValue(); HelixConfig::setPluginDirectory(m_engine->m_pluginsdir); writeIt = true; } if (m_codec->isChanged()) { m_engine->m_codecsdir = m_codec->stringValue(); HelixConfig::setCodecsDirectory(m_engine->m_codecsdir); writeIt = true; } writeIt |= m_device->save(); // not really doing anything here yet for( HelixConfigEntry *entry = entries.first(); entry; entry = entries.next() ) { if( entry->isChanged() ) { entry->setUnchanged(); } } if (m_device->isChanged()) { m_device->setUnchanged(); writeIt = true; } if (writeIt) { HelixConfig::writeConfig(); // reinit... m_engine->init(); } } HelixConfigDialog::HelixConfigDialog( HelixEngine *engine, TQWidget *p ) : Amarok::PluginConfig() { if (!instance) instance = new HelixConfigDialogBase( engine, this, p ); } HelixConfigDialog::~HelixConfigDialog() { delete instance; instance = 0; } int HelixConfigDialog::setSoundSystem( int api ) { if (instance) { instance->setSoundSystem(api); return 0; } else { HelixConfig::setOutputplugin(api ? "alsa" : "oss"); HelixConfig::writeConfig(); return 1; } } #include "helix-configdialog.moc"