magnatunebrowser.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 521 行 · 第 1/2 页
CPP
521 行
/*Copyright (c) 2006 Nikolaj Hald Nielsen <nhnFreespirit@gmail.com>This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Library General PublicLicense as published by the Free Software Foundation; eitherversion 2 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General Public Licensealong with this library; see the file COPYING.LIB. If not, write tothe Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,Boston, MA 02110-1301, USA.*/#include "amarok.h"#include "magnatunebrowser.h"#include "playlist.h"#include "magnatunedatabasehandler.h"#include "debug.h"#include <kstandarddirs.h> //locate()#include <kurl.h>#include <kiconloader.h> //multiTabBar icons#include <qsplitter.h>#include <qdragobject.h>#include <qlabel.h>MagnatuneBrowser *MagnatuneBrowser::s_instance = 0;MagnatuneBrowser::MagnatuneBrowser( const char *name ) : QVBox( 0, name ){ DEBUG_BLOCK initTopPanel( ); QSplitter *spliter = new QSplitter( Qt::Vertical, this ); debug() << "Magnatune browser starting..." << endl; m_listView = new MagnatuneListView( spliter ); m_popupMenu = new QPopupMenu( spliter, "MagnatuneMenu" ); m_artistInfobox = new MagnatuneArtistInfoBox( spliter, "ArtistInfoBox" ); initBottomPanel(); //connect (m_listView, SIGNAL(executed(KListViewItem *)), this, SLOT(itemExecuted(KListViewItem *))); connect( m_listView, SIGNAL( doubleClicked( QListViewItem * ) ), this, SLOT( itemExecuted( QListViewItem * ) ) ); connect( m_listView, SIGNAL( selectionChanged( QListViewItem * ) ), this, SLOT( selectionChanged( QListViewItem * ) ) ); connect( m_listView, SIGNAL( rightButtonClicked ( QListViewItem *, const QPoint &, int ) ), this, SLOT( showPopupMenu( QListViewItem *, const QPoint &, int ) ) ); connect( m_popupMenu, SIGNAL( aboutToShow() ), this, SLOT( menuAboutToShow() ) ); m_currentInfoUrl = ""; m_purchaseHandler = 0; m_redownloadHandler = 0; m_purchaseInProgress = false; m_polished = false; }void MagnatuneBrowser::itemExecuted( QListViewItem * item ){ DEBUG_BLOCK; switch ( item->depth() ) { case 2: addTrackToPlaylist( dynamic_cast<MagnatuneListViewTrackItem *>( item ) ); break; case 1: addAlbumToPlaylist( dynamic_cast<MagnatuneListViewAlbumItem *>( item ) ); break; case 0: addArtistToPlaylist( dynamic_cast<MagnatuneListViewArtistItem *>( item ) ); break; default: break; }}void MagnatuneBrowser::addTrackToPlaylist( MagnatuneTrack *item ){ if ( !item ) return ; // sanity check debug() << "Magnatune browser: adding single track" << endl; QString url = item->getHifiURL(); Playlist * playlist = Playlist::instance(); playlist->insertMedia( KURL( url ) );}void MagnatuneBrowser::addAlbumToPlaylist( MagnatuneAlbum * item ){ if ( !item ) return ; // sanity check debug() << "Magnatune browser: adding album" << endl; MagnatuneTrackList tracks = MagnatuneDatabaseHandler::instance() ->getTracksByAlbumId( item->getId() ); MagnatuneTrackList::iterator it; for ( it = tracks.begin(); it != tracks.end(); ++it ) addTrackToPlaylist( &( *it ) );}void MagnatuneBrowser::addArtistToPlaylist( MagnatuneArtist *item ){ if ( !item ) return ; // sanity check debug() << "Magnatune browser: adding artist" << endl; MagnatuneAlbumList albums = MagnatuneDatabaseHandler::instance() ->getAlbumsByArtistId( item->getId(), "" ); MagnatuneAlbumList::iterator it; for ( it = albums.begin(); it != albums.end(); ++it ) addAlbumToPlaylist( &( *it ) );}void MagnatuneBrowser::selectionChanged( QListViewItem *item ){ if ( !item ) return ; // sanity check debug() << "Selection changed..." << endl; if ( item->depth() == 0 ) m_purchaseAlbumButton->setEnabled( false ); else if ( ! m_purchaseInProgress ) m_purchaseAlbumButton->setEnabled( true ); if ( !m_isInfoShown ) return ; switch ( item->depth() ) { case 0: { MagnatuneListViewArtistItem * artistItem = dynamic_cast<MagnatuneListViewArtistItem *>( item ); if ( artistItem && m_currentInfoUrl != artistItem->getHomeURL() ) { m_currentInfoUrl = artistItem->getHomeURL(); m_artistInfobox->displayArtistInfo( KURL( m_currentInfoUrl ) ); } } break; case 1: { MagnatuneListViewAlbumItem *albumItem = dynamic_cast<MagnatuneListViewAlbumItem *>( item ); if ( albumItem && m_currentInfoUrl != albumItem->getCoverURL() ) { m_currentInfoUrl = albumItem->getCoverURL(); m_artistInfobox->displayAlbumInfo( albumItem ); } } break; case 2: { // a track is selected, show the corrosponding album info! MagnatuneListViewTrackItem *trackItem = dynamic_cast<MagnatuneListViewTrackItem*>( item ); if (!trackItem) { debug() << "dynamic_cast to trackItem failed!" << endl; return; } int albumId = trackItem->getAlbumId(); MagnatuneAlbum album = MagnatuneDatabaseHandler::instance() ->getAlbumById( albumId ); m_artistInfobox->displayAlbumInfo( &album ); } break; default: break; }}void MagnatuneBrowser::showPopupMenu( QListViewItem * item, const QPoint & pos, int /*column*/ ){ if ( !item ) return ; m_popupMenu->exec( pos );}void MagnatuneBrowser::addSelectionToPlaylist( ){ QListViewItem * selectedItem = m_listView->selectedItem(); switch ( selectedItem->depth() ) { case 0: addArtistToPlaylist( dynamic_cast<MagnatuneListViewArtistItem *>( selectedItem ) ); break; case 1: addAlbumToPlaylist( dynamic_cast<MagnatuneListViewAlbumItem *>( selectedItem ) ); break; case 2: addTrackToPlaylist( dynamic_cast<MagnatuneListViewTrackItem *>( selectedItem ) ); }}void MagnatuneBrowser::menuAboutToShow( ){ m_popupMenu->clear(); QListViewItem *selectedItem = m_listView->selectedItem(); if ( !selectedItem ) return ; switch ( selectedItem->depth() ) { case 0: m_popupMenu->insertItem( i18n( "Add artist to playlist" ), this, SLOT( addSelectionToPlaylist() ) ); break; case 1: m_popupMenu->insertItem( i18n( "Add album to playlist" ), this, SLOT( addSelectionToPlaylist() ) ); m_popupMenu->insertItem( i18n( "Purchase album" ), this, SLOT( purchaseSelectedAlbum() ) ); break; case 2: m_popupMenu->insertItem( i18n( "Add track to playlist" ), this, SLOT( addSelectionToPlaylist() ) ); m_popupMenu->insertItem( i18n( "Purchase album" ), this, SLOT( purchaseAlbumContainingSelectedTrack() ) ); }}void MagnatuneBrowser::purchaseButtonClicked( ){ if ( !m_purchaseInProgress ) { m_purchaseInProgress = true; m_purchaseAlbumButton->setEnabled( false ); if ( m_listView->selectedItem() ->depth() == 1 ) purchaseSelectedAlbum( ); else if ( m_listView->selectedItem() ->depth() == 2 ) purchaseAlbumContainingSelectedTrack( ); }}void MagnatuneBrowser::purchaseSelectedAlbum( ){ if ( !m_purchaseHandler ) { m_purchaseHandler = new MagnatunePurchaseHandler(); m_purchaseHandler->setParent( this ); connect( m_purchaseHandler, SIGNAL( purchaseCompleted( bool ) ), this, SLOT( purchaseCompleted( bool ) ) ); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?