summaryrefslogtreecommitdiffstats
path: root/kaudiocreator/encoderconfigimp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaudiocreator/encoderconfigimp.cpp')
-rw-r--r--kaudiocreator/encoderconfigimp.cpp289
1 files changed, 289 insertions, 0 deletions
diff --git a/kaudiocreator/encoderconfigimp.cpp b/kaudiocreator/encoderconfigimp.cpp
new file mode 100644
index 00000000..feebae7d
--- /dev/null
+++ b/kaudiocreator/encoderconfigimp.cpp
@@ -0,0 +1,289 @@
+/**
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "encoderconfigimp.h"
+#include "encoderedit.h"
+#include "prefs.h"
+
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <kconfigdialog.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kconfig.h>
+
+/**
+ * Constructor.
+ */
+EncoderConfigImp::EncoderConfigImp( QWidget* parent, const char* name) :
+ EncoderConfig (parent, name) {
+ connect(addEncoder, SIGNAL(clicked()), this, SLOT(addEncoderSlot()));
+ connect(removeEncoder, SIGNAL(clicked()), this, SLOT(removeEncoderSlot()));
+ connect(configureEncoder, SIGNAL(clicked()), this, SLOT(configureEncoderSlot()));
+ connect(kcfg_currentEncoder, SIGNAL(doubleClicked ( QListBoxItem * )),this, 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++ ){
+ QString currentGroup = QString("Encoder_%1").arg(i);
+ if(EncoderPrefs::hasPrefs(currentGroup)){
+ lastEncoder = i;
+ EncoderPrefs *encPrefs = EncoderPrefs::prefs(currentGroup);
+ QString 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;
+ QString groupName;
+ while(!foundEmptyGroup){
+ groupName = QString("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, SIGNAL(settingsChanged()), this, 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;
+
+ QString 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;
+ }
+ QString 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, SIGNAL(destroyed(QObject *)), this, SLOT(updateEncoder(QObject *)));
+ connect(dialog, SIGNAL(settingsChanged()), this, SIGNAL(encoderUpdated()));
+ connect(dialog, SIGNAL(settingsChanged(const char *)), this, SLOT(updateEncoder(const char *)));
+ dialog->show();
+}
+
+/**
+ * If object exists update encoder
+ */
+void EncoderConfigImp::updateEncoder(QObject * 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){
+ QString groupName = dialogName;
+ QString encoderName;
+ bool found = false;
+ QMap<QString, QString>::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;
+ QString newName = EncoderPrefs::prefs(groupName)->encoderName();
+ if(newName == encoderName)
+ return;
+
+ QListBoxItem *item = kcfg_currentEncoder->findItem(encoderName);
+ if(!item)
+ return;
+ kcfg_currentEncoder->changeItem(newName, kcfg_currentEncoder->index(item));
+
+ encoderNames.insert(newName, groupName);
+ encoderNames.erase(encoderName);
+}
+
+QDict<EncoderPrefs> *EncoderPrefs::m_prefs = 0;
+
+EncoderPrefs *EncoderPrefs::prefs(const QString &groupName)
+{
+ if (!m_prefs)
+ {
+ m_prefs = new QDict<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 QString &groupName)
+{
+ KConfig &config = *KGlobal::config();
+ return config.hasGroup(groupName);
+}
+
+void EncoderPrefs::deletePrefs(const QString &groupName)
+{
+ KConfig &config = *KGlobal::config();
+ config.deleteGroup(groupName);
+ if (!m_prefs)
+ return;
+ m_prefs->remove(groupName);
+}
+
+#include "encoderconfigimp.moc"
+