/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.cpp

http://github.com/tomahawk-player/tomahawk · C++ · 325 lines · 223 code · 79 blank · 23 comment · 30 complexity · dad6e6ae22283f0f9d294106ce4e30ad MD5 · raw file

  1. /* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
  2. *
  3. * Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
  4. * Copyright 2010-2011, Jeff Mitchell <jeff@tomahawk-player.org>
  5. *
  6. * Tomahawk is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Tomahawk is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "ArtistInfoWidget.h"
  20. #include "ArtistInfoWidget_p.h"
  21. #include "ui_ArtistInfoWidget.h"
  22. #include <QScrollArea>
  23. #include <QScrollBar>
  24. #include "audio/AudioEngine.h"
  25. #include "playlist/GridItemDelegate.h"
  26. #include "playlist/PlayableModel.h"
  27. #include "playlist/TreeModel.h"
  28. #include "playlist/PlaylistModel.h"
  29. #include "playlist/TreeProxyModel.h"
  30. #include "Source.h"
  31. #include "database/DatabaseCommand_AllTracks.h"
  32. #include "database/DatabaseCommand_AllAlbums.h"
  33. #include "Pipeline.h"
  34. #include "utils/StyleHelper.h"
  35. #include "utils/TomahawkUtilsGui.h"
  36. #include "utils/Logger.h"
  37. using namespace Tomahawk;
  38. ArtistInfoWidget::ArtistInfoWidget( const Tomahawk::artist_ptr& artist, QWidget* parent )
  39. : QWidget( parent )
  40. , ui( new Ui::ArtistInfoWidget )
  41. , m_artist( artist )
  42. {
  43. QWidget* widget = new QWidget;
  44. ui->setupUi( widget );
  45. QPalette pal = palette();
  46. pal.setColor( QPalette::Window, QColor( "#454e59" ) );
  47. widget->setPalette( pal );
  48. widget->setAutoFillBackground( true );
  49. m_plInterface = Tomahawk::playlistinterface_ptr( new MetaArtistInfoInterface( this ) );
  50. /* TomahawkUtils::unmarginLayout( ui->layoutWidget->layout() );
  51. TomahawkUtils::unmarginLayout( ui->layoutWidget1->layout() );
  52. TomahawkUtils::unmarginLayout( ui->layoutWidget2->layout() );
  53. TomahawkUtils::unmarginLayout( ui->albumHeader->layout() );*/
  54. m_albumsModel = new PlayableModel( ui->albums );
  55. ui->albums->setPlayableModel( m_albumsModel );
  56. ui->albums->setEmptyTip( tr( "Sorry, we could not find any albums for this artist!" ) );
  57. m_relatedModel = new PlayableModel( ui->relatedArtists );
  58. ui->relatedArtists->setPlayableModel( m_relatedModel );
  59. ui->relatedArtists->proxyModel()->sort( -1 );
  60. ui->relatedArtists->setEmptyTip( tr( "Sorry, we could not find any related artists!" ) );
  61. m_topHitsModel = new PlaylistModel( ui->topHits );
  62. ui->topHits->proxyModel()->setStyle( PlayableProxyModel::Short );
  63. ui->topHits->setPlayableModel( m_topHitsModel );
  64. ui->topHits->setSortingEnabled( false );
  65. ui->topHits->setEmptyTip( tr( "Sorry, we could not find any top hits for this artist!" ) );
  66. ui->relatedArtists->setAutoFitItems( false );
  67. ui->relatedArtists->setWrapping( false );
  68. ui->relatedArtists->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
  69. ui->relatedArtists->setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
  70. ui->relatedArtists->delegate()->setItemSize( QSize( 170, 170 ) );
  71. ui->albums->setAutoFitItems( false );
  72. ui->albums->setWrapping( false );
  73. ui->albums->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
  74. ui->albums->setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
  75. ui->albums->delegate()->setItemSize( QSize( 170, 170 ) );
  76. ui->albums->proxyModel()->setHideDupeItems( true );
  77. ui->topHits->setFrameShape( QFrame::StyledPanel );
  78. ui->topHits->setAttribute( Qt::WA_MacShowFocusRect, 0 );
  79. m_pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultArtistImage, TomahawkUtils::ScaledCover, QSize( 48, 48 ) );
  80. ui->cover->setPixmap( TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultArtistImage, TomahawkUtils::ScaledCover, QSize( ui->cover->sizeHint() ) ) );
  81. ui->biography->setFrameShape( QFrame::NoFrame );
  82. ui->biography->setAttribute( Qt::WA_MacShowFocusRect, 0 );
  83. TomahawkUtils::styleScrollBar( ui->biography->verticalScrollBar() );
  84. QFont f = font();
  85. f.setBold( true );
  86. f.setPointSize( TomahawkUtils::defaultFontSize() + 5 );
  87. ui->artistLabel->setFont( f );
  88. QPalette p = ui->biography->palette();
  89. p.setColor( QPalette::Foreground, Qt::white );
  90. p.setColor( QPalette::Text, Qt::white );
  91. ui->artistLabel->setPalette( p );
  92. ui->biography->setPalette( p );
  93. ui->label->setPalette( p );
  94. ui->label_2->setPalette( p );
  95. ui->label_3->setPalette( p );
  96. QScrollArea* area = new QScrollArea();
  97. area->setWidgetResizable( true );
  98. area->setWidget( widget );
  99. area->setStyleSheet( "QScrollArea { background-color: #454e59; }" );
  100. area->setFrameShape( QFrame::NoFrame );
  101. area->setAttribute( Qt::WA_MacShowFocusRect, 0 );
  102. QVBoxLayout* layout = new QVBoxLayout();
  103. layout->addWidget( area );
  104. setLayout( layout );
  105. TomahawkUtils::unmarginLayout( layout );
  106. TomahawkUtils::styleScrollBar( ui->albums->horizontalScrollBar() );
  107. TomahawkUtils::styleScrollBar( ui->relatedArtists->horizontalScrollBar() );
  108. ui->biography->setStyleSheet( "QTextBrowser#biography { background-color: transparent; }" );
  109. ui->albums->setStyleSheet( "QListView { background-color: transparent; }" );
  110. ui->albumFrame->setStyleSheet( "QFrame#albumFrame { background-color: transparent; }"
  111. "QFrame#albumFrame { "
  112. "border-image: url(" RESPATH "images/scrollbar-vertical-handle.png) 3 3 3 3 stretch stretch;"
  113. "border-top: 3px transparent; border-bottom: 3px transparent; border-right: 3px transparent; border-left: 3px transparent; }" );
  114. ui->relatedArtists->setStyleSheet( "QListView { background-color: transparent; }" );
  115. ui->artistFrame->setStyleSheet( "QFrame#artistFrame { background-color: transparent; }"
  116. "QFrame#artistFrame { "
  117. "border-image: url(" RESPATH "images/scrollbar-vertical-handle.png) 3 3 3 3 stretch stretch;"
  118. "border-top: 3px transparent; border-bottom: 3px transparent; border-right: 3px transparent; border-left: 3px transparent; }" );
  119. // ui->topHits->setStyleSheet( "QTreeView#topHits { background-color: transparent; }" );
  120. ui->trackFrame->setStyleSheet( "QFrame#trackFrame { background-color: transparent; }"
  121. "QFrame#trackFrame { "
  122. "border-image: url(" RESPATH "images/scrollbar-vertical-handle.png) 3 3 3 3 stretch stretch;"
  123. "border-top: 3px transparent; border-bottom: 3px transparent; border-right: 3px transparent; border-left: 3px transparent; }" );
  124. load( artist );
  125. }
  126. ArtistInfoWidget::~ArtistInfoWidget()
  127. {
  128. tDebug() << Q_FUNC_INFO;
  129. delete ui;
  130. }
  131. Tomahawk::playlistinterface_ptr
  132. ArtistInfoWidget::playlistInterface() const
  133. {
  134. return m_plInterface;
  135. }
  136. bool
  137. ArtistInfoWidget::isBeingPlayed() const
  138. {
  139. if ( ui->albums && ui->albums->isBeingPlayed() )
  140. return true;
  141. if ( ui->relatedArtists && ui->relatedArtists->isBeingPlayed() )
  142. return true;
  143. if ( ui->albums && ui->albums->playlistInterface() == AudioEngine::instance()->currentTrackPlaylist() )
  144. return true;
  145. if ( ui->relatedArtists && ui->relatedArtists->playlistInterface() == AudioEngine::instance()->currentTrackPlaylist() )
  146. return true;
  147. if ( ui->topHits && ui->topHits->playlistInterface() == AudioEngine::instance()->currentTrackPlaylist() )
  148. return true;
  149. return false;
  150. }
  151. bool
  152. ArtistInfoWidget::jumpToCurrentTrack()
  153. {
  154. if ( ui->albums && ui->albums->jumpToCurrentTrack() )
  155. return true;
  156. if ( ui->relatedArtists && ui->relatedArtists->jumpToCurrentTrack() )
  157. return true;
  158. if ( ui->topHits && ui->topHits->jumpToCurrentTrack() )
  159. return true;
  160. if ( ui->albums && ui->albums->jumpToCurrentTrack() )
  161. return true;
  162. if ( ui->relatedArtists && ui->relatedArtists->jumpToCurrentTrack() )
  163. return true;
  164. return false;
  165. }
  166. void
  167. ArtistInfoWidget::load( const artist_ptr& artist )
  168. {
  169. if ( !m_artist.isNull() )
  170. {
  171. disconnect( m_artist.data(), SIGNAL( updated() ), this, SLOT( onArtistImageUpdated() ) );
  172. disconnect( m_artist.data(), SIGNAL( similarArtistsLoaded() ), this, SLOT( onSimilarArtistsLoaded() ) );
  173. disconnect( m_artist.data(), SIGNAL( biographyLoaded() ), this, SLOT( onBiographyLoaded() ) );
  174. disconnect( m_artist.data(), SIGNAL( albumsAdded( QList<Tomahawk::album_ptr>, Tomahawk::ModelMode ) ),
  175. this, SLOT( onAlbumsFound( QList<Tomahawk::album_ptr>, Tomahawk::ModelMode ) ) );
  176. disconnect( m_artist.data(), SIGNAL( tracksAdded( QList<Tomahawk::query_ptr>, Tomahawk::ModelMode, Tomahawk::collection_ptr ) ),
  177. this, SLOT( onTracksFound( QList<Tomahawk::query_ptr>, Tomahawk::ModelMode ) ) );
  178. }
  179. m_artist = artist;
  180. m_title = artist->name();
  181. connect( m_artist.data(), SIGNAL( biographyLoaded() ), SLOT( onBiographyLoaded() ) );
  182. connect( m_artist.data(), SIGNAL( similarArtistsLoaded() ), SLOT( onSimilarArtistsLoaded() ) );
  183. connect( m_artist.data(), SIGNAL( updated() ), SLOT( onArtistImageUpdated() ) );
  184. connect( m_artist.data(), SIGNAL( albumsAdded( QList<Tomahawk::album_ptr>, Tomahawk::ModelMode ) ),
  185. SLOT( onAlbumsFound( QList<Tomahawk::album_ptr>, Tomahawk::ModelMode ) ) );
  186. connect( m_artist.data(), SIGNAL( tracksAdded( QList<Tomahawk::query_ptr>, Tomahawk::ModelMode, Tomahawk::collection_ptr ) ),
  187. SLOT( onTracksFound( QList<Tomahawk::query_ptr>, Tomahawk::ModelMode ) ) );
  188. ui->artistLabel->setText( artist->name() );
  189. m_topHitsModel->startLoading();
  190. if ( !m_artist->albums( Mixed ).isEmpty() )
  191. onAlbumsFound( m_artist->albums( Mixed ), Mixed );
  192. if ( !m_artist->tracks().isEmpty() )
  193. onTracksFound( m_artist->tracks(), Mixed );
  194. if ( !m_artist->similarArtists().isEmpty() )
  195. onSimilarArtistsLoaded();
  196. if ( !m_artist->biography().isEmpty() )
  197. onBiographyLoaded();
  198. onArtistImageUpdated();
  199. }
  200. void
  201. ArtistInfoWidget::onAlbumsFound( const QList<Tomahawk::album_ptr>& albums, ModelMode mode )
  202. {
  203. Q_UNUSED( mode );
  204. m_albumsModel->appendAlbums( albums );
  205. }
  206. void
  207. ArtistInfoWidget::onTracksFound( const QList<Tomahawk::query_ptr>& queries, ModelMode mode )
  208. {
  209. Q_UNUSED( mode );
  210. m_topHitsModel->finishLoading();
  211. m_topHitsModel->appendQueries( queries );
  212. }
  213. void
  214. ArtistInfoWidget::onSimilarArtistsLoaded()
  215. {
  216. m_relatedModel->appendArtists( m_artist->similarArtists() );
  217. }
  218. void
  219. ArtistInfoWidget::onBiographyLoaded()
  220. {
  221. m_longDescription = m_artist->biography();
  222. emit longDescriptionChanged( m_longDescription );
  223. ui->biography->setHtml( m_artist->biography() );
  224. }
  225. void
  226. ArtistInfoWidget::onArtistImageUpdated()
  227. {
  228. if ( m_artist->cover( QSize( 0, 0 ) ).isNull() )
  229. return;
  230. m_pixmap = m_artist->cover( QSize( 0, 0 ) );
  231. emit pixmapChanged( m_pixmap );
  232. ui->cover->setPixmap( TomahawkUtils::createRoundedImage( m_artist->cover( ui->cover->sizeHint() ), QSize( 0, 0 ) ) );
  233. }
  234. void
  235. ArtistInfoWidget::changeEvent( QEvent* e )
  236. {
  237. QWidget::changeEvent( e );
  238. switch ( e->type() )
  239. {
  240. case QEvent::LanguageChange:
  241. ui->retranslateUi( this );
  242. break;
  243. default:
  244. break;
  245. }
  246. }