ScanWidget* MainWidget::createScan( const QString& scanName, const bool useTargetHost, const QString& profileName ) { ScanWidget* scanWidget = new ScanWidget( scanName, useTargetHost, this, "scan widget" ); m_scanStack->appendAndRaiseWidget( scanWidget ); m_scanStack->wrapText( m_wrapText ); if( profileName == QString::null ) scanWidget->readSettings( ); else scanWidget->setProfileName( profileName ); connect( scanWidget, SIGNAL( displayHelp( const QString& )), SLOT( slotDisplayHelp( const QString& ))); connect( scanWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( scanWidget, SIGNAL( outputAvailable( const bool, const bool )), SIGNAL( outputAvailable( const bool, const bool ))); connect( scanWidget, SIGNAL( scanRename( const QString& )), SLOT( slotScanRename( const QString& ))); connect( scanWidget, SIGNAL( scanStarted( )), m_indexWidget, SLOT( slotScanStarted( ))); connect( scanWidget, SIGNAL( scanStopped( ScanWidget* )), m_indexWidget, SLOT( slotScanStopped( ScanWidget* ))); connect( scanWidget, SIGNAL( statusBarText( const QString& )), SIGNAL( statusBarText( const QString& ))); return scanWidget; }
LibraryScanner::LibraryScanner(QWidget* pParentWidget, TrackCollection* collection) : m_pCollection(collection), m_libraryHashDao(m_database), m_cueDao(m_database), m_playlistDao(m_database), m_crateDao(m_database), m_directoryDao(m_database), m_analysisDao(m_database, collection->getConfig()), m_trackDao(m_database, m_cueDao, m_playlistDao, m_crateDao, m_analysisDao, m_libraryHashDao, collection->getConfig()) { // Don't initialize m_database here, we need to do it in run() so the DB // conn is in the right thread. qDebug() << "Starting LibraryScanner thread."; // Move LibraryScanner to its own thread so that our signals/slots will // queue to our event loop. moveToThread(this); m_pool.moveToThread(this); unsigned static id = 0; // the id of this LibraryScanner, for debugging purposes setObjectName(QString("LibraryScanner %1").arg(++id)); m_pool.setMaxThreadCount(kScannerThreadPoolSize); // Listen to signals from our public methods (invoked by other threads) and // connect them to our slots to run the command on the scanner thread. connect(this, SIGNAL(startScan()), this, SLOT(slotStartScan())); // Force the GUI thread's TrackInfoObject cache to be cleared when a library // scan is finished, because we might have modified the database directly // when we detected moved files, and the TIOs corresponding to the moved // files would then have the wrong track location. connect(this, SIGNAL(scanFinished()), &(collection->getTrackDAO()), SLOT(clearCache())); connect(this, SIGNAL(trackAdded(TrackPointer)), &(collection->getTrackDAO()), SLOT(databaseTrackAdded(TrackPointer))); connect(this, SIGNAL(tracksMoved(QSet<int>, QSet<int>)), &(collection->getTrackDAO()), SLOT(databaseTracksMoved(QSet<int>, QSet<int>))); connect(this, SIGNAL(tracksChanged(QSet<int>)), &(collection->getTrackDAO()), SLOT(databaseTracksChanged(QSet<int>))); // Parented to pParentWidget so we don't need to delete it. LibraryScannerDlg* pProgress = new LibraryScannerDlg(pParentWidget); connect(this, SIGNAL(progressLoading(QString)), pProgress, SLOT(slotUpdate(QString))); connect(this, SIGNAL(progressHashing(QString)), pProgress, SLOT(slotUpdate(QString))); connect(this, SIGNAL(scanStarted()), pProgress, SLOT(slotScanStarted())); connect(this, SIGNAL(scanFinished()), pProgress, SLOT(slotScanFinished())); connect(pProgress, SIGNAL(scanCancelled()), this, SLOT(cancel())); connect(&m_trackDao, SIGNAL(progressVerifyTracksOutside(QString)), pProgress, SLOT(slotUpdate(QString))); connect(&m_trackDao, SIGNAL(progressCoverArt(QString)), pProgress, SLOT(slotUpdateCover(QString))); start(); }