collectionbrowser.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,829 行 · 第 1/5 页

CPP
1,829
字号
    qb.setOptions( QueryBuilder::optRemoveDuplicates );    values = qb.run();    uint countReturnValues = qb.countReturnValues();    QPixmap pixmap;    bool expandable = category != IdNone;    if ( expandable )        pixmap = iconForCategory( category );    //this check avoid possible problems on database errors. FIXME: Should we add some real error handling here,    //like calling a collection update or something?    if ( values.isEmpty() ) { return; }    for ( int i = values.count() - countReturnValues; i >= 0; i -= countReturnValues )    {        QString text;        bool unknown=false;        if (  category == IdVisYearAlbum )            text += (  values[ i+1 ].isEmpty() ? "?" : values[ i+1 ] ) + i18n(  " - " );        //show "artist - title" for compilations        if ( c )        {            if ( values[ i + 2 ].stripWhiteSpace().isEmpty() )            {                text += i18n( "Unknown" ) + i18n( " - " );                unknown = true;            }            else                text = values[ i + 2 ] + i18n( " - " );        }        if ( values[ i ].stripWhiteSpace().isEmpty() )        {            if ( category == IdLabel )                text += i18n( "No Label" );            else                text +=  i18n( "Unknown" );            unknown = true;        }        else            text += values[ i ];        CollectionItem* child = new CollectionItem( item, category, unknown );        child->setDragEnabled( true );        child->setDropEnabled( false );        child->setText( 0, text );        if ( expandable )            child->setPixmap( 0, pixmap );        else            child->setUrl( values[ i + 1 ] );        child->setExpandable( expandable );    }    //Display the album cover for the parent item now it is expanded    if ( dynamic_cast<CollectionItem*>( item ) )    {        CollectionItem *i = static_cast<CollectionItem*>( item );        if ( i->m_cat == IdAlbum || i->m_cat == IdVisYearAlbum )            i->setPixmap( 0, QPixmap() );   //The pixmap given is unimportant. The cover is used.    }}voidCollectionView::slotCollapse( QListViewItem* item )  //SLOT{    //On collapse, go back from showing the cover to showing the icon for albums    if ( dynamic_cast<CollectionItem*>( item ) )    {        CollectionItem *i = static_cast<CollectionItem*>( item );        if ( i->m_cat == IdAlbum || i->m_cat == IdVisYearAlbum )            i->setPixmap( 0, iconForCategory( i->m_cat ) );    }    QListViewItem* child = item->firstChild();    QListViewItem* childTmp;    //delete all children    while ( child )    {        childTmp = child;        child = child->nextSibling();        delete childTmp;    }}voidCollectionView::ratingChanged( const QString&, int ){    m_dirty = true;    QTimer::singleShot( 0, CollectionView::instance(), SLOT( renderView() ) );}voidCollectionView::presetMenu( int id )  //SLOT{    switch ( id )    {        case IdArtist:            cat1Menu( IdArtist, false );            cat2Menu( IdNone, false );            cat3Menu( IdNone, false );            break;        case IdAlbum:            cat1Menu( IdAlbum, false );            cat2Menu( IdNone, false );            cat3Menu( IdNone, false );            break;        case IdArtistAlbum:            cat1Menu( IdArtist, false );            cat2Menu( IdAlbum, false );            cat3Menu( IdNone, false );            break;        case IdArtistVisYearAlbum:            cat1Menu( IdArtist, false );            cat2Menu( IdVisYearAlbum, false );            cat3Menu( IdNone, false );            break;        case IdGenreArtist:            cat1Menu( IdGenre, false );            cat2Menu( IdArtist, false );            cat3Menu( IdNone, false );            break;        case IdGenreArtistAlbum:            cat1Menu( IdGenre, false );            cat2Menu( IdArtist, false );            cat3Menu( IdAlbum, false );            break;    }    renderView(true);}voidCollectionView::cat1Menu( int id, bool rerender )  //SLOT{    m_parent->m_cat1Menu->setItemChecked( m_cat1, false ); //uncheck old item    m_parent->m_cat2Menu->setItemEnabled( m_cat1, true );  //enable old items    m_parent->m_cat3Menu->setItemEnabled( m_cat1, true );    m_cat1 = id;    updateColumnHeader();    resetIpodDepth();    m_parent->m_cat1Menu->setItemChecked( m_cat1, true );    //prevent choosing the same category in both menus    m_parent->m_cat2Menu->setItemEnabled( id , false );    m_parent->m_cat3Menu->setItemEnabled( id , false );    //if this item is checked in second menu, uncheck it    if ( m_parent->m_cat2Menu->isItemChecked( id ) ) {        m_parent->m_cat2Menu->setItemChecked( id, false );        m_parent->m_cat2Menu->setItemChecked( IdNone, true );        m_cat2 = IdNone;        enableCat3Menu( false );    }    //if this item is checked in third menu, uncheck it    if ( m_parent->m_cat3Menu->isItemChecked( id ) ) {        m_parent->m_cat3Menu->setItemChecked( id, false );        m_parent->m_cat3Menu->setItemChecked( IdNone, true );        m_cat3 = IdNone;    }    updateTrackDepth();    if ( rerender )    {        renderView(true);    }}voidCollectionView::cat2Menu( int id, bool rerender )  //SLOT{    m_parent->m_cat2Menu->setItemChecked( m_cat2, false ); //uncheck old item    m_parent->m_cat3Menu->setItemEnabled( m_cat3, true );  //enable old item    m_cat2 = id;    m_parent->m_cat2Menu->setItemChecked( m_cat2, true );    updateColumnHeader();    resetIpodDepth();    enableCat3Menu( id != IdNone );    //prevent choosing the same category in both menus    m_parent->m_cat3Menu->setItemEnabled( m_cat1 , false );    if( id != IdNone )        m_parent->m_cat3Menu->setItemEnabled( id , false );    //if this item is checked in third menu, uncheck it    if ( m_parent->m_cat3Menu->isItemChecked( id ) ) {        m_parent->m_cat3Menu->setItemChecked( id, false );        enableCat3Menu( false );    }    updateTrackDepth();    if ( rerender )    {        renderView(true);    }}voidCollectionView::cat3Menu( int id, bool rerender )  //SLOT{    m_parent->m_cat3Menu->setItemChecked( m_cat3, false ); //uncheck old item    m_cat3 = id;    m_parent->m_cat3Menu->setItemChecked( m_cat3, true );    updateColumnHeader();    resetIpodDepth();    updateTrackDepth();    if ( rerender )    {        renderView(true);    }}voidCollectionView::enableCat3Menu( bool enable ){    m_parent->m_cat3Menu->setItemEnabled( IdAlbum, enable );    m_parent->m_cat3Menu->setItemEnabled( IdVisYearAlbum, enable );    m_parent->m_cat3Menu->setItemEnabled( IdArtist, enable );    m_parent->m_cat3Menu->setItemEnabled( IdComposer, enable );    m_parent->m_cat3Menu->setItemEnabled( IdGenre, enable );    m_parent->m_cat3Menu->setItemEnabled( IdYear, enable );    m_parent->m_cat3Menu->setItemEnabled( IdLabel, enable );    if( !enable ) {        m_parent->m_cat3Menu->setItemChecked( m_cat3, false );        m_parent->m_cat3Menu->setItemChecked( IdNone, true );        m_cat3 = IdNone;    }    updateTrackDepth();}voidCollectionView::invokeItem( QListViewItem* i, const QPoint& point, int column ) //SLOT{    if( column == -1 )        return;    QPoint p = mapFromGlobal( point );    if ( p.x() > header()->sectionPos( header()->mapToIndex( 0 ) ) + treeStepSize() * ( i->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin()            || p.x() < header()->sectionPos( header()->mapToIndex( 0 ) ) )        invokeItem( i );}voidCollectionView::invokeItem( QListViewItem* item ) //SLOT{    if ( !item || dynamic_cast<DividerItem*>(item) )        return;    item->setSelected( true );    setCurrentItem( item );    //append and prevent doubles in playlist    if( item->isExpandable()  ||  m_viewMode == modeIpodView )        Playlist::instance()->insertMedia( listSelected(), Playlist::DefaultOptions );    else        Playlist::instance()->insertMedia( static_cast<CollectionItem*>( item )->url(), Playlist::DefaultOptions );}// This slot is here to handle clicks on the right-arrow buttons// in iPod browsing modevoidCollectionView::ipodItemClicked( QListViewItem *item, const QPoint&, int c ){    if( item == 0 || c == 0 )        return;    if( m_viewMode != modeIpodView )        return;    // The Qt manual says NOT to delete items from within this slot    QTimer::singleShot( 0, m_parent->m_ipodIncrement, SLOT( activate() ) );}voidCollectionView::rmbPressed( QListViewItem* item, const QPoint& point, int ) //SLOT{    if ( dynamic_cast<DividerItem*>( item ) ) return;    int artistLevel = -1;    if ( item ) {        KPopupMenu menu( this );        int cat = 0;        if ( m_viewMode == modeTreeView ) {            switch ( item->depth() )            {                case 0:                    cat = m_cat1;                    break;                case 1:                    if( m_cat1 == IdArtist )                        artistLevel = 0;                    cat = m_cat2;                    break;                case 2:                    if( m_cat1 == IdArtist )                        artistLevel = 0;                    else if( m_cat2 == IdArtist )                        artistLevel = 1;                    cat = m_cat3;                    break;            }        }        else if ( m_viewMode == modeIpodView ) {            int catArr[3] = {m_cat1, m_cat2, m_cat3};            if ( m_currentDepth < trackDepth() )                cat = catArr[m_currentDepth];        }        enum Actions { APPEND, QUEUE, MAKE, SAVE, MEDIA_DEVICE, BURN_ARTIST,                       BURN_COMPOSER, BURN_ALBUM, BURN_CD, FETCH, INFO,                       COMPILATION_SET, COMPILATION_UNSET, ORGANIZE, DELETE, TRASH,                       FILE_MENU };        QString trueItemText = getTrueItemText( cat, item );        KURL::List selection = listSelected();        QStringList siblingSelection = listSelectedSiblingsOf( cat, item );        menu.insertItem( SmallIconSet( Amarok::icon( "files" ) ), i18n( "&Load" ), MAKE );        menu.insertItem( SmallIconSet( Amarok::icon( "add_playlist" ) ), i18n( "&Append to Playlist" ), APPEND );        menu.insertItem( SmallIconSet( Amarok::icon( "queue_track" ) ), selection.count() == 1 ? i18n( "&Queue Track" )            : i18n( "&Queue Tracks" ), QUEUE );        if( selection.count() > 1 || item->isExpandable() )            menu.insertItem( SmallIconSet( Amarok::icon( "save" ) ), i18n( "&Save as Playlist..." ), SAVE );        menu.insertSeparator();        if( MediaBrowser::isAvailable() )            menu.insertItem( SmallIconSet( Amarok::icon( "device" ) ), i18n( "&Transfer to Media Device" ), MEDIA_DEVICE );        if( cat == IdArtist )        {            menu.insertItem( SmallIconSet( Amarok::icon( "burn" ) ), i18n( "&Burn All Tracks by This Artist" ), BURN_ARTIST );            menu.setItemEnabled( BURN_ARTIST, K3bExporter::isAvailable() && siblingSelection.count() == 1 );        }        else if( cat == IdComposer )        {            menu.insertItem( SmallIconSet( Amarok::icon( "burn" ) ), i18n( "&Burn All Tracks by This Composer" ), BURN_COMPOSER );            menu.setItemEnabled( BURN_COMPOSER, K3bExporter::isAvailable() && siblingSelection.count() == 1 );        }        else if( (cat == IdAlbum || cat == IdVisYearAlbum) )        {            menu.insertItem( SmallIconSet( Amarok::icon( "burn" ) ), i18n( "&Burn This Album" ), BURN_ALBUM );            menu.setItemEnabled( BURN_ALBUM, K3bExporter::isAvailable() && siblingSelection.count() == 1 );        }        // !item->isExpandable() in tree mode corresponds to        // showing tracks in iPod mode        else if( !item->isExpandable() &&                 (m_viewMode != modeIpodView || m_currentDepth == trackDepth()) )        {            menu.insertItem( SmallIconSet( Amarok::icon( "burn" ) ), i18n( "B&urn to CD" ), BURN_CD );            menu.setItemEnabled( BURN_CD, K3bExporter::isAvailable() );        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?