tracktooltip.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 352 行
CPP
352 行
/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.*//* tracktooltip.cpp begin: Tue 10 Feb 2004 copyright: (C) 2004 by Christian Muehlhaeuser email: chris@chris.de copyright: (C) 2005 by Gábor Lehel email: illissius@gmail.com*/#include "amarok.h"#include "app.h"#include "amarokconfig.h"#include "debug.h"#include "metabundle.h"#include "moodbar.h"#include "collectiondb.h"#include "playlist.h"#include "playlistitem.h"#include "podcastbundle.h"#include <qapplication.h>#include <kstandarddirs.h>#include "tracktooltip.h"TrackToolTip *TrackToolTip::instance(){ static TrackToolTip tip; return &tip;}TrackToolTip::TrackToolTip(): m_haspos( false ){ connect( CollectionDB::instance(), SIGNAL( coverChanged( const QString &, const QString & ) ), this, SLOT( slotCoverChanged( const QString &, const QString & ) ) ); connect( CollectionDB::instance(), SIGNAL( imageFetched( const QString & ) ), this, SLOT( slotImageChanged( const QString & ) ) ); connect( Playlist::instance(), SIGNAL( columnsChanged() ), this, SLOT( slotUpdate() ) ); connect( CollectionDB::instance(), SIGNAL( scoreChanged( const QString&, float ) ), this, SLOT( slotUpdate( const QString& ) ) ); connect( CollectionDB::instance(), SIGNAL( ratingChanged( const QString&, int ) ), this, SLOT( slotUpdate( const QString& ) ) ); // Only connect this once -- m_tags exists for the lifetime of this instance connect( &m_tags.moodbar(), SIGNAL( jobEvent( int ) ), SLOT( slotMoodbarEvent() ) ); // This is so the moodbar can be re-rendered when AlterMood is changed connect( App::instance(), SIGNAL( moodbarPrefs( bool, bool, int, bool ) ), SLOT( slotMoodbarEvent() ) ); clear();}void TrackToolTip::addToWidget( QWidget *widget ){ if( widget && !m_widgets.containsRef( widget ) ) { m_widgets.append( widget ); Amarok::ToolTip::add( this, widget ); }}void TrackToolTip::removeFromWidget( QWidget *widget ){ if( widget && m_widgets.containsRef( widget ) ) { Amarok::ToolTip::remove( widget ); m_widgets.removeRef( widget ); }}#define MOODBAR_WIDTH 150void TrackToolTip::setTrack( const MetaBundle &tags, bool force ){ if( force || m_tags != tags || m_tags.url() != tags.url() ) { m_haspos = false; m_tooltip = QString::null; QStringList left, right; const QString tableRow = "<tr><td width=70 align=right>%1:</td><td align=left>%2</td></tr>"; QString filename = "", title = ""; //special case these, put the first one encountered on top Playlist *playlist = Playlist::instance(); const int n = playlist->numVisibleColumns(); for( int i = 0; i < n; ++i ) { const int column = playlist->mapToLogicalColumn( i ); if( column == PlaylistItem::Score ) { const float score = CollectionDB::instance()->getSongPercentage( tags.url().path() ); if( score > 0.f ) { right << QString::number( score, 'f', 2 ); // 2 digits after decimal point left << playlist->columnText( column ); } } else if( column == PlaylistItem::Rating ) { const int rating = CollectionDB::instance()->getSongRating( tags.url().path() ); if( rating > 0 ) { QString s; for( int i = 0; i < rating / 2; ++i ) s += QString( "<img src=\"%1\" height=\"%2\" width=\"%3\">" ) .arg( locate( "data", "amarok/images/star.png" ) ) .arg( QFontMetrics( QToolTip::font() ).height() ) .arg( QFontMetrics( QToolTip::font() ).height() ); if( rating % 2 ) s += QString( "<img src=\"%1\" height=\"%2\" width=\"%3\">" ) .arg( locate( "data", "amarok/images/smallstar.png" ) ) .arg( QFontMetrics( QToolTip::font() ).height() ) .arg( QFontMetrics( QToolTip::font() ).height() ); right << s; left << playlist->columnText( column ); } } else if( column == PlaylistItem::Mood ) { if( !AmarokConfig::showMoodbar() ) continue; m_tags.moodbar().load(); switch( tags.moodbar_const().state() ) { case Moodbar::JobQueued: case Moodbar::JobRunning: right << tags.prettyText( column ); left << playlist->columnText( column ); break; case Moodbar::Loaded: { // Ok so this is a hack, but it works quite well. // Save an image in the user's home directory just so // it can be referenced in an <img> tag. Store which // moodbar is saved in m_moodbarURL so we don't have // to re-save it every second. left << playlist->columnText( column ); QString filename = ::locateLocal( "data", "amarok/mood_tooltip.png" ); int height = QFontMetrics( QToolTip::font() ).height() - 2; if( m_moodbarURL != tags.url().url() ) { QPixmap moodbar = const_cast<MetaBundle&>( tags ).moodbar().draw( MOODBAR_WIDTH, height ); moodbar.save( filename, "PNG", 100 ); m_moodbarURL = tags.url().url(); } right << QString( "<img src=\"%1\" height=\"%2\" width=\"%3\">" ) .arg( filename ).arg( height ).arg( MOODBAR_WIDTH ); } break; default: // no tag break; } } else if( column == PlaylistItem::PlayCount ) { const int count = CollectionDB::instance()->getPlayCount( tags.url().path() ); if( count > 0 ) { right << QString::number( count ); left << playlist->columnText( column ); } } else if( column == PlaylistItem::LastPlayed ) { const uint lastPlayed = CollectionDB::instance()->getLastPlay( tags.url().path() ).toTime_t(); right << Amarok::verboseTimeSince( lastPlayed ); left << playlist->columnText( column ); } else if( column == PlaylistItem::Filename && title.isEmpty() ) filename = tags.prettyText( column ); else if( column == PlaylistItem::Title && filename.isEmpty() ) title = tags.prettyText( column ); else if( column != PlaylistItem::Length ) { const QString tag = tags.prettyText( column ); if( !tag.isEmpty() ) { right << tag; left << playlist->columnText( column ); } } } if( !filename.isEmpty() ) { right.prepend( filename ); left.prepend( playlist->columnText( PlaylistItem::Filename ) ); } else if( !title.isEmpty() ) { right.prepend( title ); left.prepend( playlist->columnText( PlaylistItem::Title ) ); } if( tags.length() > 0 ) //special case this too, always on the bottom { m_haspos = true; right << "%9 / " + tags.prettyLength(); left << playlist->columnText( PlaylistItem::Length ); } //NOTE it seems to be necessary to <center> each element indivdually m_tooltip += "<center><b>Amarok</b></center><table cellpadding='2' cellspacing='2' align='center'><tr>"; m_tooltip += "%1"; //the cover gets substituted in, in tooltip() m_cover = CollectionDB::instance()->podcastImage( tags, true ); if( m_cover.isEmpty() || m_cover.contains( "nocover" ) != -1 ) { m_cover = CollectionDB::instance()->albumImage( tags, true, 150 ); if ( m_cover == CollectionDB::instance()->notAvailCover() ) m_cover = QString::null; } m_tooltip += "<td><table cellpadding='0' cellspacing='0'>"; if (tags.title().isEmpty() || tags.artist().isEmpty()) // no title or no artist, so we add prettyTitle m_tooltip += QString ("<tr><td align=center colspan='2'>%1</td></tr>") .arg(tags.veryNiceTitle()); for( uint x = 0; x < left.count(); ++x ) if ( !right[x].isEmpty() ) m_tooltip += tableRow.arg( left[x] ).arg( right[x] ); m_tooltip += "</table></td>"; m_tooltip += "</tr></table></center>"; m_tags = tags; updateWidgets(); }}void TrackToolTip::setPos( int pos ){ if( m_pos != pos ) { m_pos = pos; updateWidgets(); }}void TrackToolTip::clear(){ m_pos = 0; m_cover = QString::null; m_tooltip = i18n( "Amarok - rediscover your music" ); m_tags = MetaBundle(); m_tags.setUrl( KURL() ); updateWidgets();}QPair<QString, QRect> TrackToolTip::toolTipText( QWidget*, const QPoint& ) const{ return QPair<QString, QRect>( tooltip(), QRect() );}void TrackToolTip::slotCoverChanged( const QString &artist, const QString &album ){ if( artist == m_tags.artist() && album == m_tags.album() ) { m_cover = CollectionDB::instance()->albumImage( m_tags, true, 150 ); if( m_cover == CollectionDB::instance()->notAvailCover() ) m_cover = QString::null; updateWidgets(); }}void TrackToolTip::slotImageChanged( const QString &remoteURL ){ PodcastEpisodeBundle peb; if( CollectionDB::instance()->getPodcastEpisodeBundle( m_tags.url().url(), &peb ) ) { PodcastChannelBundle pcb; if( CollectionDB::instance()->getPodcastChannelBundle( peb.parent().url(), &pcb ) ) { if( pcb.imageURL().url() == remoteURL ) { m_cover = CollectionDB::instance()->podcastImage( remoteURL ); if( m_cover == CollectionDB::instance()->notAvailCover() ) m_cover = QString::null; updateWidgets(); } } }}void TrackToolTip::slotUpdate( const QString &url ){ if( url.isNull() || url == m_tags.url().path() ) setTrack( m_tags, true );}voidTrackToolTip::slotMoodbarEvent( void ){ // Clear this so the moodbar gets redrawn m_moodbarURL = QString::null; // Reset the moodbar in case AlterMood has changed m_tags.moodbar().reset(); setTrack( m_tags, true );}QString TrackToolTip::tooltip() const{ QString tip = m_tooltip;; if( !m_tags.isEmpty() ) { if( !m_cover.isEmpty() ) tip = tip.arg( QString( "<td><table cellpadding='0' cellspacing='0'><tr><td>" "<img src='%1'>" "</td></tr></table></td>" ).arg( m_cover ) ); else tip = tip.arg(""); if( m_haspos ) tip = tip.arg( MetaBundle::prettyLength( m_pos / 1000, true ) ); } return tip;}void TrackToolTip::updateWidgets(){ Amarok::ToolTip::updateTip();}#include "tracktooltip.moc"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?