📄 contextbrowser.cpp
字号:
{ QueryBuilder qb; qb.clear(); //Song count qb.addReturnFunctionValue( QueryBuilder::funcCount, QueryBuilder::tabSong, QueryBuilder::valURL ); qb.setOptions( QueryBuilder::optRemoveDuplicates ); QStringList a = qb.run(); QString songCount = a[0]; qb.clear(); //Artist count //qb.addReturnFunctionValue( QueryBuilder::funcCount, QueryBuilder::tabArtist, QueryBuilder::valID ); //qb.setOptions( QueryBuilder::optRemoveDuplicates ); //a = qb.run(); //QString artistCount = a[0]; qb.setOptions( QueryBuilder::optRemoveDuplicates ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valArtistID ); //I can't get the correct value w/o suing a subquery, and querybuilder doesn't support those QString artistCount = QString::number( qb.run().count() ); qb.clear(); //Album count //qb.addReturnFunctionValue( QueryBuilder::funcCount, QueryBuilder::tabAlbum, QueryBuilder::valID ); //qb.setOptions( QueryBuilder::optRemoveDuplicates ); //a = qb.run(); //QString albumCount = a[0]; qb.setOptions( QueryBuilder::optRemoveDuplicates ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valAlbumID ); QString albumCount = QString::number( qb.run().count() ); qb.clear(); //Genre count //qb.addReturnFunctionValue( QueryBuilder::funcCount, QueryBuilder::tabGenre, QueryBuilder::valID ); //qb.setOptions( QueryBuilder::optRemoveDuplicates ); //a = qb.run(); //QString genreCount = a[0]; qb.setOptions( QueryBuilder::optRemoveDuplicates ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valGenreID ); QString genreCount = QString::number( qb.run().count() ); qb.clear(); //Total Playtime qb.addReturnFunctionValue( QueryBuilder::funcSum, QueryBuilder::tabSong, QueryBuilder::valLength ); a = qb.run(); QString playTime = MetaBundle::fuzzyTime( a[0].toInt() ); m_HTMLSource.append( QStringx( "<div id='introduction_box' class='box'>\n" "<div id='introduction_box-header-title' class='box-header'>\n" "<span id='introduction_box-header-title' class='box-header-title'>\n" + i18n( "No Track Playing" ) + "</span>\n" "</div>\n" "<table id='current_box-table' class='box-body' width='100%' cellpadding='0' cellspacing='0'>\n" "<tr>\n" "<td id='current_box-largecover-td'>\n" "<a href='%1'><img id='current_box-largecover-image' src='%2' title='Amarok'></a>\n" "</td>\n" "<td id='current_box-information-td' align='right'>\n" "<span>%3</span><br />\n" "<span>%4</span><br />\n" "<span>%5</span><br />\n" "<span>%6</span><br />\n" "<span>%7</span><br />\n" "</td>\n" "</tr>\n" "</table>\n" "</div>\n" ) .args( QStringList() << escapeHTMLAttr( "externalurl://amarok.kde.org" ) << escapeHTMLAttr( m_amarokIconPath ) << i18n( "1 Track", "%n Tracks", songCount.toInt() ) << i18n( "1 Artist", "%n Artists", artistCount.toInt() ) << i18n( "1 Album", "%n Albums", albumCount.toInt() ) << i18n( "1 Genre", "%n Genres", genreCount.toInt() ) << i18n( "%1 Play-time" ).arg ( playTime ) ) ); m_shownAlbums = showHomeByAlbums(); m_HTMLSource.append( "</div></body></html>\n");}voidCurrentTrackJob::constructHTMLAlbums( const QStringList &reqResult, QString &htmlCode, const QString &stID ){ // This function create the html code used to display a list of albums. Each album // is a 'toggleable' block. // Parameter stID is used to differentiate same albums in different album list. So if this function // is called multiple time in the same HTML code, stID must be different. for ( uint i = 0; i < reqResult.count(); i += 4 ) { QueryBuilder qb; qb.clear(); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valTitle ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valURL ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valTrack ); qb.addReturnValue( QueryBuilder::tabYear, QueryBuilder::valName ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valLength ); qb.addReturnValue( QueryBuilder::tabArtist, QueryBuilder::valName ); qb.addReturnValue( QueryBuilder::tabArtist, QueryBuilder::valID ); qb.addReturnValue( QueryBuilder::tabSong, QueryBuilder::valDiscNumber ); qb.addMatch( QueryBuilder::tabSong, QueryBuilder::valAlbumID, reqResult[i+1] ); qb.addMatch( QueryBuilder::tabSong, QueryBuilder::valArtistID, reqResult[i+3] ); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valDiscNumber ); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valTrack ); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valTitle ); qb.setOptions( QueryBuilder::optNoCompilations ); // samplers __need__ to be handled differently QStringList albumValues = qb.run(); QString albumYear; if ( !albumValues.isEmpty() ) { albumYear = albumValues[ 3 ]; for ( uint j = 0; j < albumValues.count(); j += qb.countReturnValues()) if ( albumValues[j + 3] != albumYear || albumYear == "0" ) { albumYear = QString::null; break; } } uint i_albumLength = 0; for ( uint j = 0; j < albumValues.count(); j += qb.countReturnValues() ) i_albumLength += QString(albumValues[j + 4]).toInt(); QString albumLength = ( i_albumLength==0 ? i18n( "Unknown" ) : MetaBundle::prettyTime( i_albumLength, true ) ); htmlCode.append( QStringx ( "<tr class='" + QString( (i % 4) ? "box-row-alt" : "box-row" ) + "'>\n" "<td>\n" "<div class='album-header' onClick=\"toggleBlock('IDA%1')\">\n" "<table width='100%' border='0' cellspacing='0' cellpadding='0'>\n" "<tr>\n") .args( QStringList() << stID + reqResult[i+1] )); QString albumName = escapeHTML( reqResult[ i ].isEmpty() ? i18n( "Unknown album" ) : reqResult[ i ] ); QString artistName = albumValues[5].isEmpty() ? i18n( "Unknown artist" ) : albumValues[5]; QString albumImage = ContextBrowser::getEncodedImage( CollectionDB::instance()->albumImage( albumValues[5], reqResult[ i ], true, 50 ) ); QString albumImageTitleAttr = albumImageTooltip( albumImage, 50 ); // Album image htmlCode.append( QStringx ( "<td width='1'>\n" "<a href='fetchcover:%1 @@@ %2'>\n" "<img class='album-image' align='left' vspace='2' hspace='2' title='%3' src='%4'/>\n" "</a>\n" "</td>\n" "<td valign='middle' align='left'>\n" "<a href='artist:%5'>\n" "<span class='album-title'>%6</span>\n" "</a>\n" "<span class='song-separator'> - </span>\n" "<a href='album:%7 @@@ %8'>\n" "<span class='album-title'>%9</span>\n" "</a>\n" ) .args( QStringList() << escapeHTMLAttr( albumValues[5] ) // artist name << escapeHTMLAttr( reqResult[ i ].isEmpty() ? i18n( "Unknown" ) : reqResult[ i ] ) // album.name << albumImageTitleAttr << escapeHTMLAttr( albumImage ) << escapeHTMLAttr( artistName ) << escapeHTML( artistName ) << albumValues[6] << reqResult[ i + 1 ] //album.id << albumName ) ); // Tracks number, year and length htmlCode.append( QStringx ( "<span class='album-info'>%1</span> " "<br />\n" "<span class='album-year'>%2</span>\n" "<span class='album-length'>%3</span>\n" "</td>\n") .args( QStringList() << i18n( "Single", "%n Tracks", albumValues.count() / qb.countReturnValues() ) << albumYear << albumLength) ); // Begining of the 'toggleable div' that contains the songs htmlCode.append( QStringx ( "</tr>\n" "</table>\n" "</div>\n" "<div class='album-body' style='display:%1;' id='IDA%2'>\n" ) .args( QStringList() << "none" /* shows it if it's the current track album */ << stID + reqResult[ i + 1 ] ) ); QString discNumber; if ( !albumValues.isEmpty() ) { for ( uint j = 0; j < albumValues.count(); j += qb.countReturnValues() ) { QString newDiscNumber = albumValues[ j + 7 ].stripWhiteSpace(); if( discNumber != newDiscNumber && newDiscNumber.toInt() > 0) { discNumber = newDiscNumber; htmlCode.append( QStringx ( "<div class='disc-separator'>\n" "<a href=\"albumdisc: %1 @@@ %2 @@@ %3\">\n" "%4" "</a>\n" "</div>\n" ) .args( QStringList() << albumValues[6] << reqResult[ i + 1 ] //album.id << escapeHTMLAttr( discNumber ) << i18n( "Disc %1" ).arg( discNumber ) ) ); } QString track = albumValues[j + 2].stripWhiteSpace(); if( track.length() > 0 ) { if( track.length() == 1 ) track.prepend( "0" ); track = "<span class='album-song-trackno'>\n" + track + " </span>\n"; } QString length; if( albumValues[j + 4] != "0" ) length = "<span class='album-song-time'>(" + MetaBundle::prettyTime( QString(albumValues[j + 4]).toInt(), true ) + ")</span>\n"; htmlCode.append( "<div class='album-song'>\n" "<a href=\"file:" + escapeHTMLAttr( albumValues[j + 1] ) + "\">\n" + track + "<span class='album-song-title'>\n" + escapeHTML( albumValues[j] ) + "</span> " + length + "</a>\n" "</div>\n" ); } } htmlCode.append( "</div>\n" "</td>\n" "</tr>\n" ); }}// return list of albums shownQStringListCurrentTrackJob::showHomeByAlbums(){ QueryBuilder qb; m_HTMLSource.append( "<table width='100%' cellpadding='0' cellspacing='0' border='0'><tr>\n" ); // <Fresh Podcasts Information> if( ContextBrowser::instance()->m_showFreshPodcasts ) { qb.clear(); qb.addReturnValue( QueryBuilder::tabPodcastEpisodes, QueryBuilder::valParent ); qb.addFilter( QueryBuilder::tabPodcastEpisodes, QueryBuilder::valIsNew, CollectionDB::instance()->boolT(), QueryBuilder::modeNormal, true ); qb.sortBy( QueryBuilder::tabPodcastEpisodes, QueryBuilder::valID, true ); qb.setOptions( QueryBuilder::optRemoveDuplicates ); qb.setLimit( 0, 5 ); QStringList channels = qb.run(); if( channels.count() > 0 ) { m_HTMLSource.append( "<td valign='top'><div id='least_box' class='box'>\n" "<div id='least_box-header' class='box-header'>\n" "<span id='least_box-header-title' class='box-header-title'>\n" + i18n( "Fresh Podcast Episodes" ) + "</span>\n" "</div>\n" "<table id='least_box-body' class='box-body' width='100%' cellpadding='0' cellspacing='0'>\n" ); uint i = 0; for( QStringList::iterator it = channels.begin(); it != channels.end(); it++ ) { PodcastChannelBundle pcb; if( !CollectionDB::instance()->getPodcastChannelBundle( *it, &pcb ) ) continue; QValueList<PodcastEpisodeBundle> episodes = CollectionDB::instance()->getPodcastEpisodes( *it, true /* only new */, 1 ); if( !episodes.isEmpty() ) { PodcastEpisodeBundle &ep = *episodes.begin(); QString date; ep.dateTime().isNull() ? date = ep.date() : date = ep.dateTime().toString(); QString image = CollectionDB::instance()->podcastImage( pcb.imageURL().url(), true, 50 ); QString imageAttr = escapeHTMLAttr( i18n( "Click to go to podcast website: %1." ).arg( pcb.link().prettyURL() ) ); m_HTMLSource.append( QStringx ( "<tr class='" + QString( (i % 2) ? "box-row-alt" : "box-row" ) + "'>\n" "<td>\n" "<div class='album-header' onClick=\"toggleBlock('IDP%1')\">\n" "<table width='100%' border='0' cellspacing='0' cellpadding='0'>\n" "<tr>\n" "<td width='1'>\n" "<a href='%2'>\n" "<img class='album-image' align='left' vspace='2' hspace='2' title='%3' src='%4' />\n" "</a>\n" "</td>\n" "<td valign='middle' align='left'>\n" "<span class='album-info'>%5</span> \n" "<a href='%6'><span class='album-title'>%7</span></a>\n" "<br />\n" "<span class='album-year'>%8</span>\n" "</td>\n" "</tr>\n" "</table>\n" "</div>\n" "<div cla
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -