Commit d9afd582 authored by Scott Wheeler's avatar Scott Wheeler

Since 3.5 devel seems to have mostly slowed down, I'm synching with the branch

now.  This probably doesn't come anywhere close to compiling, but...

svn path=/trunk/KDE/kdemultimedia/juk/; revision=513849
parent 0c034232
......@@ -23,7 +23,7 @@ file currently being worked in should be followed. So:
static void foo()
{
if(bar()) // <-- 4 spaces
baz() // <-- 1 tab
baz() // <-- 8 spaces
}
================================================================================
......
......@@ -32,7 +32,8 @@ using namespace aKode;
////////////////////////////////////////////////////////////////////////////////
aKodePlayer::aKodePlayer() : Player(),
m_player(0)
m_player(0),
m_volume(1.0)
{}
aKodePlayer::~aKodePlayer()
......@@ -61,6 +62,7 @@ void aKodePlayer::play(const FileHandle &file)
else {
m_player = new aKode::Player();
m_player->open("auto");
m_player->setVolume(m_volume);
}
if (m_player->load(filename.local8Bit().data()))
......@@ -84,16 +86,15 @@ void aKodePlayer::stop()
void aKodePlayer::setVolume(float volume)
{
m_volume = volume;
if (m_player)
m_player->setVolume(volume);
m_player->setVolume(m_volume);
}
float aKodePlayer::volume() const
{
if (m_player)
return m_player->volume();
// 1.0 is full volume
return 1.0;
return m_volume;
}
/////////////////////////////////////////////////////////////////////////////////
......@@ -102,7 +103,7 @@ float aKodePlayer::volume() const
bool aKodePlayer::playing() const
{
if (m_player && m_player->decoder())
if (m_player && m_player->decoder() && m_player->state() == aKode::Player::Playing)
return !m_player->decoder()->eof();
else
return false;
......
......@@ -59,6 +59,7 @@ public slots:
private:
aKode::Player *m_player;
float m_volume;
};
#endif
......
......@@ -34,7 +34,6 @@
using namespace ActionCollection;
Cache *Cache::m_cache = 0;
static const int playlistCacheVersion = 2;
enum PlaylistType
......@@ -52,11 +51,17 @@ enum PlaylistType
Cache *Cache::instance()
{
if(m_cache == 0) {
m_cache = new Cache;
m_cache->load();
static Cache cache;
// load() indirectly calls instance() so we have to protect against recursion.
static bool loaded = false;
if(!loaded) {
loaded = true;
cache.load();
}
return m_cache;
return &cache;
}
void Cache::save()
......
......@@ -43,7 +43,6 @@ protected:
void load();
private:
static Cache *m_cache;
static const int m_currentVersion = 1;
};
......
......@@ -18,9 +18,12 @@
#include "filerenameroptions.h"
#include "categoryreaderinterface.h"
QString CategoryReaderInterface::value(TagType category) const
QString CategoryReaderInterface::value(const CategoryID &category) const
{
QString value = categoryValue(category).stripWhiteSpace();
QString value = categoryValue(category.category).stripWhiteSpace();
if(category.category == Track)
value = fixupTrack(value, category.categoryNumber).stripWhiteSpace();
if(value.isEmpty() && emptyAction(category) == TagRenamerOptions::UseReplacementValue)
value = emptyText(category);
......@@ -28,7 +31,7 @@ QString CategoryReaderInterface::value(TagType category) const
return prefix(category) + value + suffix(category);
}
bool CategoryReaderInterface::isRequired(TagType category) const
bool CategoryReaderInterface::isRequired(const CategoryID &category) const
{
return emptyAction(category) != TagRenamerOptions::IgnoreEmptyTag;
}
......@@ -38,4 +41,27 @@ bool CategoryReaderInterface::isEmpty(TagType category) const
return categoryValue(category).isEmpty();
}
QString CategoryReaderInterface::fixupTrack(const QString &track, unsigned categoryNum) const
{
QString str(track);
CategoryID trackId(Track, categoryNum);
if(track == "0") {
if(emptyAction(trackId) == TagRenamerOptions::UseReplacementValue)
str = emptyText(trackId);
else
return QString::null;
}
unsigned minimumWidth = trackWidth(categoryNum);
if(str.length() < minimumWidth) {
QString prefix;
prefix.fill('0', minimumWidth - str.length());
return prefix + str;
}
return str;
}
// vim: set et sw=4 ts=4:
//Added by qt3to4:
#include <Q3ValueList>
/***************************************************************************
begin : Sun Oct 31 2004
copyright : (C) 2004 by Michael Pyne
......@@ -18,7 +16,11 @@
#ifndef JUK_CATEGORYREADERINTERFACE_H
#define JUK_CATEGORYREADERINTERFACE_H
#include "tagrenameroptions.h"
//Added by qt3to4:
#include <Q3ValueList>
enum TagType;
class QString;
template<class T> class Q3ValueList;
......@@ -37,9 +39,10 @@ public:
/**
* Returns the textual representation of \p type, without any processing done
* on it. For example, track values shouldn't be expanded out to the minimum
* width from this function.
* width from this function. No CategoryID is needed since the value is constant
* for a category.
*
* @param category to retrieve the value of.
* @param type, The category to retrieve the value of.
* @return textual representation of that category's value.
*/
virtual QString categoryValue(TagType type) const = 0;
......@@ -50,7 +53,7 @@ public:
* @param category the category to retrieve the value for.
* @return user-specified prefix string for \p category.
*/
virtual QString prefix(TagType category) const = 0;
virtual QString prefix(const CategoryID &category) const = 0;
/**
* Returns the user-specified suffix string for \p category.
......@@ -58,7 +61,7 @@ public:
* @param category the category to retrieve the value for.
* @return user-specified suffix string for \p category.
*/
virtual QString suffix(TagType category) const = 0;
virtual QString suffix(const CategoryID &category) const = 0;
/**
* Returns the user-specified empty action for \p category.
......@@ -66,7 +69,7 @@ public:
* @param category the category to retrieve the value for.
* @return user-specified empty action for \p category.
*/
virtual TagRenamerOptions::EmptyActions emptyAction(TagType category) const = 0;
virtual TagRenamerOptions::EmptyActions emptyAction(const CategoryID &category) const = 0;
/**
* Returns the user-specified empty text for \p category. This text might
......@@ -75,28 +78,45 @@ public:
* @param category the category to retrieve the value for.
* @return the user-specified empty text for \p category.
*/
virtual QString emptyText(TagType category) const = 0;
virtual QString emptyText(const CategoryID &category) const = 0;
/**
* @return the categories in the order the user has chosen. Categories may
* be repeated (which is why CategoryID has the categoryNumber value to
* disambiguate duplicates).
*/
virtual Q3ValueList<CategoryID> categoryOrder() const = 0;
virtual Q3ValueList<TagType> categoryOrder() const = 0;
/**
* @return track width for the Track item identified by categoryNum.
*/
virtual int trackWidth(unsigned categoryNum) const = 0;
// You probably shouldn't reimplement this
virtual QString value(TagType category) const;
virtual QString value(const CategoryID &category) const;
virtual QString separator() const = 0;
virtual QString musicFolder() const = 0;
virtual int trackWidth() const = 0;
virtual bool hasFolderSeparator(int index) const = 0;
/**
* @param index the zero-based index of the item just before the
* separator in question.
* @return true if a folder separator should be placed between the tags
* at index and index + 1.
*/
virtual bool hasFolderSeparator(unsigned index) const = 0;
virtual bool isDisabled(TagType category) const = 0;
virtual bool isDisabled(const CategoryID &category) const = 0;
// You probably shouldn't reimplement this
virtual bool isRequired(TagType category) const;
virtual bool isRequired(const CategoryID &category) const;
// You probably shouldn't reimplement this
virtual bool isEmpty(TagType category) const;
// You probably shouldn't reimplement this
virtual QString fixupTrack(const QString &track, unsigned categoryNum) const;
};
#endif /* JUK_CATEGORYREADERINTERFACE_H */
......
......@@ -32,7 +32,8 @@
#include "tag.h"
#include "viewmode.h"
#include "coverinfo.h"
//Added by qt3to4:
#include "covermanager.h"
#include <Q3ValueList>
#include <QDragMoveEvent>
#include <Q3CString>
......@@ -100,7 +101,7 @@ PlaylistItem *CollectionList::createItem(const FileHandle &file, Q3ListViewItem
PlaylistItem *item = new CollectionListItem(file);
if(!item->isValid()) {
kError() << "CollectinList::createItem() -- A valid tag was not created for \""
kError() << "CollectionList::createItem() -- A valid tag was not created for \""
<< file.absFilePath() << "\"" << endl;
delete item;
return 0;
......@@ -140,7 +141,7 @@ void CollectionList::setupTreeViewEntries(ViewMode *viewMode) const
for(TagCountDictIterator it(*m_columnTags[*colIt]); it.current(); ++it)
items << it.currentKey();
treeViewMode->slotAddItems(items, *colIt);
treeViewMode->addItems(items, *colIt);
}
}
......@@ -192,8 +193,9 @@ void CollectionList::clear()
i18n("Removing an item from the collection will also remove it from "
"all of your playlists. Are you sure you want to continue?\n\n"
"Note, however, that if the directory that these files are in is in "
"your \"scan on startup\" list, they will be readded on startup."),QString::null, KStdGuiItem::del());
if(result == KMessageBox::Yes) {
"your \"scan on startup\" list, they will be readded on startup."));
if(result == KMessageBox::Continue) {
Playlist::clear();
emit signalCollectionChanged();
}
......@@ -271,9 +273,9 @@ CollectionList::~CollectionList()
void CollectionList::contentsDropEvent(QDropEvent *e)
{
if(e->source() == this)
return;
return; // Don't rearrange in the CollectionList.
else
decode(e, static_cast<PlaylistItem *>(itemAt(contentsToViewport(e->pos()))));
Playlist::contentsDropEvent(e);
}
void CollectionList::contentsDragMoveEvent(QDragMoveEvent *e)
......
......@@ -10,7 +10,7 @@ fi
if test "x$with_gstreamer" = xcheck && test "x$have_gst" = xno; then
echo "**************************************************"
echo "*"
echo "* You do not seem to have GStreamer >= 0.8 installed."
echo "* You do not seem to have GStreamer installed."
echo "* Without this aRts output will be used exclusively."
echo "*"
echo "* JuK supports GStreamer output but will also"
......@@ -24,8 +24,8 @@ if test "x$with_tunepimp" = xcheck && test "x$have_tunepimp" = xno; then
echo "*"
echo "* You do not seem to have libmusicbrainz and"
echo "* libtunepimp. JuK will be compiled without"
echo "* will be compiled without MusicBrainz support and"
echo "* automatic song recognition will not be supported."
echo "* MusicBrainz support and automatic song"
echo "* recognition will not be supported."
echo "* Please download libmusicbrainz 2.x and libtunepimp"
echo "* 0.3.x from:"
echo "* http://www.musicbrainz.org/products/client/download.html "
......
......@@ -20,56 +20,67 @@ fi
AC_SUBST(LIB_ARTS)
AC_SUBST(ARTS_CFLAGS)
AC_ARG_WITH(tunepimp,
[AC_HELP_STRING(--with-tunepimp,
[enable support for TunePimp @<:@default=check@:>@])],
[], with_tunepimp=check)
have_tunepimp=no
if test "x$with_tunepimp" != xno; then
KDE_CHECK_HEADER(tunepimp/tp_c.h, have_tunepimp=yes)
if test "x$with_tunepimp" != xcheck && test "x$have_tunepimp" != xyes; then
AC_MSG_ERROR([--with-tunepimp was given, but test for TunePimp failed])
fi
AC_ARG_WITH(musicbrainz,
[AC_HELP_STRING(--with-musicbrainz,
[enable support for MusicBrainz @<:@default=check@:>@])],
[], with_musicbrainz=check)
have_musicbrainz=no
if test "x$with_musicbrainz" != xno; then
KDE_CHECK_HEADER(tunepimp/tp_c.h, have_musicbrainz=yes)
if test "x$with_musicbrainz" != xcheck && test "x$have_musicbrainz" != xyes; then
AC_MSG_ERROR([--with-musicbrainz was given, but test for MusicBrainz failed])
fi
fi
if test "x$have_tunepimp" = xyes; then
AC_CHECK_LIB(tunepimp, tp_SetFileNameEncoding,
AC_DEFINE(HAVE_TUNEPIMP, 4, [have MusicBrainz 0.4.x]),
AC_DEFINE(HAVE_TUNEPIMP, 1, [have MusicBrainz]))
if test "x$have_musicbrainz" = xyes; then
AC_CHECK_LIB(tunepimp, tp_SetFileNameEncoding,
AC_DEFINE(HAVE_MUSICBRAINZ, 4, [have MusicBrainz 0.4.x]),
AC_DEFINE(HAVE_MUSICBRAINZ, 1, [have MusicBrainz]))
else
AC_DEFINE(HAVE_TUNEPIMP, 0, [have TunePimp])
AC_DEFINE(HAVE_MUSICBRAINZ, 0, [have MusicBrainz])
fi
AM_CONDITIONAL(link_lib_TP, test "x$have_tunepimp" = xyes)
AM_CONDITIONAL(link_lib_MB, test "x$have_musicbrainz" = xyes)
AC_ARG_WITH(gstreamer,
[AC_HELP_STRING(--with-gstreamer,
[enable support for GStreamer @<:@default=check@:>@])],
[], with_gstreamer=check)
[AC_HELP_STRING(--with-gstreamer,
[enable support for GStreamer @<:@default=check@:>@])],
[], with_gstreamer=check)
have_gst=no
if test "x$with_gstreamer" != xno; then
# pkg-config seems to have a bug where it masks needed -L entries when it
# shouldn't, so disable that.
# pkg-config seems to have a bug where it masks needed -L entries when it
# shouldn't, so disable that.
PKG_CONFIG_ALLOW_SYSTEM_LIBS=1
export PKG_CONFIG_ALLOW_SYSTEM_LIBS
PKG_CONFIG_ALLOW_SYSTEM_LIBS=1
export PKG_CONFIG_ALLOW_SYSTEM_LIBS
dnl start with 0.8
GST_MAJORMINOR=0.8
GST_REQ=0.8.0
GST_MAJORMINOR=0.10
GST_REQ=0.10.0
GST_VERSION=10
PKG_CHECK_MODULES(GST, \
gstreamer-$GST_MAJORMINOR >= $GST_REQ \
gstreamer-control-$GST_MAJORMINOR >= $GST_REQ \
gstreamer-libs-$GST_MAJORMINOR >= $GST_REQ,
have_gst=yes, have_gst=no)
PKG_CHECK_MODULES(GST, \
gstreamer-$GST_MAJORMINOR >= $GST_REQ, \
have_gst=yes, have_gst=no)
if test "x$with_gstreamer" != xcheck && test "x$have_gst" != xyes; then
AC_MSG_ERROR([--with-gstreamer was given, but test for GStreamer failed])
fi
if test "x$have_gst" != xyes; then
GST_MAJORMINOR=0.8
GST_REQ=0.8.0
GST_VERSION=8
PKG_CHECK_MODULES(GST, \
gstreamer-$GST_MAJORMINOR >= $GST_REQ, \
have_gst=yes, have_gst=no)
fi
if test "x$with_gstreamer" != xcheck && test "x$have_gst" != xyes; then
AC_MSG_ERROR([--with-gstreamer was given, but test for GStreamer failed])
fi
fi
if test "x$have_gst" = "xno"; then
......@@ -88,15 +99,13 @@ else
AC_MSG_NOTICE([GStreamer version >= $GST_REQ found.])
AC_DEFINE(HAVE_GSTREAMER, 1, [have GStreamer])
AC_DEFINE_UNQUOTED(GSTREAMER_VERSION, $GST_VERSION, [GStreamer Version])
fi
AC_SUBST(GST_CFLAGS)
AC_SUBST(LDADD_GST)
AC_SUBST(LDFLAGS_GST)
# Remove this after we have ported JuK to KDE 4. -- mpyne.
DO_NOT_COMPILE="$DO_NOT_COMPILE juk"
if test "x$have_taglib" != xyes || ( test "x$build_arts" = "xno" && test "x$have_gst" = "xno" && test "x$have_akode" = "xno") ; then
DO_NOT_COMPILE="$DO_NOT_COMPILE juk"
fi
......@@ -23,7 +23,7 @@
#include <qtimer.h>
#include <qtoolbutton.h>
//Added by qt3to4:
#include <Q3ValueList>
#include "coverdialog.h"
......@@ -47,6 +47,21 @@ public:
}
};
class CaseInsensitiveItem : public KListViewItem
{
public:
CaseInsensitiveItem(QListView *parent, const QString &text) :
KListViewItem(parent, text)
{
}
int compare(QListViewItem *item, int column, bool ascending) const
{
Q_UNUSED(ascending);
return text(column).lower().localeAwareCompare(item->text(column).lower());
}
};
CoverDialog::CoverDialog(QWidget *parent) :
CoverDialogBase(parent, "juk_cover_dialog", Qt::WType_Dialog)
{
......@@ -72,7 +87,7 @@ void CoverDialog::show()
m_artists->setSorting(-1);
new AllArtistsListViewItem(m_artists);
for(QStringList::ConstIterator it = artists.begin(); it != artists.end(); ++it)
new KListViewItem(m_artists, *it);
new CaseInsensitiveItem(m_artists, *it);
m_artists->setSorting(0);
......
......@@ -36,7 +36,7 @@ namespace CoverUtility
private:
coverKey m_id;
};
};
}
using CoverUtility::CoverIconViewItem;
......
......@@ -29,6 +29,9 @@
#include <QHBoxLayout>
#include <QEvent>
#include "collectionlist.h"
#include "playlistsearch.h"
#include "playlistitem.h"
#include "coverinfo.h"
#include "tag.h"
......@@ -86,22 +89,6 @@ bool CoverInfo::hasCover()
if(m_coverKey != CoverManager::NoMatch)
m_hasCover = CoverManager::hasCover(m_coverKey);
// If we don't have a cover, first check if the CoverManager
// has one matching our album and artist.
if(!m_hasCover) {
QString artist = m_file.tag()->artist();
QString album = m_file.tag()->album();
coverKey match = CoverManager::idFromMetadata(artist, album);
if(match != CoverManager::NoMatch) {
m_hasCover = true;
m_coverKey = match;
// Make CoverManager remember this association
CoverManager::setIdForTrack(m_file.absFilePath(), match);
}
}
// We *still* don't have it? Check the old-style covers then.
if(!m_hasCover) {
m_hasCover = QFile(coverLocation(FullSize)).exists();
......@@ -120,6 +107,8 @@ void CoverInfo::clearCover()
// Yes, we have checked, and we don't have it. ;)
m_haveCheckedForCover = true;
m_needsConverting = false;
// We don't need to call removeCover because the CoverManager will
// automatically unlink the cover if we were the last track to use it.
CoverManager::setIdForTrack(m_file.absFilePath(), CoverManager::NoMatch);
......@@ -132,6 +121,7 @@ void CoverInfo::setCover(const QImage &image)
return;
m_haveCheckedForCover = true;
m_needsConverting = false;
m_hasCover = true;
QPixmap cover;
......@@ -149,15 +139,48 @@ void CoverInfo::setCoverId(coverKey id)
{
m_coverKey = id;
m_haveCheckedForCover = true;
// We assume this is true, this would make a good spot for an
// assertion though.
m_hasCover = true;
m_needsConverting = false;
m_hasCover = id != CoverManager::NoMatch;
// Inform CoverManager of the change.
CoverManager::setIdForTrack(m_file.absFilePath(), m_coverKey);
}
void CoverInfo::applyCoverToWholeAlbum(bool overwriteExistingCovers) const
{
QString artist = m_file.tag()->artist();
QString album = m_file.tag()->album();
PlaylistSearch::ComponentList components;
ColumnList columns;
columns.append(PlaylistItem::ArtistColumn);
components.append(PlaylistSearch::Component(artist, false, columns, PlaylistSearch::Component::Exact));
columns.clear();
columns.append(PlaylistItem::AlbumColumn);
components.append(PlaylistSearch::Component(album, false, columns, PlaylistSearch::Component::Exact));
PlaylistList playlists;
playlists.append(CollectionList::instance());
PlaylistSearch search(playlists, components, PlaylistSearch::MatchAll);
// Search done, iterate through results.
PlaylistItemList results = search.matchedItems();
PlaylistItemList::ConstIterator it = results.constBegin();
for(; it != results.constEnd(); ++it) {
// Don't worry about files that somehow already have a tag,
// unless the coversion is forced.
if(!overwriteExistingCovers && !(*it)->file().coverInfo()->m_needsConverting)
continue;
kdDebug(65432) << "Setting cover for: " << *it << endl;
(*it)->file().coverInfo()->setCoverId(m_coverKey);
}
}
QPixmap CoverInfo::pixmap(CoverSize size) const
{
if(m_needsConverting)
......@@ -235,12 +258,26 @@ bool CoverInfo::convertOldStyleCover() const
QString artist = m_file.tag()->artist();
QString album = m_file.tag()->album();
m_coverKey = CoverManager::addCover(coverLocation(FullSize), artist, album);
QString oldLocation = coverLocation(FullSize);
m_coverKey = CoverManager::addCover(oldLocation, artist, album);
m_needsConverting = false;
if(m_coverKey != CoverManager::NoMatch) {
CoverManager::setIdForTrack(m_file.absFilePath(), m_coverKey);
// Now let's also set the ID for the tracks matching the track and
// artist at this point so that the conversion is complete, otherwise
// we can't tell apart the "No cover on purpose" and "Has no cover yet"
// possibilities.
applyCoverToWholeAlbum();
// If we convert we need to remove the old cover otherwise we'll find
// it later if the user un-sets the new cover.
if(!QFile::remove(oldLocation))
kdError(65432) << "Unable to remove converted cover at " << oldLocation << endl;
return true;
}
else {
......
......@@ -39,6 +39,17 @@ public:
// Use this to assign to a specific cover id.
void setCoverId(coverKey id);
/**
* This function sets the cover identifier for all tracks that have the
* same Artist and Album as this track, to the cover identifier of this
* track.
*
* @param overwriteExistingCovers If set to true, this function will always
* apply the new cover to a track even if the track already had
* a different cover set.
*/
void applyCoverToWholeAlbum(bool overwriteExistingCovers = false) const;
coverKey coverId() const { return m_coverKey; }
QPixmap pixmap(CoverSize size) const;
......
......@@ -23,7 +23,7 @@
#include <q3dict.h>
#include <q3cache.h>
#include <qmime.h>
//Added by qt3to4:
#include <qbuffer.h>
#include <Q3ValueList>
#include <kdebug.h>
......@@ -115,9 +115,10 @@ public:
*/
coverKey nextId() const;
void saveCovers() const;
private:
void loadCovers();
void saveCovers() const;
/**
* @return the full path and filename of the file storing the cover
......@@ -207,6 +208,7 @@ void CoverManagerPrivate::loadCovers()
in >> id;
in >> *data;
data->refCount = 0;
covers[(coverKey) id] = data;
}
......@@ -217,7 +219,15 @@ void CoverManagerPrivate::loadCovers()
Q_UINT32 id;
in >> path >> id;
tracks.insert(path, new coverKey(id));
// If we somehow already managed to load a cover id with this path,
// don't do so again. Possible due to a coding error during 3.5
// development.
if(!tracks.find(path)) {
++covers[(coverKey) id]->refCount; // Another track using this.
tracks.insert(path, new coverKey(id));
}
}
}
......@@ -270,8 +280,15 @@ QByteArray CoverDrag::encodedData(const char *mimetype) const
return data;
}
else if(qstrcmp(mimetype, "image/png") == 0) {
// TODO: Implement.
;
QPixmap large = CoverManager::coverFromId(m_id, CoverManager::FullSize);
QImage img = large.convertToImage();
QByteArray data;
QBuffer buffer(data);
buffer.open(IO_WriteOnly);
img.save(&buffer, "PNG"); // Write in PNG format.
return data;
}
return QByteArray();
......@@ -355,7 +372,7 @@ QPixmap CoverManager::coverFromData(const CoverData &coverData, Size size)
if(size == Thumbnail) {
// Convert to image for smoothScale()
QImage image = pix->convertToImage();
pix->convertFromImage(image.smoothScale(80, 80));
pix->convertFromImage(image.smoothScale(80, 80, QImage::ScaleMin));
}
QPixmap returnValue = *pix; // Save it early.
......@@ -392,6 +409,7 @@ coverKey CoverManager::addCover(const QPixmap &large, const QString &artist, con
coverData->artist = artist.lower();
coverData->album = album.lower();
coverData->refCount = 0;
data()->covers[id] = coverData;
......@@ -460,6 +478,11 @@ CoverManagerPrivate *CoverManager::data()
return m_data;
}
void CoverManager::saveCovers()
{
data()->saveCovers();
}
void CoverManager::shutdown()
{
sd.destructObject();
......@@ -482,14 +505,24 @@ Q3ValueList<coverKey> CoverManager::keys()
void CoverManager::setIdForTrack(