1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#include "library/baseexternaltrackmodel.h"
#include "library/dao/trackschema.h"
#include "library/queryutil.h"
#include "library/trackcollectionmanager.h"
#include "mixer/playermanager.h"
BaseExternalTrackModel::BaseExternalTrackModel(QObject* parent,
TrackCollectionManager* pTrackCollectionManager,
const char* settingsNamespace,
const QString& trackTable,
QSharedPointer<BaseTrackCache> trackSource)
: BaseSqlTableModel(parent, pTrackCollectionManager, settingsNamespace) {
QString viewTable = trackTable + "_view";
QStringList columns;
columns << "id";
columns << "'' AS " + LIBRARYTABLE_PREVIEW;
QSqlQuery query(m_database);
FieldEscaper f(m_database);
QString queryString = QString(
"CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS "
"SELECT %2 FROM %3")
.arg(f.escapeString(viewTable),
columns.join(","),
f.escapeString(trackTable));
query.prepare(queryString);
if (!query.exec()) {
LOG_FAILED_QUERY(query) << "Error creating temporary view for" << trackTable;
return;
}
columns[1] = LIBRARYTABLE_PREVIEW;
setTable(viewTable, columns[0], columns, trackSource);
setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder);
}
BaseExternalTrackModel::~BaseExternalTrackModel() {
}
TrackPointer BaseExternalTrackModel::getTrack(const QModelIndex& index) const {
QString artist = index.sibling(index.row(), fieldIndex("artist")).data().toString();
QString title = index.sibling(index.row(), fieldIndex("title")).data().toString();
QString album = index.sibling(index.row(), fieldIndex("album")).data().toString();
QString year = index.sibling(index.row(), fieldIndex("year")).data().toString();
QString genre = index.sibling(index.row(), fieldIndex("genre")).data().toString();
float bpm = index.sibling(index.row(), fieldIndex("bpm")).data().toString().toFloat();
QString nativeLocation = index.sibling(index.row(), fieldIndex("location")).data().toString();
QString location = QDir::fromNativeSeparators(nativeLocation);
if (location.isEmpty()) {
// Track is lost
return TrackPointer();
}
bool track_already_in_library = false;
TrackPointer pTrack = m_pTrackCollectionManager->getOrAddTrack(
TrackRef::fromFileInfo(location),
&track_already_in_library);
if (pTrack) {
// If this track was not in the Mixxx library it is now added and will be
// saved with the metadata from external library. If it was already in the
// Mixxx library then we do not touch it so that we do not over-write the
// user's metadata.
if (!track_already_in_library) {
pTrack->setArtist(artist);
pTrack->setTitle(title);
pTrack->setAlbum(album);
pTrack->setYear(year);
pTrack->setGenre(genre);
pTrack->setBpm(bpm);
}
} else {
qWarning() << "Failed to load external track" << location;
}
return pTrack;
}
TrackId BaseExternalTrackModel::getTrackId(const QModelIndex& index) const {
const auto track = getTrack(index);
if (track) {
return track->getId();
} else {
return TrackId();
}
}
TrackId BaseExternalTrackModel::doGetTrackId(const TrackPointer& pTrack) const {
if (pTrack) {
// The external table has foreign Track IDs, so we need to compare
// by location
for (int row = 0; row < rowCount(); ++row) {
QString nativeLocation = index(row, fieldIndex("location")).data().toString();
QString location = QDir::fromNativeSeparators(nativeLocation);
if (location == pTrack->getLocation()) {
return TrackId(index(row, 0).data());
}
}
}
return TrackId();
}
bool BaseExternalTrackModel::isColumnInternal(int column) {
return column == fieldIndex(LIBRARYTABLE_ID) ||
(PlayerManager::numPreviewDecks() == 0 &&
column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_PREVIEW));
}
Qt::ItemFlags BaseExternalTrackModel::flags(const QModelIndex& index) const {
return readOnlyFlags(index);
}
TrackModel::Capabilities BaseExternalTrackModel::getCapabilities() const {
return Capability::AddToTrackSet |
Capability::AddToAutoDJ |
Capability::LoadToDeck |
Capability::LoadToPreviewDeck |
Capability::LoadToSampler;
}
|