~ubuntu-branches/ubuntu/trusty/tomahawk/trusty-proposed

« back to all changes in this revision

Viewing changes to src/libtomahawk/widgets/infowidgets/TrackInfoWidget.cpp

  • Committer: Package Import Robot
  • Author(s): Harald Sitter
  • Date: 2013-03-07 21:50:13 UTC
  • Revision ID: package-import@ubuntu.com-20130307215013-6gdjkdds7i9uenvs
Tags: upstream-0.6.0+dfsg
ImportĀ upstreamĀ versionĀ 0.6.0+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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-2012, Jeff Mitchell <jeff@tomahawk-player.org>
 
5
 *   Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
 
6
 *
 
7
 *   Tomahawk is free software: you can redistribute it and/or modify
 
8
 *   it under the terms of the GNU General Public License as published by
 
9
 *   the Free Software Foundation, either version 3 of the License, or
 
10
 *   (at your option) any later version.
 
11
 *
 
12
 *   Tomahawk is distributed in the hope that it will be useful,
 
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 
15
 *   GNU General Public License for more details.
 
16
 *
 
17
 *   You should have received a copy of the GNU General Public License
 
18
 *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
 
19
 */
 
20
 
 
21
#include "TrackInfoWidget.h"
 
22
#include "ui_TrackInfoWidget.h"
 
23
 
 
24
#include <QScrollArea>
 
25
#include <QScrollBar>
 
26
 
 
27
#include "ViewManager.h"
 
28
#include "SourceList.h"
 
29
#include "playlist/PlayableModel.h"
 
30
#include "audio/AudioEngine.h"
 
31
 
 
32
#include "utils/TomahawkUtilsGui.h"
 
33
#include "utils/Logger.h"
 
34
 
 
35
using namespace Tomahawk;
 
36
 
 
37
 
 
38
TrackInfoWidget::TrackInfoWidget( const Tomahawk::query_ptr& query, QWidget* parent )
 
39
    : QWidget( parent )
 
40
    , ui( new Ui::TrackInfoWidget )
 
41
    , m_scrollArea( 0 )
 
42
{
 
43
    QWidget* widget = new QWidget;
 
44
    ui->setupUi( widget );
 
45
 
 
46
    QPalette pal = palette();
 
47
    pal.setColor( QPalette::Window, QColor( "#272b2e" ) );
 
48
 
 
49
    widget->setPalette( pal );
 
50
    widget->setAutoFillBackground( true );
 
51
 
 
52
    ui->statsLabel->setStyleSheet( "QLabel { background-image:url(); border: 2px solid #dddddd; background-color: #faf9f9; border-radius: 4px; padding: 12px; }" );
 
53
    ui->lyricsView->setStyleSheet( "QTextBrowser#lyricsView { background-color: transparent; }" );
 
54
 
 
55
    ui->lyricsView->setFrameShape( QFrame::NoFrame );
 
56
    ui->lyricsView->setAttribute( Qt::WA_MacShowFocusRect, 0 );
 
57
    ui->lyricsView->setVisible( false ); // FIXME eventually
 
58
 
 
59
    ui->similarTracksView->setAutoResize( true );
 
60
    ui->similarTracksView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
 
61
//    TomahawkUtils::styleScrollBar( ui->similarTracksView->verticalScrollBar() );
 
62
    TomahawkUtils::styleScrollBar( ui->lyricsView->verticalScrollBar() );
 
63
 
 
64
//    ui->similarTracksView->setStyleSheet( "QListView { background-color: transparent; } QListView::item { background-color: transparent; }" );
 
65
 
 
66
    QFont f = ui->statsLabel->font();
 
67
    f.setPointSize( TomahawkUtils::defaultFontSize() + 2 );
 
68
    f.setBold( true );
 
69
    ui->statsLabel->setFont( f );
 
70
 
 
71
    QPalette p = ui->lyricsView->palette();
 
72
    p.setColor( QPalette::Foreground, Qt::white );
 
73
    p.setColor( QPalette::Text, Qt::white );
 
74
 
 
75
    ui->lyricsView->setPalette( p );
 
76
    ui->label->setPalette( p );
 
77
//    ui->similarTracksLabel->setPalette( p );
 
78
 
 
79
    m_relatedTracksModel = new PlayableModel( ui->similarTracksView );
 
80
    ui->similarTracksView->setPlayableModel( m_relatedTracksModel );
 
81
    ui->similarTracksView->proxyModel()->sort( -1 );
 
82
    ui->similarTracksView->setEmptyTip( tr( "Sorry, but we could not find similar tracks for this song!" ) );
 
83
 
 
84
    m_pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultTrackImage, TomahawkUtils::Original, QSize( 48, 48 ) );
 
