tagdialog.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,499 行 · 第 1/4 页
CPP
1,499 行
void TagDialog::init(){ // delete itself when closing setWFlags( getWFlags() | Qt::WDestructiveClose ); KConfig *config = Amarok::config( "TagDialog" ); kTabWidget->addTab( summaryTab, i18n( "Summary" ) ); kTabWidget->addTab( tagsTab, i18n( "Tags" ) ); kTabWidget->addTab( lyricsTab, i18n( "Lyrics" ) ); kTabWidget->addTab( statisticsTab, i18n( "Statistics" ) ); kTabWidget->addTab( labelsTab, i18n( "Labels" ) ); kTabWidget->setCurrentPage( config->readNumEntry( "CurrentTab", 0 ) ); const QStringList artists = CollectionDB::instance()->artistList(); kComboBox_artist->insertStringList( artists ); kComboBox_artist->completionObject()->insertItems( artists ); kComboBox_artist->completionObject()->setIgnoreCase( true ); kComboBox_artist->setCompletionMode( KGlobalSettings::CompletionPopup ); const QStringList albums = CollectionDB::instance()->albumList(); kComboBox_album->insertStringList( albums ); kComboBox_album->completionObject()->insertItems( albums ); kComboBox_album->completionObject()->setIgnoreCase( true ); kComboBox_album->setCompletionMode( KGlobalSettings::CompletionPopup ); const QStringList composers = CollectionDB::instance()->composerList(); kComboBox_composer->insertStringList( composers ); kComboBox_composer->completionObject()->insertItems( composers ); kComboBox_composer->completionObject()->setIgnoreCase( true ); kComboBox_composer->setCompletionMode( KGlobalSettings::CompletionPopup ); kComboBox_rating->insertStringList( MetaBundle::ratingList() );// const QStringList genres = MetaBundle::genreList(); const QStringList genres = CollectionDB::instance()->genreList(); kComboBox_genre->insertStringList( genres ); kComboBox_genre->completionObject()->insertItems( genres ); kComboBox_genre->completionObject()->setIgnoreCase( true ); const QStringList labels = CollectionDB::instance()->labelList(); //TODO: figure out a way to add auto-completion support to kTestEdit_selectedLabels //m_labelCloud = new KHTMLPart( labels_favouriteLabelsFrame ); m_labelCloud = new HTMLView( labels_favouriteLabelsFrame ); m_labelCloud->view()->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored, false ); m_labelCloud->view()->setVScrollBarMode( QScrollView::AlwaysOff ); m_labelCloud->view()->setHScrollBarMode( QScrollView::AlwaysOff ); new QVBoxLayout( labels_favouriteLabelsFrame ); labels_favouriteLabelsFrame->layout()->add( m_labelCloud->view() ); const QStringList favoriteLabels = CollectionDB::instance()->favoriteLabels(); QString html = generateHTML( favoriteLabels ); m_labelCloud->set( html ); connect( m_labelCloud->browserExtension(), SIGNAL( openURLRequest( const KURL &, const KParts::URLArgs & ) ), this, SLOT( openURLRequest( const KURL & ) ) ); // looks better to have a blank label than 0, we can't do this in // the UI file due to bug in Designer kIntSpinBox_track->setSpecialValueText( " " ); kIntSpinBox_year->setSpecialValueText( " " ); kIntSpinBox_score->setSpecialValueText( " " ); kIntSpinBox_discNumber->setSpecialValueText( " " ); if( !AmarokConfig::useRatings() ) { kComboBox_rating->hide(); ratingLabel->hide(); } if( !AmarokConfig::useScores() ) { kIntSpinBox_score->hide(); scoreLabel->hide(); } //HACK due to deficiency in Qt that will be addressed in version 4 // QSpinBox doesn't emit valueChanged if you edit the value with // the lineEdit until you change the keyboard focus connect( kIntSpinBox_year->child( "qt_spinbox_edit" ), SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kIntSpinBox_track->child( "qt_spinbox_edit" ), SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kIntSpinBox_score->child( "qt_spinbox_edit" ), SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kIntSpinBox_discNumber->child( "qt_spinbox_edit" ), SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); // Connects for modification check connect( kLineEdit_title, SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kComboBox_composer,SIGNAL(activated( int )), SLOT(checkModified()) ); connect( kComboBox_composer,SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kComboBox_artist, SIGNAL(activated( int )), SLOT(checkModified()) ); connect( kComboBox_artist, SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kComboBox_album, SIGNAL(activated( int )), SLOT(checkModified()) ); connect( kComboBox_album, SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kComboBox_genre, SIGNAL(activated( int )), SLOT(checkModified()) ); connect( kComboBox_genre, SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kComboBox_rating, SIGNAL(activated( int )), SLOT(checkModified()) ); connect( kComboBox_rating, SIGNAL(textChanged( const QString& )), SLOT(checkModified()) ); connect( kIntSpinBox_track, SIGNAL(valueChanged( int )), SLOT(checkModified()) ); connect( kIntSpinBox_year, SIGNAL(valueChanged( int )), SLOT(checkModified()) ); connect( kIntSpinBox_score, SIGNAL(valueChanged( int )), SLOT(checkModified()) ); connect( kTextEdit_comment, SIGNAL(textChanged()), SLOT(checkModified()) ); connect( kTextEdit_lyrics, SIGNAL(textChanged()), SLOT(checkModified()) ); connect( kTextEdit_selectedLabels, SIGNAL(textChanged()), SLOT(checkModified()) ); // Remember original button text m_buttonMbText = pushButton_musicbrainz->text(); connect( pushButton_cancel, SIGNAL(clicked()), SLOT(cancelPressed()) ); connect( pushButton_ok, SIGNAL(clicked()), SLOT(accept()) ); connect( pushButton_open, SIGNAL(clicked()), SLOT(openPressed()) ); connect( pushButton_previous, SIGNAL(clicked()), SLOT(previousTrack()) ); connect( pushButton_next, SIGNAL(clicked()), SLOT(nextTrack()) ); connect( checkBox_perTrack, SIGNAL(clicked()), SLOT(perTrack()) ); // set an icon for the open-in-konqui button pushButton_open->setIconSet( SmallIconSet( Amarok::icon( "files" ) ) ); //Update lyrics on Context Browser connect( this, SIGNAL(lyricsChanged( const QString& )), ContextBrowser::instance(), SLOT( lyricsChanged( const QString& ) ) ); //Update cover connect( CollectionDB::instance(), SIGNAL( coverFetched( const QString&, const QString& ) ), this, SLOT( loadCover( const QString&, const QString& ) ) ); connect( CollectionDB::instance(), SIGNAL( coverChanged( const QString&, const QString& ) ), this, SLOT( loadCover( const QString&, const QString& ) ) );#if HAVE_TUNEPIMP connect( pushButton_musicbrainz, SIGNAL(clicked()), SLOT(musicbrainzQuery()) );#else QToolTip::add( pushButton_musicbrainz, i18n("Please install MusicBrainz to enable this functionality") );#endif connect( pushButton_guessTags, SIGNAL(clicked()), SLOT( guessFromFilename() ) ); connect( pushButton_setFilenameSchemes, SIGNAL(clicked()), SLOT( setFileNameSchemes() ) ); if( m_urlList.count() ) { //editing multiple tracks m_perTrack = false; setMultipleTracksMode(); readMultipleTracks(); checkBox_perTrack->setChecked( m_perTrack ); if( m_urlList.count() == 1 ) { checkBox_perTrack->setEnabled( false ); pushButton_previous->setEnabled( false ); pushButton_next->setEnabled( false ); } else { checkBox_perTrack->setEnabled( true ); pushButton_previous->setEnabled( m_perTrack ); pushButton_next->setEnabled( m_perTrack ); } } else { m_perTrack = true; checkBox_perTrack->hide(); if( !m_playlistItem ) { //We have already loaded the metadata (from the file) in the constructor pushButton_previous->hide(); pushButton_next->hide(); } else { //Reload the metadata from the file, to be sure it's accurate loadTags( m_playlistItem->url() ); } loadLyrics( m_bundle.url() ); loadLabels( m_bundle.url() ); readTags(); } // make it as small as possible resize( sizeHint().width(), minimumSize().height() );}inline const QString TagDialog::unknownSafe( QString s ) { return ( s.isNull() || s.isEmpty() || s == "?" || s == "-" ) ? i18n ( "Unknown" ) : s;}const QStringList TagDialog::statisticsData() { QStringList data, values; const uint artist_id = CollectionDB::instance()->artistID( m_bundle.artist() ); const uint album_id = CollectionDB::instance()->albumID ( m_bundle.album() ); QueryBuilder qb; if ( !m_bundle.artist().isEmpty() ) { // tracks by this artist qb.clear(); qb.addReturnFunctionValue( QueryBuilder::funcCount, QueryBuilder::tabSong, QueryBuilder::valTitle ); qb.addMatch( QueryBuilder::tabSong, QueryBuilder::valArtistID, QString::number( artist_id ) ); values = qb.run(); data += i18n( "Tracks by this Artist" ); data += values[0]; // albums by this artist qb.clear(); qb.addReturnFunctionValue( QueryBuilder::funcCount, QueryBuilder::tabAlbum, QueryBuilder::valID ); qb.addMatch( QueryBuilder::tabSong, QueryBuilder::valArtistID, QString::number( artist_id ) ); qb.groupBy( QueryBuilder::tabSong, QueryBuilder::valAlbumID ); qb.excludeMatch( QueryBuilder::tabAlbum, i18n( "Unknown" ) ); qb.setOptions( QueryBuilder::optNoCompilations ); values = qb.run(); data += i18n( "Albums by this Artist" ); data += QString::number( values.count() ); // Favorite track by this artist qb.clear(); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valTitle ); qb.addReturnValue( QueryBuilder::tabStats, QueryBuilder::valScore ); qb.addMatch( QueryBuilder::tabSong, QueryBuilder::valArtistID, QString::number( artist_id ) ); qb.sortByFavorite(); qb.setLimit( 0, 1 ); values = qb.run(); data += i18n( "Favorite by this Artist" ); data += values[0]; if ( !m_bundle.album().isEmpty() ) { // Favorite track on this album qb.clear(); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valTitle ); qb.addReturnValue( QueryBuilder::tabStats, QueryBuilder::valScore ); qb.addMatch( QueryBuilder::tabSong, QueryBuilder::valAlbumID, QString::number( album_id ) ); qb.sortByFavorite(); qb.setLimit( 0, 1 ); values = qb.run(); data += i18n( "Favorite on this Album" ); data += values[0]; } // Related Artists const QString sArtists = CollectionDB::instance()->similarArtists( m_bundle.artist(), 4 ).join(", "); if ( !sArtists.isEmpty() ) { data += i18n( "Related Artists" ); data += sArtists; } } return data;}void TagDialog::readTags(){ bool local = m_bundle.url().isLocalFile(); setCaption( kapp->makeStdCaption( i18n("Track Information: %1 by %2").arg( m_bundle.title(), m_bundle.artist() ) ) ); QString niceTitle; if ( m_bundle.album().isEmpty() ) { if( !m_bundle.title().isEmpty() ) { if( !m_bundle.artist().isEmpty() ) niceTitle = i18n( "<b>%1</b> by <b>%2</b>" ).arg( m_bundle.title(), m_bundle.artist() ); else niceTitle = QString( "<b>%1</b>" ).arg( m_bundle.title() ); } else niceTitle = m_bundle.prettyTitle(); } else { niceTitle = i18n( "<b>%1</b> by <b>%2</b> on <b>%3</b>" ) .arg( m_bundle.title(), m_bundle.artist(), m_bundle.album() ); } trackArtistAlbumLabel->setText( niceTitle ); trackArtistAlbumLabel2->setText( niceTitle ); kLineEdit_title ->setText( m_bundle.title() ); kComboBox_artist ->setCurrentText( m_bundle.artist() ); kComboBox_album ->setCurrentText( m_bundle.album() ); kComboBox_genre ->setCurrentText( m_bundle.genre() ); kComboBox_rating ->setCurrentItem( m_bundle.rating() ); kIntSpinBox_track ->setValue( m_bundle.track() ); kComboBox_composer ->setCurrentText( m_bundle.composer() ); kIntSpinBox_year ->setValue( m_bundle.year() ); kIntSpinBox_score ->setValue( static_cast<int>(m_bundle.score()) ); kIntSpinBox_discNumber ->setValue( m_bundle.discNumber() ); kTextEdit_comment ->setText( m_bundle.comment() ); bool extended = m_bundle.hasExtendedMetaInformation(); kIntSpinBox_discNumber->setEnabled( extended ); kComboBox_composer->setEnabled( extended ); QString summaryText, statisticsText; const QString body2cols = i18n( "<tr><td>Label:</td><td><b>Value</b></td></tr>", "<tr><td><nobr>%1:</nobr></td><td><b>%2</b></td></tr>" ); const QString body1col = "<tr><td colspan=2>%1</td></td></tr>"; const QString emptyLine = "<tr><td colspan=2></td></tr>"; summaryText = "<table width=100%><tr><td width=50%><table>"; summaryText += body2cols.arg( i18n("Length"), unknownSafe( m_bundle.prettyLength() ) ); summaryText += body2cols.arg( i18n("Bitrate"), unknownSafe( m_bundle.prettyBitrate() ) ); summaryText += body2cols.arg( i18n("Samplerate"), unknownSafe( m_bundle.prettySampleRate() ) ); summaryText += body2cols.arg( i18n("Size"), unknownSafe( m_bundle.prettyFilesize() ) ); summaryText += body2cols.arg( i18n("Format"), unknownSafe( m_bundle.type() ) ); summaryText += "</table></td><td width=50%><table>"; if( AmarokConfig::useScores() ) summaryText += body2cols.arg( i18n("Score"), QString::number( static_cast<int>( m_bundle.score() ) ) ); if( AmarokConfig::useRatings() ) summaryText += body2cols.arg( i18n("Rating"), m_bundle.prettyRating() ); summaryText += body2cols.arg( i18n("Playcount"), QString::number( m_bundle.playCount() ) ); summaryText += body2cols.arg( i18n("First Played"), m_bundle.playCount() ? KGlobal::locale()->formatDate( CollectionDB::instance()->getFirstPlay( m_bundle.url().path() ).date() , true ) : i18n("Never") ); summaryText += body2cols.arg( i18n("a single item (singular)", "Last Played"), m_bundle.playCount() ? KGlobal::locale()->formatDate( CollectionDB::instance()->getLastPlay( m_bundle.url().path() ).date() , true ) : i18n("Never") ); summaryText += "</table></td></tr></table>"; summaryLabel->setText( summaryText ); statisticsText = "<table>"; QStringList sData = statisticsData(); for ( uint i = 0; i<sData.count(); i+=2 ) { statisticsText += body2cols.arg( sData[i], sData[i+1] ); } statisticsText += "</table>"; statisticsLabel->setText( statisticsText ); kLineEdit_location->setText( local ? m_bundle.url().path() : m_bundle.url().url() ); //lyrics kTextEdit_lyrics->setText( m_lyrics ); loadCover( m_bundle.artist(), m_bundle.album() ); // enable only for local files kLineEdit_title->setReadOnly( !local ); kComboBox_artist->setEnabled( local ); kComboBox_album->setEnabled( local ); kComboBox_genre->setEnabled( local ); kComboBox_rating->setEnabled( local ); kIntSpinBox_track->setEnabled( local ); kIntSpinBox_year->setEnabled( local ); kIntSpinBox_score->setEnabled( local ); kTextEdit_comment->setEnabled( local ); kTextEdit_selectedLabels->setEnabled( local ); m_labelCloud->view()->setEnabled( local ); if( local ) { pushButton_musicbrainz->show(); pushButton_guessTags->show(); pushButton_setFilenameSchemes->show(); } else { pushButton_musicbrainz->hide(); pushButton_guessTags->hide(); pushButton_setFilenameSchemes->hide(); } // If it's a local file, write the directory to m_path, else disable the "open in konqui" button if ( local ) m_path = m_bundle.url().directory(); else pushButton_open->setEnabled( false ); pushButton_ok->setEnabled( storedTags.count() > 0 || storedScores.count() > 0 || storedLyrics.count() > 0 || storedRatings.count() > 0 || newLabels.count() > 0 );#if HAVE_TUNEPIMP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?