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