You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/kaudiocreator/encoderconfigimp.cpp

290 lines
9.1 KiB

/**
* This file is part of the KAudioCreator package
* Copyright (C) 2003 Benjamin C Meyer (ben+kaudiocreator at meyerhome dot net)
*
* 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 library 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
* Library 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 "encoderconfigimp.h"
#include "encoderedit.h"
#include "prefs.h"
#include <tqpushbutton.h>
#include <tqlineedit.h>
#include <kconfigdialog.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kconfig.h>
/**
* Constructor.
*/
EncoderConfigImp::EncoderConfigImp( TQWidget* parent, const char* name) :
EncoderConfig (parent, name) {
connect(addEncoder, TQT_SIGNAL(clicked()), this, TQT_SLOT(addEncoderSlot()));
connect(removeEncoder, TQT_SIGNAL(clicked()), this, TQT_SLOT(removeEncoderSlot()));
connect(configureEncoder, TQT_SIGNAL(clicked()), this, TQT_SLOT(configureEncoderSlot()));
connect(kcfg_currentEncoder, TQT_SIGNAL(doubleClicked ( TQListBoxItem * )),this, TQT_SLOT(configureEncoderSlot()));
// If there are no encoders then store the three default ones.
if( Prefs::lastKnownEncoder() == 0){
EncoderPrefs *encPrefs;
encPrefs = EncoderPrefs::prefs("Encoder_0");
encPrefs->setEncoderName(i18n("Ogg Vorbis"));
encPrefs->setCommandLine("oggenc -o %o --artist %{artist} --album %{albumtitle} --title %{title} --date %{year} --tracknum %{number} --genre %{genre} %f");
encPrefs->setExtension("ogg");
encPrefs->setPercentLength(4);
encPrefs->writeConfig();
encPrefs = EncoderPrefs::prefs("Encoder_1");
encPrefs->setEncoderName(i18n("MP3"));
encPrefs->setCommandLine("lame --preset standard --tt %{title} --ta %{artist} --tl %{albumtitle} --ty %{year} --tn %{number} --tg %{genre} %f %o");
encPrefs->setExtension("mp3");
encPrefs->setPercentLength(2);
encPrefs->writeConfig();
encPrefs = EncoderPrefs::prefs("Encoder_2");
encPrefs->setEncoderName(i18n("Wav"));
encPrefs->setCommandLine("mv %f %o");
encPrefs->setExtension("wav");
encPrefs->setPercentLength(2);
encPrefs->writeConfig();
encPrefs = EncoderPrefs::prefs("Encoder_3");
encPrefs->setEncoderName(i18n("FLAC"));
encPrefs->setCommandLine("flac --best -o %o --tag=Artist=%{artist} --tag=Album=%{albumtitle} --tag=Date=%{year} --tag=Title=%{title} --tag=Tracknumber=%{number} --tag=Genre=%{genre} %f");
encPrefs->setExtension("flac");
encPrefs->setPercentLength(2);
encPrefs->writeConfig();
Prefs::setLastKnownEncoder(3);
Prefs::writeConfig();
}
loadEncoderList();
}
/**
* Clear map
* Clear listbox
* Load list of encoders.
*/
void EncoderConfigImp::loadEncoderList(){
encoderNames.clear();
kcfg_currentEncoder->clear();
bool foundCurrentEncoder = false;
int lastEncoder = 0;
int lastKnownEncoder = Prefs::lastKnownEncoder();
lastKnownEncoder++;
for( int i=0; i<=lastKnownEncoder; i++ ){
TQString currentGroup = TQString("Encoder_%1").arg(i);
if(EncoderPrefs::hasPrefs(currentGroup)){
lastEncoder = i;
EncoderPrefs *encPrefs = EncoderPrefs::prefs(currentGroup);
TQString encoderName = encPrefs->encoderName();
kcfg_currentEncoder->insertItem(encoderName);
encoderNames.insert(encoderName, currentGroup);
if(Prefs::currentEncoder() == i)
foundCurrentEncoder = true;
}
}
if(lastEncoder != Prefs::lastKnownEncoder()){
Prefs::setLastKnownEncoder(lastEncoder);
Prefs::writeConfig();
}
// Make sure that the current encoder is valid.
if(!foundCurrentEncoder && kcfg_currentEncoder->count() > 0)
kcfg_currentEncoder->setCurrentItem(0);
}
/**
* Find empty group
* bring up dialog for that group.
*/
void EncoderConfigImp::addEncoderSlot(){
bool foundEmptyGroup = false;
uint number = 0;
TQString groupName;
while(!foundEmptyGroup){
groupName = TQString("Encoder_%1").arg(number);
if(!EncoderPrefs::hasPrefs(groupName))
foundEmptyGroup = true;
else
number++;
}
if(KConfigDialog::showDialog(groupName.latin1()))
return;
KConfigDialog *dialog = new KConfigDialog(this, groupName.latin1(), EncoderPrefs::prefs(groupName),
KDialogBase::Swallow,
KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help);
dialog->setCaption(i18n("Configure Encoder"));
dialog->addPage(new EncoderEdit(0, groupName.latin1()), i18n("Encoder Configuration"), "package_settings");
connect(dialog, TQT_SIGNAL(settingsChanged()), this, TQT_SLOT(loadEncoderList()));
dialog->show();
}
/**
* If
* Something is selected
* There is more then 1 thing left
* The user says ok to delete.
* Is not the current encoder.
* Then
* The group is removed from the list
* Deleted from the config.
*/
void EncoderConfigImp::removeEncoderSlot(){
if(!kcfg_currentEncoder->selectedItem()){
KMessageBox:: sorry(this, i18n("Please select an encoder."), i18n("No Encoder Selected"));
return;
}
if(kcfg_currentEncoder->count() <= 1){
KMessageBox:: sorry(this, i18n("At least one encoder must exist."), i18n("Can Not Remove"));
return;
}
if(KMessageBox::warningContinueCancel(this, i18n("Delete encoder?"), i18n("Delete Encoder"),KStdGuiItem::del())
== KMessageBox::Cancel )
return;
TQString groupName = encoderNames[kcfg_currentEncoder->currentText()];
kcfg_currentEncoder->removeItem(kcfg_currentEncoder->currentItem());
delete KConfigDialog::exists(groupName.latin1());
EncoderPrefs::deletePrefs(groupName);
}
/**
* If
* Something is selected
* Group exists
* Then
* Bring up dialog
*/
void EncoderConfigImp::configureEncoderSlot() {
if(!kcfg_currentEncoder->selectedItem()){
KMessageBox:: sorry(this, i18n("Please select an encoder."), i18n("No Encoder Selected"));
return;
}
TQString groupName = encoderNames[kcfg_currentEncoder->currentText()];
KConfig &config = *KGlobal::config();
if(!config.hasGroup(groupName))
return;
if(KConfigDialog::showDialog(groupName.latin1()))
return;
KConfigDialog *dialog = new KConfigDialog(this, groupName.latin1(), EncoderPrefs::prefs(groupName),
KDialogBase::Swallow,
KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help);
dialog->setCaption(i18n("Configure Encoder"));
dialog->addPage(new EncoderEdit(0, groupName.latin1()), i18n("Encoder Configuration"), "package_settings");
connect(dialog, TQT_SIGNAL(destroyed(TQObject *)), this, TQT_SLOT(updateEncoder(TQObject *)));
connect(dialog, TQT_SIGNAL(settingsChanged()), this, TQT_SIGNAL(encoderUpdated()));
connect(dialog, TQT_SIGNAL(settingsChanged(const char *)), this, TQT_SLOT(updateEncoder(const char *)));
dialog->show();
}
/**
* If object exists update encoder
*/
void EncoderConfigImp::updateEncoder(TQObject * obj){
if(!obj)
return;
updateEncoder(obj->name());
}
/**
* If
* Exists
* Then
* Get name
* Make sure group exists
* Update name
* Update Map
* If current encoder update also.
*/
void EncoderConfigImp::updateEncoder(const char *dialogName){
TQString groupName = dialogName;
TQString encoderName;
bool found = false;
TQMap<TQString, TQString>::Iterator it;
for ( it = encoderNames.begin(); it != encoderNames.end(); ++it ) {
if(it.data() == groupName){
found = true;
encoderName = it.key();
}
}
if(!found)
return;
if(!EncoderPrefs::hasPrefs(groupName))
return;
TQString newName = EncoderPrefs::prefs(groupName)->encoderName();
if(newName == encoderName)
return;
TQListBoxItem *item = kcfg_currentEncoder->findItem(encoderName);
if(!item)
return;
kcfg_currentEncoder->changeItem(newName, kcfg_currentEncoder->index(item));
encoderNames.insert(newName, groupName);
encoderNames.erase(encoderName);
}
TQDict<EncoderPrefs> *EncoderPrefs::m_prefs = 0;
EncoderPrefs *EncoderPrefs::prefs(const TQString &groupName)
{
if (!m_prefs)
{
m_prefs = new TQDict<EncoderPrefs>();
m_prefs->setAutoDelete(true);
}
EncoderPrefs *encPrefs = m_prefs->find(groupName);
if (encPrefs)
return encPrefs;
encPrefs = new EncoderPrefs(groupName);
encPrefs->readConfig();
m_prefs->insert(groupName, encPrefs);
return encPrefs;
}
bool EncoderPrefs::hasPrefs(const TQString &groupName)
{
KConfig &config = *KGlobal::config();
return config.hasGroup(groupName);
}
void EncoderPrefs::deletePrefs(const TQString &groupName)
{
KConfig &config = *KGlobal::config();
config.deleteGroup(groupName);
if (!m_prefs)
return;
m_prefs->remove(groupName);
}
#include "encoderconfigimp.moc"