summaryrefslogtreecommitdiffstats
path: root/kaudiocreator/kaudiocreator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaudiocreator/kaudiocreator.cpp')
-rw-r--r--kaudiocreator/kaudiocreator.cpp305
1 files changed, 305 insertions, 0 deletions
diff --git a/kaudiocreator/kaudiocreator.cpp b/kaudiocreator/kaudiocreator.cpp
new file mode 100644
index 00000000..12267ed0
--- /dev/null
+++ b/kaudiocreator/kaudiocreator.cpp
@@ -0,0 +1,305 @@
+/**
+ * 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 "kaudiocreator.h"
+
+#include <qvbox.h>
+#include <kiconloader.h>
+
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kaction.h>
+#include <kstatusbar.h>
+#include <knotifydialog.h>
+#include <kcombobox.h>
+
+#include "tracksimp.h"
+#include "jobqueimp.h"
+#include "ripper.h"
+#include "encoder.h"
+#include "prefs.h"
+#include "encodefileimp.h"
+#include "job.h"
+
+// Settings
+#include "ripconfig.h"
+#include "cdconfig.h"
+#include "encoderconfigimp.h"
+#include "general.h"
+#include <kcmoduleloader.h>
+#include <kurlrequester.h>
+
+/**
+ * Constructor. Connect all of the object and the job control.
+ */
+KAudioCreator::KAudioCreator( QWidget* parent, const char* name) :
+ KMainWindow(parent, name)
+{
+ janusWidget = new KJanusWidget(this, name, KJanusWidget::Tabbed);
+ setCentralWidget(janusWidget);
+
+ QVBox *frame = janusWidget->addVBoxPage(i18n("&CD Tracks"), QString::null, SmallIcon("cdaudio_unmount", 32));
+ tracks = new TracksImp(frame, "Tracks");
+
+ ripper = new Ripper ( frame, "Rip" );
+ encoder = new Encoder( frame, "Encoder" );
+
+ frame = janusWidget->addVBoxPage( i18n("&Jobs"), QString::null, SmallIcon( "run", 32 ) );
+ jobQue = new JobQueImp( frame, "Que" );
+
+ resize(500, 440);
+
+ /*KAction *eject = */new KAction( i18n("&Eject CD"), 0, tracks,
+ SLOT( eject() ), actionCollection(), "eject" );
+
+ (void)new KAction( i18n("&Configure KAudioCreator..."), 0, this,
+ SLOT( showSettings() ), actionCollection(), "configure_kaudiocreator" );
+
+ KAction *selectAll = new KAction( i18n( "Select &All Tracks"), 0, tracks,
+ SLOT( selectAllTracks() ), actionCollection(), "select_all" ) ;
+ KAction *deselectAll = new KAction( i18n( "Deselect &All Tracks"), 0, tracks,
+ SLOT( deselectAllTracks() ), actionCollection(), "deselect_all" );
+ selectAll->setEnabled( false );
+ deselectAll->setEnabled( false );
+
+ KActionMenu *actActionMenu = new KActionMenu( i18n("Rip &Selection"), "rip", actionCollection(), "rip" );
+ actActionMenu->setDelayed(true); //needed for checking "all accounts"
+ actActionMenu->setEnabled( false );
+ connect( actActionMenu, SIGNAL( activated() ), tracks, SLOT( startSession() ) );
+
+ ripMenu = actActionMenu->popupMenu();
+ connect( ripMenu, SIGNAL( activated(int) ), this, SLOT( slotRipSelection(int)) );
+ connect( ripMenu, SIGNAL( aboutToShow() ), this, SLOT( getRipMenu()) );
+
+ KAction *rip = new KAction( i18n( "Rip &Selection" ), 0, tracks,
+ SLOT( startSession() ), actionCollection(), "rip_selected" );
+ rip->setEnabled( false );
+
+ connect( jobQue, SIGNAL( removeJob(int) ), this, SLOT( updateStatus() ) );
+ connect( jobQue, SIGNAL( removeJob(int) ), ripper, SLOT( removeJob(int) ) );
+ connect( jobQue, SIGNAL( removeJob(int) ), encoder, SLOT( removeJob(int)) );
+
+ connect( ripper, SIGNAL( updateProgress(int, int) ) , jobQue, SLOT( updateProgress(int,int) ) );
+ connect( ripper, SIGNAL( addJob(Job*, const QString &) ), jobQue, SLOT( addJob(Job*, const QString &)) );
+ connect( ripper, SIGNAL( eject(const QString &) ) , tracks, SLOT( ejectDevice(const QString &)) );
+ connect( ripper, SIGNAL( encodeWav(Job *) ) , encoder, SLOT( encodeWav(Job *)) );
+ connect( ripper, SIGNAL( jobsChanged() ) , this, SLOT( updateStatus() ) );
+
+ connect( encoder, SIGNAL( updateProgress(int, int) ) , jobQue, SLOT( updateProgress(int,int)) );
+ connect( encoder, SIGNAL( addJob(Job*, const QString&)), jobQue, SLOT( addJob(Job*, const QString &)) );
+ connect( encoder, SIGNAL( jobsChanged() ) , this, SLOT( updateStatus() ) );
+
+ connect( tracks, SIGNAL( hasCD(bool) ) , this, SLOT( hasCD(bool) ) );
+ connect( tracks, SIGNAL( ripTrack(Job *) ), ripper, SLOT( ripTrack(Job *)) );
+ connect( tracks, SIGNAL( hasTracks(bool) ), rip, SLOT( setEnabled(bool)) );
+ connect( tracks, SIGNAL( hasTracks(bool) ), actActionMenu, SLOT( setEnabled(bool)) );
+ connect( tracks, SIGNAL( hasTracks(bool) ), deselectAll, SLOT( setEnabled(bool)) );
+ connect( tracks, SIGNAL( hasTracks(bool) ), selectAll, SLOT( setEnabled(bool)) );
+
+ (void)new KAction(i18n("Remove &Completed Jobs"), 0, jobQue,
+ SLOT(clearDoneJobs()), actionCollection(), "clear_done_jobs" );
+
+ KAction *edit = new KAction(i18n("&Edit Album..."), 0, tracks,
+ SLOT(editInformation()), actionCollection(), "edit_cd");
+ connect(tracks, SIGNAL(hasCD(bool)), edit, SLOT(setEnabled(bool)));
+ edit->setEnabled( false );
+
+ (void)new KAction(i18n("Encode &File..."), 0, this,
+ SLOT(encodeFile()), actionCollection(), "encode_file");
+
+ KAction *cddb = new KAction(i18n("&CDDB Lookup"), 0, tracks,
+ SLOT(performCDDB()), actionCollection(), "cddb_now");
+ connect(tracks, SIGNAL(hasCD(bool)), cddb, SLOT(setEnabled(bool)));
+ cddb->setEnabled( false );
+
+ KStdAction::configureNotifications(this, SLOT(configureNotifications()),
+ actionCollection());
+ KStdAction::quit( this, SLOT(close()), actionCollection(), "quit" );
+
+ // Init statusbar
+ statusBar()->insertItem(i18n("No Audio CD detected"), 0 );
+ hasCD(tracks->hasCD());
+
+ setupGUI();
+}
+
+void KAudioCreator::setDevice( const QString &device )
+{
+ tracks->deviceCombo->setCurrentText( device );
+}
+
+void KAudioCreator::slotRipSelection(int selection){
+ tracks->startSession( selection );
+}
+
+void KAudioCreator::getRipMenu(){
+ ripMenu->clear();
+
+ int i=0;
+ QString currentGroup = QString("Encoder_%1").arg(i);
+ while(EncoderPrefs::hasPrefs(currentGroup)){
+ ripMenu->insertItem(EncoderPrefs::prefs(currentGroup)->encoderName(), i);
+ currentGroup = QString("Encoder_%1").arg(++i);
+ }
+}
+
+/**
+ * Changes the status bar to let the user no if a cd was not detected or inserted.
+ */
+void KAudioCreator::hasCD(bool cd){
+ if(cd)
+ statusBar()->changeItem(i18n("CD Inserted"), 0 );
+ else
+ statusBar()->changeItem(i18n("No Audio CD detected"), 0 );
+}
+
+void KAudioCreator::updateStatus() {
+ QString status = i18n("Idle.");
+ QString rippingStatus;
+ QString encodingStatus;
+ int activeRippingJobs = ripper->activeJobCount();
+ int pendingRippingJobs = ripper->pendingJobCount();
+ int activeEncodingJobs = encoder->activeJobCount();
+ int pendingEncodingJobs = encoder->pendingJobCount();
+
+ if ( activeRippingJobs ) {
+ rippingStatus = i18n("Ripping (%1 active, %2 queued)").arg( activeRippingJobs ).arg( pendingRippingJobs );
+ status = rippingStatus;
+ }
+ if ( activeEncodingJobs ) {
+ encodingStatus = i18n("Encoding (%1 active, %2 queued)").arg( activeEncodingJobs ).arg( pendingEncodingJobs );
+
+ if ( activeRippingJobs ) {
+ status.append(" : ");
+ status.append( encodingStatus );
+ }
+ else {
+ status = encodingStatus;
+ }
+ }
+
+ statusBar()->changeItem( status, 0 );
+}
+
+/**
+ * Ask the user if they really want to quit if there are open jobs.
+ */
+bool KAudioCreator::queryClose() {
+ if(jobQue->numberOfJobsNotFinished() > 0 &&
+ (KMessageBox::warningContinueCancel(this, i18n("There are unfinished jobs in the queue. Would you like to quit anyway?"), i18n("Unfinished Jobs in Queue"),KStdGuiItem::quit())
+ == KMessageBox::Cancel ))
+ return false;
+ return true;
+}
+
+void KAudioCreator::configureNotifications() {
+ KNotifyDialog *dialog = new KNotifyDialog(this, "KNotifyDialog", false);
+ dialog->show();
+}
+
+void KAudioCreator::encodeFile(){
+ EncodeFileImp *file = new EncodeFileImp(this, "EncodeFile");
+ connect(file, SIGNAL(startJob(Job*)),encoder, SLOT(encodeWav(Job*)));
+ file->show();
+}
+
+/**
+ * Show Settings dialog.
+ */
+void KAudioCreator::showSettings(){
+ if(KConfigDialog::showDialog("settings"))
+ return;
+
+ SettingsDialog *dialog = new SettingsDialog(this, "settings", Prefs::self());
+ connect(dialog, SIGNAL(settingsChanged()), ripper, SLOT(loadSettings()));
+ connect(dialog, SIGNAL(settingsChanged()), encoder, SLOT(loadSettings()));
+ connect(dialog, SIGNAL(settingsChanged()), tracks, SLOT(loadSettings()));
+ connect(dialog->encoderConfigImp, SIGNAL(encoderUpdated()), encoder, SLOT(loadSettings()));
+ dialog->show();
+}
+
+SettingsDialog::SettingsDialog(QWidget *parent, const char *name,KConfigSkeleton *config)
+ : KConfigDialog(parent, name, config),
+ cddb(0), cddbChanged(false)
+{
+ addPage(new General(0, "General"), i18n("General"), "package_settings",
+ i18n("General Configuration"));
+ addPage(new CdConfig(0, "CD"), i18n("CD"), "package_system",
+ i18n("CD Configuration"));
+
+ // Because WE don't segfault on our users...
+ KService::Ptr libkcddb = KService::serviceByDesktopName("libkcddb");
+ if (libkcddb && libkcddb->isValid())
+ {
+ cddb = KCModuleLoader::loadModule(QString("libkcddb"), KCModuleLoader::Inline);
+ if (cddb)
+ {
+ cddb->load();
+ addPage(cddb, i18n("CDDB"), "cdaudio_mount", i18n("CDDB Configuration"), false);
+ connect(cddb, SIGNAL(changed(bool)), this, SLOT(slotCddbChanged(bool)));
+ }
+ }
+ RipConfig *rip = new RipConfig(0, "Ripper");
+ rip->kcfg_tempDir->setMode(KFile::Directory);
+ addPage(rip, i18n("Ripper"), "gear", i18n("Ripper Configuration") );
+
+ encoderConfigImp = new EncoderConfigImp(0, "Encoder");
+ addPage(encoderConfigImp, i18n("Encoder"), "filter", i18n("Encoder Configuration") );
+}
+
+void SettingsDialog::updateSettings()
+{
+ if (cddb)
+ cddb->save();
+}
+
+void SettingsDialog::updateWidgets()
+{
+ if (cddb)
+ cddb->load();
+ cddbChanged = false;
+}
+
+void SettingsDialog::updateWidgetsDefault()
+{
+ if (cddb)
+ cddb->defaults();
+}
+
+bool SettingsDialog::hasChanged()
+{
+ return cddbChanged;
+}
+
+bool SettingsDialog::isDefault()
+{
+ if (cddb)
+ return false;
+ return true;
+}
+
+void SettingsDialog::slotCddbChanged(bool changed)
+{
+ cddbChanged = changed;
+ updateButtons();
+}
+
+#include "kaudiocreator.moc"
+