# 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 , TQT_SIGNAL ( clicked ( ) ) ,
this , TQT_SLOT ( help ( ) )
) ;
Bring filenew, fileopen, fileprint, filequickprint, filesave, filesaveas, fileclose, editclear, editcopy, editcut, editdelete, editpaste, folder_new, and gohome icons into XDG compliance
10 years ago
pGenerate = new KPushButton ( iconLoader - > loadIcon ( " document-new " , TDEIcon : : Small ) , i18n ( " Generate " ) , this , " pGenerate " ) ;
buttonBox - > addWidget ( pGenerate ) ;
connect ( pGenerate , TQT_SIGNAL ( clicked ( ) ) ,
this , TQT_SLOT ( generate ( ) )
) ;
pConvert = new KPushButton ( iconLoader - > loadIcon ( " system-run " , TDEIcon : : Small ) , i18n ( " Format " ) , this , " pConvert " ) ;
buttonBox - > addWidget ( pConvert ) ;
connect ( pConvert , TQT_SIGNAL ( clicked ( ) ) ,
this , TQT_SLOT ( convert ( ) )
) ;
pShift = new KPushButton ( iconLoader - > loadIcon ( " reload " , TDEIcon : : Small ) , i18n ( " Shift Title/Performer " ) , this , " pShift " ) ;
buttonBox - > addWidget ( pShift ) ;
connect ( pShift , TQT_SIGNAL ( clicked ( ) ) ,
this , TQT_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 , TQT_SIGNAL ( clicked ( ) ) ,
this , TQT_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 , " %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 ) ;
}
*/