diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 034aeaa31f..542ceb9da7 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -6261,6 +6261,38 @@ void OverlayWidget::handleKeyPress(not_null e) { } else if (key == Qt::Key_Space) { playbackPauseResume(); return; + } else if (modifiers.testFlag(Qt::AltModifier) + && (key == Qt::Key_Left || key == Qt::Key_Right) + && _streamed->controls + && !_streamed->controls->timestamps().empty()) { + const auto ×tamps = _streamed->controls->timestamps(); + const auto &state = _streamed->instance.info().video.state; + const auto duration = state.duration; + if (duration > 0) { + const auto progress = state.position + / float64(duration); + const auto eps = 0.005; + if (key == Qt::Key_Right) { + for (const auto &ts : timestamps) { + if (ts.position > progress + eps) { + activateControls(); + restartAtProgress(ts.position); + return; + } + } + } else { + for (auto i = int(timestamps.size()) - 1; i >= 0; --i) { + if (timestamps[i].position < progress - eps) { + activateControls(); + restartAtProgress(timestamps[i].position); + return; + } + } + activateControls(); + restartAtSeekPosition(0); + } + } + return; } else if (_fullScreenVideo) { if (key == Qt::Key_Escape) { playbackToggleFullScreen(); diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.h b/Telegram/SourceFiles/media/view/media_view_playback_controls.h index 91c5272c3b..fb68c6d758 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.h +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.h @@ -72,6 +72,9 @@ public: void setTimestamps(std::vector timestamps); void setInFullScreen(bool inFullScreen); [[nodiscard]] bool hasTimestamps() const; + [[nodiscard]] auto ×tamps() const { + return _timestamps; + } [[nodiscard]] bool hasMenu() const; [[nodiscard]] bool dragging() const;