85
    ui->cover->setPixmap( TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultTrackImage, TomahawkUtils::Grid, ui->cover->size() ) );
 
86
    ui->cover->setShowText( true );
 
87
    
 
88
    m_scrollArea = new QScrollArea();
 
89
    m_scrollArea->setWidgetResizable( true );
 
90
    m_scrollArea->setWidget( widget );
 
91
    m_scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
 
92
 
 
93
    m_scrollArea->setStyleSheet( "QScrollArea { background-color: #454e59 }" );
 
94
    m_scrollArea->setFrameShape( QFrame::NoFrame );
 
95
    m_scrollArea->setAttribute( Qt::WA_MacShowFocusRect, 0 );
 
96
 
 
97
    QVBoxLayout* layout = new QVBoxLayout();
 
98
    layout->addWidget( m_scrollArea );
 
99
    setLayout( layout );
 
100
    TomahawkUtils::unmarginLayout( layout );
 
101
 
 
102
    ui->similarTracksView->setStyleSheet( "QListView { background-color: transparent; }" );
 
103
    ui->frame->setStyleSheet( "QFrame#frame { background-color: transparent; }"
 
104
                              "QFrame#frame { "
 
105
                              "border-image: url(" RESPATH "images/widget-border.png) 3 3 3 3 stretch stretch;"
 
106
                              "border-top: 3px transparent; border-bottom: 3px transparent; border-right: 3px transparent; border-left: 3px transparent; }" );
 
107
 
 
108
    load( query );
 
109
}
 
110
 
 
111
 
 
112
TrackInfoWidget::~TrackInfoWidget()
 
113
{
 
114
    tDebug() << Q_FUNC_INFO;
 
115
    delete ui;
 
116
}
 
117
 
 
118
 
 
119
Tomahawk::playlistinterface_ptr
 
120
TrackInfoWidget::playlistInterface() const
 
121
{
 
122
    return ui->similarTracksView->playlistInterface();
 
123
}
 
124
 
 
125
 
 
126
bool
 
127
TrackInfoWidget::isBeingPlayed() const
 
128
{
 
129
    if ( ui->similarTracksView->playlistInterface() == AudioEngine::instance()->currentTrackPlaylist() )
 
130
        return true;
 
131
 
 
132
    if ( ui->similarTracksView->playlistInterface()->hasChildInterface( AudioEngine::instance()->currentTrackPlaylist() ) )
 
133
        return true;
 
134
 
 
135
    return false;
 
136
}
 
137
 
 
138
 
 
139
bool
 
140
TrackInfoWidget::jumpToCurrentTrack()
 
141
{
 
142
    if ( ui->similarTracksView->jumpToCurrentTrack() && !ui->similarTracksView->currentTrackRect().isEmpty() )
 
143
    {
 
144
        // We embed the view in a scrollarea, so we have to manually ensure we make it visible
 
145
        const QRect itemRect = ui->similarTracksView->currentTrackRect();
 
146
        m_scrollArea->ensureVisible( itemRect.right(), itemRect.bottom(), 50, 50 );
 
147
 
 
148
        return true;
 
149
    }
 
150
 
 
151
    return false;
 
152
}
 
153
 
 
154
 
 
155
void
 
156
TrackInfoWidget::load( const query_ptr& query )
 
157
{
 
158
    m_query = query;
 
159
    m_artist = Artist::get( m_query->artist() );
 
160
    m_title = QString( "%1 - %2" ).arg( query->artist() ).arg( query->track() );
 
161
 
 
162
    if ( !m_query.isNull() )
 
163
    {
 
164
        disconnect( m_query.data(), SIGNAL( lyricsLoaded() ), this, SLOT( onLyricsLoaded() ) );
 
165
        disconnect( m_query.data(), SIGNAL( similarTracksLoaded() ), this, SLOT( onSimilarTracksLoaded() ) );
 
166
        disconnect( m_query.data(), SIGNAL( statsLoaded() ), this, SLOT( onStatsLoaded() ) );
 
167
        disconnect( m_query.data(), SIGNAL( updated() ), this, SLOT( onCoverUpdated() ) );
 
168
        disconnect( m_artist.data(), SIGNAL( statsLoaded() ), this, SLOT( onStatsLoaded() ) );
 
169
        disconnect( m_artist.data(), SIGNAL( similarArtistsLoaded() ), this, SLOT( onSimilarArtistsLoaded() ) );
 
170
    }
 
171
 
 
172
    connect( m_artist.data(), SIGNAL( similarArtistsLoaded() ), SLOT( onSimilarArtistsLoaded() ) );
 
173
    connect( m_artist.data(), SIGNAL( statsLoaded() ), SLOT( onStatsLoaded() ) );
 
174
    connect( m_query.data(), SIGNAL( lyricsLoaded() ), SLOT( onLyricsLoaded() ) );
 
175
    connect( m_query.data(), SIGNAL( similarTracksLoaded() ), SLOT( onSimilarTracksLoaded() ) );
 
176
    connect( m_query.data(), SIGNAL( updated() ), SLOT( onCoverUpdated() ) );
 
177
    connect( m_query.data(), SIGNAL( statsLoaded() ), SLOT( onStatsLoaded() ) );
 
178
 
 
179
    m_artist->loadStats();
 
180
    m_query->loadStats();
 
181
//    m_query->lyrics();
 
182
    onCoverUpdated();
 
183
 
 
184
    ui->cover->setQuery( query );
 
185
 
 
186
    m_relatedTracksModel->clear();
 
187
    m_relatedTracksModel->startLoading();
 
188
 
 
189
    if ( !m_query->similarTracks().isEmpty() )
 
190
        onSimilarTracksLoaded();
 
191
}
 
