@@ -1116,6 +1116,48 @@ int PlaylistDAO::tracksInPlaylist(const int playlistId) const {
1116
1116
return count;
1117
1117
}
1118
1118
1119
+ void PlaylistDAO::orderTracksByCurrPos (const int playlistId,
1120
+ QList<std::pair<TrackId, int >>& newOrder) {
1121
+ if (newOrder.isEmpty () || playlistId == kInvalidPlaylistId ) {
1122
+ return ;
1123
+ }
1124
+ ScopedTransaction transaction (m_database);
1125
+ QSqlQuery query (m_database);
1126
+ query.prepare (QStringLiteral (
1127
+ " UPDATE PlaylistTracks "
1128
+ " SET position=:new_pos "
1129
+ " WHERE position=:old_pos AND "
1130
+ " track_id=:track_id AND "
1131
+ " playlist_id=:pl_id" ));
1132
+ int newPos = 1 ;
1133
+ for (auto oldIdAndPos : newOrder) {
1134
+ int oldPos = oldIdAndPos.second ;
1135
+ const TrackId trackId = oldIdAndPos.first ;
1136
+ VERIFY_OR_DEBUG_ASSERT (trackId.isValid ()) {
1137
+ return ;
1138
+ }
1139
+ query.bindValue (" :new_pos" , newPos++);
1140
+ query.bindValue (" :old_pos" , oldPos);
1141
+ query.bindValue (" :track_id" , trackId.toVariant ());
1142
+ query.bindValue (" :pl_id" , playlistId);
1143
+ if (!query.exec ()) {
1144
+ // We temporarily have duplicate positions, so abort the entire operation
1145
+ // to not leave the playlist with an invalid state.
1146
+ LOG_FAILED_QUERY (query);
1147
+ return ;
1148
+ }
1149
+ }
1150
+
1151
+ transaction.commit ();
1152
+
1153
+ // Print out any SQL error, if there was one.
1154
+ if (query.lastError ().isValid ()) {
1155
+ qDebug () << query.lastError ();
1156
+ }
1157
+
1158
+ emit tracksMoved (QSet<int >{playlistId});
1159
+ }
1160
+
1119
1161
void PlaylistDAO::moveTrack (const int playlistId, const int oldPosition, const int newPosition) {
1120
1162
ScopedTransaction transaction (m_database);
1121
1163
QSqlQuery query (m_database);
@@ -1341,9 +1383,7 @@ void PlaylistDAO::shuffleTracks(const int playlistId,
1341
1383
}
1342
1384
}
1343
1385
1344
- // qDebug() << "Swapping tracks " << trackAPosition << " and " << trackBPosition;
1345
- trackPositionIds.insert (trackAPosition, trackBId);
1346
- trackPositionIds.insert (trackBPosition, trackAId);
1386
+ // qDebug() << "Swapping tracks " << trackAPosition << " and " << trackBPosition;
1347
1387
1348
1388
// TODO: The following use of QList<T>::swap(int, int) is deprecated
1349
1389
// and should be replaced with QList<T>::swapItemsAt(int, int)
0 commit comments