void PlayerWidget::updateOverState(OverState newState) { bool result = true; if (_over != newState) { updateOverRect(_over); updateOverRect(newState); if (_over != OverNone) { _stateAnimations.remove(_over); _stateAnimations[-_over] = getms() - ((1. - _stateHovers[_over]) * st::playerDuration); if (!_a_state.animating()) _a_state.start(); } else { result = false; } _over = newState; if (newState != OverNone) { _stateAnimations.remove(-_over); _stateAnimations[_over] = getms() - (_stateHovers[_over] * st::playerDuration); if (!_a_state.animating()) _a_state.start(); setCursor(style::cur_pointer); } else { setCursor(style::cur_default); } } }
void PlayerWidget::mousePressEvent(QMouseEvent *e) { QPoint pos(myrtlpoint(e->pos())); if (e->button() == Qt::LeftButton) { _down = OverNone; if (_song && _over == OverPlay) { playPausePressed(); return; } else if (_over == OverPrev) { prevPressed(); } else if (_over == OverNext) { nextPressed(); } else if (_over == OverClose) { _down = OverClose; } else if (_over == OverVolume) { _down = OverVolume; _downCoord = pos.x() - _volumeRect.x(); cSetSongVolume(snap((_downCoord - ((_volumeRect.width() - st::playerVolume.pxWidth()) / 2)) / float64(st::playerVolume.pxWidth()), 0., 1.)); emit audioPlayer()->songVolumeChanged(); rtlupdate(_volumeRect); } else if (_over == OverPlayback) { SongMsgId playing; AudioPlayerState playingState = AudioPlayerStopped; int64 playingPosition = 0, playingDuration = 0; int32 playingFrequency = 0; audioPlayer()->currentState(&playing, &playingState, &playingPosition, &playingDuration, &playingFrequency); if (playing == _song && playingDuration) { if (playingState == AudioPlayerPlaying || playingState == AudioPlayerStarting || playingState == AudioPlayerResuming) { audioPlayer()->pauseresume(OverviewDocuments); } _down = OverPlayback; _downProgress = snap((pos.x() - _playbackRect.x()) / float64(_playbackRect.width()), 0., 1.); _downDuration = playingDuration; _downFrequency = (playingFrequency ? playingFrequency : AudioVoiceMsgFrequency); rtlupdate(_playbackRect); updateDownTime(); } } else if (_over == OverFull && _song) { if (HistoryItem *item = App::histItemById(_song.msgId)) { App::main()->showMediaOverview(item->history()->peer, OverviewAudioDocuments); } } else if (_over == OverRepeat) { _repeat = !_repeat; updateOverRect(OverRepeat); } } }
void PlayerWidget::step_state(uint64 ms, bool timer) { for (StateAnimations::iterator i = _stateAnimations.begin(); i != _stateAnimations.cend();) { int32 over = qAbs(i.key()); updateOverRect(OverState(over)); float64 dt = float64(ms - i.value()) / st::playerDuration; if (dt >= 1) { _stateHovers[over] = (i.key() > 0) ? 1 : 0; i = _stateAnimations.erase(i); } else { _stateHovers[over] = (i.key() > 0) ? dt : (1 - dt); ++i; } } if (_stateAnimations.isEmpty()) { _a_state.stop(); } }
bool PlayerWidget::stateStep(float64 msc) { bool result = false; uint64 ms = getms(); for (StateAnimations::iterator i = _stateAnimations.begin(); i != _stateAnimations.cend();) { int32 over = qAbs(i.key()); updateOverRect(OverState(over)); float64 dt = float64(ms - i.value()) / st::playerDuration; if (dt >= 1) { _stateHovers[over] = (i.key() > 0) ? 1 : 0; i = _stateAnimations.erase(i); } else { _stateHovers[over] = (i.key() > 0) ? dt : (1 - dt); ++i; } } return !_stateAnimations.isEmpty(); }