-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpreparefeature.cpp
More file actions
135 lines (117 loc) · 4.19 KB
/
Copy pathpreparefeature.cpp
File metadata and controls
135 lines (117 loc) · 4.19 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "library/trackset/preparefeature.h"
#include <QSet>
#include "library/library.h"
#include "library/playlisttablemodel.h"
#include "library/trackcollection.h"
#include "library/trackcollectionmanager.h"
#include "library/treeitem.h"
#include "moc_preparefeature.cpp"
#include "sources/soundsourceproxy.h"
#include "util/assert.h"
namespace {
const QString kPreparePlaylistName = QStringLiteral("PiFlex Prepare");
} // namespace
PrepareFeature::PrepareFeature(Library* pLibrary, UserSettingsPointer pConfig)
: LibraryFeature(pLibrary, pConfig, QStringLiteral("prepare")),
m_playlistDao(pLibrary->trackCollectionManager()
->internalCollection()
->getPlaylistDAO()),
m_playlistId(kInvalidPlaylistId),
m_pTrackModel(new PlaylistTableModel(this,
pLibrary->trackCollectionManager(),
"mixxx.db.model.prepare")),
m_pSidebarModel(make_parented<TreeItemModel>(this)) {
m_pSidebarModel->setRootItem(TreeItem::newRoot(this));
// Reuse the same hidden Prepare playlist across clean restarts. Unlike a
// normal playlist, it cannot accidentally appear among the user's
// Rekordbox or Mixxx playlists, and it never writes to removable media.
const auto preparePlaylists = m_playlistDao.getPlaylists(PlaylistDAO::PLHT_PREPARE);
if (!preparePlaylists.isEmpty()) {
m_playlistId = preparePlaylists.constFirst().first;
} else {
QString playlistName = kPreparePlaylistName;
m_playlistId = m_playlistDao.createUniquePlaylist(
&playlistName, PlaylistDAO::PLHT_PREPARE);
}
VERIFY_OR_DEBUG_ASSERT(m_playlistId != kInvalidPlaylistId) {
return;
}
m_pTrackModel->selectPlaylist(m_playlistId);
}
QVariant PrepareFeature::title() {
return tr("Prepare");
}
TreeItemModel* PrepareFeature::sidebarModel() const {
return m_pSidebarModel;
}
void PrepareFeature::activate() {
VERIFY_OR_DEBUG_ASSERT(m_playlistId != kInvalidPlaylistId) {
return;
}
emit saveModelState();
m_pTrackModel->selectPlaylist(m_playlistId);
emit showTrackModel(m_pTrackModel);
emit enableCoverArtDisplay(true);
}
void PrepareFeature::activateAndSelect() {
activate();
emit featureSelect(this, QModelIndex());
}
bool PrepareFeature::dropAccept(const QList<QUrl>& urls, QObject* pSource) {
const QList<TrackId> trackIds =
m_pLibrary->trackCollectionManager()->resolveTrackIdsFromUrls(
urls, !pSource);
if (trackIds.isEmpty()) {
return false;
}
addMissingTracks(trackIds);
return true;
}
bool PrepareFeature::dragMoveAccept(const QUrl& url) {
return SoundSourceProxy::isUrlSupported(url);
}
void PrepareFeature::addMissingTracks(const QList<TrackId>& trackIds) {
QList<TrackId> missing;
for (const TrackId& trackId : trackIds) {
if (trackId.isValid() &&
!m_playlistDao.isTrackInPlaylist(trackId, m_playlistId)) {
missing.append(trackId);
}
}
if (!missing.isEmpty()) {
m_playlistDao.appendTracksToPlaylist(missing, m_playlistId);
}
}
void PrepareFeature::toggleTracks(const QList<TrackId>& trackIds) {
QList<TrackId> validTracks;
bool allAlreadyPrepared = true;
for (const TrackId& trackId : trackIds) {
if (!trackId.isValid()) {
continue;
}
validTracks.append(trackId);
if (!m_playlistDao.isTrackInPlaylist(trackId, m_playlistId)) {
allAlreadyPrepared = false;
}
}
if (validTracks.isEmpty()) {
return;
}
if (allAlreadyPrepared) {
for (const TrackId& trackId : validTracks) {
m_playlistDao.removeTracksFromPlaylistById(m_playlistId, trackId);
}
} else {
addMissingTracks(validTracks);
}
}
void PrepareFeature::clear() {
const QList<TrackId> trackIds = m_playlistDao.getTrackIds(m_playlistId);
QSet<TrackId> uniqueTrackIds;
for (const TrackId& trackId : trackIds) {
uniqueTrackIds.insert(trackId);
}
for (const TrackId& trackId : uniqueTrackIds) {
m_playlistDao.removeTracksFromPlaylistById(m_playlistId, trackId);
}
}