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 + -
显示快捷键?