collectionbrowser.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,829 行 · 第 1/5 页
CPP
1,829 行
menu.insertSeparator(); KPopupMenu fileMenu; fileMenu.insertItem( SmallIconSet( "filesaveas" ), i18n( "&Organize File..." , "&Organize %n Files..." , selection.count() ) , ORGANIZE ); fileMenu.insertItem( SmallIconSet( Amarok::icon( "remove" ) ), i18n( "&Delete File..." , "&Delete %n Files..." , selection.count() ) , DELETE ); menu.insertItem( SmallIconSet( Amarok::icon( "files" ) ), i18n( "Manage &Files" ), &fileMenu, FILE_MENU ); if( (cat == IdAlbum || cat == IdVisYearAlbum) && siblingSelection.count() == 1 ) // cover fetch isn't multiselection capable { menu.insertItem( SmallIconSet( Amarok::icon( "download" ) ), i18n( "&Fetch Cover From amazon.%1" ).arg( CoverManager::amazonTld() ), this, SLOT( fetchCover() ), 0, FETCH ); #ifndef AMAZON_SUPPORT menu.setItemEnabled( FETCH, false ); #endif if( trueItemText.isEmpty() ) // disable cover fetch for unknown albums menu.setItemEnabled( FETCH, false ); } if ( ( (cat == IdAlbum || cat == IdVisYearAlbum) && siblingSelection.count() > 0 ) //album || ( !item->isExpandable() && m_viewMode == modeTreeView ) ) //or track { menu.insertSeparator(); menu.insertItem( SmallIconSet( "ok" ), i18n( "Show under &Various Artists" ), COMPILATION_SET ); menu.insertItem( SmallIconSet( "cancel" ), i18n( "&Do not Show under Various Artists" ), COMPILATION_UNSET ); } menu.insertSeparator(); menu.insertItem( SmallIconSet( Amarok::icon( "info" ) ) , i18n( "Edit Track &Information...", "Edit &Information for %n Tracks...", selection.count()) , this, SLOT( showTrackInfo() ), 0, INFO ); switch( menu.exec( point ) ) { case APPEND: Playlist::instance()->insertMedia( selection, Playlist::Append ); break; case MAKE: Playlist::instance()->insertMedia( selection, Playlist::Replace ); break; case SAVE: playlistFromURLs( selection ); break; case QUEUE: Playlist::instance()->insertMedia( selection, Playlist::Queue ); break; case MEDIA_DEVICE: MediaBrowser::queue()->addURLs( selection ); break; case BURN_COMPOSER: K3bExporter::instance()->exportComposer( trueItemText ); break; case BURN_ARTIST: K3bExporter::instance()->exportArtist( trueItemText ); break; case BURN_ALBUM: if( artistLevel == -1 || static_cast<CollectionItem *>(item)->isSampler() ) { K3bExporter::instance()->exportAlbum( trueItemText ); } else { QString artist; if( item->depth() - artistLevel == 1 ) artist = item->parent()->text( 0 ); else if( item->depth() - artistLevel == 2 ) artist = item->parent()->parent()->text( 0 ); else if( item->depth() - artistLevel == 3 ) artist = item->parent()->parent()->parent()->text( 0 ); K3bExporter::instance()->exportAlbum( artist, trueItemText ); } break; case BURN_CD: K3bExporter::instance()->exportTracks( selection ); break; case COMPILATION_SET: setCompilation( selection, true ); break; case COMPILATION_UNSET: setCompilation( selection, false ); break; case ORGANIZE: organizeFiles( selection, i18n( "Organize Collection Files" ), false /* do not add to collection, just move */ ); break; case DELETE: if ( DeleteDialog::showTrashDialog(this, selection) ) { CollectionDB::instance()->removeSongs( selection ); foreachType( KURL::List, selection ) CollectionDB::instance()->emitFileDeleted( (*it).path() ); } m_dirty = true; QTimer::singleShot( 0, CollectionView::instance(), SLOT( renderView() ) ); break; } }}voidCollectionView::setViewMode( int mode, bool rerender /*=true*/ ){ if( m_viewMode == modeFlatView ) { m_flatColumnWidths.clear(); for ( int c = 0; c < columns(); ++c ) m_flatColumnWidths.push_back( columnWidth( c ) ); } m_viewMode = mode; clear(); updateColumnHeader(); if( m_viewMode == modeIpodView ) { #if KDE_VERSION >= KDE_MAKE_VERSION(3,4,0) setShadeSortColumn( false ); #endif m_parent->m_ipodDecrement->setEnabled( m_currentDepth > 0 ); m_parent->ipodToolbar( true ); } else { #if KDE_VERSION >= KDE_MAKE_VERSION(3,4,0) setShadeSortColumn( true ); #endif m_parent->ipodToolbar( false ); } if ( rerender ) { // Pretend we just incremented the view depth so that // renderView() will call selectIpodItems() if( m_viewMode == modeIpodView ) m_ipodIncremented = 1; renderView( true ); }}voidCollectionItem::setPixmap(int column, const QPixmap & pix){ //Don't show the cover if the album isn't expanded (for speed) if ( !isOpen() ) { QListViewItem::setPixmap( column, pix ); return; } //Generate Album name QString album( text( 0 ) ), artist; if ( m_cat == IdVisYearAlbum ) { QString pointlessString; CollectionView::yearAlbumCalc( pointlessString, album ); } else if ( m_cat != IdAlbum ) { QListViewItem::setPixmap( column, pix ); return; } //Now m_cat is either IdAlbum or IdVisYearAlbum, and so this is an album as required. //Now work out the artist CollectionItem *p = this; while ( p->parent() && dynamic_cast<CollectionItem*>( p->parent() ) ) { p = static_cast<CollectionItem*>( p->parent() ); if ( IdArtist == p->m_cat ) { artist = p->text( 0 ); break; } } if ( artist.isNull() ) { //Try to guess artist - this will only happen if you don't have an Artist category //above the Album category in the tree QueryBuilder qb; qb.addReturnValue( QueryBuilder::tabArtist, QueryBuilder::valName ); qb.addMatch( QueryBuilder::tabAlbum, QueryBuilder::valName, album ); QStringList values( qb.run() ); if ( !values.isEmpty() ) artist = values[ 0 ]; else { //Don't bother trying to create a shadow because it won't work anyway. The //nocover image has intial transparency, so adding the shadow doesn't work. QListViewItem::setPixmap( column, QPixmap( CollectionDB::instance()->notAvailCover( false, 50 ) ) ); return; } } QListViewItem::setPixmap( column, QPixmap( CollectionDB::instance()->albumImage( artist, album, true, 50 ) ) );}voidCollectionView::fetchCover() //SLOT{ #ifdef AMAZON_SUPPORT CollectionItem* item = static_cast<CollectionItem*>( currentItem() ); if ( !item ) return; int cat = 0; switch ( item->depth() ) { case 0: cat = m_cat1; break; case 1: cat = m_cat2; break; case 2: cat = m_cat3; break; } QString album = item->text(0); if( cat == IdVisYearAlbum ) { // we can't use findRev since an album may have " - " within it. QString sep = i18n(" - "); album = album.right( album.length() - sep.length() - album.find( sep ) ); } // find the first artist's name QStringList values = CollectionDB::instance()->query( QString ( "SELECT DISTINCT artist.name FROM artist, album, tags " "WHERE artist.id = tags.artist AND tags.album = album.id " "AND album.name = '%1';" ) .arg( CollectionDB::instance()->escapeString( album ) ) ); if ( !values.isEmpty() ) CollectionDB::instance()->fetchCover( this, values[0], album, false, static_cast<QListViewItem*>(item) ); #endif}voidCollectionView::showTrackInfo() //SLOT{ DEBUG_BLOCK KURL::List urls = listSelected(); int selectedTracksNumber = urls.count(); //If we have only one, call the full dialog. Otherwise, the multiple tracks one. if ( selectedTracksNumber == 1 ) { TagDialog* dialog = new TagDialog( urls.first(), instance() ); dialog->show(); } else if ( selectedTracksNumber ) { TagDialog* dialog = new TagDialog( urls, instance() ); dialog->show(); }}boolCollectionView::isOrganizingFiles() const{ return m_organizeURLs.count() > 0;}void CollectionView::cancelOrganizingFiles(){ // Set the indicator m_organizingFileCancelled = true; // Cancel the current underlying CollectionDB::instance()->moveFile operation CollectionDB::instance()->cancelMovingFileJob();}voidCollectionView::organizeFiles( const KURL::List &urls, const QString &caption, bool copy ) //SLOT{ if( m_organizingFileCancelled ) { QString shortMsg = i18n( "Cannot start organize operation until jobs are aborted." ); Amarok::StatusBar::instance()->shortMessage( shortMsg, KDE::StatusBar::Sorry ); return; } if( m_organizeURLs.count() ) { if( copy != m_organizeCopyMode ) { QString shortMsg = i18n( "Cannot start organize operation of different kind while another is in progress." ); Amarok::StatusBar::instance()->shortMessage( shortMsg, KDE::StatusBar::Sorry ); return; } else { m_organizeURLs += Amarok::recursiveUrlExpand( urls ); Amarok::StatusBar::instance()->incrementProgressTotalSteps( this, urls.count() ); return; } } QStringList folders = MountPointManager::instance()->collectionFolders(); if( folders.isEmpty() ) { QString longMsg = i18n( "You need to configure at least one folder for your collection for organizing your files." ); Amarok::StatusBar::instance()->longMessage( longMsg, KDE::StatusBar::Sorry ); return; } OrganizeCollectionDialogBase base( m_parent, "OrganizeFiles", true, caption, KDialogBase::Ok|KDialogBase::Cancel|KDialogBase::Details ); QVBox* page = base.makeVBoxMainWidget(); OrganizeCollectionDialog dialog( page ); dialog.folderCombo->insertStringList( folders, 0 ); dialog.folderCombo->setCurrentItem( AmarokConfig::organizeDirectory() ); dialog.overwriteCheck->setChecked( AmarokConfig::overwriteFiles() ); dialog.filetypeCheck->setChecked( AmarokConfig::groupByFiletype() ); dialog.initialCheck->setChecked( AmarokConfig::groupArtists() ); dialog.spaceCheck->setChecked( AmarokConfig::replaceSpace() ); dialog.coverCheck->setChecked( AmarokConfig::coverIcons() ); dialog.ignoreTheCheck->setChecked( AmarokConfig::ignoreThe() ); dialog.vfatCheck->setChecked( AmarokConfig::vfatCompatible() ); dialog.asciiCheck->setChecked( AmarokConfig::asciiOnly() ); dialog.customschemeCheck->setChecked( AmarokConfig::useCustomScheme() ); dialog.formatEdit->setText( AmarokConfig::customScheme() ); dialog.regexpEdit->setText( AmarokConfig::replacementRegexp() ); dialog.replaceEdit->setText( AmarokConfig::replacementString() ); connect( &base, SIGNAL(detailsClicked()), &dialog, SLOT(slotDetails()) ); if( dialog.customschemeCheck->isChecked() ) { base.setDetails( true ); } else { dialog.slotDetails(); } KURL::List previewURLs = Amarok::recursiveUrlExpand( urls.first(), 1 ); if( previewURLs.count() ) { dialog.setPreviewBundle( MetaBundle( previewURLs.first() ) ); dialog.update( 0 ); } base.setInitialSize( QSize( 450, 350 ) ); if( base.exec() == KDialogBase::Accepted ) { AmarokConfig::setOrganizeDirectory( dialog.folderCombo->currentItem() ); AmarokConfig::setOverwriteFiles( dialog.overwriteCheck->isChecked() ); AmarokConfig::setGroupByFiletype( dialog.filetypeCheck->isChecked() ); AmarokConfig::setGroupArtists( dialog.initialCheck->isChecked() ); AmarokConfig::setIgnoreThe( dialog.ignoreTheCheck->isChecked() ); AmarokConfig::setReplaceSpace( dialog.spaceCheck->isChecked() ); AmarokConfig::setCoverIcons( dialog.coverCheck->isChecked() ); AmarokConfig::setVfatCompatible( dialog.vfatCheck->isChecked() ); AmarokConfig::setAsciiOnly( dialog.asciiCheck->isChecked() ); AmarokConfig::setUseCustomScheme( dialog.customschemeCheck->isChecked() ); AmarokConfig::setCustomScheme( dialog.formatEdit->text() ); AmarokC
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?