void MediaDeviceTrack::setGenre( const QString &newGenre ) { if( !m_collection ) return; MediaDeviceGenrePtr genrePtr; MediaDeviceTrackPtr track( this ); GenreMap genreMap = m_collection.data()->memoryCollection()->genreMap(); // do cleanup of soon to be previous genre genrePtr = m_genre; if ( !genrePtr.isNull() ) { // remove track from previous genre's tracklist genrePtr->remTrack( track ); // if genre's tracklist is empty, remove genre from genremap if( genrePtr->tracks().isEmpty() ) genreMap.remove( genrePtr->name() ); } // change to a new genre // check for the existence of the genre to be set to, // if genre exists, reuse, else create if ( genreMap.contains( newGenre ) ) { genrePtr = MediaDeviceGenrePtr::staticCast( genreMap.value( newGenre ) ); } else { genrePtr = MediaDeviceGenrePtr( new MediaDeviceGenre( newGenre ) ); genreMap.insert( newGenre, GenrePtr::staticCast( genrePtr ) ); } // add track to genre's tracklist genrePtr->addTrack( track ); // set track's genre to the new genre setGenre( genrePtr ); m_collection.data()->memoryCollection()->acquireWriteLock(); m_collection.data()->memoryCollection()->setGenreMap( genreMap ); m_collection.data()->memoryCollection()->releaseLock(); }