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.
soundkonverter/src/cuesheeteditor.cpp

328 lines
9.9 KiB

#include "cuesheeteditor.h"
#include <tqlayout.h>
#include <tqstring.h>
#include <tdelocale.h>
#include <kiconloader.h>
#include <kpushbutton.h>
#include <tdemessagebox.h>
//#include <ktextedit.h>
/*#include <tdeparts/factory.h> // KPart Factory
#include <klibloader.h> // LibLoader, contains factories
#include <kate/document.h> // Katepart document
#include <kate/view.h> // Katepart view
*/
// ### soundkonverter 0.4: import/export flac cuesheet
CuesheetEditor::CuesheetEditor( TQWidget *parent, const char *name, bool modal, WFlags f )
: KDialog( parent, name, modal, f )
{
// TODO can the cuesheet editor be extendet by more tags (composer), etc.
// create an icon loader object for loading icons
TDEIconLoader* iconLoader = new TDEIconLoader();
setCaption( i18n("Cuesheet Editor") );
resize( 600, 400 );
setIcon( iconLoader->loadIcon("kwrite",TDEIcon::Small) );
TQGridLayout *grid = new TQGridLayout( this, 4, 1, 11, 6 );
tTextEdit = new KTextEdit( this, "tTextEdit" );
tTextEdit->setFocus();
grid->addWidget( tTextEdit, 0, 0 );
/*
// Get KPart factory for the katepart library.
// This returns 0, if the library can not be found
KParts::Factory* factory = (KParts::Factory *)
KLibLoader::self()->factory ("libkatepart");
if (factory)
{
// The library was found, so create the Kate::Document
KTextEditor::Document *doc = (KTextEditor::Document *)
factory->createPart( 0, "", this, "", "KTextEditor::Document" );
// The document only represents the document, to view
// the document's content
// we have to create a view for the document.
Kate::View *view = (Kate::View *) doc->createView( this, 0L );
// all went well, so return the view
//return view;
grid->addWidget( view, 0, 0 );
}
else
{
// The library was not found
//return 0L;
}
*/
TQHBoxLayout *buttonBox = new TQHBoxLayout();
grid->addLayout( buttonBox, 3, 0 );
pHelp = new KPushButton( iconLoader->loadIcon("help",TDEIcon::Small), "", this, "pHelp" );
buttonBox->addWidget( pHelp );
connect( pHelp, TQ_SIGNAL(clicked()),
this, TQ_SLOT(help())
);
pGenerate = new KPushButton( iconLoader->loadIcon("document-new",TDEIcon::Small), i18n("Generate"), this, "pGenerate" );
buttonBox->addWidget( pGenerate );
connect( pGenerate, TQ_SIGNAL(clicked()),
this, TQ_SLOT(generate())
);
pConvert = new KPushButton( iconLoader->loadIcon("system-run",TDEIcon::Small), i18n("Format"), this, "pConvert" );
buttonBox->addWidget( pConvert );
connect( pConvert, TQ_SIGNAL(clicked()),
this, TQ_SLOT(convert())
);
pShift = new KPushButton( iconLoader->loadIcon("reload",TDEIcon::Small), i18n("Shift Title/Performer"), this, "pShift" );
buttonBox->addWidget( pShift );
connect( pShift, TQ_SIGNAL(clicked()),
this, TQ_SLOT(shift())
);
buttonBox->addStretch();
pOk = new KPushButton(iconLoader->loadIcon("system-log-out",TDEIcon::Small), i18n("Close"), this, "pOk" );
pOk->setFocus();
buttonBox->addWidget( pOk );
connect( pOk, TQ_SIGNAL(clicked()),
this, TQ_SLOT(accept())
);
// delete the icon loader object
delete iconLoader;
}
CuesheetEditor::~CuesheetEditor()
{}
void CuesheetEditor::help()
{
KMessageBox::information( this,
i18n("<p>With this small tool you can process cue files as they are used for burning music mixes and for organizing them in media players like amaroK.<br><br>You can generate a new file by pasting text into the input area. It must be formated the following way:<br><br>Title - Artist [time]<br>Title - Artist [3:25]<br>Title - Artist [2:37]<br>...<br>A tip: Use kwrite and regular expressions to format it this way.</p>"),
i18n("Cuesheet Editor - Help") );
}
void CuesheetEditor::generate()
{
TQString text = tTextEdit->text();
TQString newText;
TQStringList titleList, performerList;
TQValueList<int> timeList;
TQString time;
int min, sec;
int index;
while( index != -1 )
{
index = text.find( " - " );
if( index == -1 )
break;
titleList.append( text.left(index) );
text.remove( 0, index + 3 );
index=text.find( " [" );
if( index == -1 )
break;
performerList.append( text.left(index) );
text.remove( 0, index + 2 );
index = text.find( "]" );
if( index == -1 )
break;
time = text.left( index );
sscanf( time.local8Bit().data(), "%i:%i", &min, &sec );
timeList.append( min * 60 + sec );
text.remove( 0, index + 2 );
}
newText.append( "TITLE \"\"\n" );
newText.append( "PERFORMER \"\"\n" );
newText.append( "FILE \"\" MP3\n" );
int TRACK = 1;
int INDEX = 0;
bool addFrames = false;
TQStringList::Iterator performerIt = performerList.begin();
TQValueList<int>::Iterator timeIt = timeList.begin();
for( TQStringList::Iterator titleIt = titleList.begin(); titleIt != titleList.end(); ++titleIt )
{
newText.append( TQString().sprintf(" TRACK %02i AUDIO\n",TRACK ) );
newText.append( " TITLE \"" + (*titleIt) + "\"\n" );
newText.append( " PERFORMER \"" + (*performerIt) + "\"\n" );
if( addFrames ) {
newText.append( TQString().sprintf(" INDEX 01 %02i:%02i:37\n",INDEX/60,INDEX%60) );
INDEX++;
addFrames = false;
}
else {
newText.append( TQString().sprintf(" INDEX 01 %02i:%02i:00\n",INDEX/60,INDEX%60) );
addFrames = true;
}
performerIt++;
timeIt++;
TRACK++;
INDEX += (*timeIt);
}
tTextEdit->setText(newText);
}
void CuesheetEditor::convert()
{
TQString text=tTextEdit->text();
TQString newText;
TQString tmpText;
TQString first, rest;
TQStringList splinters;
int index;
while( index!=-1 )
{
index=text.find("\"");
if( index==-1 )
break;
newText+=text.left(index+1);
text.remove(0,index+1);
index=text.find("\"");
tmpText=text.left(index+1);
text.remove(0,index+1);
if( newText.right(6) == "FILE \"" )
{
newText+=tmpText;
continue;
}
splinters=TQStringList::split(' ',tmpText);
for( TQStringList::Iterator it=splinters.begin(); it!=splinters.end(); ++it )
{
for( uint i=0; i<(*it).length(); i++ )
{
if( (*it).left(i).lower() != (*it).left(i).upper() )
{
index=i;
break;
}
}
first=(*it).left(index);
first=first.upper();
rest=(*it).right((*it).length()-index);
rest=rest.lower();
for( uint i=0; i<rest.length(); i++ )
{
/*if( rest.mid(i,1).lower() == rest.mid(i,1).upper() )
{
rest=rest.left(i+1)+rest.mid(i+1,1).upper()+rest.right(rest.length()-i-2);
}*/
if( rest.mid(i,1) == "-" )
{
rest=rest.left(i+1)+rest.mid(i+1,1).upper()+rest.right(rest.length()-i-2);
}
if( rest.mid(i,1).lower() == "j" && rest.mid(i-1,1).lower() == "d" )
{
rest=rest.left(i-1)+rest.mid(i-1,2).upper()+rest.right(rest.length()-i-1);
}
if( rest.mid(i,1).lower() == "j" && first.right(1).lower() == "d" )
{
rest=rest.left(i)+rest.mid(i,1).upper()+rest.right(rest.length()-i-1);
}
}
newText += first + rest + " ";
}
newText.remove( newText.length() - 1, 1 );
}
newText += text;
tTextEdit->setText( newText );
}
void CuesheetEditor::shift() //move the title to "PERFORMER" and performer to "TITLE"
{
TQString text = tTextEdit->text();
TQString newText;
TQString line, title="", performer="";
int index;
while( index !=- 1 )
{
index = text.find("\n");
if( index == -1 )
break;
line = text.left(index+1);
text.remove(0,index+1);
// TODO clean up
if( line.find( "TITLE" ) != -1 ) {
line.replace( "TITLE", "PERFORMER" );
if( performer != "" ) newText += performer;
performer=line;
}
else if( line.find( "PERFORMER" ) != -1 ) {
line.replace( "PERFORMER", "TITLE" );
if( title != "" ) newText += title;
title = line;
}
else {
if( title != "" ) newText += title;
if( performer != "" ) newText += performer;
title = "";
performer = "";
newText += line;
}
if( title != "" && performer != "" ) {
newText += title;
newText += performer;
title = "";
performer = "";
}
}
tTextEdit->setText( newText );
}
/*
void CuesheetEditor::shift() //replace title by performer and reverse
{
TQString text=tTextEdit->text();
TQString newText;
TQString line, title, performer;
int index;
while( index!=-1 )
{
index=text.find("\n");
if( index==-1 )
break;
line=text.left(index+1);
text.remove(0,index+1);
if( line.find(" TITLE \"") != -1 ) {
line.replace(" TITLE \""," PERFORMER \"");
newText+=line;
}
else if( line.find(" PERFORMER \"") != -1 ) {
line.replace(" PERFORMER \""," TITLE \"");
newText+=line;
}
else {
newText+=line;
}
}
tTextEdit->setText(newText);
}
*/
#include "cuesheeteditor.moc"