#include "MpvControls.hh" #include "MpvContainer.hh" using namespace Vivy; MpvControls::MpvControls(MpvContainer *passedContainer, QWidget *parent) noexcept : QWidget(parent) , mpv(passedContainer) { auto *progressBar = new QSlider(this); auto *togglePlaybackButton = new QPushButton(playIcon, "", this); // Be default MPV is paused auto *reCreateMpvButton = new QPushButton( reCreateMpvIcon, "", this); // Recreate the MPV context if something went wrong progressBar->setTracking(false); progressBar->setOrientation(Qt::Horizontal); mpv->registerMpvDurationCallback([progressBar, this](double time) noexcept -> void { timePosition = chrono::seconds::zero(); timeDuration = chrono::seconds(static_cast<long>(time)); progressBar->setMaximum(static_cast<int>(timeDuration.count())); progressBar->setValue(0); }); mpv->registerMpvTimeCallback([progressBar, this](double time) noexcept -> void { if (!progressBar->isSliderDown()) { // The user is not pressing the slider timePosition = chrono::seconds(static_cast<long>(time)); progressBar->setValue(static_cast<int>(timePosition.count())); } }); connect(progressBar, &QAbstractSlider::sliderMoved, this, [this](int value) noexcept -> void { askedSliderPosition = value; }); connect(progressBar, &QAbstractSlider::actionTriggered, this, [progressBar](int action) noexcept -> void { switch (static_cast<QAbstractSlider::SliderAction>(action)) { case QAbstractSlider::SliderSingleStepAdd: case QAbstractSlider::SliderSingleStepSub: case QAbstractSlider::SliderPageStepAdd: case QAbstractSlider::SliderPageStepSub: progressBar->setSliderPosition(progressBar->value()); break; case QAbstractSlider::SliderAction::SliderMove: case QAbstractSlider::SliderNoAction: case QAbstractSlider::SliderToMinimum: case QAbstractSlider::SliderToMaximum: break; } }); connect(progressBar, &QAbstractSlider::sliderReleased, this, [this]() noexcept -> void { qDebug() << "Slider set to" << askedSliderPosition << "max was" << timeDuration.count(); timePosition = chrono::seconds(askedSliderPosition); mpv->seekInFile(timePosition); }); connect(togglePlaybackButton, &QAbstractButton::clicked, mpv, &MpvContainer::mpvTogglePlayback); connect(reCreateMpvButton, &QAbstractButton::clicked, mpv, &MpvContainer::reCreateMpvContext); connect(mpv, &MpvContainer::mpvPlaybackToggled, this, [this, togglePlaybackButton](bool isPlay) noexcept -> void { togglePlaybackButton->setIcon(isPlay ? pauseIcon : playIcon); }); auto *centralLayout = new QHBoxLayout(this); centralLayout->addWidget(togglePlaybackButton); centralLayout->addWidget(reCreateMpvButton); centralLayout->addWidget(progressBar, 1); setLayout(centralLayout); }