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