Commit 2c297413 authored by Michael Pyne's avatar Michael Pyne

Fairly large overhaul of the JuK codebase to beat out a lot of the Qt 3 stuff.

Still a lot of Qt 3 code to go but at this point Q3ValueList, Q3Vector, Q3PtrDict and
Q3Dict should all be gone.

In addition many loops have been foreach()'ed, which really does make it more readable.

There is a crash fix as well, now the polish() function in Playlist has been replaced
with an initialization slot which is singleShot'ed since the timing of the polish event
is apparently different than it was in Qt 3, which was making new Playlists crash when
they were first shown.

Also I went through almost every header and pared it down to the minimum reasonably
achievable, which required some additional headers in a few .cpp files but overall
compilation time should be down and you won't have to rebuild all of JuK just because
a header file got touched.

I haven't seen any regressions yet but then again I still can't play music either.

svn path=/trunk/KDE/kdemultimedia/juk/; revision=667815
parent ee136682
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
#ifndef ACTIONCOLLECTION_H #ifndef ACTIONCOLLECTION_H
#define ACTIONCOLLECTION_H #define ACTIONCOLLECTION_H
#include <ktoolbarpopupaction.h>
class KActionCollection; class KActionCollection;
class KAction; class QAction;
class QString;
namespace ActionCollection namespace ActionCollection
{ {
......
...@@ -18,12 +18,13 @@ ...@@ -18,12 +18,13 @@
#include <kdialog.h> #include <kdialog.h>
#include <QList> #include <QList>
#include "searchwidget.h"
#include "playlistsearch.h"
class KLineEdit; class KLineEdit;
class KPushButton; class KPushButton;
class QRadioButton; class QRadioButton;
class SearchLine;
class AdvancedSearchDialog : public KDialog class AdvancedSearchDialog : public KDialog
{ {
......
...@@ -16,15 +16,17 @@ ...@@ -16,15 +16,17 @@
#ifndef CACHE_H #ifndef CACHE_H
#define CACHE_H #define CACHE_H
#include <QDataStream>
#include "stringhash.h" #include "stringhash.h"
#include <QList>
class Tag; class Tag;
class Playlist; class Playlist;
class PlaylistCollection; class PlaylistCollection;
template<class T>
class QList;
typedef QList<Playlist *> PlaylistList; typedef QList<Playlist *> PlaylistList;
class Cache : public FileHandleHash class Cache : public FileHandleHash
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
#include "tagrenameroptions.h" #include "tagrenameroptions.h"
#include <QList>
enum TagType; enum TagType;
class QString; class QString;
......
...@@ -15,22 +15,21 @@ ...@@ -15,22 +15,21 @@
#include "collectionlist.h" #include "collectionlist.h"
#include <k3urldrag.h>
#include <klocale.h> #include <klocale.h>
#include <kmessagebox.h> #include <kmessagebox.h>
#include <kdebug.h> #include <kdebug.h>
#include <kmenu.h> #include <kmenu.h>
#include <kiconloader.h>
#include <kconfig.h> #include <kconfig.h>
#include <kaction.h>
#include <kurl.h>
#include <kactioncollection.h>
#include <kconfiggroup.h> #include <kconfiggroup.h>
#include <kactioncollection.h>
#include <ktoolbarpopupaction.h> #include <ktoolbarpopupaction.h>
#include <kdirwatch.h>
#include <Q3ValueList> #include <QList>
#include <QDragMoveEvent> #include <QDragMoveEvent>
#include <QDropEvent> #include <QDropEvent>
#include <QApplication>
#include <QClipboard>
#include "playlistcollection.h" #include "playlistcollection.h"
#include "splashscreen.h" #include "splashscreen.h"
...@@ -98,7 +97,7 @@ PlaylistItem *CollectionList::createItem(const FileHandle &file, Q3ListViewItem ...@@ -98,7 +97,7 @@ PlaylistItem *CollectionList::createItem(const FileHandle &file, Q3ListViewItem
// It's probably possible to optimize the line below away, but, well, right // It's probably possible to optimize the line below away, but, well, right
// now it's more important to not load duplicate items. // now it's more important to not load duplicate items.
if(m_itemsDict.find(file.absFilePath())) if(m_itemsDict.contains(file.absFilePath()))
return 0; return 0;
PlaylistItem *item = new CollectionListItem(file); PlaylistItem *item = new CollectionListItem(file);
...@@ -133,19 +132,13 @@ void CollectionList::setupTreeViewEntries(ViewMode *viewMode) const ...@@ -133,19 +132,13 @@ void CollectionList::setupTreeViewEntries(ViewMode *viewMode) const
return; return;
} }
Q3ValueList<int> columnList; QList<int> columnList;
columnList << PlaylistItem::ArtistColumn; columnList << PlaylistItem::ArtistColumn;
columnList << PlaylistItem::GenreColumn; columnList << PlaylistItem::GenreColumn;
columnList << PlaylistItem::AlbumColumn; columnList << PlaylistItem::AlbumColumn;
QStringList items; foreach(int column, columnList)
for(Q3ValueList<int>::Iterator colIt = columnList.begin(); colIt != columnList.end(); ++colIt) { treeViewMode->addItems(m_columnTags[column]->keys(), column);
items.clear();
for(TagCountDictIterator it(*m_columnTags[*colIt]); it.current(); ++it)
items << it.currentKey();
treeViewMode->addItems(items, *colIt);
}
} }
void CollectionList::slotNewItems(const KFileItemList &items) void CollectionList::slotNewItems(const KFileItemList &items)
...@@ -190,6 +183,11 @@ void CollectionList::slotDeleteItem(KFileItem *item) ...@@ -190,6 +183,11 @@ void CollectionList::slotDeleteItem(KFileItem *item)
// public slots // public slots
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void CollectionList::paste()
{
decode(QApplication::clipboard()->mimeData());
}
void CollectionList::clear() void CollectionList::clear()
{ {
int result = KMessageBox::warningContinueCancel(this, int result = KMessageBox::warningContinueCancel(this,
...@@ -208,9 +206,9 @@ void CollectionList::slotCheckCache() ...@@ -208,9 +206,9 @@ void CollectionList::slotCheckCache()
{ {
PlaylistItemList invalidItems; PlaylistItemList invalidItems;
for(Q3DictIterator<CollectionListItem>it(m_itemsDict); it.current(); ++it) { foreach(CollectionListItem *item, m_itemsDict) {
if(!it.current()->checkCurrent()) if(!item->checkCurrent())
invalidItems.append(*it); invalidItems.append(item);
processEvents(); processEvents();
} }
...@@ -224,7 +222,8 @@ void CollectionList::slotRemoveItem(const QString &file) ...@@ -224,7 +222,8 @@ void CollectionList::slotRemoveItem(const QString &file)
void CollectionList::slotRefreshItem(const QString &file) void CollectionList::slotRefreshItem(const QString &file)
{ {
m_itemsDict[file]->refresh(); if(m_itemsDict[file])
m_itemsDict[file]->refresh();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -233,7 +232,6 @@ void CollectionList::slotRefreshItem(const QString &file) ...@@ -233,7 +232,6 @@ void CollectionList::slotRefreshItem(const QString &file)
CollectionList::CollectionList(PlaylistCollection *collection) : CollectionList::CollectionList(PlaylistCollection *collection) :
Playlist(collection, true), Playlist(collection, true),
m_itemsDict(5003),
m_columnTags(15, 0) m_columnTags(15, 0)
{ {
QAction *spaction = ActionCollection::actions()->addAction("showPlaying"); QAction *spaction = ActionCollection::actions()->addAction("showPlaying");
...@@ -242,22 +240,15 @@ CollectionList::CollectionList(PlaylistCollection *collection) : ...@@ -242,22 +240,15 @@ CollectionList::CollectionList(PlaylistCollection *collection) :
connect(action<KToolBarPopupAction>("back")->menu(), SIGNAL(aboutToShow()), connect(action<KToolBarPopupAction>("back")->menu(), SIGNAL(aboutToShow()),
this, SLOT(slotPopulateBackMenu())); this, SLOT(slotPopulateBackMenu()));
connect(action<KToolBarPopupAction>("back")->menu(), SIGNAL(activated(int)), connect(action<KToolBarPopupAction>("back")->menu(), SIGNAL(activated(QAction *)),
this, SLOT(slotPlayFromBackMenu(int))); this, SLOT(slotPlayFromBackMenu(QAction *)));
connect(action<KToolBarPopupAction>("back")->menu(), SIGNAL(triggered(QAction *)), connect(action<KToolBarPopupAction>("back")->menu(), SIGNAL(triggered(QAction *)),
this, SLOT(slotPlayFromBackMenu(QAction *))); this, SLOT(slotPlayFromBackMenu(QAction *)));
setSorting(-1); // Temporarily disable sorting to add items faster. setSorting(-1); // Temporarily disable sorting to add items faster.
m_columnTags[PlaylistItem::ArtistColumn] = new TagCountDict(5001, false); m_columnTags[PlaylistItem::ArtistColumn] = new TagCountDict;
m_columnTags[PlaylistItem::ArtistColumn]->setAutoDelete(true); m_columnTags[PlaylistItem::AlbumColumn] = new TagCountDict;
m_columnTags[PlaylistItem::GenreColumn] = new TagCountDict;
m_columnTags[PlaylistItem::AlbumColumn] = new TagCountDict(5001, false);
m_columnTags[PlaylistItem::AlbumColumn]->setAutoDelete(true);
m_columnTags[PlaylistItem::GenreColumn] = new TagCountDict(5001, false);
m_columnTags[PlaylistItem::GenreColumn]->setAutoDelete(true);
polish();
} }
CollectionList::~CollectionList() CollectionList::~CollectionList()
...@@ -271,8 +262,9 @@ CollectionList::~CollectionList() ...@@ -271,8 +262,9 @@ CollectionList::~CollectionList()
// are. // are.
clearItems(items()); clearItems(items());
for(TagCountDicts::Iterator it = m_columnTags.begin(); it != m_columnTags.end(); ++it)
delete *it; qDeleteAll(m_columnTags);
m_columnTags.clear();
} }
void CollectionList::contentsDropEvent(QDropEvent *e) void CollectionList::contentsDropEvent(QDropEvent *e)
...@@ -296,11 +288,10 @@ QString CollectionList::addStringToDict(const QString &value, int column) ...@@ -296,11 +288,10 @@ QString CollectionList::addStringToDict(const QString &value, int column)
if(column > m_columnTags.count() || value.trimmed().isEmpty()) if(column > m_columnTags.count() || value.trimmed().isEmpty())
return QString(); return QString();
int *refCountPtr = m_columnTags[column]->find(value); if(m_columnTags[column]->contains(value))
if(refCountPtr) ++((*m_columnTags[column])[value]);
++(*refCountPtr);
else { else {
m_columnTags[column]->insert(value, new int(1)); m_columnTags[column]->insert(value, 1);
emit signalNewTag(value, column); emit signalNewTag(value, column);
} }
...@@ -329,33 +320,37 @@ QStringList CollectionList::uniqueSet(UniqueSetType t) const ...@@ -329,33 +320,37 @@ QStringList CollectionList::uniqueSet(UniqueSetType t) const
return QStringList(); return QStringList();
} }
if(column >= m_columnTags.count()) return m_columnTags[column]->keys();
return QStringList(); }
TagCountDictIterator it(*m_columnTags[column]);
QStringList list;
for(; it.current(); ++it)
list += it.currentKey();
return list; CollectionListItem *CollectionList::lookup(const QString &file) const
{
return m_itemsDict.value(file, 0);
} }
void CollectionList::removeStringFromDict(const QString &value, int column) void CollectionList::removeStringFromDict(const QString &value, int column)
{ {
if(column > m_columnTags.count() || value.isEmpty()) if(column > m_columnTags.count() || value.trimmed().isEmpty())
return; return;
int *refCountPtr = m_columnTags[column]->find(value); if(m_columnTags[column]->contains(value) &&
if(refCountPtr) { --((*m_columnTags[column])[value])) // If the decrement goes to 0...
--(*refCountPtr); {
if(*refCountPtr == 0) { emit signalRemovedTag(value, column);
emit signalRemovedTag(value, column); m_columnTags[column]->remove(value);
m_columnTags[column]->remove(value);
}
} }
} }
void CollectionList::addWatched(const QString &file)
{
m_dirWatch->addFile(file);
}
void CollectionList::removeWatched(const QString &file)
{
m_dirWatch->removeFile(file);
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// CollectionListItem public methods // CollectionListItem public methods
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -502,7 +497,7 @@ void CollectionListItem::addChildItem(PlaylistItem *child) ...@@ -502,7 +497,7 @@ void CollectionListItem::addChildItem(PlaylistItem *child)
void CollectionListItem::removeChildItem(PlaylistItem *child) void CollectionListItem::removeChildItem(PlaylistItem *child)
{ {
if(!m_shuttingDown) if(!m_shuttingDown)
m_children.remove(child); m_children.removeAll(child);
} }
bool CollectionListItem::checkCurrent() bool CollectionListItem::checkCurrent()
......
...@@ -16,23 +16,17 @@ ...@@ -16,23 +16,17 @@
#ifndef COLLECTIONLIST_H #ifndef COLLECTIONLIST_H
#define COLLECTIONLIST_H #define COLLECTIONLIST_H
#include <kapplication.h> #include <QHash>
#include <kdirwatch.h> #include <QVector>
#include <kfileitem.h>
#include <q3dict.h>
#include <qclipboard.h>
#include <q3valuevector.h>
//Added by qt3to4:
#include <QDragMoveEvent>
#include <QDropEvent>
#include "playlist.h" #include "playlist.h"
#include "playlistitem.h" #include "playlistitem.h"
#include "sortedstringlist.h"
class CollectionListItem; class CollectionListItem;
class ViewMode; class ViewMode;
class KFileItem;
class KFileItemList;
class KDirWatch;
/** /**
* This type is for mapping QString track attributes like the album, artist * This type is for mapping QString track attributes like the album, artist
...@@ -40,16 +34,16 @@ class ViewMode; ...@@ -40,16 +34,16 @@ class ViewMode;
* that hold the string. * that hold the string.
*/ */
typedef Q3Dict<int> TagCountDict; typedef QHash<QString, int> TagCountDict;
typedef Q3DictIterator<int> TagCountDictIterator; typedef QHashIterator<QString, int> TagCountDictIterator;
/** /**
* We then have an array of dicts, one for each column in the list view. We * We then have an array of dicts, one for each column in the list view.
* use pointers to TagCountDicts because QDict has a broken copy ctor, which * The array is sparse (not every vector will have a TagCountDict so we use
* doesn't copy the case sensitivity setting. * pointers.
*/ */
typedef Q3ValueVector<TagCountDict*> TagCountDicts; typedef QVector<TagCountDict *> TagCountDicts;
/** /**
* This is the "collection", or all of the music files that have been opened * This is the "collection", or all of the music files that have been opened
...@@ -83,7 +77,7 @@ public: ...@@ -83,7 +77,7 @@ public:
*/ */
QStringList uniqueSet(UniqueSetType t) const; QStringList uniqueSet(UniqueSetType t) const;
CollectionListItem *lookup(const QString &file) { return m_itemsDict.find(file); } CollectionListItem *lookup(const QString &file) const;
virtual PlaylistItem *createItem(const FileHandle &file, virtual PlaylistItem *createItem(const FileHandle &file,
Q3ListViewItem * = 0, Q3ListViewItem * = 0,
...@@ -98,7 +92,7 @@ public: ...@@ -98,7 +92,7 @@ public:
virtual bool canReload() const { return true; } virtual bool canReload() const { return true; }
public slots: public slots:
virtual void paste() { decode(kapp->clipboard()->mimeData()); } virtual void paste();
virtual void clear(); virtual void clear();
void slotCheckCache(); void slotCheckCache();
...@@ -118,7 +112,7 @@ protected: ...@@ -118,7 +112,7 @@ protected:
// These methods are used by CollectionListItem, which is a friend class. // These methods are used by CollectionListItem, which is a friend class.
void addToDict(const QString &file, CollectionListItem *item) { m_itemsDict.replace(file, item); } void addToDict(const QString &file, CollectionListItem *item) { m_itemsDict.insert(file, item); }
void removeFromDict(const QString &file) { m_itemsDict.remove(file); } void removeFromDict(const QString &file) { m_itemsDict.remove(file); }
// These methods are also used by CollectionListItem, to manage the // These methods are also used by CollectionListItem, to manage the
...@@ -127,10 +121,10 @@ protected: ...@@ -127,10 +121,10 @@ protected:
QString addStringToDict(const QString &value, int column); QString addStringToDict(const QString &value, int column);
void removeStringFromDict(const QString &value, int column); void removeStringFromDict(const QString &value, int column);
void addWatched(const QString &file) { m_dirWatch->addFile(file); } void addWatched(const QString &file);
void removeWatched(const QString &file) { m_dirWatch->removeFile(file); } void removeWatched(const QString &file);
virtual bool hasItem(const QString &file) const { return m_itemsDict.find(file); } virtual bool hasItem(const QString &file) const { return m_itemsDict.contains(file); }
signals: signals:
void signalCollectionChanged(); void signalCollectionChanged();
...@@ -154,7 +148,7 @@ private: ...@@ -154,7 +148,7 @@ private:
static const int m_uniqueSetCount = 3; static const int m_uniqueSetCount = 3;
static CollectionList *m_list; static CollectionList *m_list;
Q3Dict<CollectionListItem> m_itemsDict; QHash<QString, CollectionListItem *> m_itemsDict;
KDirWatch *m_dirWatch; KDirWatch *m_dirWatch;
TagCountDicts m_columnTags; TagCountDicts m_columnTags;
}; };
...@@ -165,11 +159,6 @@ class CollectionListItem : public PlaylistItem ...@@ -165,11 +159,6 @@ class CollectionListItem : public PlaylistItem
friend class CollectionList; friend class CollectionList;
friend class PlaylistItem; friend class PlaylistItem;
/**
* Needs access to the destructor, even though the destructor isn't used by QDict.
*/
friend class Q3Dict<CollectionListItem>;
public: public:
virtual void refresh(); virtual void refresh();
PlaylistItem *itemForPlaylist(const Playlist *playlist); PlaylistItem *itemForPlaylist(const Playlist *playlist);
......
...@@ -24,8 +24,7 @@ ...@@ -24,8 +24,7 @@
#include <klocale.h> #include <klocale.h>
#include <QTimer> #include <QTimer>
#include <QToolButton> #include <QList>
#include <Q3ValueList>
#include "covericonview.h" #include "covericonview.h"
#include "covermanager.h" #include "covermanager.h"
...@@ -102,13 +101,12 @@ void CoverDialog::show() ...@@ -102,13 +101,12 @@ void CoverDialog::show()
// covers. // covers.
void CoverDialog::loadCovers() void CoverDialog::loadCovers()
{ {
Q3ValueList<coverKey> keys = CoverManager::keys();
Q3ValueList<coverKey>::ConstIterator it;
int i = 0; int i = 0;
for(it = keys.begin(); it != keys.end(); ++it) { foreach(coverKey cover, CoverManager::keys()) {
new CoverIconViewItem(*it, m_covers); (void) new CoverIconViewItem(cover, m_covers);
// TODO: Threading!
if(++i == 10) { if(++i == 10) {
i = 0; i = 0;
kapp->processEvents(); kapp->processEvents();
...@@ -127,13 +125,11 @@ void CoverDialog::slotArtistClicked(Q3ListViewItem *item) ...@@ -127,13 +125,11 @@ void CoverDialog::slotArtistClicked(Q3ListViewItem *item)
} }
else { else {
QString artist = item->text(0).toLower(); QString artist = item->text(0).toLower();
Q3ValueList<coverKey> keys = CoverManager::keys();
Q3ValueList<coverKey>::ConstIterator it;
for(it = keys.begin(); it != keys.end(); ++it) { foreach(coverKey cover, CoverManager::keys()) {
CoverDataPtr data = CoverManager::coverInfo(*it); CoverDataPtr data = CoverManager::coverInfo(cover);
if(data->artist == artist) if(data->artist == artist)
new CoverIconViewItem(*it, m_covers); (void) new CoverIconViewItem(cover, m_covers);
} }
} }
} }
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include "covermanager.h" #include "covermanager.h"
#include <QPixmap> #include <QPixmap>
#include <QMap>
#include <QString> #include <QString>
#include <QFile> #include <QFile>
#include <QImage> #include <QImage>
...@@ -26,7 +25,8 @@ ...@@ -26,7 +25,8 @@
#include <Q3Cache> #include <Q3Cache>
#include <QMimeSource> #include <QMimeSource>
#include <QBuffer> #include <QBuffer>
#include <Q3ValueList> #include <QList>
#include <QMap>
#include <kdebug.h> #include <kdebug.h>
#include <kstaticdeleter.h> #include <kstaticdeleter.h>
...@@ -160,7 +160,7 @@ void CoverManagerPrivate::saveCovers() const ...@@ -160,7 +160,7 @@ void CoverManagerPrivate::saveCovers() const
out << quint32(0) << quint32(covers.count()); out << quint32(0) << quint32(covers.count());
// Write out the data // Write out the data
for(CoverDataMap::ConstIterator it = covers.begin(); it != covers.end(); ++it) { for(CoverDataMap::const_iterator it = covers.begin(); it != covers.end(); ++it) {
out << quint32(it.key()); out << quint32(it.key());
out << *it.value(); out << *it.value();
} }
...@@ -321,8 +321,8 @@ coverKey CoverManager::idFromMetadata(const QString &artist, const QString &albu ...@@ -321,8 +321,8 @@ coverKey CoverManager::idFromMetadata(const QString &artist, const QString &albu
{ {
// Search for the string, yay! It might make sense to use a cache here, // Search for the string, yay! It might make sense to use a cache here,
// if so it's not hard to add a QCache. // if so it's not hard to add a QCache.
CoverDataMap::ConstIterator it = begin(); CoverDataMap::const_iterator it = begin();
CoverDataMap::ConstIterator endIt = end(); CoverDataMap::const_iterator endIt = end();
for(; it != endIt; ++it) { for(; it != endIt; ++it) {
if(it.value()->album == album.toLower() && it.value()->artist == artist.toLower()) if(it.value()->album == album.toLower() && it.value()->artist == artist.toLower())
...@@ -489,17 +489,17 @@ void CoverManager::shutdown() ...@@ -489,17 +489,17 @@ void CoverManager::shutdown()
sd.destructObject(); sd.destructObject();
} }
CoverDataMap::ConstIterator CoverManager::begin() CoverDataMapIterator CoverManager::begin()
{ {
return data()->covers.constBegin(); return data()->covers.constBegin();
} }
CoverDataMap::ConstIterator CoverManager::end() CoverDataMapIterator CoverManager::end()
{ {
return data()->covers.constEnd(); return data()->covers.constEnd();
} }
Q3ValueList<coverKey> CoverManager::keys() CoverList CoverManager::keys()
{ {
return data()->covers.keys(); return data()->covers.keys();
} }
......
...@@ -18,16 +18,17 @@ ...@@ -18,16 +18,17 @@
#include <ksharedptr.h> #include <ksharedptr.h>
#include <QMap> #include <Q3DragObject>
#include <q3dragobject.h> #include <QString>
//Added by qt3to4:
#include <QPixmap>
#include <Q3ValueList>
class CoverManagerPrivate; class CoverManagerPrivate;
class QString;
class QPixmap; class QPixmap;
class QDataStream;
template<class Key, class Value>
class QMap;
template<class T>
class QList;
/** /**
* This class holds the data on a cover. This includes the path to the cover * This class holds the data on a cover. This includes the path to the cover
...@@ -54,8 +55,14 @@ public: ...@@ -54,8 +55,14 @@ public:
typedef KSharedPtr<CoverData> CoverDataPtr; typedef KSharedPtr<CoverData> CoverDataPtr;
typedef unsigned long coverKey; ///< Type of the id for a cover. typedef unsigned long coverKey; ///< Type of the id for a cover.
typedef QMap<coverKey, CoverDataPtr> CoverDataMap; typedef QMap<coverKey, CoverDataPtr> CoverDataMap;
// I can't believe this actually works...
typedef CoverDataMap::const_iterator CoverDataMapIterator;
typedef QList<coverKey> CoverList;
/** /**
* This class is used to drag covers in JuK. It adds a special mimetype that * This class is used to drag covers in JuK. It adds a special mimetype that
* contains the cover ID used for this cover, and also supports an image/png * contains the cover ID used for this cover, and also supports an image/png
...@@ -217,17 +224,17 @@ public: ...@@ -217,17 +224,17 @@ public:
/** /**
* @return Iterator pointing to the first element in the cover database. * @return Iterator pointing to the first element in the cover database.