1 //
2 // C++ Implementation: optionseditor
3 //
4 // Description:
5 //
6 //
7 // Author: Daniel Faust <hessijames@gmail.com>, (C) 2008 - 2012
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12 #include "optionseditor.h"
13 #include "options.h"
14 #include "config.h"
15 #include "filelistitem.h"
16 
17 #include "global.h"
18 
19 #include <QApplication>
20 #include <QBoxLayout>
21 #include <KComboBox>
22 #include <KIcon>
23 #include <KLineEdit>
24 #include <KLocale>
25 #include <KNumInput>
26 #include <KPushButton>
27 #include <KTextEdit>
28 #include <QDateTime>
29 #include <QLabel>
30 
31 
32 // TODO use QPointer or QSharedPointer
33 
OptionsEditor(Config * _config,QWidget * parent)34 OptionsEditor::OptionsEditor( Config *_config, QWidget *parent )
35     : KPageDialog( parent ),
36     config( _config )
37 {
38     tagEngine = config->tagEngine();
39 
40     setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel );
41     nextButton = new QPushButton(KIcon("go-next"), i18n("Next"));
42     nextButton->setAutoRepeat(true);
43     addActionButton(nextButton);
44     prevButton = new QPushButton(KIcon("go-previous"), i18n("Previous"));
45     prevButton->setAutoRepeat(true);
46     addActionButton(prevButton);
47 
48     connect( this, SIGNAL(applyClicked()), this, SLOT(applyChanges()) );
49     connect( this, SIGNAL(okClicked()), this, SLOT(applyChanges()) );
50 
51     QWidget *conversionOptionsWidget = new QWidget( this );
52     KPageWidgetItem *conversionOptionsPage = addPage( conversionOptionsWidget, i18n("Conversion") );
53     conversionOptionsPage->setIcon( KIcon( "view-list-text" ) );
54 
55     // the grid for all widgets in the main window
56     QGridLayout* conversionOptionsGridLayout = new QGridLayout( conversionOptionsWidget );
57     // generate the options input area
58     options = new Options( config, i18n("Select your desired output options and click on \"Ok\"."), conversionOptionsWidget );
59     conversionOptionsGridLayout->addWidget( options, 0, 0 );
60     conversionOptionsGridLayout->setRowStretch( 1, 1 );
61 
62     lEditOptions = new QLabel( "", conversionOptionsWidget );
63     conversionOptionsGridLayout->addWidget( lEditOptions, 2, 0 );
64     lEditOptions->setAlignment( Qt::AlignHCenter );
65     lEditOptions->hide();
66     pEditOptions = new KPushButton( i18n("Edit conversion options"), conversionOptionsWidget );
67     pEditOptions->setFixedWidth( pEditOptions->sizeHint().width() );
68     conversionOptionsGridLayout->addWidget( pEditOptions, 3, 0, Qt::AlignHCenter );
69     pEditOptions->hide();
70     connect( pEditOptions, SIGNAL(clicked()), this, SLOT(editOptionsClicked()) );
71 
72 
73 
74     QWidget *tagsWidget = new QWidget( this );
75     KPageWidgetItem *tagsPage = addPage( tagsWidget, i18n("Tags") );
76     tagsPage->setIcon( KIcon( "feed-subscribe" ) );
77 
78     // the grid for all widgets in the main window
79     QGridLayout* tagsGridLayout = new QGridLayout( tagsWidget );
80 
81     // add the inputs
82     // add a horizontal box layout for the covers
83     QHBoxLayout *coversBox = new QHBoxLayout();
84     tagsGridLayout->addLayout( coversBox, 0, 1 );
85     // and fill it up
86     lCoversLabel = new QLabel( i18n("Covers:"), tagsWidget );
87     tagsGridLayout->addWidget( lCoversLabel, 0, 0 );
88     bCovers = new QHBoxLayout();
89     coversBox->addLayout( bCovers );
90     coversBox->addStretch();
91 
92     // add a horizontal box layout for the title and track number
93     QHBoxLayout *titleBox = new QHBoxLayout();
94     tagsGridLayout->addLayout( titleBox, 1, 1 );
95     // and fill it up
96     lTitleLabel = new QLabel( i18n("Title:"), tagsWidget );
97     tagsGridLayout->addWidget( lTitleLabel, 1, 0 );
98     lTitle = new KLineEdit( tagsWidget );
99     titleBox->addWidget( lTitle );
100     pTitleEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
101     pTitleEdit->setFixedSize( pTitleEdit->sizeHint().height(), lTitle->sizeHint().height() );
102     pTitleEdit->setFlat( true );
103     pTitleEdit->setToolTip( i18n("Edit") );
104     pTitleEdit->hide();
105     titleBox->addWidget( pTitleEdit );
106     connect( pTitleEdit, SIGNAL(clicked()), this, SLOT(editTitleClicked()) );
107     lTrackLabel = new QLabel( i18n("Track No.:"), tagsWidget );
108     titleBox->addWidget( lTrackLabel );
109     iTrack = new KIntSpinBox( 0, 999, 1, 1, tagsWidget );
110     titleBox->addWidget( iTrack );
111     pTrackEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
112     pTrackEdit->setFixedSize( pTrackEdit->sizeHint().height(), iTrack->sizeHint().height() );
113     pTrackEdit->setFlat( true );
114     pTrackEdit->setToolTip( i18n("Edit") );
115     pTrackEdit->hide();
116     titleBox->addWidget( pTrackEdit );
117     connect( pTrackEdit, SIGNAL(clicked()), this, SLOT(editTrackClicked()) );
118     lTrackTotalLabel = new QLabel( i18nc("Track/Disc No. x of y","of"), tagsWidget );
119     titleBox->addWidget( lTrackTotalLabel );
120     iTrackTotal = new KIntSpinBox( 0, 999, 1, 1, tagsWidget );
121     titleBox->addWidget( iTrackTotal );
122     pTrackTotalEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
123     pTrackTotalEdit->setFixedSize( pTrackTotalEdit->sizeHint().height(), iTrackTotal->sizeHint().height() );
124     pTrackTotalEdit->setFlat( true );
125     pTrackTotalEdit->setToolTip( i18n("Edit") );
126     pTrackTotalEdit->hide();
127     titleBox->addWidget( pTrackTotalEdit );
128     connect( pTrackTotalEdit, SIGNAL(clicked()), this, SLOT(editTrackTotalClicked()) );
129 
130     // add a horizontal box layout for the artist and the composer
131     QHBoxLayout *artistBox = new QHBoxLayout();
132     tagsGridLayout->addLayout( artistBox, 2, 1 );
133     // and fill it up
134     lArtistLabel = new QLabel( i18n("Artist:"), tagsWidget );
135     tagsGridLayout->addWidget( lArtistLabel, 2, 0 );
136     lArtist = new KLineEdit( tagsWidget );
137     artistBox->addWidget( lArtist );
138     pArtistEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
139     pArtistEdit->setFixedSize( pArtistEdit->sizeHint().height(), lArtist->sizeHint().height() );
140     pArtistEdit->setFlat( true );
141     pArtistEdit->setToolTip( i18n("Edit") );
142     pArtistEdit->hide();
143     artistBox->addWidget( pArtistEdit );
144     connect( pArtistEdit, SIGNAL(clicked()), this, SLOT(editArtistClicked()) );
145     lComposerLabel = new QLabel( i18n("Composer:"), tagsWidget );
146     artistBox->addWidget( lComposerLabel );
147     lComposer = new KLineEdit( tagsWidget );
148     artistBox->addWidget( lComposer );
149     pComposerEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
150     pComposerEdit->setFixedSize( pComposerEdit->sizeHint().height(), lComposer->sizeHint().height() );
151     pComposerEdit->setFlat( true );
152     pComposerEdit->setToolTip( i18n("Edit") );
153     pComposerEdit->hide();
154     artistBox->addWidget( pComposerEdit );
155     connect( pComposerEdit, SIGNAL(clicked()), this, SLOT(editComposerClicked()) );
156 
157     // add a horizontal box layout for the album
158     QHBoxLayout *albumArtistBox = new QHBoxLayout();
159     tagsGridLayout->addLayout( albumArtistBox, 3, 1 );
160     // and fill it up
161     lAlbumArtistLabel = new QLabel( i18n("Album artist:"), tagsWidget );
162     tagsGridLayout->addWidget( lAlbumArtistLabel, 3, 0 );
163     lAlbumArtist = new KLineEdit( tagsWidget );
164     albumArtistBox->addWidget( lAlbumArtist );
165     pAlbumArtistEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
166     pAlbumArtistEdit->setFixedSize( pAlbumArtistEdit->sizeHint().height(), lAlbumArtist->sizeHint().height() );
167     pAlbumArtistEdit->setFlat( true );
168     pAlbumArtistEdit->setToolTip( i18n("Edit") );
169     pAlbumArtistEdit->hide();
170     albumArtistBox->addWidget( pAlbumArtistEdit );
171     connect( pAlbumArtistEdit, SIGNAL(clicked()), this, SLOT(editAlbumArtistClicked()) );
172 
173     // add a horizontal box layout for the album
174     QHBoxLayout *albumBox = new QHBoxLayout();
175     tagsGridLayout->addLayout( albumBox, 4, 1 );
176     // and fill it up
177     lAlbumLabel = new QLabel( i18n("Album:"), tagsWidget );
178     tagsGridLayout->addWidget( lAlbumLabel, 4, 0 );
179     lAlbum = new KLineEdit( tagsWidget );
180     albumBox->addWidget( lAlbum );
181     pAlbumEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
182     pAlbumEdit->setFixedSize( pAlbumEdit->sizeHint().height(), lAlbum->sizeHint().height() );
183     pAlbumEdit->setFlat( true );
184     pAlbumEdit->setToolTip( i18n("Edit") );
185     pAlbumEdit->hide();
186     albumBox->addWidget( pAlbumEdit );
187     connect( pAlbumEdit, SIGNAL(clicked()), this, SLOT(editAlbumClicked()) );
188 
189     // add a horizontal box layout for the disc number, year and genre
190     QHBoxLayout *albumdataBox = new QHBoxLayout();
191     tagsGridLayout->addLayout( albumdataBox, 5, 1 );
192     // and fill it up
193     lDiscLabel = new QLabel( i18n("Disc No.:"), tagsWidget );
194     tagsGridLayout->addWidget( lDiscLabel, 5, 0 );
195     iDisc = new KIntSpinBox( 0, 99, 1, 1, tagsWidget );
196     albumdataBox->addWidget( iDisc );
197     pDiscEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
198     pDiscEdit->setFixedSize( pDiscEdit->sizeHint().height(), iDisc->sizeHint().height() );
199     pDiscEdit->setFlat( true );
200     pDiscEdit->setToolTip( i18n("Edit") );
201     pDiscEdit->hide();
202     albumdataBox->addWidget( pDiscEdit );
203     connect( pDiscEdit, SIGNAL(clicked()), this, SLOT(editDiscClicked()) );
204     lDiscTotalLabel = new QLabel( i18nc("Track/Disc No. x of y","of"), tagsWidget );
205     albumdataBox->addWidget( lDiscTotalLabel );
206     iDiscTotal = new KIntSpinBox( 0, 99, 1, 1, tagsWidget );
207     albumdataBox->addWidget( iDiscTotal );
208     pDiscTotalEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
209     pDiscTotalEdit->setFixedSize( pDiscTotalEdit->sizeHint().height(), iDiscTotal->sizeHint().height() );
210     pDiscTotalEdit->setFlat( true );
211     pDiscTotalEdit->setToolTip( i18n("Edit") );
212     pDiscTotalEdit->hide();
213     albumdataBox->addWidget( pDiscTotalEdit );
214     connect( pDiscTotalEdit, SIGNAL(clicked()), this, SLOT(editDiscTotalClicked()) );
215     albumdataBox->addStretch();
216     lYearLabel = new QLabel( i18n("Year:"), tagsWidget );
217     albumdataBox->addWidget( lYearLabel );
218     iYear = new KIntSpinBox( 0, 99999, 1, QDate::currentDate().year(), tagsWidget );
219     albumdataBox->addWidget( iYear );
220     pYearEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
221     pYearEdit->setFixedSize( pYearEdit->sizeHint().height(), iYear->sizeHint().height() );
222     pYearEdit->setFlat( true );
223     pYearEdit->setToolTip( i18n("Edit") );
224     pYearEdit->hide();
225     albumdataBox->addWidget( pYearEdit );
226     connect( pYearEdit, SIGNAL(clicked()), this, SLOT(editYearClicked()) );
227     albumdataBox->addStretch();
228     lGenreLabel = new QLabel( i18n("Genre:"), tagsWidget );
229     albumdataBox->addWidget( lGenreLabel );
230     cGenre = new KComboBox( true, tagsWidget );
231     cGenre->addItems( tagEngine->genreList );
232     cGenre->clearEditText();
233     KCompletion *cGenreCompletion = cGenre->completionObject();
234     cGenreCompletion->insertItems( tagEngine->genreList );
235     cGenreCompletion->setIgnoreCase( tagsWidget );
236     albumdataBox->addWidget( cGenre );
237     pGenreEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
238     pGenreEdit->setFixedSize( pGenreEdit->sizeHint().height(), cGenre->sizeHint().height() );
239     pGenreEdit->setFlat( true );
240     pGenreEdit->setToolTip( i18n("Edit") );
241     pGenreEdit->hide();
242     albumdataBox->addWidget( pGenreEdit );
243     connect( pGenreEdit, SIGNAL(clicked()), this, SLOT(editGenreClicked()) );
244 
245     // add a horizontal box layout for the comment
246     QHBoxLayout *commentBox = new QHBoxLayout();
247     tagsGridLayout->addLayout( commentBox, 6, 1 );
248     // and fill it up
249     lCommentLabel = new QLabel( i18n("Comment:"), tagsWidget );
250     tagsGridLayout->addWidget( lCommentLabel, 6, 0 );
251     tComment = new KTextEdit( tagsWidget );
252     commentBox->addWidget( tComment );
253     pCommentEdit = new KPushButton( KIcon("edit-rename"), " ", tagsWidget );
254     pCommentEdit->setFixedSize( pCommentEdit->sizeHint().height(), lTitle->sizeHint().height() );
255     pCommentEdit->setFlat( true );
256     pCommentEdit->setToolTip( i18n("Edit") );
257     pCommentEdit->hide();
258     commentBox->addWidget( pCommentEdit );
259     connect( pCommentEdit, SIGNAL(clicked()), this, SLOT(editCommentClicked()) );
260     tagsGridLayout->setRowStretch( 6, 1 );
261 
262     lEditTags = new QLabel( "", tagsWidget );
263     tagsGridLayout->addWidget( lEditTags, 7, 1 );
264     lEditTags->setAlignment( Qt::AlignHCenter );
265     lEditTags->hide();
266     pEditTags = new KPushButton( i18n("Edit tags"), tagsWidget );
267     pEditTags->setFixedWidth( pEditTags->sizeHint().width() );
268     tagsGridLayout->addWidget( pEditTags, 8, 1, Qt::AlignHCenter );
269     pEditTags->hide();
270     connect( pEditTags, SIGNAL(clicked()), this, SLOT(editTagsClicked()) );
271 }
272 
~OptionsEditor()273 OptionsEditor::~OptionsEditor()
274 {}
275 
setTagInputEnabled(bool enabled)276 void OptionsEditor::setTagInputEnabled( bool enabled )
277 {
278     lTitleLabel->setEnabled( enabled );
279     lTitle->setEnabled( enabled );
280     pTitleEdit->hide();
281     lTrackLabel->setEnabled( enabled );
282     iTrack->setEnabled( enabled );
283     lTrackTotalLabel->setEnabled( enabled );
284     iTrackTotal->setEnabled( enabled );
285     pTrackEdit->hide();
286     lArtistLabel->setEnabled( enabled );
287     lArtist->setEnabled( enabled );
288     pArtistEdit->hide();
289     lComposerLabel->setEnabled( enabled );
290     lComposer->setEnabled( enabled );
291     pComposerEdit->hide();
292     lAlbumArtistLabel->setEnabled( enabled );
293     lAlbumArtist->setEnabled( enabled );
294     pAlbumArtistEdit->hide();
295     lAlbumLabel->setEnabled( enabled );
296     lAlbum->setEnabled( enabled );
297     pAlbumEdit->hide();
298     lDiscLabel->setEnabled( enabled );
299     iDisc->setEnabled( enabled );
300     lDiscTotalLabel->setEnabled( enabled );
301     iDiscTotal->setEnabled( enabled );
302     pDiscEdit->hide();
303     lYearLabel->setEnabled( enabled );
304     iYear->setEnabled( enabled );
305     pYearEdit->hide();
306     lGenreLabel->setEnabled( enabled );
307     cGenre->setEnabled( enabled );
308     pGenreEdit->hide();
309     lCommentLabel->setEnabled( enabled );
310     tComment->setEnabled( enabled );
311     tComment->setReadOnly( !enabled );
312     pCommentEdit->hide();
313 
314     if( !enabled )
315     {
316         lTitle->setText( "" );
317         iTrack->setValue( 0 );
318         iTrackTotal->setValue( 0 );
319         lArtist->setText( "" );
320         lComposer->setText( "" );
321         lAlbumArtist->setText( "" );
322         lAlbum->setText( "" );
323         iDisc->setValue( 0 );
324         iDiscTotal->setValue( 0 );
325         iYear->setValue( 0 );
326         cGenre->setEditText( "" );
327         tComment->setText( "" );
328     }
329 }
330 
itemsSelected(QList<FileListItem * > items)331 void OptionsEditor::itemsSelected( QList<FileListItem*> items )
332 {
333     selectedItems.clear();
334     foreach( FileListItem *item, items )
335     {
336         bool canEdit = false;
337         if( item )
338         {
339             switch( item->state )
340             {
341                 case FileListItem::WaitingForConversion:
342                     canEdit = true;
343                     break;
344                 case FileListItem::Ripping:
345                     break;
346                 case FileListItem::Converting:
347                     break;
348                 case FileListItem::ApplyingReplayGain:
349                     break;
350                 case FileListItem::WaitingForAlbumGain:
351                     break;
352                 case FileListItem::ApplyingAlbumGain:
353                     break;
354                 case FileListItem::Stopped:
355                     canEdit = true;
356                     break;
357             }
358         }
359         if( canEdit )
360             selectedItems.append( item );
361     }
362 
363     // remove all cover widgets
364     foreach( QLabel* label, lCovers )
365     {
366         bCovers->removeWidget( label ); // FIXME crash
367         label->deleteLater();
368     }
369     lCovers.clear();
370     lCoversLabel->setEnabled( false );
371 
372     if( selectedItems.count() == 0 )
373     {
374         setWindowTitle( i18n("No file selected") );
375         options->setEnabled( false );
376         lEditOptions->hide();
377         pEditOptions->hide();
378         setTagInputEnabled( false );
379         lEditTags->hide();
380         pEditTags->hide();
381 
382         return;
383     }
384 
385     options->setEnabled( true );
386     lEditOptions->hide();
387     pEditOptions->hide();
388     setTagInputEnabled( true );
389     lEditTags->hide();
390     pEditTags->hide();
391 
392     if( selectedItems.count() == 1 )
393     {
394         FileListItem *item = selectedItems.first();
395 
396         setWindowTitle(selectedItems.first()->url.fileName());
397 
398         const bool success = options->setCurrentConversionOptions( config->conversionOptionsManager()->getConversionOptions(selectedItems.first()->conversionOptionsId) );
399         options->setEnabled( success );
400         // TODO show error message if !success
401 
402         if( item->tags == 0 && !item->local )
403         {
404             setTagInputEnabled( false );
405             lEditTags->setText( i18n("The tags could not be read, because this is not a local file.\n"
406                     "soundKonverter will try to read the tags, when it is about to convert the file.\n"
407                     "If you want to edit the tags, you can hit the button below but then soundKonverter will not try\n"
408                     "to read the tags after downloading.") );
409             lEditTags->show();
410             pEditTags->show();
411         }
412         else if( item->tags == 0 )
413         {
414             setTagInputEnabled( false );
415             lEditTags->setText( i18n("Reading the tags of this file failed.\n"
416                     "soundKonverter will try to read the tags a second time, when it is about to convert the file.\n"
417                     "If you want to edit the tags, you can hit the button below but then soundKonverter will not try\n"
418                     "to read the tags a second time.") );
419             lEditTags->show();
420             pEditTags->show();
421         }
422         else
423         {
424             const int fontHeight = QFontMetrics(QApplication::font()).boundingRect("M").size().height();
425 
426             if( !(item->tags->tagsRead & TagData::Covers) )
427             {
428                 item->tags->covers = tagEngine->readCovers( item->url );
429                 item->tags->tagsRead = TagData::TagsRead(item->tags->tagsRead | TagData::Covers);
430             }
431             foreach( CoverData* cover, item->tags->covers )
432             {
433                 QPixmap pixmap;
434                 pixmap.loadFromData( cover->data );
435 
436                 QLabel *label = new QLabel();
437                 label->setFrameShape( QFrame::StyledPanel );
438                 label->setFrameShadow( QFrame::Raised );
439                 QString toolTip;
440                 toolTip += "<span style='white-space:pre'><table>";
441                 toolTip += "<tr><td>" + i18nc("cover tooltip","Cover type:") + "</td><td>" + CoverData::roleName(cover->role) + "</td></tr>";
442                 if( !cover->description.isEmpty() )
443                     toolTip += "<tr><td>" + i18nc("cover tooltip","Description:") + "</td><td>" + cover->description + "</td></tr>";
444                 toolTip += "<tr><td>" + i18nc("cover tooltip","Size:") + "</td><td>" + i18nc("cover tooltip","%1 x %2 pixels (%3)",pixmap.width(),pixmap.height(),Global::prettyNumber(cover->data.size(),"B")) + "</td></tr>";
445                 if( !cover->mimeType.isEmpty() )
446                     toolTip += "<tr><td>" + i18nc("cover tooltip","Mime type:") + "</td><td>" + cover->mimeType + "</td></tr>";
447                 toolTip += "</table></span>";
448                 label->setToolTip( toolTip );
449                 bCovers->addWidget( label );
450                 lCovers.append( label );
451 
452                 label->setPixmap( pixmap.scaledToHeight( 4.5*fontHeight, Qt::SmoothTransformation ) );
453             }
454             lCoversLabel->setEnabled( item->tags->covers.count() > 0 );
455             lTitle->setText( item->tags->title );
456             iTrack->setValue( item->tags->track );
457             iTrackTotal->setValue( item->tags->trackTotal );
458             lArtist->setText( item->tags->artist );
459             lComposer->setText( item->tags->composer );
460             lAlbumArtist->setText( item->tags->albumArtist );
461             lAlbum->setText( item->tags->album );
462             iDisc->setValue( item->tags->disc );
463             iDiscTotal->setValue( item->tags->discTotal );
464             iYear->setValue( item->tags->year );
465             cGenre->setEditText( item->tags->genre );
466             tComment->setText( item->tags->comment );
467         }
468     }
469     else // selectedItems.count() > 1
470     {
471         setWindowTitle(i18n("%1 Files").arg(selectedItems.count()));
472 
473         FileListItem *firstItem = selectedItems.first();
474         const int     conversionOptionsId = firstItem->conversionOptionsId;
475         const QString title               = ( firstItem->tags == 0 ) ? "" : firstItem->tags->title;
476         const int     track               = ( firstItem->tags == 0 ) ? 0  : firstItem->tags->track;
477         const int     trackTotal          = ( firstItem->tags == 0 ) ? 0  : firstItem->tags->trackTotal;
478         const QString artist              = ( firstItem->tags == 0 ) ? "" : firstItem->tags->artist;
479         const QString composer            = ( firstItem->tags == 0 ) ? "" : firstItem->tags->composer;
480         const QString albumArtist         = ( firstItem->tags == 0 ) ? "" : firstItem->tags->albumArtist;
481         const QString album               = ( firstItem->tags == 0 ) ? "" : firstItem->tags->album;
482         const int     disc                = ( firstItem->tags == 0 ) ? 0  : firstItem->tags->disc;
483         const int     discTotal           = ( firstItem->tags == 0 ) ? 0  : firstItem->tags->discTotal;
484         const int     year                = ( firstItem->tags == 0 ) ? 0  : firstItem->tags->year;
485         const QString genre               = ( firstItem->tags == 0 ) ? "" : firstItem->tags->genre;
486         const QString comment             = ( firstItem->tags == 0 ) ? "" : firstItem->tags->comment;
487 
488         foreach( const FileListItem *item, selectedItems )
489         {
490             if( item->conversionOptionsId != conversionOptionsId )
491             {
492                 options->setEnabled( false );
493                 lEditOptions->setText( i18n("You have selected multiple files with different conversion options.\nYou can change the options of all files by hitting the button below.") );
494                 lEditOptions->show();
495                 pEditOptions->show();
496             }
497 
498             if( item->tags == 0 )
499             {
500                 setTagInputEnabled( false );
501                 lEditTags->setText( i18n("Reading the tags of one or more files failed.\n"
502                         "soundKonverter will try to read the tags a second time, when it is about to convert the files.\n"
503                         "If you want to edit the tags, you can hit the button below but then soundKonverter will not try\n"
504                         "to read the tags a second time.") );
505                 lEditTags->show();
506                 pEditTags->show();
507                 continue;
508             }
509 
510             if( title != item->tags->title && lTitle->isEnabled() )
511             {
512                 lTitle->setEnabled( false );
513                 lTitle->setText( "" );
514                 pTitleEdit->show();
515             }
516             if( track != item->tags->track && iTrack->isEnabled() )
517             {
518                 iTrack->setEnabled( false );
519                 iTrack->setValue( 1 );
520                 pTrackEdit->show();
521             }
522             if( trackTotal != item->tags->trackTotal && iTrackTotal->isEnabled() )
523             {
524                 iTrackTotal->setEnabled( false );
525                 iTrackTotal->setValue( 1 );
526                 pTrackTotalEdit->show();
527             }
528             if( artist != item->tags->artist && lArtist->isEnabled() )
529             {
530                 lArtist->setEnabled( false );
531                 lArtist->setText( "" );
532                 pArtistEdit->show();
533             }
534             if( composer != item->tags->composer && lComposer->isEnabled() )
535             {
536                 lComposer->setEnabled( false );
537                 lComposer->setText( "" );
538                 pComposerEdit->show();
539             }
540             if( albumArtist != item->tags->albumArtist && lAlbumArtist->isEnabled() )
541             {
542                 lAlbumArtist->setEnabled( false );
543                 lAlbumArtist->setText( "" );
544                 pAlbumArtistEdit->show();
545             }
546             if( album != item->tags->album && lAlbum->isEnabled() )
547             {
548                 lAlbum->setEnabled( false );
549                 lAlbum->setText( "" );
550                 pAlbumEdit->show();
551             }
552             if( disc != item->tags->disc && iDisc->isEnabled() )
553             {
554                 iDisc->setEnabled( false );
555                 iDisc->setValue( 1 );
556                 pDiscEdit->show();
557             }
558             if( discTotal != item->tags->discTotal && iDiscTotal->isEnabled() )
559             {
560                 iDiscTotal->setEnabled( false );
561                 iDiscTotal->setValue( 1 );
562                 pDiscTotalEdit->show();
563             }
564             if( year != item->tags->year && iYear->isEnabled() )
565             {
566                 iYear->setEnabled( false );
567                 iYear->setValue( QDate::currentDate().year() );
568                 pYearEdit->show();
569             }
570             if( genre != item->tags->genre && cGenre->isEnabled() )
571             {
572                 cGenre->setEnabled( false );
573                 cGenre->setEditText( "" );
574                 pGenreEdit->show();
575             }
576             if( comment != item->tags->comment && tComment->isEnabled() )
577             {
578                 tComment->setEnabled( false );
579                 tComment->setReadOnly( true );
580                 tComment->setText( "" );
581                 pCommentEdit->show();
582             }
583         }
584 
585         if( options->isEnabled() )
586         {
587             const bool success = options->setCurrentConversionOptions( config->conversionOptionsManager()->getConversionOptions(conversionOptionsId) );
588             options->setEnabled( success );
589             // TODO show error message if !success
590         }
591 
592         if( lTitle->isEnabled() )
593             lTitle->setText( title );
594 
595         if( iTrack->isEnabled() )
596             iTrack->setValue( track );
597 
598         if( iTrackTotal->isEnabled() )
599             iTrackTotal->setValue( trackTotal );
600 
601         if( lArtist->isEnabled() )
602             lArtist->setText( artist );
603 
604         if( lComposer->isEnabled() )
605             lComposer->setText( composer );
606 
607         if( lAlbumArtist->isEnabled() )
608             lAlbumArtist->setText( albumArtist );
609 
610         if( lAlbum->isEnabled() )
611             lAlbum->setText( album );
612 
613         if( iDisc->isEnabled() )
614             iDisc->setValue( disc );
615 
616         if( iDiscTotal->isEnabled() )
617             iDiscTotal->setValue( discTotal );
618 
619         if( iYear->isEnabled() )
620             iYear->setValue( year );
621 
622         if( cGenre->isEnabled() )
623             cGenre->setEditText( genre );
624 
625         if( tComment->isEnabled() )
626             tComment->setText( comment );
627     }
628 }
629 
setPreviousEnabled(bool enabled)630 void OptionsEditor::setPreviousEnabled( bool enabled )
631 {
632     prevButton->setEnabled(enabled);
633 }
634 
setNextEnabled(bool enabled)635 void OptionsEditor::setNextEnabled( bool enabled )
636 {
637     nextButton->setEnabled(enabled);
638 }
639 
applyChanges()640 void OptionsEditor::applyChanges()
641 {
642     ConversionOptions *newConversionOptions = options->currentConversionOptions();
643 
644     for( int i=0; i<selectedItems.count(); i++ )
645     {
646         if( !selectedItems.at(i) )
647             continue;
648 
649         if( newConversionOptions && options->isEnabled() )
650         {
651             selectedItems.at(i)->conversionOptionsId = config->conversionOptionsManager()->updateConversionOptions( selectedItems.at(i)->conversionOptionsId, newConversionOptions );
652         }
653         else
654         {
655             // TODO error message
656         }
657 
658         if( selectedItems.at(i)->tags )
659         {
660             if( lTitle->isEnabled() )
661                 selectedItems.at(i)->tags->title = lTitle->text();
662 
663             if( iTrack->isEnabled() )
664                 selectedItems.at(i)->tags->track = iTrack->value();
665 
666             if( iTrackTotal->isEnabled() )
667                 selectedItems.at(i)->tags->trackTotal = iTrackTotal->value();
668 
669             if( lArtist->isEnabled() )
670                 selectedItems.at(i)->tags->artist = lArtist->text();
671 
672             if( lComposer->isEnabled() )
673                 selectedItems.at(i)->tags->composer = lComposer->text();
674 
675             if( lAlbumArtist->isEnabled() )
676                 selectedItems.at(i)->tags->albumArtist = lAlbumArtist->text();
677 
678             if( lAlbum->isEnabled() )
679                 selectedItems.at(i)->tags->album = lAlbum->text();
680 
681             if( iDisc->isEnabled() )
682                 selectedItems.at(i)->tags->disc = iDisc->value();
683 
684             if( iDiscTotal->isEnabled() )
685                 selectedItems.at(i)->tags->discTotal= iDiscTotal->value();
686 
687             if( iYear->isEnabled() )
688                 selectedItems.at(i)->tags->year = iYear->value();
689 
690             if( cGenre->isEnabled() )
691                 selectedItems.at(i)->tags->genre = cGenre->currentText();
692 
693             if( tComment->isEnabled() )
694                 selectedItems.at(i)->tags->comment = tComment->toPlainText();
695         }
696     }
697 
698     options->accepted();
699 
700     emit updateFileListItems( selectedItems );
701 }
702 
editOptionsClicked()703 void OptionsEditor::editOptionsClicked()
704 {
705     options->setEnabled( true );
706     lEditOptions->hide();
707     pEditOptions->hide();
708 
709     if( selectedItems.count() > 0 && selectedItems.first() )
710     {
711         const ConversionOptions *conversionOptions = config->conversionOptionsManager()->getConversionOptions( selectedItems.first()->conversionOptionsId );
712         if( conversionOptions )
713             options->setCurrentConversionOptions( conversionOptions );
714     }
715 }
716 
editTagsClicked()717 void OptionsEditor::editTagsClicked()
718 {
719     for( int i=0; i<selectedItems.count(); i++ )
720     {
721         selectedItems.at(i)->tags = new TagData();
722     }
723 
724     editTitleClicked();
725     editTrackClicked();
726     editTrackTotalClicked();
727     editArtistClicked();
728     editComposerClicked();
729     editAlbumClicked();
730     editDiscClicked();
731     editDiscTotalClicked();
732     editYearClicked();
733     editGenreClicked();
734     editCommentClicked();
735 }
736 
editTitleClicked()737 void OptionsEditor::editTitleClicked()
738 {
739     lTitle->setEnabled( true );
740     lTitle->setFocus();
741     pTitleEdit->hide();
742 
743     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
744     {
745         lTitle->setText( selectedItems.first()->tags->title );
746     }
747 }
748 
editTrackClicked()749 void OptionsEditor::editTrackClicked()
750 {
751     iTrack->setEnabled( true );
752     iTrack->setFocus();
753     pTrackEdit->hide();
754 
755     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
756     {
757         iTrack->setValue( selectedItems.first()->tags->track );
758     }
759 }
760 
editTrackTotalClicked()761 void OptionsEditor::editTrackTotalClicked()
762 {
763     iTrackTotal->setEnabled( true );
764     iTrackTotal->setFocus();
765     pTrackTotalEdit->hide();
766 
767     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
768     {
769         iTrackTotal->setValue( selectedItems.first()->tags->trackTotal );
770     }
771 }
772 
editArtistClicked()773 void OptionsEditor::editArtistClicked()
774 {
775     lArtist->setEnabled( true );
776     lArtist->setFocus();
777     pArtistEdit->hide();
778 
779     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
780     {
781         lArtist->setText( selectedItems.first()->tags->artist );
782     }
783 }
784 
editComposerClicked()785 void OptionsEditor::editComposerClicked()
786 {
787     lComposer->setEnabled( true );
788     lComposer->setFocus();
789     pComposerEdit->hide();
790 
791     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
792     {
793         lComposer->setText( selectedItems.first()->tags->composer );
794     }
795 }
796 
editAlbumArtistClicked()797 void OptionsEditor::editAlbumArtistClicked()
798 {
799     lAlbumArtist->setEnabled( true );
800     lAlbumArtist->setFocus();
801     pAlbumArtistEdit->hide();
802 
803     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
804     {
805         lAlbumArtist->setText( selectedItems.first()->tags->albumArtist );
806     }
807 }
808 
editAlbumClicked()809 void OptionsEditor::editAlbumClicked()
810 {
811     lAlbum->setEnabled( true );
812     lAlbum->setFocus();
813     pAlbumEdit->hide();
814 
815     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
816     {
817         lAlbum->setText( selectedItems.first()->tags->album );
818     }
819 }
820 
editDiscClicked()821 void OptionsEditor::editDiscClicked()
822 {
823     iDisc->setEnabled( true );
824     iDisc->setFocus();
825     pDiscEdit->hide();
826 
827     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
828     {
829         iDisc->setValue( selectedItems.first()->tags->disc );
830     }
831 }
832 
editDiscTotalClicked()833 void OptionsEditor::editDiscTotalClicked()
834 {
835     iDiscTotal->setEnabled( true );
836     iDiscTotal->setFocus();
837     pDiscTotalEdit->hide();
838 
839     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
840     {
841         iDiscTotal->setValue( selectedItems.first()->tags->discTotal );
842     }
843 }
844 
editYearClicked()845 void OptionsEditor::editYearClicked()
846 {
847     iYear->setEnabled( true );
848     iYear->setFocus();
849     pYearEdit->hide();
850 
851     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
852     {
853         iYear->setValue( selectedItems.first()->tags->year );
854     }
855 }
856 
editGenreClicked()857 void OptionsEditor::editGenreClicked()
858 {
859     cGenre->setEnabled( true );
860     cGenre->setFocus();
861     pGenreEdit->hide();
862 
863     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
864     {
865         cGenre->setCurrentItem( selectedItems.first()->tags->genre );
866     }
867 }
868 
editCommentClicked()869 void OptionsEditor::editCommentClicked()
870 {
871     tComment->setEnabled( true );
872     tComment->setReadOnly( false );
873     tComment->setFocus();
874     pCommentEdit->hide();
875 
876     if( selectedItems.count() > 0 && selectedItems.first() && selectedItems.first()->tags )
877     {
878         tComment->setPlainText( selectedItems.first()->tags->comment );
879     }
880 }
881 
882 
883 
884