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