bool ProxyBase::rowMatch( int sourceModelRow, const QString &searchTerms, int searchFields ) const { if ( !m_belowModel ) return false; Meta::TrackPtr track = m_belowModel->trackAt( sourceModelRow ); QStringList searchList = searchTerms.split(" ", QString::SkipEmptyParts); foreach( const QString& searchTerm, searchList ) { bool match = false; if ( searchFields & MatchTrack && track->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchArtist && track->artist() && track->artist()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchAlbum && track->album() && track->album()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchGenre && track->genre() && track->genre()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchComposer && track->composer() && track->composer()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchYear && track->year() && track->year()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if( searchFields & MatchRating ) { bool ok; int rating = QString( searchTerm ).remove( "rating:" ).toInt( &ok ); if( ok && ( track->statistics()->rating() == rating ) ) match = true; } if( !match ) return false; }
void LastfmInfoParser::getInfo(Meta::TrackPtr track) { DEBUG_BLOCK QMap<QString, QString> query; query[ "method" ] = "track.getInfo"; query[ "track" ] = track->name(); query[ "album" ] = track->album() ? track->album()->name() : QString(); query[ "artist" ] = track->artist() ? track->artist()->name() : QString(); query[ "apikey" ] = Amarok::lastfmApiKey(); m_jobs[ "getTrackInfo" ] = lastfm::ws::post( query ); connect( m_jobs[ "getTrackInfo" ], SIGNAL( finished() ), SLOT( onGetTrackInfo() ) ); }
bool Dynamic::AlbumPlayBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || playlist.count() <= position ) return true; Meta::TrackPtr track = playlist[position-1]; Meta::AlbumPtr album = track->album(); Meta::TrackPtr currentTrack = playlist[position]; Meta::AlbumPtr currentAlbum = currentTrack->album(); if( !album || album->tracks().isEmpty() ) return false; Meta::TrackList albumTracks = album->tracks(); if( sameTrack( track, albumTracks.last() ) && m_follow != DontCare ) return false; // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( sameTrack( albumTracks[i-1], track ) ) return sameTrack( albumTracks[i], currentTrack ); return false; } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found && sameTrack( albumTracks[i], currentTrack ) ) return true; if( sameTrack( albumTracks[i], track ) ) found = true; } return false; } else if( m_follow == DontCare ) { return album == currentAlbum; } return false; }
void IpodCopyTracksJob::slotStartDuplicateTrackSearch( const Meta::TrackPtr &track ) { Collections::QueryMaker *qm = m_coll.data()->queryMaker(); qm->setQueryType( Collections::QueryMaker::Track ); // we cannot qm->addMatch( track ) - it matches by uidUrl() qm->addFilter( Meta::valTitle, track->name(), true, true ); qm->addMatch( track->album() ); qm->setArtistQueryMode( Collections::QueryMaker::TrackArtists ); qm->addMatch( track->artist() ); qm->addMatch( track->composer() ); qm->addMatch( track->genre() ); qm->addMatch( track->year() ); qm->addNumberFilter( Meta::valTrackNr, track->trackNumber(), Collections::QueryMaker::Equals ); qm->addNumberFilter( Meta::valDiscNr, track->discNumber(), Collections::QueryMaker::Equals ); // we don't want to match by filesize, track length, filetype etc - these change during // transcoding. We don't match album artist because handling of it is inconsistent connect( qm, SIGNAL(newResultReady(Meta::TrackList)), SLOT(slotDuplicateTrackSearchNewResult(Meta::TrackList)) ); connect( qm, SIGNAL(queryDone()), SLOT(slotDuplicateTrackSearchQueryDone()) ); qm->setAutoDelete( true ); m_duplicateTrack = Meta::TrackPtr(); // reset duplicate track from previous query qm->run(); }
void CurrentEngine::trackPlaying( Meta::TrackPtr track ) { DEBUG_BLOCK m_lastQueryMaker = 0; if( m_requested.value( QLatin1String("current") ) ) update( track ); if( track && m_requested.value( QLatin1String("albums") ) ) update( track->album() ); }
Dynamic::TrackSet Dynamic::AlbumPlayBias::matchingTracks( const Meta::TrackList& playlist, int contextCount, int finalCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); Q_UNUSED( finalCount ); if( playlist.isEmpty() ) // no track means we can't find any tracks in the same album return Dynamic::TrackSet( universe, false ); Meta::TrackPtr track = playlist.last(); Meta::AlbumPtr album = track->album(); if( !album ) // no album means we can't find any tracks in the same album return Dynamic::TrackSet( universe, false ); Meta::TrackList albumTracks = album->tracks(); if( ( albumTracks.count() <= 1 ) || // the album has only one track (or even less) so there can't be any other tracks in the same album ( m_follow != DontCare && sameTrack( track, albumTracks.last() ) ) ) // track is the last one and we want to find a later one. return Dynamic::TrackSet( universe, false ); // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection TrackSet result( universe, false ); if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( sameTrack( albumTracks[i-1], track ) ) result.unite( albumTracks[i] ); } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found ) result.unite( albumTracks[i] ); if( sameTrack( albumTracks[i], track ) ) found = true; } } else if( m_follow == DontCare ) { for( int i = 0; i < albumTracks.count(); i++ ) { if( !sameTrack( albumTracks[i], track ) ) result.unite( albumTracks[i] ); } } return result; }
bool Dynamic::QuizPlayBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || position >= playlist.count()) return true; // -- determine the last character we need to quiz Meta::TrackPtr lastTrack = playlist[position-1]; Meta::DataPtr lastData; if( m_follow == TitleToTitle ) lastData = Meta::DataPtr::staticCast<Meta::Track>(lastTrack); else if( m_follow == ArtistToArtist ) lastData = Meta::DataPtr::staticCast<Meta::Artist>(lastTrack->artist()); else if( m_follow == AlbumToAlbum ) lastData = Meta::DataPtr::staticCast<Meta::Album>(lastTrack->album()); if( !lastData || lastData->name().isEmpty() ) return true; // -- determine the first character Meta::TrackPtr track = playlist[position]; Meta::DataPtr data; if( m_follow == TitleToTitle ) data = Meta::DataPtr::staticCast<Meta::Track>(track); else if( m_follow == ArtistToArtist ) data = Meta::DataPtr::staticCast<Meta::Artist>(track->artist()); else if( m_follow == AlbumToAlbum ) data = Meta::DataPtr::staticCast<Meta::Album>(track->album()); if( !data || data->name().isEmpty() ) return false; // -- now compare QString lastName = lastData->name(); QString name = data->name(); return lastChar( lastName ).toLower() == name[0].toLower(); }
void Amarok::OSD::show( Meta::TrackPtr track ) //slot { setAlignment( static_cast<OSDWidget::Alignment>( AmarokConfig::osdAlignment() ) ); setOffset( AmarokConfig::osdYOffset() ); QString text; if( !track || track->playableUrl().isEmpty() ) { text = i18n( "No track playing" ); setRating( 0 ); // otherwise stars from last rating change are visible } else { setRating( track->rating() ); text = track->prettyName(); if( track->artist() && !track->artist()->prettyName().isEmpty() ) text = track->artist()->prettyName() + " - " + text; if( track->album() && !track->album()->prettyName().isEmpty() ) text += "\n (" + track->album()->prettyName() + ") "; else text += '\n'; if( track->length() > 0 ) text += Meta::msToPrettyTime( track->length() ); } if( text.isEmpty() ) text = track->playableUrl().fileName(); if( text.startsWith( "- " ) ) //When we only have a title tag, _something_ prepends a f*****g hyphen. Remove that. text = text.mid( 2 ); if( text.isEmpty() ) //still text = i18n("No information available for this track"); QImage image; if( track && track->album() ) image = The::svgHandler()->imageWithBorder( track->album(), 100, 5 ).toImage(); OSDWidget::show( text, image ); }
void CurrentEngine::metadataChanged( Meta::TrackPtr track ) { QVariantMap trackInfo = Meta::Field::mapFromTrack( track ); if( m_trackInfo != trackInfo ) { m_trackInfo = trackInfo; setData( "current", "current", trackInfo ); if( track && m_requested.value( QLatin1String("albums") ) ) update( track->album() ); } }
Dynamic::TrackSet Dynamic::AlbumPlayBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position < 1 || position >= playlist.count() ) return Dynamic::TrackSet( universe, false ); Meta::TrackPtr track = playlist[position-1]; Meta::AlbumPtr album = track->album(); if( !album ) return Dynamic::TrackSet( universe, false ); Meta::TrackList albumTracks = album->tracks(); if( albumTracks.count() == 1 || (track == albumTracks.last() && m_follow != DontCare) ) return Dynamic::TrackSet( universe, false ); // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection TrackSet result( universe, false ); if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( albumTracks[i-1] == track ) result.unite( albumTracks[i] ); } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found ) result.unite( albumTracks[i] ); if( albumTracks[i] == track ) found = true; } } else if( m_follow == DontCare ) { for( int i = 0; i < albumTracks.count(); i++ ) { if( albumTracks[i] != track ) result.unite( albumTracks[i] ); } } return result; }
Playlist::PlaylistLayout::Part Playlist::PlaylistLayout::partForItem( const QModelIndex &index ) const { switch ( index.data( GroupRole ).toInt() ) { case Grouping::Head: // GroupMode case Grouping::Body: case Grouping::Tail: { Meta::TrackPtr track = index.data( TrackRole ).value<Meta::TrackPtr>(); if( !track->artist() || !track->album() || !track->album()->albumArtist() || ( track->artist()->name() != track->album()->albumArtist()->name() ) ) return VariousArtistsBody; else return StandardBody; } case Grouping::None: default: return Single; } }
void CurrentTrack::coverDropped( const QPixmap &cover ) { DEBUG_BLOCK Meta::TrackPtr track = The::engineController()->currentTrack(); if( !track ) return; Meta::AlbumPtr album = track->album(); if( !album ) return; if ( !cover.isNull() ) album->setImage( cover.toImage() ); }
bool CurrentEngine::sourceRequestEvent( const QString& name ) { Meta::TrackPtr track = The::engineController()->currentTrack(); m_requested[ name ] = true; if( !track ) stopped(); if( name == QLatin1String("current") ) update( track ); else if( name == QLatin1String("albums") ) track ? update(track->album()) : setData(name, Plasma::DataEngine::Data()); else return false; return true; }
Dynamic::TrackSet Dynamic::QuizPlayBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position <= 0 || position > playlist.count()) return Dynamic::TrackSet( universe, true ); // determine the last character we need to quiz Meta::TrackPtr lastTrack = playlist[position-1]; Meta::DataPtr lastData; if( m_follow == TitleToTitle ) lastData = Meta::DataPtr::staticCast<Meta::Track>(lastTrack); else if( m_follow == ArtistToArtist ) lastData = Meta::DataPtr::staticCast<Meta::Artist>(lastTrack->artist()); else if( m_follow == AlbumToAlbum ) lastData = Meta::DataPtr::staticCast<Meta::Album>(lastTrack->album()); if( !lastData || lastData->name().isEmpty() ) { // debug() << "QuizPlay: no data for"<<lastTrack->name(); return Dynamic::TrackSet( universe, true ); } m_currentCharacter = lastChar(lastData->name()).toLower(); // debug() << "QuizPlay: data for"<<lastTrack->name()<<"is"<<m_currentCharacter; // -- look if we already buffered it if( m_tracksValid && m_characterTrackMap.contains( m_currentCharacter ) ) return m_characterTrackMap.value( m_currentCharacter ); // -- start a new query m_tracks = Dynamic::TrackSet( universe, false ); QTimer::singleShot(0, const_cast<QuizPlayBias*>(this), SLOT(newQuery())); // create the new query from my parent thread return Dynamic::TrackSet(); }
void ScrobblerAdapter::copyTrackMetadata( lastfm::MutableTrack &to, const Meta::TrackPtr &track ) { to.setTitle( track->name() ); QString artistOrComposer; Meta::ComposerPtr composer = track->composer(); if( m_config->scrobbleComposer() && composer ) artistOrComposer = composer->name(); Meta::ArtistPtr artist = track->artist(); if( artistOrComposer.isEmpty() && artist ) artistOrComposer = artist->name(); to.setArtist( artistOrComposer ); Meta::AlbumPtr album = track->album(); Meta::ArtistPtr albumArtist; if( album ) { to.setAlbum( album->name() ); albumArtist = album->hasAlbumArtist() ? album->albumArtist() : Meta::ArtistPtr(); } if( albumArtist ) to.setAlbumArtist( albumArtist->name() ); to.setDuration( track->length() / 1000 ); if( track->trackNumber() >= 0 ) to.setTrackNumber( track->trackNumber() ); lastfm::Track::Source source = lastfm::Track::Player; if( track->type() == "stream/lastfm" ) source = lastfm::Track::LastFmRadio; else if( track->type().startsWith( "stream" ) ) source = lastfm::Track::NonPersonalisedBroadcast; else if( track->collection() && track->collection()->collectionId() != "localCollection" ) source = lastfm::Track::MediaDevice; to.setSource( source ); }
void CurrentEngine::update( Meta::TrackPtr track ) { if( !m_requested.value( QLatin1String("current") ) || track == m_currentTrack ) return; DEBUG_BLOCK m_currentTrack = track; removeAllData( QLatin1String("current") ); if( !track ) return; Plasma::DataEngine::Data data; QVariantMap trackInfo = Meta::Field::mapFromTrack( track ); data["current"] = trackInfo; Meta::AlbumPtr album = track->album(); data["albumart"] = QVariant( album ? The::coverCache()->getCover( album, m_coverWidth) : QPixmap() ); Capabilities::SourceInfoCapability *sic = track->create<Capabilities::SourceInfoCapability>(); if( sic ) { //is the source defined const QString source = sic->sourceName(); debug() <<" We have source " <<source; if( !source.isEmpty() ) data["source_emblem"] = sic->scalableEmblem(); delete sic; } else data["source_emblem"] = QVariant( QPixmap() ); debug() << "updating track" << track->name(); setData( "current", data ); }
QList<QAction*> CurrentTrack::contextualActions() { DEBUG_BLOCK QList<QAction*> actions; Meta::TrackPtr track = The::engineController()->currentTrack(); if( !track ) return actions; if( !m_contextActions.isEmpty() ) return m_contextActions; Meta::AlbumPtr album = track->album(); if( !album ) return actions; QScopedPointer<Capabilities::ActionsCapability> ac( album->create<Capabilities::ActionsCapability>() ); if( ac ) { m_contextActions << ac->actions(); actions.append( m_contextActions ); } return actions; }
QString TrackOrganizer::buildDestination(const QString& format, const Meta::TrackPtr& track) const { // get hold of the shared pointers Meta::AlbumPtr album = track->album(); Meta::ArtistPtr artist = track->artist(); Meta::ComposerPtr composer = track->composer(); Meta::ArtistPtr albumArtist = album ? album->albumArtist() : Meta::ArtistPtr(); Meta::GenrePtr genre = track->genre(); Meta::YearPtr year = track->year(); bool isCompilation = album && album->isCompilation(); QMap<QString, QString> args; QString strArtist = artist ? artist->name() : QString(); QString strAlbumArtist = isCompilation ? i18n( "Various Artists" ) : ( albumArtist ? albumArtist->name() : strArtist ); args["theartist"] = strArtist; args["thealbumartist"] = strAlbumArtist; if( m_postfixThe ) { Amarok::manipulateThe( strArtist, true ); Amarok::manipulateThe( strAlbumArtist, true ); } if ( track->trackNumber() ) { QString trackNum = QString("%1").arg( track->trackNumber(), 2, 10, QChar('0') ); args["track"] = trackNum; } args["title"] = track->name(); args["artist"] = strArtist; args["composer"] = composer ? composer->name() : QString(); // if year == 0 then we don't want include it QString strYear = year ? year->name() : QString(); args["year"] = strYear.localeAwareCompare( "0" ) == 0 ? QString() : strYear; args["album"] = track->album() ? track->album()->name() : QString(); args["albumartist"] = strAlbumArtist; args["comment"] = track->comment(); args["genre"] = genre ? genre->name() : QString(); if( m_targetFileExtension.isEmpty() ) args["filetype"] = track->type(); else args["filetype"] = m_targetFileExtension; QString strFolder = QFileInfo( track->playableUrl().toLocalFile() ).path(); strFolder = strFolder.mid( commonPrefixLength( m_folderPrefix, strFolder ) ); args["folder"] = strFolder; args["initial"] = strAlbumArtist.mid( 0, 1 ).toUpper(); //artists starting with The are already handled above if( track->discNumber() ) args["discnumber"] = QString::number( track->discNumber() ); args["collectionroot"] = m_folderPrefix; // some additional properties not supported by organize dialog. args["rating"] = track->statistics()->rating(); args["filesize"] = track->filesize(); args["length"] = track->length() / 1000; // Fill up default empty values for StringX formater // TODO make this values changeable by user args["default_album"] = i18n( "Unknown album" ); args["default_albumartist"] = i18n( "Unknown artist" ); args["default_artist"] = args["albumartist"]; args["default_thealbumartist"] = args["albumartist"]; args["default_theartist"] = args["albumartist"]; args["default_comment"] = i18n( "No comments" ); args["default_composer"] = i18n( "Unknown composer" ); args["default_discnumber"] = i18n( "Unknown disc number" ); args["default_genre"] = i18n( "Unknown genre" ); args["default_title"] = i18n( "Unknown title" ); args["default_year"] = i18n( "Unknown year" ); foreach( const QString &key, args.keys() ) if( key != "collectionroot" && key != "folder" ) args[key] = args[key].replace( '/', '-' ); Amarok::QStringx formatx( format ); QString result = formatx.namedOptArgs( args ); return cleanPath( result ); }
void WikipediaEngine::update() { DEBUG_BLOCK m_triedRefinedSearch = false; QString tmpWikiStr; unsubscribeFrom( m_currentTrack ); Meta::TrackPtr currentTrack = The::engineController()->currentTrack(); m_currentTrack = currentTrack; subscribeTo( currentTrack ); if ( !currentTrack ) return; DataEngine::Data data; if( selection() == "artist" ) // default, or applet told us to fetch artist { data["wikipedia"] = "label, artist"; if( currentTrack->artist() ) { data["wikipedia"] = "title", currentTrack->artist()->prettyName(); if ( ( currentTrack->playableUrl().protocol() == "lastfm" ) || ( currentTrack->playableUrl().protocol() == "daap" ) || !The::engineController()->isStream() ) { tmpWikiStr = currentTrack->artist()->name(); tmpWikiStr += wikiArtistPostfix(); //makes wikipedia bail out debug() << "tmpWikiStr: " << tmpWikiStr; } else { tmpWikiStr = currentTrack->artist()->prettyName(); tmpWikiStr += wikiArtistPostfix(); //makes wikipedia bail out } } } else if( selection() == "title" ) { tmpWikiStr = currentTrack->prettyName(); data["wikipedia"] = QString( "label" ), QString( "Title" ); data["wikipedia"] = "title", currentTrack->prettyName(); } else if( selection() == "album" ) { if( currentTrack->album() ) { data["wikipedia"] = QString( "label" ), QString( "Album" ); data["wikipedia"] = "title", currentTrack->album()->prettyName(); if ( ( currentTrack->playableUrl().protocol() == "lastfm" ) || ( currentTrack->playableUrl().protocol() == "daap" ) || !The::engineController()->isStream() ) { tmpWikiStr = currentTrack->album()->name(); tmpWikiStr += wikiAlbumPostfix(); } } } //Hack to make wiki searches work with magnatune preview tracks if ( tmpWikiStr.contains( "PREVIEW: buy it at www.magnatune.com" ) ) { tmpWikiStr = tmpWikiStr.remove(" (PREVIEW: buy it at www.magnatune.com)" ); int index = tmpWikiStr.indexOf( '-' ); if ( index != -1 ) tmpWikiStr = tmpWikiStr.left (index - 1); } if( m_wikiCurrentEntry == tmpWikiStr ) { debug() << "Same entry requested again. Ignoring."; return; } removeAllData( "wikipedia" ); foreach( const QString &key, data.keys() ) setData( key, data[key] ); m_wikiCurrentEntry = tmpWikiStr; m_wikiCurrentUrl = wikiUrl( tmpWikiStr ); debug() << "wiki url: " << m_wikiCurrentUrl; setData( "wikipedia", "message", i18n( "Fetching content.." ) ); m_wikiJob = KIO::storedGet( m_wikiCurrentUrl, KIO::NoReload, KIO::HideProgressInfo ); connect( m_wikiJob, SIGNAL( result( KJob* ) ), SLOT( wikiResult( KJob* ) ) ); }
void CurrentTrack::setupLayoutActions( Meta::TrackPtr track ) { if( !track ) return; PERF_LOG( "Begin actions layout setup" ); //first, add any global CurrentTrackActions (iow, actions that are shown for all tracks) QList<QAction *> actions = The::globalCurrentTrackActions()->actions(); using namespace Capabilities; QScopedPointer<ActionsCapability> ac( track->create<ActionsCapability>() ); if( ac ) { QList<QAction*> trackActions = ac->actions(); // ensure that the actions get deleted afterwards foreach( QAction* action, trackActions ) { if( !action->parent() ) action->setParent( this ); actions << action; } } QScopedPointer<BookmarkThisCapability> btc( track->create<BookmarkThisCapability>() ); if( btc && btc->bookmarkAction() ) { actions << btc->bookmarkAction(); } if( m_showEditTrackDetailsAction && track->editor() ) { QAction *editAction = new QAction( KIcon("media-track-edit-amarok"), i18n("Edit Track Details"), this ); connect( editAction, SIGNAL(triggered()), SLOT(editTrack()) ); m_customActions << editAction; } if( track->has<FindInSourceCapability>() ) { if( !m_findInSourceSignalMapper ) { m_findInSourceSignalMapper = new QSignalMapper( this ); connect( m_findInSourceSignalMapper, SIGNAL(mapped(QString)), SLOT(findInSource(QString)) ); } Meta::AlbumPtr album = track->album(); Meta::ArtistPtr artist = track->artist(); Meta::ComposerPtr composer = track->composer(); Meta::GenrePtr genre = track->genre(); Meta::YearPtr year = track->year(); QAction *act( 0 ); if( album && !album->name().isEmpty() ) { act = new QAction( KIcon("current-track-amarok"), i18n("Show Album in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("album") ); m_customActions << act; } if( artist && !artist->name().isEmpty() ) { act = new QAction( KIcon("filename-artist-amarok"), i18n("Show Artist in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("artist") ); m_customActions << act; KPluginInfo::List services = The::pluginManager()->plugins( QLatin1String("Service") ); foreach( const KPluginInfo &service, services ) { if( service.pluginName() == QLatin1String("amarok_service_amazonstore") ) { if( service.isPluginEnabled() ) { act = new QAction( KIcon("view-services-amazon-amarok"), i18n("Search for Artist in the MP3 Music Store"), this ); connect( act, SIGNAL(triggered()), this, SLOT(findInStore()) ); m_customActions << act; } break; } } } if( composer && !composer->name().isEmpty() && (composer->name() != i18n("Unknown Composer")) ) { act = new QAction( KIcon("filename-composer-amarok"), i18n("Show Composer in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("composer") ); m_customActions << act; } if( genre && !genre->name().isEmpty() ) { act = new QAction( KIcon("filename-genre-amarok"), i18n("Show Genre in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("genre") ); m_customActions << act; } if( year && !year->name().isEmpty() ) { act = new QAction( KIcon("filename-year-amarok"), i18n("Show Year in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("year") ); m_customActions << act; } }
QList<PopupDropperAction*> Playlist::ViewCommon::actionsFor( QWidget *parent, const QModelIndex *index, bool coverActions ) { QList<PopupDropperAction*> actions; Meta::TrackPtr track = index->data( Playlist::TrackRole ).value< Meta::TrackPtr >(); PopupDropperAction *separator = new PopupDropperAction( parent ); separator->setSeparator( true ); const bool isCurrentTrack = index->data( Playlist::ActiveTrackRole ).toBool(); PopupDropperAction *stopAction = new PopupDropperAction( KIcon( "media-playback-stop-amarok" ), i18n( "Stop Playing After This Track" ), parent ); QObject::connect( stopAction, SIGNAL( triggered() ), parent, SLOT( stopAfterTrack() ) ); actions << stopAction; actions << separator; const bool isQueued = index->data( Playlist::StateRole ).toInt() & Item::Queued; const QString queueText = !isQueued ? i18n( "Queue Track" ) : i18n( "Dequeue Track" ); PopupDropperAction *queueAction = new PopupDropperAction( KIcon( "media-track-queue-amarok" ), queueText, parent ); if( isQueued ) QObject::connect( queueAction, SIGNAL( triggered() ), parent, SLOT( dequeueSelection() ) ); else QObject::connect( queueAction, SIGNAL( triggered() ), parent, SLOT( queueSelection() ) ); actions << queueAction; actions << separator; PopupDropperAction *removeAction = new PopupDropperAction( KIcon( "media-track-remove-amarok" ), i18n( "Remove From Playlist" ), parent ); QObject::connect( removeAction, SIGNAL( triggered() ), parent, SLOT( removeSelection() ) ); actions << removeAction; actions << separator; //lets see if parent is the currently playing tracks, and if it has CurrentTrackActionsCapability if( isCurrentTrack ) { QList<QAction*> globalCurrentTrackActions = The::globalCurrentTrackActions()->actions(); foreach( QAction *action, globalCurrentTrackActions ) actions << PopupDropperAction::from( action ); if ( track->hasCapabilityInterface( Meta::Capability::CurrentTrackActions ) ) { Meta::CurrentTrackActionsCapability *cac = track->create<Meta::CurrentTrackActionsCapability>(); if ( cac ) { QList<PopupDropperAction *> actions = cac->customActions(); foreach( PopupDropperAction *action, actions ) actions << action; } delete cac; } } actions << separator; if ( coverActions ) { Meta::AlbumPtr album = track->album(); if ( album ) { Meta::CustomActionsCapability *cac = album->create<Meta::CustomActionsCapability>(); if ( cac ) { QList<PopupDropperAction *> customActions = cac->customActions(); foreach( PopupDropperAction *customAction, customActions ) actions << customAction; } delete cac; } } actions << separator; const bool isMultiSource = index->data( Playlist::MultiSourceRole ).toBool(); if( isMultiSource ) { PopupDropperAction *selectSourceAction = new PopupDropperAction( KIcon( "media-playlist-repeat" ), i18n( "Select Source" ), parent ); QObject::connect( selectSourceAction, SIGNAL( triggered() ), parent, SLOT( selectSource() ) ); actions << selectSourceAction; } PopupDropperAction *editAction = new PopupDropperAction( KIcon( "media-track-edit-amarok" ), i18n( "Edit Track Details" ), parent ); QObject::connect( editAction, SIGNAL( triggered() ), parent, SLOT( editTrackInformation() ) ); actions << editAction; return actions; }
QVariant Meta::valueForField( qint64 field, Meta::TrackPtr track ) { if( !track ) return QVariant(); switch( field ) { case 0: { // that is the simple search for MetaQueryWidget QSet<QString> allInfos; allInfos += track->playableUrl().path() += track->name() += track->comment(); if( track->artist() ) allInfos += track->artist()->name(); if( track->album() ) allInfos += track->album()->name(); if( track->genre() ) allInfos += track->genre()->name(); return QVariant( allInfos.toList() ); } case Meta::valUrl: return track->playableUrl().path(); case Meta::valTitle: return track->name(); case Meta::valArtist: return track->artist() ? QVariant(track->artist()->name()) : QVariant(); case Meta::valAlbum: return track->album() ? QVariant(track->album()->name()) : QVariant(); case Meta::valGenre: return track->genre() ? QVariant(track->genre()->name()) : QVariant(); case Meta::valComposer: return track->composer() ? QVariant(track->composer()->name()) : QVariant(); case Meta::valYear: return track->year() ? QVariant(track->year()->name().toInt()) : QVariant(); case Meta::valComment: return track->comment(); case Meta::valTrackNr: return track->trackNumber(); case Meta::valDiscNr: return track->discNumber(); case Meta::valBpm: return track->bpm(); case Meta::valLength: return track->length(); case Meta::valBitrate: return track->bitrate(); case Meta::valSamplerate: return track->sampleRate(); case Meta::valFilesize: return track->filesize(); case Meta::valFormat: return int(Amarok::FileTypeSupport::fileType(track->type())); case Meta::valCreateDate: return track->createDate(); case Meta::valScore: return track->statistics()->score(); case Meta::valRating: return track->statistics()->rating(); case Meta::valFirstPlayed: return track->statistics()->firstPlayed(); case Meta::valLastPlayed: return track->statistics()->lastPlayed(); case Meta::valPlaycount: return track->statistics()->playCount(); case Meta::valUniqueId: return track->uidUrl(); // todo case Meta::valTrackGain: return "track gain"; case Meta::valTrackGainPeak: return "track gain peak"; case Meta::valAlbumGain: return "album gain"; case Meta::valAlbumGainPeak: return "album gain peak"; case Meta::valAlbumArtist: return (track->album() && track->album()->albumArtist()) ? QVariant(track->album()->albumArtist()->name()) : QVariant(); case Meta::valLabel: { Meta::LabelList labels = track->labels(); QStringList strLabels; foreach( Meta::LabelPtr label, labels ) strLabels.append( label->name() ); return QVariant( strLabels ); } case Meta::valModified: return track->modifyDate(); default: return QVariant(); } }