192
 
 
193
 
 
194
void
 
195
TrackInfoWidget::onCoverUpdated()
 
196
{
 
197
    if ( m_query->cover( QSize( 0, 0 ) ).isNull() )
 
198
        return;
 
199
 
 
200
    m_pixmap = m_query->cover( ui->cover->size() );
 
201
    ui->cover->setPixmap( TomahawkUtils::createRoundedImage( m_pixmap, QSize( 0, 0 ) ) );
 
202
}
 
203
 
 
204
 
 
205
void
 
206
TrackInfoWidget::onStatsLoaded()
 
207
{
 
208
    QList< Tomahawk::PlaybackLog > history = m_query->playbackHistory( SourceList::instance()->getLocal() );
 
209
    const unsigned int trackCounter = m_query->playbackCount( SourceList::instance()->getLocal() );
 
210
    const unsigned int artistCounter = m_artist->playbackCount( SourceList::instance()->getLocal() );
 
211
 
 
212
    QString stats;
 
213
 
 
214
    if ( trackCounter )
 
215
        stats = tr( "You've listened to this track %n time(s).", "", trackCounter );
 
216
    else
 
217
        stats = tr( "You've never listened to this track before." );
 
218
 
 
219
    if ( history.count() )
 
220
    {
 
221
        stats += "\n" + tr( "You first listened to it on %1." ).arg( QDateTime::fromTime_t( history.first().timestamp ).toString( "dd MMM yyyy" ) );
 
222
    }
 
223
 
 
224
    if ( artistCounter )
 
225
        stats += "\n" + tr( "You've listened to %1 %n time(s).", "", artistCounter ).arg( m_artist->name() );
 
226
    else
 
227
        stats += "\n" + tr( "You've never listened to %1 before." ).arg( m_artist->name() );
 
228
 
 
229
    ui->statsLabel->setText( stats );
 
230
}
 
231
 
 
232
 
 
233
void
 
234
TrackInfoWidget::onSimilarArtistsLoaded()
 
235
{
 
236
/*    Artist* artist = qobject_cast<Artist*>( sender() );
 
237
 
 
238
    m_relatedArtistsModel->addArtists( artist->similarArtists() );*/
 
239
}
 
240
 
 
241
 
 
242
void
 
243
TrackInfoWidget::onSimilarTracksLoaded()
 
244
{
 
245
    m_relatedTracksModel->appendQueries( m_query->similarTracks() );
 
246
    m_relatedTracksModel->finishLoading();
 
247
}
 
248
 
 
249
 
 
250
void
 
251
TrackInfoWidget::onLyricsLoaded()
 
252
{
 
253
    ui->lyricsView->setHtml( m_query->lyrics().join( "<br/>" ) );
 
254
}
 
255
 
 
256
 
 
257
void
 
258
TrackInfoWidget::onArtistClicked()
 
259
{
 
260
    ViewManager::instance()->show( Artist::get( m_query->artist(), false ) );
 
261
}
 
262
 
 
263
 
 
264
void
 
265
TrackInfoWidget::onAlbumClicked()
 
266
{
 
267
    artist_ptr artist = Artist::get( m_query->artist(), false );
 
268
    ViewManager::instance()->show( Album::get( artist, m_query->album(), false ) );
 
269
}
 
270
 
 
271
 
 
272
void
 
273
TrackInfoWidget::changeEvent( QEvent* e )
 
274
{
 
275
    QWidget::changeEvent( e );
 
276
    switch ( e->type() )
 
277
    {
 
278
        case QEvent::LanguageChange:
 
279
            ui->retranslateUi( this );
 
280
            break;
 
281
 
 
282
        default:
 
283
            break;
 
284
    }
 
285
}