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.
306 lines
12 KiB
306 lines
12 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 "kaudiocreator.h"
|
|
|
|
#include <tqvbox.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( TQWidget* parent, const char* name) :
|
|
KMainWindow(parent, name)
|
|
{
|
|
janusWidget = new KJanusWidget(this, name, KJanusWidget::Tabbed);
|
|
setCentralWidget(janusWidget);
|
|
|
|
TQVBox *frame = janusWidget->addVBoxPage(i18n("&CD Tracks"), TQString(), SmallIcon("cdaudio_unmount", 32));
|
|
tracks = new TracksImp(frame, "Tracks");
|
|
|
|
ripper = new Ripper ( TQT_TQOBJECT(frame), "Rip" );
|
|
encoder = new Encoder( TQT_TQOBJECT(frame), "Encoder" );
|
|
|
|
frame = janusWidget->addVBoxPage( i18n("&Jobs"), TQString(), SmallIcon( "run", 32 ) );
|
|
jobQue = new JobQueImp( frame, "Que" );
|
|
|
|
resize(500, 440);
|
|
|
|
/*KAction *eject = */new KAction( i18n("&Eject CD"), 0, TQT_TQOBJECT(tracks),
|
|
TQT_SLOT( eject() ), actionCollection(), "eject" );
|
|
|
|
(void)new KAction( i18n("&Configure KAudioCreator..."), 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT( showSettings() ), actionCollection(), "configure_kaudiocreator" );
|
|
|
|
KAction *selectAll = new KAction( i18n( "Select &All Tracks"), 0, TQT_TQOBJECT(tracks),
|
|
TQT_SLOT( selectAllTracks() ), actionCollection(), "select_all" ) ;
|
|
KAction *deselectAll = new KAction( i18n( "Deselect &All Tracks"), 0, TQT_TQOBJECT(tracks),
|
|
TQT_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, TQT_SIGNAL( activated() ), TQT_TQOBJECT(tracks), TQT_SLOT( startSession() ) );
|
|
|
|
ripMenu = actActionMenu->popupMenu();
|
|
connect( ripMenu, TQT_SIGNAL( activated(int) ), TQT_TQOBJECT(this), TQT_SLOT( slotRipSelection(int)) );
|
|
connect( ripMenu, TQT_SIGNAL( aboutToShow() ), TQT_TQOBJECT(this), TQT_SLOT( getRipMenu()) );
|
|
|
|
KAction *rip = new KAction( i18n( "Rip &Selection" ), 0, TQT_TQOBJECT(tracks),
|
|
TQT_SLOT( startSession() ), actionCollection(), "rip_selected" );
|
|
rip->setEnabled( false );
|
|
|
|
connect( jobQue, TQT_SIGNAL( removeJob(int) ), TQT_TQOBJECT(this), TQT_SLOT( updateStatus() ) );
|
|
connect( jobQue, TQT_SIGNAL( removeJob(int) ), TQT_TQOBJECT(ripper), TQT_SLOT( removeJob(int) ) );
|
|
connect( jobQue, TQT_SIGNAL( removeJob(int) ), TQT_TQOBJECT(encoder), TQT_SLOT( removeJob(int)) );
|
|
|
|
connect( ripper, TQT_SIGNAL( updateProgress(int, int) ), TQT_TQOBJECT(jobQue), TQT_SLOT( updateProgress(int,int) ) );
|
|
connect( ripper, TQT_SIGNAL( addJob(Job*, const TQString &) ), TQT_TQOBJECT(jobQue), TQT_SLOT( addJob(Job*, const TQString &)) );
|
|
connect( ripper, TQT_SIGNAL( eject(const TQString &) ) , TQT_TQOBJECT(tracks), TQT_SLOT( ejectDevice(const TQString &)) );
|
|
connect( ripper, TQT_SIGNAL( encodeWav(Job *) ) , TQT_TQOBJECT(encoder), TQT_SLOT( encodeWav(Job *)) );
|
|
connect( ripper, TQT_SIGNAL( jobsChanged() ) , TQT_TQOBJECT(this), TQT_SLOT( updateStatus() ) );
|
|
|
|
connect( encoder, TQT_SIGNAL( updateProgress(int, int) ) , TQT_TQOBJECT(jobQue), TQT_SLOT( updateProgress(int,int)) );
|
|
connect( encoder, TQT_SIGNAL( addJob(Job*, const TQString&)), TQT_TQOBJECT(jobQue), TQT_SLOT( addJob(Job*, const TQString &)) );
|
|
connect( encoder, TQT_SIGNAL( jobsChanged() ) , TQT_TQOBJECT(this), TQT_SLOT( updateStatus() ) );
|
|
|
|
connect( tracks, TQT_SIGNAL( hasCD(bool) ) , TQT_TQOBJECT(this), TQT_SLOT( hasCD(bool) ) );
|
|
connect( tracks, TQT_SIGNAL( ripTrack(Job *) ), TQT_TQOBJECT(ripper), TQT_SLOT( ripTrack(Job *)) );
|
|
connect( tracks, TQT_SIGNAL( hasTracks(bool) ), rip, TQT_SLOT( setEnabled(bool)) );
|
|
connect( tracks, TQT_SIGNAL( hasTracks(bool) ), actActionMenu, TQT_SLOT( setEnabled(bool)) );
|
|
connect( tracks, TQT_SIGNAL( hasTracks(bool) ), deselectAll, TQT_SLOT( setEnabled(bool)) );
|
|
connect( tracks, TQT_SIGNAL( hasTracks(bool) ), selectAll, TQT_SLOT( setEnabled(bool)) );
|
|
|
|
(void)new KAction(i18n("Remove &Completed Jobs"), 0, TQT_TQOBJECT(jobQue),
|
|
TQT_SLOT(clearDoneJobs()), actionCollection(), "clear_done_jobs" );
|
|
|
|
KAction *edit = new KAction(i18n("&Edit Album..."), 0, TQT_TQOBJECT(tracks),
|
|
TQT_SLOT(editInformation()), actionCollection(), "edit_cd");
|
|
connect(tracks, TQT_SIGNAL(hasCD(bool)), edit, TQT_SLOT(setEnabled(bool)));
|
|
edit->setEnabled( false );
|
|
|
|
(void)new KAction(i18n("Encode &File..."), 0, TQT_TQOBJECT(this),
|
|
TQT_SLOT(encodeFile()), actionCollection(), "encode_file");
|
|
|
|
KAction *cddb = new KAction(i18n("&CDDB Lookup"), 0, TQT_TQOBJECT(tracks),
|
|
TQT_SLOT(performCDDB()), actionCollection(), "cddb_now");
|
|
connect(tracks, TQT_SIGNAL(hasCD(bool)), cddb, TQT_SLOT(setEnabled(bool)));
|
|
cddb->setEnabled( false );
|
|
|
|
KStdAction::configureNotifications(TQT_TQOBJECT(this), TQT_SLOT(configureNotifications()),
|
|
actionCollection());
|
|
KStdAction::quit( TQT_TQOBJECT(this), TQT_SLOT(close()), actionCollection(), "quit" );
|
|
|
|
// Init statusbar
|
|
statusBar()->insertItem(i18n("No Audio CD detected"), 0 );
|
|
hasCD(tracks->hasCD());
|
|
|
|
setupGUI();
|
|
}
|
|
|
|
void KAudioCreator::setDevice( const TQString &device )
|
|
{
|
|
tracks->deviceCombo->setCurrentText( device );
|
|
}
|
|
|
|
void KAudioCreator::slotRipSelection(int selection){
|
|
tracks->startSession( selection );
|
|
}
|
|
|
|
void KAudioCreator::getRipMenu(){
|
|
ripMenu->clear();
|
|
|
|
int i=0;
|
|
TQString currentGroup = TQString("Encoder_%1").arg(i);
|
|
while(EncoderPrefs::hasPrefs(currentGroup)){
|
|
ripMenu->insertItem(EncoderPrefs::prefs(currentGroup)->encoderName(), i);
|
|
currentGroup = TQString("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() {
|
|
TQString status = i18n("Idle.");
|
|
TQString rippingStatus;
|
|
TQString 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, TQT_SIGNAL(startJob(Job*)),encoder, TQT_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, TQT_SIGNAL(settingsChanged()), ripper, TQT_SLOT(loadSettings()));
|
|
connect(dialog, TQT_SIGNAL(settingsChanged()), TQT_TQOBJECT(encoder), TQT_SLOT(loadSettings()));
|
|
connect(dialog, TQT_SIGNAL(settingsChanged()), TQT_TQOBJECT(tracks), TQT_SLOT(loadSettings()));
|
|
connect(dialog->encoderConfigImp, TQT_SIGNAL(encoderUpdated()), TQT_TQOBJECT(encoder), TQT_SLOT(loadSettings()));
|
|
dialog->show();
|
|
}
|
|
|
|
SettingsDialog::SettingsDialog(TQWidget *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(TQString("libkcddb"), KCModuleLoader::Inline);
|
|
if (cddb)
|
|
{
|
|
cddb->load();
|
|
addPage(cddb, i18n("CDDB"), "cdaudio_mount", i18n("CDDB Configuration"), false);
|
|
connect(cddb, TQT_SIGNAL(changed(bool)), TQT_TQOBJECT(this), TQT_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"
|
|
|