K9Copy – DVD backup tool
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.
 
 
 
k9copy/src/k9copy.cpp

530 lines
16 KiB

//
// C++ Implementation: k9copy
//
// Description:
//
//
// Author: Jean-Michel PETIT <k9copy@free.fr>, (C) 2005
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include "k9main.h"
#include "k9copy.h"
#include "k9settings.h"
#include "k9playbackoptions.h"
#include "k9langselect.h"
#include "k9config.h"
#include <tdeversion.h>
#include <kstatusbar.h>
#include <tdestdaccel.h>
#include <tdeaction.h>
#include <kstdaction.h>
#include <kdockwidget.h>
#include <tdemdidefines.h>
#include <tdemdichildarea.h>
#include <tqframe.h>
#include <kkeydialog.h>
#include <kedittoolbar.h>
#include <klibloader.h>
#include "kviewmpeg2.h"
#include "k9titlefactor.h"
#include <tqdom.h>
#include <ksimpleconfig.h>
#include "k9mp4title.h"
#include "k9tools.h"
#include "k9importfiles.h"
#include "k9import.h"
#include "k9menuedit.h"
#include "k9chapteredit.h"
#include "k9newtitle.h"
#include "k9menu.h"
#include <kdockwidget.h>
#include <kiconloader.h>
k9Copy::k9Copy()
: KMdiMainFrm( 0, "k9Copy" ,KMdi::IDEAlMode ) {
// tell the TDEMainWindow that this is indeed the main widget
m_k9MainView=NULL;
m_k9ImportView=NULL;
m_chapterEdit=NULL;
// accept dnd
setAcceptDrops(true);
// then, setup our actions
setupActions();
// and a status bar
statusBar()->show();
statusBar()->insertFixedItem("",sbFactor,TRUE);
statusBar()->setItemFixed(sbFactor,100);
statusBar()->insertItem("",sbMessage,1,FALSE);
statusBar()->setItemAlignment(sbMessage,AlignLeft | AlignVCenter);
// Apply the create the main window and ask the mainwindow to
// automatically save settings if changed: window size, toolbar
// position, icon size, etc. Also to add actions for the statusbar
// toolbar, and keybindings if necessary.
resize(TQSize(800,600));
setToolviewStyle(KMdi::TextAndIcon);
createCopyWindows();
backupAction->setChecked(true);
//createImportWindows();
}
void k9Copy::createCopyWindows() {
saveDock();
if (m_k9ImportView) {
m_k9ImportView->close();
m_k9Import=NULL;
m_k9ImportView=NULL;
}
removeToolWindows();
m_actions["open"]->setEnabled(true);
m_actions["quit"]->setEnabled(true);
m_actions["preferences"]->setEnabled(true);
m_actions["playtitle"]->setEnabled(true);
m_actions["copy"]->setEnabled(true);
m_actions["create"]->setEnabled(false);
m_actions["mp4"]->setEnabled(true);
m_actions["eject"]->setEnabled(true);
k9Config config;
m_useXine=config.getUseMplayer();
m_useDvdAuthor=config.getUseDvdAuthor();
if (config.getPrefVersion() != VERSION) {
initCodecs();
config.read();
config.setPrefVersion(VERSION);
config.save();
}
m_k9Main=new k9Main(this,0,&m_drives);
m_k9MainView=createWrapper( m_k9Main,"","");
addWindow(m_k9MainView, KMdi::StandardAdd);
m_options=new k9PlaybackOptions(m_k9Main,this);
KMdiToolViewAccessor *acc;
acc=addToolWindow(m_options, KDockWidget::DockRight, getMainDockWidget(),0,i18n("DVD playback options"),i18n("DVD playback options"));
acc->show();
m_ToolViews.append(acc);
m_lang=new k9LangSelect(m_k9Main,this);
acc=addToolWindow(m_lang, KDockWidget::DockRight, getMainDockWidget(),0,i18n("Selection"),i18n("Selection"));
m_ToolViews.append(acc);
if (m_useXine) {
m_mp2=new K9Mplayer(TQT_TQOBJECT(this));
} else
m_mp2=new kViewMPEG2();
m_previewAcc=addToolWindow(m_mp2,KDockWidget::DockRight,getMainDockWidget(),0,i18n("Preview"),i18n("Preview"));
m_ToolViews.append(m_previewAcc);
connect(m_k9Main,TQT_SIGNAL(showPreview( k9DVD*, k9DVDTitle*,int )),m_mp2,TQT_SLOT(open( k9DVD*, k9DVDTitle*,int )));
connect(m_k9Main,TQT_SIGNAL(stopPreview()),m_mp2,TQT_SLOT(bStopClick()));
m_factors =new k9TitleFactor( this);
m_factors->setUseDvdAuthor(m_useDvdAuthor);
int h=m_factors->height();
acc=addToolWindow(m_factors,KDockWidget::DockBottom,getMainDockWidget(),10,i18n("Shrink Factor"),i18n("Shrink Factor"));
m_ToolViews.append(acc);
connect(m_k9Main,TQT_SIGNAL(SelectionChanged( k9DVD*,bool )),m_factors,TQT_SLOT(SelectionChanged( k9DVD*,bool )));
connect(m_k9Main,TQT_SIGNAL(changedTitle( k9DVDTitle* )),m_factors,TQT_SLOT(changedTitle( k9DVDTitle* )));
KDockWidget *dw=dockManager->findWidgetParentDock (m_factors);
dw->setForcedFixedHeight(h);
addMp4TitleOptions();
// allow the view to change the statusbar and caption
connect(m_k9Main, TQT_SIGNAL(changeStatusbar(const TQString&,int )),
this, TQT_SLOT(changeStatusbar(const TQString&,int)));
connect(m_k9Main, TQT_SIGNAL(changeCaption(const TQString&)),
this, TQT_SLOT(changeCaption(const TQString&)));
setAutoSaveSettings();
KSimpleConfig settings("K9Copy");
if (settings.hasGroup("dock"))
dockManager->readConfig((TDEConfig*)&settings,"dock");
}
void k9Copy::removeToolWindows() {
for (KMdiToolViewAccessor *acc=m_ToolViews.first();acc;acc=m_ToolViews.next()) {
deleteToolWindow(acc);
}
m_ToolViews.clear();
}
void k9Copy::createImportWindows() {
saveDock();
if (m_k9MainView) {
m_k9MainView->close();
m_k9Main=NULL;
m_k9MainView=NULL;
}
removeToolWindows();
m_actions["open"]->setEnabled(false);
m_actions["quit"]->setEnabled(true);
m_actions["preferences"]->setEnabled(true);
m_actions["playtitle"]->setEnabled(false);
m_actions["copy"]->setEnabled(false);
m_actions["create"]->setEnabled(false);
m_actions["mp4"]->setEnabled(false);
m_actions["eject"]->setEnabled(false);
KMdiToolViewAccessor *acc;
m_k9Import=new k9Import(this,0,&m_drives);
m_k9ImportView=createWrapper( m_k9Import,"","");
addWindow(m_k9ImportView, KMdi::StandardAdd);
m_menuEdit=new k9MenuEdit(this,0,m_k9Import->getNewDVD()->getRootMenu()->getCanvas());
m_menuEdit->setIcon(SmallIcon("edit"));
acc=addToolWindow(m_menuEdit, KDockWidget::DockRight, getMainDockWidget(),20,i18n("Edit menu"),i18n("Edit Menu"));
m_ToolViews.append(acc);
connect (m_k9Import,TQT_SIGNAL(titleSelected(k9Title*)),m_menuEdit,TQT_SLOT(titleSelected(k9Title*)));
connect (m_k9Import,TQT_SIGNAL(rootSelected(k9NewDVD*)),m_menuEdit,TQT_SLOT(rootSelected(k9NewDVD*)));
m_k9Import->setMenuEdit(m_menuEdit);
m_newTitle=new k9NewTitle(this);
m_newTitle->setK9Import(m_k9Import);
m_newTitle->setIcon(SmallIcon("fileimport"));
acc=addToolWindow(m_newTitle, KDockWidget::DockBottom, getMainDockWidget(),20,i18n("Add title"),i18n("Add title"));
m_ToolViews.append(acc);
acc->show();
m_chapterEdit =new k9ChapterEdit(this);
m_chapterEdit->setIcon(SmallIcon("title"));
acc=addToolWindow(m_chapterEdit, KDockWidget::DockBottom, getMainDockWidget(),20,i18n("Chapter properties"),i18n("Chapter properties"));
m_ToolViews.append(acc);
connect(m_k9Import,TQT_SIGNAL(aviFileSelected(k9AviFile*)),m_chapterEdit,TQT_SLOT(setAviFile(k9AviFile*)));
// allow the view to change the statusbar and caption
/*
connect(m_k9Main, TQT_SIGNAL(changeStatusbar(const TQString&,int )),
this, TQT_SLOT(changeStatusbar(const TQString&,int)));
connect(m_k9Main, TQT_SIGNAL(changeCaption(const TQString&)),
this, TQT_SLOT(changeCaption(const TQString&)));
*/
setAutoSaveSettings();
KSimpleConfig settings("K9Copy");
if (settings.hasGroup("dockImport"))
dockManager->readConfig((TDEConfig*)&settings,"dockImport");
m_k9Import->init();
}
k9Copy::~k9Copy() {
k9Config config;
if (config.getPrefDelTmpFiles())
k9Tools::clearOutput(config.getPrefOutput()+"/dvd");
}
void k9Copy::initCodecs() {
k9VideoCodecs v(0,0);
v.reset();
k9AudioCodecs a(0,0);
a.reset();
}
bool k9Copy::queryClose ( ) {
return true;
}
void k9Copy::setupActions() {
m_actions["open"]=KStdAction::open(TQT_TQOBJECT(this), TQT_SLOT(fileOpen()), actionCollection());
m_actions["quit"]=KStdAction::quit(TQT_TQOBJECT(this), TQT_SLOT(quit()), actionCollection());
m_actions["preferences"]=KStdAction::preferences(TQT_TQOBJECT(this),TQT_SLOT(preferences()),actionCollection());
KStdAction::keyBindings(TQT_TQOBJECT(this), TQT_SLOT(optionsConfigureKeys()), actionCollection());
KStdAction::configureToolbars(TQT_TQOBJECT(this), TQT_SLOT(optionsConfigureToolbars()), actionCollection());
setStandardToolBarMenuEnabled(TRUE);
createStandardStatusBarAction();
PlayTitleAction = new TDEAction(i18n("Play title"), 0,
TQT_TQOBJECT(this), TQT_SLOT(ActionPlayTitle()),
actionCollection(), "PlayTitle");
m_actions["playtitle"]=PlayTitleAction;
TQImage img;
img.loadFromData( img_preview, sizeof( img_preview ), "PNG" );
PlayTitleAction->setIconSet(TQIconSet(img));
CopyAction = new TDEAction(i18n("Copy"), 0,
TQT_TQOBJECT(this), TQT_SLOT(ActionCopy()),
actionCollection(), "Copy");
m_actions["copy"]=CopyAction;
CopyAction->setIcon("dvdcopy");
mkMpeg2Action = new TDEAction(i18n("Extract MPEG2"),0,
TQT_TQOBJECT(this), TQT_SLOT(ActionMpeg2()),
actionCollection(),"MakeMPEG2");
m_actions["mp2"]=mkMpeg2Action;
mkMpeg2Action->setIcon("mpeg");
mkMP4Action = new TDEAction(i18n("Create MPEG-4"),0,
TQT_TQOBJECT(this), TQT_SLOT(ActionMP4()),
actionCollection(),"MakeMPEG4");
m_actions["mp4"]=mkMP4Action;
mkMP4Action->setIcon("mp4");
ejectAction = new TDEAction(i18n("Eject"),0,
TQT_TQOBJECT(this), TQT_SLOT(ActionEject()),
actionCollection() , "Eject");
ejectAction->setIcon("player_eject");
m_actions["eject"]=ejectAction;
backupAction= new TDERadioAction(i18n("DVD Backup"),0,
TQT_TQOBJECT(this), TQT_SLOT(ActionBackup()),
actionCollection(), "backup");
backupAction->setExclusiveGroup("mode");
m_actions["backup"]=backupAction;
authorAction= new TDERadioAction(i18n("DVD Author"),0,
TQT_TQOBJECT(this), TQT_SLOT(ActionAuthor()),
actionCollection(), "author");
authorAction->setExclusiveGroup("mode");
m_actions["author"]=authorAction;
m_actions["create"]= new TDEAction(i18n("Create DVD"),0,
TQT_TQOBJECT(this), TQT_SLOT(ActionCreate()),
actionCollection(), "Create");
m_actions["create"]->setIcon("author");
createGUI(0);
}
void k9Copy::setActions( bool enabled) {
if (m_k9MainView) {
m_actions["open"]->setEnabled(enabled);
m_actions["quit"]->setEnabled(enabled);
m_actions["preferences"]->setEnabled(enabled);
m_actions["playtitle"]->setEnabled(enabled);
m_actions["copy"]->setEnabled(enabled);
m_actions["mp4"]->setEnabled(enabled);
m_actions["mp2"]->setEnabled(enabled);
m_actions["eject"]->setEnabled(enabled);
m_mp2->setEnabled(enabled);
m_mp4->setEnabled(enabled);
m_factors->setEnabled(enabled);
m_lang->setEnabled(enabled);
m_options->setEnabled(enabled);
} else {
m_actions["create"]->setEnabled(enabled);
m_menuEdit->setEnabled(enabled);
m_newTitle->setEnabled(enabled);
m_chapterEdit->setEnabled(enabled);
m_k9Import->setEnabled(enabled);
}
}
void k9Copy::optionsConfigureKeys() {
KKeyDialog::configure(actionCollection());
}
void k9Copy::optionsConfigureToolbars() {
// use the standard toolbar editor
saveMainWindowSettings(TDEGlobal::config(), autoSaveGroup());
KEditToolbar dlg(factory());
connect(&dlg,TQT_SIGNAL(newToolbarConfig()),this,TQT_SLOT(newToolbarConfig()));
dlg.exec();
}
void k9Copy::newToolbarConfig() {
// this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
// recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
createGUI(0);
applyMainWindowSettings(TDEGlobal::config(), autoSaveGroup());
}
void k9Copy::fileOpen() {
m_k9Main->Open();
}
void k9Copy::addMp4TitleOptions() {
m_mp4=new k9MP4Title(this);
m_ToolViews.append(addToolWindow(m_mp4,KDockWidget::DockBottom,getMainDockWidget(),10,i18n("MPEG4 Encoding options"),i18n("MPEG4 Encoding Options")));
connect(m_k9Main,TQT_SIGNAL(changedTitle( k9DVDTitle* )),m_mp4,TQT_SLOT(titleChanged( k9DVDTitle* )));
connect(m_k9Main,TQT_SIGNAL(SelectionChanged( k9DVD*,bool )),m_mp4,TQT_SLOT(selectionChanged( k9DVD*,bool )));
}
void k9Copy::preferences() {
k9settings settings(this,i18n("Settings"));
settings.exec();
k9Config config;
m_useXine=config.getUseMplayer();
if (m_k9MainView) {
m_k9Main->readSettings();
m_mp2->close();
deleteToolWindow(m_previewAcc);
m_ToolViews.removeRef(m_previewAcc);
if (m_useXine)
m_mp2=new K9Mplayer(TQT_TQOBJECT(this));
else
m_mp2=new kViewMPEG2();
m_previewAcc=addToolWindow(m_mp2,KDockWidget::DockRight,getMainDockWidget(),0,i18n("Preview"),i18n("Preview"));
m_ToolViews.append(m_previewAcc);
//kViewMPEG2 * v=(kViewMPEG2*) m_mp2;
connect(m_k9Main,TQT_SIGNAL(showPreview( k9DVD*, k9DVDTitle*,int )),m_mp2,TQT_SLOT(open( k9DVD*, k9DVDTitle*,int )));
connect(m_k9Main,TQT_SIGNAL(stopPreview()),m_mp2,TQT_SLOT(bStopClick()));
m_mp4->load();
}
}
void k9Copy::ActionCopy() {
if (m_useXine)
((K9Mplayer*)m_mp2)->bStopClick();
else
((kViewMPEG2*)m_mp2)->bStopClick();
m_k9Main->Copy();
}
void k9Copy::ActionPlayTitle() {
m_previewAcc->show();
m_k9Main->PreviewTitle();
}
void k9Copy::ActionMP4() {
m_k9Main->CreateMP4();
}
void k9Copy::ActionMpeg2() {
m_k9Main->extractMPEG2();
}
void k9Copy::ActionEject() {
m_k9Main->eject();
}
void k9Copy::ActionBackup() {
createCopyWindows();
}
void k9Copy::ActionAuthor() {
createImportWindows();
}
void k9Copy::ActionCreate() {
m_k9Import->execute();
}
KMdiToolViewAccessor * k9Copy::setToolWindow(TQWidget *_widget,KDockWidget::DockPosition _pos,const TQString &tabToolTip,const TQString &tabCaption) {
KMdiToolViewAccessor *acc=addToolWindow(_widget, _pos, getMainDockWidget(),0,tabToolTip,tabCaption);
m_ToolViews.append(acc);
return acc;
}
void k9Copy::removeToolWindow(KMdiToolViewAccessor *toolWin) {
deleteToolWindow(toolWin);
m_ToolViews.removeRef(toolWin);
}
void k9Copy::changeStatusbar(const TQString& text,int id) {
// display the text on the statusbar
statusBar()->changeItem(text,id);
}
void k9Copy::changeCaption(const TQString& text) {
// display the text on the caption
setCaption(text);
}
void k9Copy::clone( TQString _input,TQString _output) {
show();
m_k9Main->Clone( _input,_output);
}
void k9Copy::setInput(TQString _input) {
m_k9Main->setInput(_input);
}
void k9Copy::setOutput(TQString _output) {
m_k9Main->setOutput(_output);
}
void k9Copy::quit() {
close( true);
}
void k9Copy::saveDock() {
TDEConfig config("K9Copy");
if (m_k9MainView) {
dockManager->writeConfig(&config,"dock");
m_k9Main->saveSettings();
} else if (m_k9ImportView) {
dockManager->writeConfig(&config,"dockImport");
}
}
void k9Copy::closeEvent( TQCloseEvent* ce ) {
saveDock();
ce->accept();
kapp->quit();
}
KDockWidget* k9Copy::getVisibleDock() {
if (m_k9MainView) {
KDockWidget *w= manager()->findWidgetParentDock(m_options);
if (w->isVisible())
return w;
w= manager()->findWidgetParentDock(m_lang);
if (w->isVisible())
return w;
w= manager()->findWidgetParentDock(m_mp2);
if (w->isVisible())
return w;
} else {
KDockWidget *w= manager()->findWidgetParentDock(m_menuEdit);
if (w->isVisible())
return w;
}
return NULL;
}
void k9Copy::setEnabledCreateDVD(bool _state) {
m_actions["create"]->setEnabled(_state);
}
#include "k9copy.moc"