Changeset View
Changeset View
Standalone View
Standalone View
src/mediaplaylist.cpp
Show All 36 Lines | |||||
37 | public: | 37 | public: | ||
38 | 38 | | |||
39 | QList<MediaPlayListEntry> mData; | 39 | QList<MediaPlayListEntry> mData; | ||
40 | 40 | | |||
41 | QList<DatabaseInterface::TrackDataType> mTrackData; | 41 | QList<DatabaseInterface::TrackDataType> mTrackData; | ||
42 | 42 | | |||
43 | MusicListenersManager* mMusicListenersManager = nullptr; | 43 | MusicListenersManager* mMusicListenersManager = nullptr; | ||
44 | 44 | | |||
45 | QPersistentModelIndex mPreviousTrack; | ||||
46 | | ||||
45 | QPersistentModelIndex mCurrentTrack; | 47 | QPersistentModelIndex mCurrentTrack; | ||
46 | 48 | | |||
49 | QPersistentModelIndex mNextTrack; | ||||
50 | | ||||
47 | QVariantMap mPersistentState; | 51 | QVariantMap mPersistentState; | ||
48 | 52 | | |||
49 | QMediaPlaylist mLoadPlaylist; | 53 | QMediaPlaylist mLoadPlaylist; | ||
50 | 54 | | |||
51 | int mCurrentPlayListPosition = 0; | 55 | int mCurrentPlayListPosition = 0; | ||
52 | 56 | | |||
53 | bool mRandomPlay = false; | 57 | bool mRandomPlay = false; | ||
54 | 58 | | |||
▲ Show 20 Lines • Show All 210 Lines • ▼ Show 20 Line(s) | 262 | if (!d->mCurrentTrack.isValid()) { | |||
265 | if (!d->mCurrentTrack.isValid()) { | 269 | if (!d->mCurrentTrack.isValid()) { | ||
266 | Q_EMIT playListFinished(); | 270 | Q_EMIT playListFinished(); | ||
267 | resetCurrentTrack(); | 271 | resetCurrentTrack(); | ||
268 | if (!d->mCurrentTrack.isValid()) { | 272 | if (!d->mCurrentTrack.isValid()) { | ||
269 | notifyCurrentTrackChanged(); | 273 | notifyCurrentTrackChanged(); | ||
270 | } | 274 | } | ||
271 | } | 275 | } | ||
272 | } | 276 | } | ||
277 | if (!d->mNextTrack.isValid() || !d->mPreviousTrack.isValid()) { | ||||
278 | notifyPreviousAndNextTracks(); | ||||
279 | } | ||||
273 | 280 | | |||
274 | if (!d->mCurrentTrack.isValid() && rowCount(parent) <= row) { | 281 | if (!d->mCurrentTrack.isValid() && rowCount(parent) <= row) { | ||
275 | resetCurrentTrack(); | 282 | resetCurrentTrack(); | ||
276 | } | 283 | } | ||
277 | 284 | | |||
278 | if (d->mRandomPlay) { | 285 | if (d->mRandomPlay) { | ||
279 | createRandomList(); | 286 | createRandomList(); | ||
280 | } | 287 | } | ||
▲ Show 20 Lines • Show All 490 Lines • ▼ Show 20 Line(s) | 777 | { | |||
771 | return d->mMusicListenersManager; | 778 | return d->mMusicListenersManager; | ||
772 | } | 779 | } | ||
773 | 780 | | |||
774 | int MediaPlayList::tracksCount() const | 781 | int MediaPlayList::tracksCount() const | ||
775 | { | 782 | { | ||
776 | return rowCount(); | 783 | return rowCount(); | ||
777 | } | 784 | } | ||
778 | 785 | | |||
786 | QPersistentModelIndex MediaPlayList::previousTrack() const | ||||
787 | { | ||||
788 | return d->mPreviousTrack; | ||||
789 | } | ||||
790 | | ||||
779 | QPersistentModelIndex MediaPlayList::currentTrack() const | 791 | QPersistentModelIndex MediaPlayList::currentTrack() const | ||
780 | { | 792 | { | ||
781 | return d->mCurrentTrack; | 793 | return d->mCurrentTrack; | ||
782 | } | 794 | } | ||
783 | 795 | | |||
796 | QPersistentModelIndex MediaPlayList::nextTrack() const | ||||
797 | { | ||||
798 | return d->mNextTrack; | ||||
799 | } | ||||
800 | | ||||
784 | int MediaPlayList::currentTrackRow() const | 801 | int MediaPlayList::currentTrackRow() const | ||
785 | { | 802 | { | ||
786 | return d->mCurrentTrack.row(); | 803 | return d->mCurrentTrack.row(); | ||
787 | } | 804 | } | ||
788 | 805 | | |||
789 | bool MediaPlayList::randomPlay() const | 806 | bool MediaPlayList::randomPlay() const | ||
790 | { | 807 | { | ||
791 | return d->mRandomPlay; | 808 | return d->mRandomPlay; | ||
▲ Show 20 Lines • Show All 171 Lines • ▼ Show 20 Line(s) | 955 | } else if (oneEntry.mEntryType != ElisaUtils::Artist && !oneEntry.mIsValid && !oneEntry.mTrackUrl.isValid()) { | |||
963 | Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); | 980 | Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); | ||
964 | 981 | | |||
965 | restorePlayListPosition(); | 982 | restorePlayListPosition(); | ||
966 | 983 | | |||
967 | if (!d->mCurrentTrack.isValid()) { | 984 | if (!d->mCurrentTrack.isValid()) { | ||
968 | resetCurrentTrack(); | 985 | resetCurrentTrack(); | ||
969 | } else if (i == d->mCurrentTrack.row()) { | 986 | } else if (i == d->mCurrentTrack.row()) { | ||
970 | notifyCurrentTrackChanged(); | 987 | notifyCurrentTrackChanged(); | ||
988 | } else if (i == d->mNextTrack.row() || i == d->mPreviousTrack.row()) { | ||||
989 | notifyPreviousAndNextTracks(); | ||||
971 | } | 990 | } | ||
972 | 991 | | |||
973 | break; | 992 | break; | ||
974 | } else if (oneEntry.mEntryType != ElisaUtils::Artist && !oneEntry.mIsValid && oneEntry.mTrackUrl.isValid()) { | 993 | } else if (oneEntry.mEntryType != ElisaUtils::Artist && !oneEntry.mIsValid && oneEntry.mTrackUrl.isValid()) { | ||
975 | if (track.resourceURI() != oneEntry.mTrackUrl) { | 994 | if (track.resourceURI() != oneEntry.mTrackUrl) { | ||
976 | continue; | 995 | continue; | ||
977 | } | 996 | } | ||
978 | 997 | | |||
979 | d->mTrackData[i] = track; | 998 | d->mTrackData[i] = track; | ||
980 | oneEntry.mId = track.databaseId(); | 999 | oneEntry.mId = track.databaseId(); | ||
981 | oneEntry.mIsValid = true; | 1000 | oneEntry.mIsValid = true; | ||
982 | 1001 | | |||
983 | Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); | 1002 | Q_EMIT dataChanged(index(i, 0), index(i, 0), {}); | ||
984 | 1003 | | |||
985 | restorePlayListPosition(); | 1004 | restorePlayListPosition(); | ||
986 | 1005 | | |||
987 | if (!d->mCurrentTrack.isValid()) { | 1006 | if (!d->mCurrentTrack.isValid()) { | ||
988 | resetCurrentTrack(); | 1007 | resetCurrentTrack(); | ||
989 | } else if (i == d->mCurrentTrack.row()) { | 1008 | } else if (i == d->mCurrentTrack.row()) { | ||
990 | notifyCurrentTrackChanged(); | 1009 | notifyCurrentTrackChanged(); | ||
1010 | } else if (i == d->mNextTrack.row() || i == d->mPreviousTrack.row()) { | ||||
1011 | notifyPreviousAndNextTracks(); | ||||
991 | } | 1012 | } | ||
992 | 1013 | | |||
993 | break; | 1014 | break; | ||
994 | } | 1015 | } | ||
995 | } | 1016 | } | ||
996 | } | 1017 | } | ||
997 | 1018 | | |||
998 | void MediaPlayList::trackRemoved(qulonglong trackId) | 1019 | void MediaPlayList::trackRemoved(qulonglong trackId) | ||
Show All 37 Lines | |||||
1036 | 1057 | | |||
1037 | void MediaPlayList::setRandomPlay(bool value) | 1058 | void MediaPlayList::setRandomPlay(bool value) | ||
1038 | { | 1059 | { | ||
1039 | if (d->mRandomPlay != value) { | 1060 | if (d->mRandomPlay != value) { | ||
1040 | d->mRandomPlay = value; | 1061 | d->mRandomPlay = value; | ||
1041 | createRandomList(); | 1062 | createRandomList(); | ||
1042 | Q_EMIT randomPlayChanged(); | 1063 | Q_EMIT randomPlayChanged(); | ||
1043 | Q_EMIT remainingTracksChanged(); | 1064 | Q_EMIT remainingTracksChanged(); | ||
1065 | notifyPreviousAndNextTracks(); | ||||
1044 | } | 1066 | } | ||
1045 | } | 1067 | } | ||
1046 | 1068 | | |||
1047 | void MediaPlayList::setRepeatPlay(bool value) | 1069 | void MediaPlayList::setRepeatPlay(bool value) | ||
1048 | { | 1070 | { | ||
1049 | if (d->mRepeatPlay != value) { | 1071 | if (d->mRepeatPlay != value) { | ||
1050 | d->mRepeatPlay = value; | 1072 | d->mRepeatPlay = value; | ||
1051 | Q_EMIT repeatPlayChanged(); | 1073 | Q_EMIT repeatPlayChanged(); | ||
1052 | Q_EMIT remainingTracksChanged(); | 1074 | Q_EMIT remainingTracksChanged(); | ||
1075 | notifyPreviousAndNextTracks(); | ||||
1053 | } | 1076 | } | ||
1054 | } | 1077 | } | ||
1055 | 1078 | | |||
1056 | void MediaPlayList::displayOrHideUndoInline(bool value) | 1079 | void MediaPlayList::displayOrHideUndoInline(bool value) | ||
1057 | { | 1080 | { | ||
1058 | if(value){ | 1081 | if(value){ | ||
1059 | Q_EMIT displayUndoInline(); | 1082 | Q_EMIT displayUndoInline(); | ||
1060 | }else { | 1083 | }else { | ||
▲ Show 20 Lines • Show All 117 Lines • ▼ Show 20 Line(s) | 1198 | for(int row = 0; row < rowCount(); ++row) { | |||
1178 | if (candidateTrack.isValid() && candidateTrack.data(ColumnsRoles::IsValidRole).toBool()) { | 1201 | if (candidateTrack.isValid() && candidateTrack.data(ColumnsRoles::IsValidRole).toBool()) { | ||
1179 | d->mCurrentTrack = candidateTrack; | 1202 | d->mCurrentTrack = candidateTrack; | ||
1180 | notifyCurrentTrackChanged(); | 1203 | notifyCurrentTrackChanged(); | ||
1181 | break; | 1204 | break; | ||
1182 | } | 1205 | } | ||
1183 | } | 1206 | } | ||
1184 | } | 1207 | } | ||
1185 | 1208 | | |||
1209 | void MediaPlayList::notifyPreviousAndNextTracks() | ||||
1210 | { | ||||
1211 | if (!d->mCurrentTrack.isValid()) { | ||||
1212 | d->mPreviousTrack = QPersistentModelIndex(); | ||||
1213 | d->mNextTrack = QPersistentModelIndex(); | ||||
1214 | } | ||||
1215 | auto mOldPreviousTrack = d->mPreviousTrack; | ||||
1216 | auto mOldNextTrack = d->mNextTrack; | ||||
1217 | // use random list for previous and next types | ||||
1218 | if (d->mRandomPlay) { | ||||
1219 | d->mPreviousTrack = index(d->mRandomPositions.first(), 0); | ||||
1220 | d->mNextTrack = index(d->mRandomPositions.last(), 0); | ||||
1221 | } else if (d->mRepeatPlay) { | ||||
1222 | // forward to end or begin when repeating | ||||
1223 | if (d->mCurrentTrack.row() == 0) { | ||||
1224 | d->mPreviousTrack = index(rowCount() - 1, 0); | ||||
1225 | } else { | ||||
1226 | d->mPreviousTrack = index(d->mCurrentTrack.row() - 1, 0); | ||||
1227 | } | ||||
1228 | if (d->mCurrentTrack.row() == rowCount() - 1) { | ||||
1229 | d->mNextTrack = index(0, 0); | ||||
1230 | } else { | ||||
1231 | d->mNextTrack = index(d->mCurrentTrack.row() + 1, 0); | ||||
1232 | } | ||||
1233 | } else { | ||||
1234 | // return nothing if no tracks available | ||||
1235 | if (d->mCurrentTrack.row() == 0) { | ||||
1236 | d->mPreviousTrack = QPersistentModelIndex(); | ||||
1237 | } else { | ||||
1238 | d->mPreviousTrack = index(d->mCurrentTrack.row() - 1, 0); | ||||
1239 | } | ||||
1240 | if (d->mCurrentTrack.row() == rowCount() - 1) { | ||||
1241 | d->mNextTrack = QPersistentModelIndex(); | ||||
1242 | } else { | ||||
1243 | d->mNextTrack = index(d->mCurrentTrack.row() + 1, 0); | ||||
1244 | } | ||||
1245 | } | ||||
1246 | if (d->mPreviousTrack != mOldPreviousTrack) { | ||||
1247 | Q_EMIT previousTrackChanged(d->mPreviousTrack); | ||||
1248 | } | ||||
1249 | if (d->mNextTrack != mOldNextTrack) { | ||||
1250 | Q_EMIT nextTrackChanged(d->mNextTrack); | ||||
1251 | } | ||||
1252 | } | ||||
1253 | | ||||
1186 | void MediaPlayList::notifyCurrentTrackChanged() | 1254 | void MediaPlayList::notifyCurrentTrackChanged() | ||
1187 | { | 1255 | { | ||
1256 | // determine previous and next tracks first | ||||
1257 | notifyPreviousAndNextTracks(); | ||||
1258 | | ||||
1188 | Q_EMIT currentTrackChanged(d->mCurrentTrack); | 1259 | Q_EMIT currentTrackChanged(d->mCurrentTrack); | ||
1189 | Q_EMIT currentTrackRowChanged(); | 1260 | Q_EMIT currentTrackRowChanged(); | ||
1190 | Q_EMIT remainingTracksChanged(); | 1261 | Q_EMIT remainingTracksChanged(); | ||
1191 | bool currentTrackIsValid = d->mCurrentTrack.isValid(); | 1262 | bool currentTrackIsValid = d->mCurrentTrack.isValid(); | ||
1192 | if (currentTrackIsValid) { | 1263 | if (currentTrackIsValid) { | ||
1193 | d->mCurrentPlayListPosition = d->mCurrentTrack.row(); | 1264 | d->mCurrentPlayListPosition = d->mCurrentTrack.row(); | ||
1194 | } | 1265 | } | ||
1195 | } | 1266 | } | ||
▲ Show 20 Lines • Show All 63 Lines • Show Last 20 Lines |