00001
00002 #include <qdir.h>
00003 #include <qapplication.h>
00004 #include <qfontmetrics.h>
00005
00006
00007 #include <mythtv/mythcontext.h>
00008 #include <mythtv/mythdbcon.h>
00009 #include <mythtv/audiooutput.h>
00010
00011
00012 #include "importmusic.h"
00013 #include "decoder.h"
00014 #include "genres.h"
00015 #include "metadata.h"
00016 #include "directoryfinder.h"
00017 #include "cdrip.h"
00018 #include "editmetadata.h"
00019 #include "musicplayer.h"
00020
00021 static QString truncateFilename(QString filename, UITextType *textType)
00022 {
00023 int width = textType->DisplayArea().width();
00024 QFontMetrics fm(textType->GetFont()->face);
00025 QStringList list = QStringList::split('/', filename);
00026
00027 QString s = filename;
00028 int newWidth = width + 1;
00029
00030 for (uint x = 0; x < filename.length(); x++)
00031 {
00032 if (x != 0)
00033 newWidth = fm.width(QString("...") + s, -1);
00034 else
00035 newWidth = fm.width(s, -1);
00036
00037 if (newWidth < width)
00038 break;
00039
00040 s = s.right(s.length() -1);
00041 }
00042
00043 if (s == filename)
00044 return s;
00045
00046 return QString("...") + s;
00047 }
00048
00049 static bool copyFile(const QString &src, const QString &dst)
00050 {
00051 const int bufferSize = 16*1024;
00052
00053 QFile s(src);
00054 QFile d(dst);
00055 char buffer[bufferSize];
00056 int len;
00057
00058 if (!s.open(IO_ReadOnly))
00059 return false;
00060
00061 if (!d.open(IO_WriteOnly))
00062 {
00063 s.close();
00064 return false;
00065 }
00066
00067 len = s.readBlock(buffer, bufferSize);
00068 do
00069 {
00070 d.writeBlock(buffer, len);
00071 len = s.readBlock(buffer, bufferSize);
00072 } while (len > 0);
00073
00074 s.close();
00075 d.close();
00076
00077 return true;
00078 }
00079
00081
00082 FileScannerThread::FileScannerThread(ImportMusicDialog *parent)
00083 {
00084 m_parent = parent;
00085 }
00086
00087 void FileScannerThread::run()
00088 {
00089 m_parent->doScan();
00090 }
00091
00093
00094
00095 ImportMusicDialog::ImportMusicDialog(MythMainWindow *parent, const char* name)
00096 :MythThemedDialog(parent, "import_music", "music-", name)
00097 {
00098 m_popupMenu = NULL;
00099
00100 m_defaultCompilation = false;
00101 m_defaultCompArtist = "";
00102 m_defaultArtist = "";
00103 m_defaultAlbum = "";
00104 m_defaultGenre = "";
00105 m_defaultYear = 0;
00106 m_defaultRating = 0;
00107 m_haveDefaults = false;
00108
00109 wireUpTheme();
00110 assignFirstFocus();
00111 m_somethingWasImported = false;
00112 m_tracks = new vector<TrackInfo*>;
00113 fillWidgets();
00114 m_location_edit->setText(gContext->GetSetting("MythMusicLastImportDir", "/"));
00115 }
00116
00117 ImportMusicDialog::~ImportMusicDialog()
00118 {
00119 gContext->SaveSetting("MythMusicLastImportDir", m_location_edit->getText());
00120
00121 delete m_tracks;
00122 }
00123
00124 void ImportMusicDialog::fillWidgets()
00125 {
00126 if (m_tracks->size() > 0)
00127 {
00128
00129 m_current_text->SetText(QString("%1 of %2")
00130 .arg(m_currentTrack + 1).arg(m_tracks->size()));
00131
00132 Metadata *meta = m_tracks->at(m_currentTrack)->metadata;
00133 m_filename_text->SetText(truncateFilename(meta->Filename(), m_filename_text));
00134 m_compilation_check->setState(meta->Compilation());
00135 m_compartist_text->SetText(meta->CompilationArtist());
00136 m_artist_text->SetText(meta->Artist());
00137 m_album_text->SetText(meta->Album());
00138 m_title_text->SetText(meta->Title());
00139 m_genre_text->SetText(meta->Genre());
00140 m_year_text->SetText(QString::number(meta->Year()));
00141 m_track_text->SetText(QString::number(meta->Track()));
00142 if (m_tracks->at(m_currentTrack)->isNewTune)
00143 {
00144 m_coverart_button->hide();
00145 m_status_text->SetText(tr("New File"));
00146 }
00147 else
00148 {
00149 m_coverart_button->show();
00150 m_status_text->SetText(tr("All Ready in Database"));
00151 }
00152 }
00153 else
00154 {
00155
00156 m_current_text->SetText(tr("Non found"));
00157 m_filename_text->SetText("");
00158 m_compilation_check->setState(false);
00159 m_compartist_text->SetText("");
00160 m_artist_text->SetText("");
00161 m_album_text->SetText("");
00162 m_title_text->SetText("");
00163 m_genre_text->SetText("");
00164 m_year_text->SetText("");
00165 m_track_text->SetText("");
00166 m_status_text->SetText("");
00167 m_coverart_button->hide();
00168 }
00169
00170 buildFocusList();
00171 }
00172
00173 void ImportMusicDialog::keyPressEvent(QKeyEvent *e)
00174 {
00175 bool handled = false;
00176
00177 QStringList actions;
00178 gContext->GetMainWindow()->TranslateKeyPress("Global", e, actions);
00179
00180 for (unsigned int i = 0; i < actions.size() && !handled; i++)
00181 {
00182 QString action = actions[i];
00183 handled = true;
00184
00185 if (action == "UP")
00186 nextPrevWidgetFocus(false);
00187 else if (action == "DOWN")
00188 nextPrevWidgetFocus(true);
00189 else if (action == "LEFT")
00190 {
00191 m_prev_button->push();
00192 }
00193 else if (action == "RIGHT")
00194 {
00195 m_next_button->push();
00196 }
00197 else if (action == "SELECT")
00198 {
00199 if (getCurrentFocusWidget() != m_compilation_check)
00200 activateCurrent();
00201 }
00202 else if (action == "INFO")
00203 {
00204 showEditMetadataDialog();
00205 }
00206 else if (action == "MENU")
00207 {
00208 showMenu();
00209 }
00210 else if (action == "1")
00211 {
00212 setCompilation();
00213 }
00214 else if (action == "2")
00215 {
00216 setCompilationArtist();
00217 }
00218 else if (action == "3")
00219 {
00220 setArtist();
00221 }
00222 else if (action == "4")
00223 {
00224 setAlbum();
00225 }
00226 else if (action == "5")
00227 {
00228 setGenre();
00229 }
00230 else if (action == "6")
00231 {
00232 setYear();
00233 }
00234 else if (action == "7")
00235 {
00236 setRating();
00237 }
00238 else if (action == "8")
00239 {
00240 setTitleWordCaps();
00241 }
00242 else if (action == "9")
00243 {
00244 setTitleInitialCap();
00245 }
00246 else if (action == "0")
00247 {
00248 if (m_tracks->size() > 0 && !m_tracks->at(m_currentTrack)->isNewTune)
00249 showImportCoverArtDialog();
00250 }
00251 else
00252 handled = false;
00253 }
00254
00255 if (!handled)
00256 MythThemedDialog::keyPressEvent(e);
00257 }
00258
00259 void ImportMusicDialog::wireUpTheme()
00260 {
00261 m_location_edit = getUIRemoteEditType("location_edit");
00262 if (m_location_edit)
00263 {
00264 m_location_edit->createEdit(this);
00265
00266 }
00267
00268 m_location_button = getUIPushButtonType("location_button");
00269 if (m_location_button)
00270 {
00271 connect(m_location_button, SIGNAL(pushed()), this, SLOT(locationPressed()));
00272 }
00273
00274 m_scan_button = getUITextButtonType("scan_button");
00275 if (m_scan_button)
00276 {
00277 m_scan_button->setText(tr("Search"));
00278 connect(m_scan_button, SIGNAL(pushed()), this, SLOT(scanPressed()));
00279 }
00280
00281 m_coverart_button = getUITextButtonType("coverart_button");
00282 if (m_coverart_button)
00283 {
00284 m_coverart_button->setText(tr("Cover Art"));
00285 connect(m_coverart_button, SIGNAL(pushed()), this, SLOT(coverArtPressed()));
00286 }
00287
00288 m_filename_text = getUITextType("filename_text");
00289 m_compartist_text = getUITextType("compartist_text");
00290 m_artist_text = getUITextType("artist_text");
00291 m_album_text = getUITextType("album_text");
00292 m_title_text = getUITextType("title_text");
00293 m_genre_text = getUITextType("genre_text");
00294 m_year_text = getUITextType("year_text");
00295 m_track_text = getUITextType("track_text");
00296 m_current_text = getUITextType("current_text");
00297 m_status_text = getUITextType("status_text");
00298
00299 m_compilation_check = getUICheckBoxType("compilation_check");
00300
00301 m_play_button = getUITextButtonType("play_button");
00302 if (m_play_button)
00303 {
00304 m_play_button->setText(tr("Play"));
00305 connect(m_play_button, SIGNAL(pushed()), this, SLOT(playPressed()));
00306 }
00307
00308 m_nextnew_button = getUITextButtonType("nextnew_button");
00309 if (m_nextnew_button)
00310 {
00311 m_nextnew_button->setText(tr("Next New"));
00312 connect(m_nextnew_button, SIGNAL(pushed()), this, SLOT(nextNewPressed()));
00313 }
00314
00315 m_add_button = getUITextButtonType("add_button");
00316 if (m_add_button)
00317 {
00318 m_add_button->setText(tr("Add"));
00319 connect(m_add_button, SIGNAL(pushed()), this, SLOT(addPressed()));
00320 }
00321
00322 m_addallnew_button = getUITextButtonType("addallnew_button");
00323 if (m_addallnew_button)
00324 {
00325 m_addallnew_button->setText(tr("Add All New"));
00326 connect(m_addallnew_button, SIGNAL(pushed()), this, SLOT(addAllNewPressed()));
00327 }
00328
00329 m_next_button = getUIPushButtonType("next_button");
00330 if (m_next_button)
00331 {
00332 connect(m_next_button, SIGNAL(pushed()), this, SLOT(nextPressed()));
00333 }
00334
00335 m_prev_button = getUIPushButtonType("prev_button");
00336 if (m_prev_button)
00337 {
00338 connect(m_prev_button, SIGNAL(pushed()), this, SLOT(prevPressed()));
00339 }
00340
00341 buildFocusList();
00342 }
00343
00344 void ImportMusicDialog::locationPressed()
00345 {
00346 DirectoryFinder finder(m_location_edit->getText(),
00347 gContext->GetMainWindow(), "directory finder");
00348 DialogCode res = finder.exec();
00349
00350 if (kDialogCodeRejected != res)
00351 {
00352 m_location_edit->setText(finder.getSelected());
00353 editLostFocus();
00354 }
00355 }
00356
00357 void ImportMusicDialog::coverArtPressed()
00358 {
00359 showImportCoverArtDialog();
00360 }
00361
00362 void ImportMusicDialog::playPressed()
00363 {
00364 if (m_tracks->size() == 0)
00365 return;
00366
00367 Metadata *meta = m_tracks->at(m_currentTrack)->metadata;
00368
00369 gPlayer->playFile(*meta);
00370 }
00371
00372 void ImportMusicDialog::prevPressed()
00373 {
00374 if (m_currentTrack > 0)
00375 {
00376 m_currentTrack--;
00377 fillWidgets();
00378 }
00379 }
00380
00381 void ImportMusicDialog::nextPressed()
00382 {
00383 if (m_currentTrack < (int) m_tracks->size() - 1)
00384 {
00385 m_currentTrack++;
00386 fillWidgets();
00387 }
00388 }
00389
00390 void ImportMusicDialog::addPressed()
00391 {
00392 if (m_tracks->size() == 0)
00393 return;
00394
00395 Metadata *meta = m_tracks->at(m_currentTrack)->metadata;
00396
00397
00398 if (m_tracks->at(m_currentTrack)->isNewTune)
00399 {
00400
00401 QString saveFilename = Ripper::filenameFromMetadata(meta);
00402
00403
00404 QFileInfo fi(meta->Filename());
00405 saveFilename += "." + fi.extension(false);
00406
00407
00408 if (!copyFile(meta->Filename(), saveFilename))
00409 {
00410 MythPopupBox::showOkPopup(gContext->GetMainWindow(), tr("Copy Failed"),
00411 tr("Could not copy file to:") + saveFilename);
00412 return;
00413 }
00414
00415 meta->setFilename(saveFilename);
00416
00417
00418 if (m_tracks->at(m_currentTrack)->metadataHasChanged)
00419 {
00420 Decoder *decoder = Decoder::create(saveFilename, NULL, NULL, true);
00421 if (decoder)
00422 {
00423 decoder->commitMetadata(meta);
00424 delete decoder;
00425 }
00426 }
00427
00428
00429 meta->dumpToDatabase();
00430 m_somethingWasImported = true;
00431
00432 m_tracks->at(m_currentTrack)->isNewTune = Ripper::isNewTune(
00433 meta->Artist(), meta->Album(), meta->Title());
00434
00435
00436 fillWidgets();
00437 }
00438 else
00439 {
00440 MythPopupBox::showOkPopup(gContext->GetMainWindow(), tr("Duplicate Track"),
00441 tr("This track is already in the database"));
00442 }
00443 }
00444
00445 void ImportMusicDialog::addAllNewPressed()
00446 {
00447 if (m_tracks->size() == 0)
00448 return;
00449
00450 m_currentTrack = 0;
00451 int newCount = 0;
00452
00453 while (m_currentTrack < (int) m_tracks->size())
00454 {
00455 fillWidgets();
00456 qApp->processEvents();
00457
00458 if (m_tracks->at(m_currentTrack)->isNewTune)
00459 {
00460 addPressed();
00461 newCount++;
00462 }
00463
00464 qApp->processEvents();
00465
00466 m_currentTrack++;
00467 }
00468
00469 m_currentTrack--;
00470
00471 MythPopupBox::showOkPopup(gContext->GetMainWindow(), tr("Add Tracks"),
00472 tr("%1 new tracks were added to the database").arg(newCount));
00473 }
00474
00475 void ImportMusicDialog::nextNewPressed()
00476 {
00477 if (m_tracks->size() == 0)
00478 return;
00479
00480 uint track = m_currentTrack + 1;
00481 while (track < m_tracks->size())
00482 {
00483 if (m_tracks->at(track)->isNewTune)
00484 {
00485 m_currentTrack = track;
00486 fillWidgets();
00487 break;
00488 }
00489 track++;
00490 }
00491 }
00492
00493 void ImportMusicDialog::scanPressed()
00494 {
00495 startScan();
00496 }
00497
00498 void ImportMusicDialog::editLostFocus()
00499 {
00500 startScan();
00501 }
00502
00503 void ImportMusicDialog::startScan()
00504 {
00505 MythBusyDialog *busy = new MythBusyDialog(QObject::tr("Searching for music files"));
00506
00507 FileScannerThread *scanner = new FileScannerThread(this);
00508 busy->start();
00509 scanner->start();
00510
00511 while (!scanner->finished())
00512 {
00513 usleep(500);
00514 qApp->processEvents();
00515 }
00516
00517 delete scanner;
00518
00519 m_currentTrack = 0;
00520 fillWidgets();
00521
00522 busy->close();
00523 busy->deleteLater();
00524 }
00525
00526 void ImportMusicDialog::doScan()
00527 {
00528 m_tracks->clear();
00529 m_sourceFiles.clear();
00530 QString location = m_location_edit->getText();
00531 scanDirectory(location, m_tracks);
00532 }
00533
00534 void ImportMusicDialog::scanDirectory(QString &directory, vector<TrackInfo*> *tracks)
00535 {
00536 QDir d(directory);
00537
00538 if (!d.exists())
00539 return;
00540
00541 const QFileInfoList *list = d.entryInfoList();
00542 if (!list)
00543 return;
00544
00545 QFileInfoListIterator it(*list);
00546 QFileInfo *fi;
00547
00548 while ((fi = it.current()) != 0)
00549 {
00550 ++it;
00551 if (fi->fileName() == "." || fi->fileName() == "..")
00552 continue;
00553 QString filename = fi->absFilePath();
00554 if (fi->isDir())
00555 scanDirectory(filename, tracks);
00556 else
00557 {
00558 Decoder *decoder = Decoder::create(filename, NULL, NULL, true);
00559 if (decoder)
00560 {
00561 Metadata *metadata = decoder->getMetadata();
00562 if (metadata)
00563 {
00564 TrackInfo * track = new TrackInfo;
00565 track->metadata = metadata;
00566 track->isNewTune = Ripper::isNewTune(metadata->Artist(),
00567 metadata->Album(), metadata->Title());
00568 track->metadataHasChanged = false;
00569 tracks->push_back(track);
00570 m_sourceFiles.append(filename);
00571 }
00572
00573 delete decoder;
00574 }
00575 }
00576 }
00577 }
00578
00579 void ImportMusicDialog::showEditMetadataDialog()
00580 {
00581 if (m_tracks->size() == 0)
00582 return;
00583
00584 Metadata *editMeta = m_tracks->at(m_currentTrack)->metadata;
00585
00586 EditMetadataDialog editDialog(editMeta, gContext->GetMainWindow(),
00587 "edit_metadata", "music-", "edit metadata");
00588 editDialog.setSaveMetadataOnly();
00589
00590 if (kDialogCodeRejected != editDialog.exec())
00591 {
00592 m_tracks->at(m_currentTrack)->metadataHasChanged = true;
00593 m_tracks->at(m_currentTrack)->isNewTune = Ripper::isNewTune(
00594 editMeta->Artist(), editMeta->Album(), editMeta->Title());
00595 fillWidgets();
00596 }
00597 }
00598
00599 void ImportMusicDialog::showMenu()
00600 {
00601 if (m_popupMenu)
00602 return;
00603
00604 if (m_tracks->size() == 0)
00605 return;
00606
00607 m_popupMenu = new MythPopupBox(gContext->GetMainWindow(),
00608 "menu");
00609
00610 QButton *button = m_popupMenu->addButton(tr("Save Defaults"), this,
00611 SLOT(saveDefaults()));
00612
00613 QLabel *splitter = m_popupMenu->addLabel(" ", MythPopupBox::Small);
00614 splitter->setLineWidth(2);
00615 splitter->setFrameShape(QFrame::HLine);
00616 splitter->setFrameShadow(QFrame::Sunken);
00617 splitter->setMaximumHeight((int) (5 * hmult));
00618 splitter->setMaximumHeight((int) (5 * hmult));
00619
00620 if (m_haveDefaults)
00621 {
00622 m_popupMenu->addButton(tr("Change Compilation Flag"), this,
00623 SLOT(setCompilation()));
00624 m_popupMenu->addButton(tr("Change Compilation Artist"), this,
00625 SLOT(setCompilationArtist()));
00626 m_popupMenu->addButton(tr("Change Artist"), this,
00627 SLOT(setArtist()));
00628 m_popupMenu->addButton(tr("Change Album"), this,
00629 SLOT(setAlbum()));
00630 m_popupMenu->addButton(tr("Change Genre"), this,
00631 SLOT(setGenre()));
00632 m_popupMenu->addButton(tr("Change Year"), this,
00633 SLOT(setYear()));
00634 m_popupMenu->addButton(tr("Change Rating"), this,
00635 SLOT(setRating()));
00636 }
00637
00638 m_popupMenu->addButton(tr("Cancel"), this,
00639 SLOT(closeMenu()));
00640
00641 m_popupMenu->ShowPopup(this, SLOT(closeMenu()));
00642
00643 button->setFocus();
00644 }
00645
00646 void ImportMusicDialog::closeMenu()
00647 {
00648 if (!m_popupMenu)
00649 return;
00650
00651 m_popupMenu->hide();
00652 m_popupMenu->deleteLater();
00653 m_popupMenu = NULL;
00654 }
00655
00656 void ImportMusicDialog::saveDefaults(void)
00657 {
00658 closeMenu();
00659
00660 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00661 m_defaultCompilation = data->Compilation();
00662 m_defaultCompArtist = data->CompilationArtist();
00663 m_defaultArtist = data->Artist();
00664 m_defaultAlbum = data->Album();
00665 m_defaultGenre = data->Genre();
00666 m_defaultYear = data->Year();
00667 m_defaultRating = data->Rating();
00668
00669 m_haveDefaults = true;
00670 }
00671
00672 void ImportMusicDialog::setCompilation(void)
00673 {
00674 closeMenu();
00675
00676 if (!m_haveDefaults)
00677 return;
00678
00679 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00680
00681 if (m_defaultCompilation)
00682 {
00683 data->setCompilation(m_defaultCompilation);
00684 data->setCompilationArtist(m_defaultCompArtist);
00685 }
00686 else
00687 {
00688 data->setCompilation(m_defaultCompilation);
00689 data->setCompilationArtist(m_defaultArtist);
00690 }
00691
00692 fillWidgets();
00693 }
00694
00695 void ImportMusicDialog::setCompilationArtist(void)
00696 {
00697 closeMenu();
00698
00699 if (!m_haveDefaults)
00700 return;
00701
00702 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00703 data->setCompilationArtist(m_defaultCompArtist);
00704
00705 fillWidgets();
00706 }
00707
00708 void ImportMusicDialog::setArtist(void)
00709 {
00710 closeMenu();
00711
00712 if (!m_haveDefaults)
00713 return;
00714
00715 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00716 data->setArtist(m_defaultArtist);
00717
00718 m_tracks->at(m_currentTrack)->isNewTune = Ripper::isNewTune(
00719 data->Artist(), data->Album(), data->Title());
00720
00721 fillWidgets();
00722 }
00723
00724 void ImportMusicDialog::setAlbum(void)
00725 {
00726 closeMenu();
00727
00728 if (!m_haveDefaults)
00729 return;
00730
00731 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00732 data->setAlbum(m_defaultAlbum);
00733
00734 m_tracks->at(m_currentTrack)->isNewTune = Ripper::isNewTune(
00735 data->Artist(), data->Album(), data->Title());
00736
00737 fillWidgets();
00738 }
00739
00740 void ImportMusicDialog::setYear(void)
00741 {
00742 closeMenu();
00743
00744 if (!m_haveDefaults)
00745 return;
00746
00747 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00748 data->setYear(m_defaultYear);
00749
00750 fillWidgets();
00751 }
00752
00753 void ImportMusicDialog::setGenre(void)
00754 {
00755 closeMenu();
00756
00757 if (!m_haveDefaults)
00758 return;
00759
00760 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00761 data->setGenre(m_defaultGenre);
00762
00763 fillWidgets();
00764 }
00765
00766 void ImportMusicDialog::setRating(void)
00767 {
00768 closeMenu();
00769
00770 if (!m_haveDefaults)
00771 return;
00772
00773 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00774 data->setRating(m_defaultRating);
00775 }
00776
00777 void ImportMusicDialog::setTitleInitialCap(void)
00778 {
00779 closeMenu();
00780
00781 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00782 QString title = data->Title();
00783 bool bFoundCap = false;
00784
00785 for (uint x = 0; x < title.length(); x++)
00786 {
00787 if (title[x].isLetter())
00788 {
00789 if (bFoundCap == false)
00790 {
00791 title[x] = title[x].upper();
00792 bFoundCap = true;
00793 }
00794 else
00795 title[x] = title[x].lower();
00796 }
00797 }
00798
00799 data->setTitle(title);
00800 fillWidgets();
00801 }
00802
00803 void ImportMusicDialog::setTitleWordCaps(void)
00804 {
00805 closeMenu();
00806 Metadata *data = m_tracks->at(m_currentTrack)->metadata;
00807 QString title = data->Title();
00808 bool bInWord = false;
00809
00810 for (uint x = 0; x < title.length(); x++)
00811 {
00812 if (title[x].isSpace())
00813 bInWord = false;
00814 else
00815 {
00816 if (title[x].isLetter())
00817 {
00818 if (!bInWord)
00819 {
00820 title[x] = title[x].upper();
00821 bInWord = true;
00822 }
00823 else
00824 title[x] = title[x].lower();
00825 }
00826 }
00827 }
00828
00829 data->setTitle(title);
00830 fillWidgets();
00831 }
00832
00833 void ImportMusicDialog::showImportCoverArtDialog(void)
00834 {
00835 if (m_tracks->size() == 0)
00836 return;
00837
00838 QFileInfo fi(*m_sourceFiles.at(m_currentTrack));
00839
00840 ImportCoverArtDialog dialog(fi.dirPath(true), m_tracks->at(m_currentTrack)->metadata,
00841 gContext->GetMainWindow(), "import_coverart");
00842 dialog.exec();
00843 }
00844
00846
00847 ImportCoverArtDialog::ImportCoverArtDialog(const QString &sourceDir, Metadata *metadata,
00848 MythMainWindow *parent, const char* name)
00849 :MythThemedDialog(parent, "import_coverart", "music-", name)
00850 {
00851 m_sourceDir = sourceDir;
00852 m_metadata = metadata;
00853
00854 wireUpTheme();
00855 assignFirstFocus();
00856 scanDirectory();
00857 }
00858
00859 ImportCoverArtDialog::~ImportCoverArtDialog()
00860 {
00861
00862 }
00863
00864 void ImportCoverArtDialog::keyPressEvent(QKeyEvent *e)
00865 {
00866 bool handled = false;
00867
00868 QStringList actions;
00869 gContext->GetMainWindow()->TranslateKeyPress("Global", e, actions);
00870
00871 for (unsigned int i = 0; i < actions.size() && !handled; i++)
00872 {
00873 QString action = actions[i];
00874 handled = true;
00875
00876 if (action == "UP")
00877 nextPrevWidgetFocus(false);
00878 else if (action == "DOWN")
00879 nextPrevWidgetFocus(true);
00880 else if (action == "LEFT")
00881 {
00882 if (getCurrentFocusWidget() == m_type_selector)
00883 m_type_selector->push(false);
00884 else
00885 m_prev_button->push();
00886 }
00887 else if (action == "RIGHT")
00888 {
00889 if (getCurrentFocusWidget() == m_type_selector)
00890 m_type_selector->push(true);
00891 else
00892 m_next_button->push();
00893 }
00894 else if (action == "SELECT")
00895 {
00896 activateCurrent();
00897 }
00898 else
00899 handled = false;
00900 }
00901
00902 if (!handled)
00903 MythThemedDialog::keyPressEvent(e);
00904 }
00905
00906 void ImportCoverArtDialog::wireUpTheme()
00907 {
00908 m_filename_text = getUITextType("file_text");
00909 m_current_text = getUITextType("current_text");
00910 m_status_text = getUITextType("status_text");
00911 m_destination_text = getUITextType("destination_text");
00912
00913 m_coverart_image = getUIImageType("coverart_image");
00914
00915 m_copy_button = getUITextButtonType("copy_button");
00916 if (m_copy_button)
00917 {
00918 m_copy_button->setText(tr("Copy"));
00919 connect(m_copy_button, SIGNAL(pushed()), this, SLOT(copyPressed()));
00920 }
00921
00922 m_exit_button = getUITextButtonType("exit_button");
00923 if (m_exit_button)
00924 {
00925 m_exit_button->setText(tr("Exit"));
00926 connect(m_exit_button, SIGNAL(pushed()), this, SLOT(reject()));
00927 }
00928
00929 m_prev_button = getUIPushButtonType("prev_button");
00930 if (m_prev_button)
00931 {
00932 connect(m_prev_button, SIGNAL(pushed()), this, SLOT(prevPressed()));
00933 }
00934
00935 m_next_button = getUIPushButtonType("next_button");
00936 if (m_next_button)
00937 {
00938 connect(m_next_button, SIGNAL(pushed()), this, SLOT(nextPressed()));
00939 }
00940
00941 m_type_selector = getUISelectorType("type_selector");
00942 if (m_type_selector)
00943 {
00944 m_type_selector->addItem(0, tr("Front Cover"));
00945 m_type_selector->addItem(1, tr("Back Cover"));
00946 m_type_selector->addItem(2, tr("CD"));
00947 m_type_selector->addItem(3, tr("Inlay"));
00948 m_type_selector->addItem(4, tr("<Unknown>"));
00949 m_type_selector->setToItem(0);
00950
00951 connect(m_type_selector, SIGNAL(pushed(int)), this, SLOT(selectorChanged(int)));
00952 }
00953 }
00954
00955 void ImportCoverArtDialog::selectorChanged(int item)
00956 {
00957 (void) item;
00958 updateStatus();
00959 }
00960
00961 void ImportCoverArtDialog::copyPressed()
00962 {
00963 if (m_filelist.size() > 0)
00964 {
00965 copyFile(m_filelist[m_currentFile], m_saveFilename);
00966 updateStatus();
00967 }
00968 }
00969
00970 void ImportCoverArtDialog::prevPressed()
00971 {
00972 if (m_currentFile > 0)
00973 {
00974 m_currentFile--;
00975 updateTypeSelector();
00976 updateStatus();
00977 }
00978 }
00979
00980 void ImportCoverArtDialog::nextPressed()
00981 {
00982 if (m_currentFile < (int) m_filelist.size() - 1)
00983 {
00984 m_currentFile++;
00985 updateTypeSelector();
00986 updateStatus();
00987 }
00988 }
00989
00990 void ImportCoverArtDialog::scanDirectory()
00991 {
00992 QDir d(m_sourceDir);
00993
00994 if (!d.exists())
00995 return;
00996
00997 QString nameFilter = gContext->GetSetting("AlbumArtFilter",
00998 "*.png;*.jpg;*.jpeg;*.gif;*.bmp");
00999
01000 const QFileInfoList *list = d.entryInfoList(nameFilter);
01001 if (!list)
01002 return;
01003
01004 QFileInfoListIterator it(*list);
01005 QFileInfo *fi;
01006
01007 while ((fi = it.current()) != 0)
01008 {
01009 ++it;
01010 if (fi->fileName() == "." || fi->fileName() == "..")
01011 continue;
01012 QString filename = fi->absFilePath();
01013 if (!fi->isDir())
01014 {
01015 m_filelist.append(filename);
01016 }
01017 }
01018
01019 m_currentFile = 0;
01020 updateTypeSelector();
01021 updateStatus();
01022 }
01023
01024 void ImportCoverArtDialog::updateStatus()
01025 {
01026 if (m_filelist.size() > 0)
01027 {
01028 m_current_text->SetText(QString("%1 of %2").arg(m_currentFile + 1).arg(m_filelist.size()));
01029 m_filename_text->SetText(truncateFilename(m_filelist[m_currentFile], m_filename_text));
01030 m_coverart_image->SetImage(m_filelist[m_currentFile]);
01031 m_coverart_image->LoadImage();
01032
01033 QString saveFilename = Ripper::filenameFromMetadata(m_metadata, false);
01034 QFileInfo fi(saveFilename);
01035 QString saveDir = fi.dirPath(true);
01036
01037 fi.setFile(m_filelist[m_currentFile]);
01038 switch (m_type_selector->getCurrentInt())
01039 {
01040 case 0:
01041 saveFilename = "front." + fi.extension(false);
01042 break;
01043 case 1:
01044 saveFilename = "back." + fi.extension(false);
01045 break;
01046 case 2:
01047 saveFilename = "cd." + fi.extension(false);
01048 break;
01049 case 3:
01050 saveFilename = "inlay." + fi.extension(false);
01051 break;
01052 default:
01053 saveFilename = fi.fileName();
01054 }
01055
01056 m_saveFilename = saveDir + "/" + saveFilename;
01057 m_destination_text->SetText(truncateFilename(m_saveFilename, m_destination_text));
01058
01059 if (QFile::exists(m_saveFilename))
01060 m_status_text->SetText(tr("File Already Exists"));
01061 else
01062 m_status_text->SetText(tr("New File"));
01063 }
01064 else
01065 {
01066 m_current_text->SetText(tr("Non Found"));
01067 m_status_text->SetText("");
01068 m_filename_text->SetText("");
01069 m_coverart_image->SetImage("mm_trans_background.png");
01070 m_coverart_image->LoadImage();
01071 m_destination_text->SetText("");
01072 }
01073 }
01074
01075 void ImportCoverArtDialog::updateTypeSelector()
01076 {
01077 if (m_filelist.size() == 0)
01078 return;
01079
01080 QString filename = m_filelist[m_currentFile];
01081 QFileInfo fi(filename);
01082 filename = fi.fileName();
01083
01084 if (filename.contains("front", false) > 0)
01085 m_type_selector->setToItem(tr("Front Cover"));
01086 else if (filename.contains("back", false) > 0)
01087 m_type_selector->setToItem(tr("Back Cover"));
01088 else if (filename.contains("inlay", false) > 0)
01089 m_type_selector->setToItem(tr("Inlay"));
01090 else if (filename.contains("cd", false) > 0)
01091 m_type_selector->setToItem(tr("CD"));
01092 else
01093 m_type_selector->setToItem(tr("<Unknown>"));
01094 }