Changeset View
Changeset View
Standalone View
Standalone View
src/managemediaplayercontrol.cpp
Show All 11 Lines | |||||
12 | * Lesser General Public License for more details. | 12 | * Lesser General Public License for more details. | ||
13 | * | 13 | * | ||
14 | * You should have received a copy of the GNU Lesser General Public License | 14 | * You should have received a copy of the GNU Lesser General Public License | ||
15 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | 15 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
16 | */ | 16 | */ | ||
17 | 17 | | |||
18 | #include "managemediaplayercontrol.h" | 18 | #include "managemediaplayercontrol.h" | ||
19 | 19 | | |||
20 | #include <QDataStream> | 20 | #include <QDebug> | ||
21 | 21 | | |||
22 | ManageMediaPlayerControl::ManageMediaPlayerControl(QObject *parent) : QObject(parent) | 22 | ManageMediaPlayerControl::ManageMediaPlayerControl(QObject *parent) : QObject(parent) | ||
23 | { | 23 | { | ||
24 | 24 | | |||
25 | } | 25 | } | ||
26 | 26 | | |||
27 | bool ManageMediaPlayerControl::playControlEnabled() const | 27 | bool ManageMediaPlayerControl::playControlEnabled() const | ||
28 | { | 28 | { | ||
29 | if (!mPlayListModel) { | 29 | return mCurrentTrack.isValid(); | ||
30 | return false; | | |||
31 | } | | |||
32 | | ||||
33 | if (!mCurrentTrack.isValid()) { | | |||
34 | return false; | | |||
35 | } | | |||
36 | | ||||
37 | return mPlayListModel->rowCount() > 0; | | |||
38 | } | 30 | } | ||
39 | 31 | | |||
40 | bool ManageMediaPlayerControl::skipBackwardControlEnabled() const | 32 | bool ManageMediaPlayerControl::skipBackwardControlEnabled() const | ||
41 | { | 33 | { | ||
42 | if (!mPlayListModel) { | 34 | return (mPreviousTrack.isValid() && mIsInPlayingState); | ||
43 | return false; | | |||
44 | } | | |||
45 | | ||||
46 | if (!mCurrentTrack.isValid()) { | | |||
47 | return false; | | |||
48 | } | | |||
49 | | ||||
50 | return (mRandomOrContinuePlay || (mCurrentTrack.row() > 0)) && mIsInPlayingState; | | |||
51 | } | 35 | } | ||
52 | 36 | | |||
53 | bool ManageMediaPlayerControl::skipForwardControlEnabled() const | 37 | bool ManageMediaPlayerControl::skipForwardControlEnabled() const | ||
54 | { | 38 | { | ||
55 | if (!mPlayListModel) { | 39 | return (mNextTrack.isValid() && mIsInPlayingState); | ||
56 | return false; | | |||
57 | } | | |||
58 | | ||||
59 | if (!mCurrentTrack.isValid()) { | | |||
60 | return false; | | |||
61 | } | | |||
62 | | ||||
63 | return (mRandomOrContinuePlay || (mCurrentTrack.row() < mPlayListModel->rowCount() - 1)) && mIsInPlayingState; | | |||
64 | } | 40 | } | ||
65 | 41 | | |||
66 | bool ManageMediaPlayerControl::musicPlaying() const | 42 | bool ManageMediaPlayerControl::musicPlaying() const | ||
67 | { | 43 | { | ||
68 | return mPlayerState == ManageMediaPlayerControl::PlayerState::Playing; | 44 | return mIsInPlayingState; | ||
69 | } | 45 | } | ||
70 | 46 | | |||
71 | void ManageMediaPlayerControl::playerPaused() | 47 | void ManageMediaPlayerControl::playerPausedOrStopped() | ||
72 | { | 48 | { | ||
73 | //qDebug() << "ManageMediaPlayerControl::playerPaused"; | 49 | if (mIsInPlayingState) { | ||
74 | | ||||
75 | if (!mIsInPlayingState) { | | |||
76 | auto oldPreviousTrackIsEnabled = skipBackwardControlEnabled(); | 50 | auto oldPreviousTrackIsEnabled = skipBackwardControlEnabled(); | ||
77 | auto oldNextTrackIsEnabled = skipForwardControlEnabled(); | 51 | auto oldNextTrackIsEnabled = skipForwardControlEnabled(); | ||
78 | 52 | | |||
79 | mIsInPlayingState = true; | 53 | mIsInPlayingState = false; | ||
54 | Q_EMIT musicPlayingChanged(); | ||||
80 | 55 | | |||
81 | if (!mCurrentTrack.isValid()) { | 56 | if (!mCurrentTrack.isValid()) { | ||
82 | return; | 57 | return; | ||
83 | } | 58 | } | ||
84 | 59 | | |||
85 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | 60 | if (oldNextTrackIsEnabled != skipForwardControlEnabled()) { | ||
86 | if (oldNextTrackIsEnabled != newNextTrackIsEnabled) { | | |||
87 | Q_EMIT skipForwardControlEnabledChanged(); | 61 | Q_EMIT skipForwardControlEnabledChanged(); | ||
88 | } | 62 | } | ||
89 | 63 | | |||
90 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | 64 | if (oldPreviousTrackIsEnabled != skipBackwardControlEnabled()) { | ||
91 | if (oldPreviousTrackIsEnabled != newPreviousTrackIsEnabled) { | | |||
92 | Q_EMIT skipBackwardControlEnabledChanged(); | 65 | Q_EMIT skipBackwardControlEnabledChanged(); | ||
93 | } | 66 | } | ||
94 | } | 67 | } | ||
95 | | ||||
96 | mPlayerState = ManageMediaPlayerControl::PlayerState::Paused; | | |||
97 | Q_EMIT musicPlayingChanged(); | | |||
98 | } | 68 | } | ||
99 | 69 | | |||
100 | void ManageMediaPlayerControl::playerPlaying() | 70 | void ManageMediaPlayerControl::playerPlaying() | ||
101 | { | 71 | { | ||
102 | if (!mIsInPlayingState) { | 72 | if (!mIsInPlayingState) { | ||
103 | auto oldPreviousTrackIsEnabled = skipBackwardControlEnabled(); | 73 | auto oldPreviousTrackIsEnabled = skipBackwardControlEnabled(); | ||
104 | auto oldNextTrackIsEnabled = skipForwardControlEnabled(); | 74 | auto oldNextTrackIsEnabled = skipForwardControlEnabled(); | ||
105 | 75 | | |||
106 | mIsInPlayingState = true; | 76 | mIsInPlayingState = true; | ||
77 | Q_EMIT musicPlayingChanged(); | ||||
107 | 78 | | |||
108 | if (!mCurrentTrack.isValid()) { | 79 | if (!mCurrentTrack.isValid()) { | ||
109 | return; | 80 | return; | ||
110 | } | 81 | } | ||
111 | 82 | | |||
112 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | 83 | if (oldNextTrackIsEnabled != skipForwardControlEnabled()) { | ||
113 | if (oldNextTrackIsEnabled != newNextTrackIsEnabled) { | | |||
114 | Q_EMIT skipForwardControlEnabledChanged(); | 84 | Q_EMIT skipForwardControlEnabledChanged(); | ||
115 | } | 85 | } | ||
116 | 86 | | |||
117 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | 87 | if (oldPreviousTrackIsEnabled != skipBackwardControlEnabled()) { | ||
118 | if (oldPreviousTrackIsEnabled != newPreviousTrackIsEnabled) { | | |||
119 | Q_EMIT skipBackwardControlEnabledChanged(); | 88 | Q_EMIT skipBackwardControlEnabledChanged(); | ||
120 | } | 89 | } | ||
121 | } | 90 | } | ||
122 | | ||||
123 | mPlayerState = ManageMediaPlayerControl::PlayerState::Playing; | | |||
124 | Q_EMIT musicPlayingChanged(); | | |||
125 | } | 91 | } | ||
126 | 92 | | |||
127 | void ManageMediaPlayerControl::playerStopped() | 93 | void ManageMediaPlayerControl::setPreviousTrack(const QPersistentModelIndex &previousTrack) | ||
128 | { | 94 | { | ||
129 | //qDebug() << "ManageMediaPlayerControl::playerStopped"; | 95 | if (mPreviousTrack == previousTrack) { | ||
130 | 96 | return; | |||
131 | if (mIsInPlayingState) { | 97 | } | ||
132 | auto oldPreviousTrackIsEnabled = skipBackwardControlEnabled(); | | |||
133 | auto oldNextTrackIsEnabled = skipForwardControlEnabled(); | | |||
134 | 98 | | |||
135 | mIsInPlayingState = false; | 99 | bool oldValueSkipBackward = skipBackwardControlEnabled(); | ||
136 | 100 | | |||
137 | if (mCurrentTrack.isValid()) { | 101 | mPreviousTrack = previousTrack; | ||
138 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | 102 | Q_EMIT previousTrackChanged(); | ||
139 | if (oldNextTrackIsEnabled != newNextTrackIsEnabled) { | | |||
140 | Q_EMIT skipForwardControlEnabledChanged(); | | |||
141 | } | | |||
142 | 103 | | |||
143 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | 104 | if (oldValueSkipBackward != skipBackwardControlEnabled()) { | ||
144 | if (oldPreviousTrackIsEnabled != newPreviousTrackIsEnabled) { | | |||
145 | Q_EMIT skipBackwardControlEnabledChanged(); | 105 | Q_EMIT skipBackwardControlEnabledChanged(); | ||
146 | } | 106 | } | ||
147 | } | 107 | } | ||
148 | } | | |||
149 | | ||||
150 | mPlayerState = ManageMediaPlayerControl::PlayerState::Stopped; | | |||
151 | Q_EMIT musicPlayingChanged(); | | |||
152 | } | | |||
153 | 108 | | |||
154 | void ManageMediaPlayerControl::setCurrentTrack(const QPersistentModelIndex ¤tTrack) | 109 | void ManageMediaPlayerControl::setCurrentTrack(const QPersistentModelIndex ¤tTrack) | ||
155 | { | 110 | { | ||
156 | if (mCurrentTrack == currentTrack) { | 111 | if (mCurrentTrack == currentTrack) { | ||
157 | return; | 112 | return; | ||
158 | } | 113 | } | ||
159 | 114 | | |||
160 | bool oldPlayControlEnabled = playControlEnabled(); | 115 | bool oldPlayControlEnabled = playControlEnabled(); | ||
161 | bool oldValueSkipBackward = skipBackwardControlEnabled(); | | |||
162 | bool oldValueSkipForward = skipForwardControlEnabled(); | | |||
163 | 116 | | |||
164 | mCurrentTrack = currentTrack; | 117 | mCurrentTrack = currentTrack; | ||
165 | Q_EMIT currentTrackChanged(); | 118 | Q_EMIT currentTrackChanged(); | ||
166 | 119 | | |||
167 | if (oldPlayControlEnabled != playControlEnabled()) { | 120 | if (oldPlayControlEnabled != playControlEnabled()) { | ||
168 | Q_EMIT playControlEnabledChanged(); | 121 | Q_EMIT playControlEnabledChanged(); | ||
169 | } | 122 | } | ||
170 | | ||||
171 | if (!mIsInPlayingState) { | | |||
172 | return; | | |||
173 | } | | |||
174 | | ||||
175 | if (oldValueSkipBackward != skipBackwardControlEnabled()) { | | |||
176 | Q_EMIT skipBackwardControlEnabledChanged(); | | |||
177 | } | | |||
178 | | ||||
179 | if (oldValueSkipForward != skipForwardControlEnabled()) { | | |||
180 | Q_EMIT skipForwardControlEnabledChanged(); | | |||
181 | } | | |||
182 | } | 123 | } | ||
183 | 124 | | |||
184 | bool ManageMediaPlayerControl::randomOrContinuePlay() const | 125 | void ManageMediaPlayerControl::setNextTrack(const QPersistentModelIndex &nextTrack) | ||
185 | { | 126 | { | ||
186 | return mRandomOrContinuePlay; | 127 | if (mNextTrack == nextTrack) { | ||
187 | } | | |||
188 | | ||||
189 | void ManageMediaPlayerControl::setRandomOrContinuePlay(bool randomOrContinuePlay) | | |||
190 | { | | |||
191 | if (mRandomOrContinuePlay == randomOrContinuePlay) { | | |||
192 | return; | 128 | return; | ||
193 | } | 129 | } | ||
194 | 130 | | |||
195 | auto oldPreviousTrackIsEnabled = skipBackwardControlEnabled(); | 131 | bool oldValueSkipForward = skipForwardControlEnabled(); | ||
196 | auto oldNextTrackIsEnabled = skipForwardControlEnabled(); | | |||
197 | | ||||
198 | mRandomOrContinuePlay = randomOrContinuePlay; | | |||
199 | Q_EMIT randomOrContinuePlayChanged(); | | |||
200 | | ||||
201 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | | |||
202 | if (oldNextTrackIsEnabled != newNextTrackIsEnabled) { | | |||
203 | Q_EMIT skipForwardControlEnabledChanged(); | | |||
204 | } | | |||
205 | | ||||
206 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | | |||
207 | if (oldPreviousTrackIsEnabled != newPreviousTrackIsEnabled) { | | |||
208 | Q_EMIT skipBackwardControlEnabledChanged(); | | |||
209 | } | | |||
210 | } | | |||
211 | | ||||
212 | void ManageMediaPlayerControl::playListTracksWillBeInserted(const QModelIndex &parent, int first, int last) | | |||
213 | { | | |||
214 | Q_UNUSED(parent); | | |||
215 | Q_UNUSED(first); | | |||
216 | Q_UNUSED(last); | | |||
217 | | ||||
218 | mSkipBackwardControlWasEnabled = skipBackwardControlEnabled(); | | |||
219 | mSkipForwardControlWasEnabled = skipForwardControlEnabled(); | | |||
220 | } | | |||
221 | | ||||
222 | void ManageMediaPlayerControl::playListTracksInserted(const QModelIndex &parent, int first, int last) | | |||
223 | { | | |||
224 | Q_UNUSED(parent); | | |||
225 | Q_UNUSED(first); | | |||
226 | Q_UNUSED(last); | | |||
227 | | ||||
228 | if (!mCurrentTrack.isValid()) { | | |||
229 | mSkipBackwardControlWasEnabled = false; | | |||
230 | mSkipForwardControlWasEnabled = false; | | |||
231 | | ||||
232 | return; | | |||
233 | } | | |||
234 | | ||||
235 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | | |||
236 | if (mSkipForwardControlWasEnabled != newNextTrackIsEnabled) { | | |||
237 | Q_EMIT skipForwardControlEnabledChanged(); | | |||
238 | } | | |||
239 | | ||||
240 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | | |||
241 | if (mSkipBackwardControlWasEnabled != newPreviousTrackIsEnabled) { | | |||
242 | Q_EMIT skipBackwardControlEnabledChanged(); | | |||
243 | } | | |||
244 | } | | |||
245 | | ||||
246 | void ManageMediaPlayerControl::playListTracksWillBeRemoved(const QModelIndex &parent, int first, int last) | | |||
247 | { | | |||
248 | Q_UNUSED(parent); | | |||
249 | | ||||
250 | if (!mCurrentTrack.isValid()) { | | |||
251 | mCurrentTrackWillBeRemoved = false; | | |||
252 | mSkipBackwardControlWasEnabled = false; | | |||
253 | mSkipForwardControlWasEnabled = false; | | |||
254 | | ||||
255 | return; | | |||
256 | } | | |||
257 | | ||||
258 | mCurrentTrackWillBeRemoved = (mCurrentTrack.row() >= first && mCurrentTrack.row() <= last); | | |||
259 | mSkipBackwardControlWasEnabled = skipBackwardControlEnabled(); | | |||
260 | mSkipForwardControlWasEnabled = skipForwardControlEnabled(); | | |||
261 | } | | |||
262 | | ||||
263 | void ManageMediaPlayerControl::playListTracksRemoved(const QModelIndex &parent, int first, int last) | | |||
264 | { | | |||
265 | Q_UNUSED(parent); | | |||
266 | Q_UNUSED(first); | | |||
267 | Q_UNUSED(last); | | |||
268 | | ||||
269 | if (mCurrentTrackWillBeRemoved) { | | |||
270 | Q_EMIT currentTrackChanged(); | | |||
271 | Q_EMIT playControlEnabledChanged(); | | |||
272 | } | | |||
273 | | ||||
274 | if (!mCurrentTrack.isValid()) { | | |||
275 | if (mSkipBackwardControlWasEnabled) { | | |||
276 | Q_EMIT skipBackwardControlEnabledChanged(); | | |||
277 | } | | |||
278 | | ||||
279 | if (mSkipForwardControlWasEnabled) { | | |||
280 | Q_EMIT skipForwardControlEnabledChanged(); | | |||
281 | } | | |||
282 | | ||||
283 | return; | | |||
284 | } | | |||
285 | | ||||
286 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | | |||
287 | if (mSkipForwardControlWasEnabled != newNextTrackIsEnabled) { | | |||
288 | Q_EMIT skipForwardControlEnabledChanged(); | | |||
289 | } | | |||
290 | | ||||
291 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | | |||
292 | if (mSkipBackwardControlWasEnabled != newPreviousTrackIsEnabled) { | | |||
293 | Q_EMIT skipBackwardControlEnabledChanged(); | | |||
294 | } | | |||
295 | } | | |||
296 | | ||||
297 | void ManageMediaPlayerControl::playListReset() | | |||
298 | { | | |||
299 | } | | |||
300 | | ||||
301 | void ManageMediaPlayerControl::tracksAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) | | |||
302 | { | | |||
303 | Q_UNUSED(parent); | | |||
304 | Q_UNUSED(start); | | |||
305 | Q_UNUSED(end); | | |||
306 | Q_UNUSED(destination); | | |||
307 | Q_UNUSED(row); | | |||
308 | 132 | | |||
309 | mSkipBackwardControlWasEnabled = skipBackwardControlEnabled(); | 133 | mNextTrack = nextTrack; | ||
310 | mSkipForwardControlWasEnabled = skipForwardControlEnabled(); | 134 | Q_EMIT nextTrackChanged(); | ||
311 | } | | |||
312 | 135 | | |||
313 | void ManageMediaPlayerControl::tracksMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) | 136 | if (oldValueSkipForward != skipForwardControlEnabled()) { | ||
314 | { | | |||
315 | Q_UNUSED(parent); | | |||
316 | Q_UNUSED(start); | | |||
317 | Q_UNUSED(end); | | |||
318 | Q_UNUSED(destination); | | |||
319 | Q_UNUSED(row); | | |||
320 | | ||||
321 | auto newNextTrackIsEnabled = skipForwardControlEnabled(); | | |||
322 | if (mSkipForwardControlWasEnabled != newNextTrackIsEnabled) { | | |||
323 | Q_EMIT skipForwardControlEnabledChanged(); | 137 | Q_EMIT skipForwardControlEnabledChanged(); | ||
324 | } | 138 | } | ||
325 | | ||||
326 | auto newPreviousTrackIsEnabled = skipBackwardControlEnabled(); | | |||
327 | if (mSkipBackwardControlWasEnabled != newPreviousTrackIsEnabled) { | | |||
328 | Q_EMIT skipBackwardControlEnabledChanged(); | | |||
329 | } | | |||
330 | } | 139 | } | ||
331 | 140 | | |||
332 | void ManageMediaPlayerControl::setPlayListModel(QAbstractItemModel *aPlayListModel) | 141 | QPersistentModelIndex ManageMediaPlayerControl::previousTrack() const | ||
333 | { | 142 | { | ||
334 | if (mPlayListModel) { | 143 | return mPreviousTrack; | ||
335 | disconnect(mPlayListModel, &QAbstractItemModel::rowsAboutToBeInserted, this, &ManageMediaPlayerControl::playListTracksWillBeInserted); | | |||
336 | disconnect(mPlayListModel, &QAbstractItemModel::rowsInserted, this, &ManageMediaPlayerControl::playListTracksInserted); | | |||
337 | disconnect(mPlayListModel, &QAbstractItemModel::rowsAboutToBeRemoved, this, &ManageMediaPlayerControl::playListTracksWillBeRemoved); | | |||
338 | disconnect(mPlayListModel, &QAbstractItemModel::rowsRemoved, this, &ManageMediaPlayerControl::playListTracksRemoved); | | |||
339 | disconnect(mPlayListModel, &QAbstractItemModel::rowsMoved, this, &ManageMediaPlayerControl::tracksMoved); | | |||
340 | disconnect(mPlayListModel, &QAbstractItemModel::rowsAboutToBeMoved, this, &ManageMediaPlayerControl::tracksAboutToBeMoved); | | |||
341 | disconnect(mPlayListModel, &QAbstractItemModel::modelReset, this, &ManageMediaPlayerControl::playListReset); | | |||
342 | } | | |||
343 | | ||||
344 | mPlayListModel = aPlayListModel; | | |||
345 | | ||||
346 | if (mPlayListModel) { | | |||
347 | connect(mPlayListModel, &QAbstractItemModel::rowsAboutToBeInserted, this, &ManageMediaPlayerControl::playListTracksWillBeInserted); | | |||
348 | connect(mPlayListModel, &QAbstractItemModel::rowsInserted, this, &ManageMediaPlayerControl::playListTracksInserted); | | |||
349 | connect(mPlayListModel, &QAbstractItemModel::rowsAboutToBeRemoved, this, &ManageMediaPlayerControl::playListTracksWillBeRemoved); | | |||
350 | connect(mPlayListModel, &QAbstractItemModel::rowsRemoved, this, &ManageMediaPlayerControl::playListTracksRemoved); | | |||
351 | connect(mPlayListModel, &QAbstractItemModel::rowsMoved, this, &ManageMediaPlayerControl::tracksMoved); | | |||
352 | connect(mPlayListModel, &QAbstractItemModel::rowsAboutToBeMoved, this, &ManageMediaPlayerControl::tracksAboutToBeMoved); | | |||
353 | connect(mPlayListModel, &QAbstractItemModel::modelReset, this, &ManageMediaPlayerControl::playListReset); | | |||
354 | } | | |||
355 | | ||||
356 | Q_EMIT playListModelChanged(); | | |||
357 | } | | |||
358 | | ||||
359 | QAbstractItemModel *ManageMediaPlayerControl::playListModel() const | | |||
360 | { | | |||
361 | return mPlayListModel; | | |||
362 | } | 144 | } | ||
363 | 145 | | |||
364 | QPersistentModelIndex ManageMediaPlayerControl::currentTrack() const | 146 | QPersistentModelIndex ManageMediaPlayerControl::currentTrack() const | ||
365 | { | 147 | { | ||
366 | return mCurrentTrack; | 148 | return mCurrentTrack; | ||
367 | } | 149 | } | ||
368 | 150 | | |||
369 | QDataStream &operator<<(QDataStream &out, const ManageMediaPlayerControl::PlayerState &state) | 151 | QPersistentModelIndex ManageMediaPlayerControl::nextTrack() const | ||
370 | { | 152 | { | ||
371 | out << static_cast<int>(state); | 153 | return mNextTrack; | ||
372 | return out; | | |||
373 | } | 154 | } | ||
374 | 155 | | |||
375 | QDataStream &operator>>(QDataStream &in, ManageMediaPlayerControl::PlayerState &state) | | |||
376 | { | | |||
377 | int value; | | |||
378 | in >> value; | | |||
379 | state = static_cast<ManageMediaPlayerControl::PlayerState>(value); | | |||
380 | return in; | | |||
381 | } | | |||
382 | | ||||
383 | | ||||
384 | #include "moc_managemediaplayercontrol.cpp" | 156 | #include "moc_managemediaplayercontrol.cpp" |