From 03dc7a8780aafc21a4a8cf5e5db9eea9be58a331 Mon Sep 17 00:00:00 2001 From: cg2121 Date: Thu, 16 Jan 2025 01:05:33 -0600 Subject: [PATCH] Update to latest media control files --- CMakeLists.txt | 8 +- src/absolute-slider.cpp | 97 +++++++++++++ src/absolute-slider.hpp | 26 ++++ src/media-controls.cpp | 237 ++++++++++++++++++++----------- src/media-controls.hpp | 25 ++-- src/media-controls.ui | 167 +++++++++++++--------- src/media-slider.cpp | 53 ------- src/media-slider.hpp | 18 --- src/slider-absoluteset-style.cpp | 20 --- src/slider-absoluteset-style.hpp | 12 -- src/slider-ignorewheel.cpp | 88 +++--------- src/slider-ignorewheel.hpp | 42 ++---- src/soundboard.cpp | 5 +- 13 files changed, 431 insertions(+), 367 deletions(-) create mode 100644 src/absolute-slider.cpp create mode 100644 src/absolute-slider.hpp delete mode 100644 src/media-slider.cpp delete mode 100644 src/media-slider.hpp delete mode 100644 src/slider-absoluteset-style.cpp delete mode 100644 src/slider-absoluteset-style.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d9d1f0..e6d9faf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,9 @@ endif() target_sources( ${CMAKE_PROJECT_NAME} - PRIVATE src/clickable-label.hpp + PRIVATE src/absolute-slider.cpp + src/absolute-slider.hpp + src/clickable-label.hpp src/media-controls.cpp src/media-controls.hpp src/media-controls.ui @@ -45,14 +47,10 @@ target_sources( src/media-edit.cpp src/media-edit.hpp src/MediaEdit.ui - src/media-slider.cpp - src/media-slider.hpp src/plugin-support.c.in src/plugin-support.h src/scene-tree.cpp src/scene-tree.hpp - src/slider-absoluteset-style.cpp - src/slider-absoluteset-style.hpp src/slider-ignorewheel.cpp src/slider-ignorewheel.hpp src/soundboard.cpp diff --git a/src/absolute-slider.cpp b/src/absolute-slider.cpp new file mode 100644 index 0000000..8aedba8 --- /dev/null +++ b/src/absolute-slider.cpp @@ -0,0 +1,97 @@ +#include "moc_absolute-slider.cpp" + +AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent) +{ + installEventFilter(this); + setMouseTracking(true); +} + +AbsoluteSlider::AbsoluteSlider(Qt::Orientation orientation, QWidget *parent) : SliderIgnoreScroll(orientation, parent) +{ + installEventFilter(this); + setMouseTracking(true); +} + +void AbsoluteSlider::mousePressEvent(QMouseEvent *event) +{ + dragging = (event->buttons() & Qt::LeftButton || event->buttons() & Qt::MiddleButton); + + if (dragging) { + setSliderDown(true); + setValue(posToRangeValue(event)); + emit AbsoluteSlider::sliderMoved(posToRangeValue(event)); + } + + event->accept(); +} + +void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event) +{ + dragging = false; + setSliderDown(false); + event->accept(); +} + +void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event) +{ + int val = posToRangeValue(event); + + if (val > maximum()) + val = maximum(); + else if (val < minimum()) + val = minimum(); + + emit absoluteSliderHovered(val); + + if (dragging) { + setValue(posToRangeValue(event)); + emit AbsoluteSlider::sliderMoved(posToRangeValue(event)); + } + + QSlider::mouseMoveEvent(event); + event->accept(); +} + +bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyPress) { + QKeyEvent *keyEvent = static_cast(event); + + if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) { + return true; + } + } + + return QSlider::eventFilter(obj, event); +} + +int AbsoluteSlider::posToRangeValue(QMouseEvent *event) +{ + QStyleOptionSlider opt; + initStyleOption(&opt); + + int pos; + int sliderMin; + int sliderMax; + int handleLength; + + const QRect groove = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); + const QRect handle = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); + + if (orientation() == Qt::Horizontal) { + pos = event->pos().x(); + handleLength = handle.width(); + sliderMin = groove.left() + (handleLength / 2); + sliderMax = groove.right() - (handleLength / 2) + 1; + } else { + pos = event->pos().y(); + handleLength = handle.height(); + sliderMin = groove.top() + (handleLength / 2); + sliderMax = groove.bottom() - (handleLength / 2) + 1; + } + + int sliderValue = style()->sliderValueFromPosition(minimum(), maximum(), pos - sliderMin, sliderMax - sliderMin, + opt.upsideDown); + + return sliderValue; +} diff --git a/src/absolute-slider.hpp b/src/absolute-slider.hpp new file mode 100644 index 0000000..67e0adb --- /dev/null +++ b/src/absolute-slider.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +class AbsoluteSlider : public SliderIgnoreScroll { + Q_OBJECT + +public: + AbsoluteSlider(QWidget *parent = nullptr); + AbsoluteSlider(Qt::Orientation orientation, QWidget *parent = nullptr); + +signals: + void absoluteSliderHovered(int value); + +protected: + virtual void mouseMoveEvent(QMouseEvent *event) override; + virtual void mousePressEvent(QMouseEvent *event) override; + virtual void mouseReleaseEvent(QMouseEvent *event) override; + virtual bool eventFilter(QObject *obj, QEvent *event) override; + + int posToRangeValue(QMouseEvent *event); + +private: + bool dragging = false; +}; diff --git a/src/media-controls.cpp b/src/media-controls.cpp index ff7449f..6fc30e5 100644 --- a/src/media-controls.cpp +++ b/src/media-controls.cpp @@ -1,89 +1,95 @@ -#include "media-controls.hpp" -#include "obs-module.h" +#include "moc_media-controls.cpp" +#include #include #include #include -#include -#define QT_UTF8(str) QString::fromUtf8(str, -1) -#define QT_TO_UTF8(str) str.toUtf8().constData() -#define QTStr(str) QT_UTF8(obs_frontend_get_locale_string(str)) +#include "ui_media-controls.h" + +#define QTStr(str) QString(obs_module_text(str)) void MediaControls::OBSMediaStopped(void *data, calldata_t *) { MediaControls *media = static_cast(data); - QMetaObject::invokeMethod(media, "SetRestartState", - Qt::QueuedConnection); + QMetaObject::invokeMethod(media, "SetRestartState"); } void MediaControls::OBSMediaPlay(void *data, calldata_t *) { MediaControls *media = static_cast(data); - QMetaObject::invokeMethod(media, "SetPlayingState", - Qt::QueuedConnection); + QMetaObject::invokeMethod(media, "SetPlayingState"); } void MediaControls::OBSMediaPause(void *data, calldata_t *) { MediaControls *media = static_cast(data); - QMetaObject::invokeMethod(media, "SetPausedState", - Qt::QueuedConnection); + QMetaObject::invokeMethod(media, "SetPausedState"); } void MediaControls::OBSMediaStarted(void *data, calldata_t *) { MediaControls *media = static_cast(data); - QMetaObject::invokeMethod(media, "SetPlayingState", - Qt::QueuedConnection); + QMetaObject::invokeMethod(media, "SetPlayingState"); +} + +void MediaControls::OBSMediaNext(void *data, calldata_t *) +{ + MediaControls *media = static_cast(data); + QMetaObject::invokeMethod(media, "UpdateSlideCounter"); } -MediaControls::MediaControls(QWidget *parent) - : QWidget(parent), - ui(new Ui::MediaControls) +void MediaControls::OBSMediaPrevious(void *data, calldata_t *) +{ + MediaControls *media = static_cast(data); + QMetaObject::invokeMethod(media, "UpdateSlideCounter"); +} + +MediaControls::MediaControls(QWidget *parent) : QWidget(parent), ui(new Ui::MediaControls) { ui->setupUi(this); - ui->playPauseButton->setProperty("themeID", "playIcon"); - ui->stopButton->setProperty("themeID", "stopIcon"); - ui->stopButton->setToolTip(QTStr("StopSound")); + ui->playPauseButton->setProperty("class", "icon-media-play"); + ui->previousButton->setProperty("class", "icon-media-prev"); + ui->nextButton->setProperty("class", "icon-media-next"); + ui->stopButton->setProperty("class", "icon-media-stop"); setFocusPolicy(Qt::StrongFocus); - connect(&mediaTimer, SIGNAL(timeout()), this, - SLOT(SetSliderPosition())); - connect(&seekTimer, SIGNAL(timeout()), this, SLOT(SeekTimerCallback())); - connect(ui->slider, SIGNAL(sliderPressed()), this, - SLOT(MediaSliderClicked())); - connect(ui->slider, SIGNAL(mediaSliderHovered(int)), this, - SLOT(MediaSliderHovered(int))); - connect(ui->slider, SIGNAL(sliderReleased()), this, - SLOT(MediaSliderReleased())); - connect(ui->slider, SIGNAL(sliderMoved(int)), this, - SLOT(MediaSliderMoved(int))); + connect(&mediaTimer, &QTimer::timeout, this, &MediaControls::SetSliderPosition); + connect(&seekTimer, &QTimer::timeout, this, &MediaControls::SeekTimerCallback); + connect(ui->slider, &AbsoluteSlider::sliderPressed, this, &MediaControls::AbsoluteSliderClicked); + connect(ui->slider, &AbsoluteSlider::absoluteSliderHovered, this, &MediaControls::AbsoluteSliderHovered); + connect(ui->slider, &AbsoluteSlider::sliderReleased, this, &MediaControls::AbsoluteSliderReleased); + connect(ui->slider, &AbsoluteSlider::sliderMoved, this, &MediaControls::AbsoluteSliderMoved); QAction *restartAction = new QAction(this); + restartAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); restartAction->setShortcut({Qt::Key_R}); - connect(restartAction, SIGNAL(triggered()), this, SLOT(RestartMedia())); + connect(restartAction, &QAction::triggered, this, &MediaControls::RestartMedia); addAction(restartAction); QAction *sliderFoward = new QAction(this); sliderFoward->setShortcutContext(Qt::WidgetWithChildrenShortcut); - connect(sliderFoward, SIGNAL(triggered()), this, - SLOT(MoveSliderFoward())); + connect(sliderFoward, &QAction::triggered, this, &MediaControls::MoveSliderFoward); sliderFoward->setShortcut({Qt::Key_Right}); addAction(sliderFoward); QAction *sliderBack = new QAction(this); sliderBack->setShortcutContext(Qt::WidgetWithChildrenShortcut); - connect(sliderBack, SIGNAL(triggered()), this, - SLOT(MoveSliderBackwards())); + connect(sliderBack, &QAction::triggered, this, &MediaControls::MoveSliderBackwards); sliderBack->setShortcut({Qt::Key_Left}); addAction(sliderBack); + + QAction *playPause = new QAction(this); + playPause->setShortcutContext(Qt::WidgetWithChildrenShortcut); + connect(playPause, &QAction::triggered, this, &MediaControls::on_playPauseButton_clicked); + playPause->setShortcut({Qt::Key_Space}); + addAction(playPause); } MediaControls::~MediaControls() {} bool MediaControls::MediaPaused() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) { return false; } @@ -94,7 +100,7 @@ bool MediaControls::MediaPaused() int64_t MediaControls::GetSliderTime(int val) { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) { return 0; } @@ -106,9 +112,9 @@ int64_t MediaControls::GetSliderTime(int val) return seekTo; } -void MediaControls::MediaSliderClicked() +void MediaControls::AbsoluteSliderClicked() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) { return; } @@ -127,9 +133,9 @@ void MediaControls::MediaSliderClicked() seekTimer.start(100); } -void MediaControls::MediaSliderReleased() +void MediaControls::AbsoluteSliderReleased() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) { return; } @@ -140,6 +146,7 @@ void MediaControls::MediaSliderReleased() obs_source_media_set_time(source, GetSliderTime(seek)); } + UpdateLabels(seek); seek = lastSeek = -1; } @@ -149,23 +156,24 @@ void MediaControls::MediaSliderReleased() } } -void MediaControls::MediaSliderHovered(int val) +void MediaControls::AbsoluteSliderHovered(int val) { float seconds = ((float)GetSliderTime(val) / 1000.0f); QToolTip::showText(QCursor::pos(), FormatSeconds((int)seconds), this); } -void MediaControls::MediaSliderMoved(int val) +void MediaControls::AbsoluteSliderMoved(int val) { if (seekTimer.isActive()) { seek = val; + UpdateLabels(seek); } } void MediaControls::SeekTimerCallback() { if (lastSeek != seek) { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_set_time(source, GetSliderTime(seek)); } @@ -179,7 +187,7 @@ void MediaControls::StartMediaTimer() return; if (!mediaTimer.isActive()) - mediaTimer.start(16); + mediaTimer.start(1000); } void MediaControls::StopMediaTimer() @@ -191,36 +199,44 @@ void MediaControls::StopMediaTimer() void MediaControls::SetPlayingState() { ui->slider->setEnabled(true); - ui->playPauseButton->setProperty("themeID", "pauseIcon"); + ui->playPauseButton->setProperty("class", "icon-media-pause"); ui->playPauseButton->style()->unpolish(ui->playPauseButton); ui->playPauseButton->style()->polish(ui->playPauseButton); - ui->playPauseButton->setToolTip(QTStr("PauseSound")); + ui->playPauseButton->setToolTip(QTStr("ContextBar.MediaControls.PauseMedia")); prevPaused = false; + UpdateSlideCounter(); StartMediaTimer(); } void MediaControls::SetPausedState() { - ui->playPauseButton->setProperty("themeID", "playIcon"); + ui->playPauseButton->setProperty("class", "icon-media-play"); ui->playPauseButton->style()->unpolish(ui->playPauseButton); ui->playPauseButton->style()->polish(ui->playPauseButton); - ui->playPauseButton->setToolTip(QTStr("PlaySound")); + ui->playPauseButton->setToolTip(QTStr("ContextBar.MediaControls.PlayMedia")); StopMediaTimer(); } void MediaControls::SetRestartState() { - ui->playPauseButton->setProperty("themeID", "restartIcon"); + ui->playPauseButton->setProperty("class", "icon-media-restart"); ui->playPauseButton->style()->unpolish(ui->playPauseButton); ui->playPauseButton->style()->polish(ui->playPauseButton); - ui->playPauseButton->setToolTip(QTStr("RestartSound")); + ui->playPauseButton->setToolTip(QTStr("ContextBar.MediaControls.RestartMedia")); ui->slider->setValue(0); - ui->timerLabel->setText("--:--:--"); - ui->durationLabel->setText("--:--:--"); + + if (!isSlideshow) { + ui->timerLabel->setText("--:--:--"); + ui->durationLabel->setText("--:--:--"); + } else { + ui->timerLabel->setText("-"); + ui->durationLabel->setText("-"); + } + ui->slider->setEnabled(false); StopMediaTimer(); @@ -228,13 +244,16 @@ void MediaControls::SetRestartState() void MediaControls::RefreshControls() { - obs_source_t *source; + OBSSource source; source = OBSGetStrongRef(weakSource); uint32_t flags = 0; + const char *id = nullptr; - if (source) + if (source) { flags = obs_source_get_output_flags(source); + id = obs_source_get_unversioned_id(source); + } if (!source || !(flags & OBS_SOURCE_CONTROLLABLE_MEDIA)) { SetRestartState(); @@ -246,6 +265,14 @@ void MediaControls::RefreshControls() show(); } + bool has_playlist = strcmp(id, "ffmpeg_source") != 0; + ui->previousButton->setVisible(has_playlist); + ui->nextButton->setVisible(has_playlist); + + isSlideshow = strcmp(id, "slideshow") == 0; + ui->slider->setVisible(!isSlideshow); + ui->emptySpaceAgain->setVisible(isSlideshow); + obs_media_state state = obs_source_media_get_state(source); switch (state) { @@ -264,15 +291,18 @@ void MediaControls::RefreshControls() break; } - SetSliderPosition(); + if (isSlideshow) + UpdateSlideCounter(); + else + SetSliderPosition(); } -obs_source_t *MediaControls::GetSource() +OBSSource MediaControls::GetSource() { return OBSGetStrongRef(weakSource); } -void MediaControls::SetSource(obs_source_t *source) +void MediaControls::SetSource(OBSSource source) { sigs.clear(); @@ -285,6 +315,8 @@ void MediaControls::SetSource(obs_source_t *source) sigs.emplace_back(sh, "media_stopped", OBSMediaStopped, this); sigs.emplace_back(sh, "media_started", OBSMediaStarted, this); sigs.emplace_back(sh, "media_ended", OBSMediaStopped, this); + sigs.emplace_back(sh, "media_next", OBSMediaNext, this); + sigs.emplace_back(sh, "media_previous", OBSMediaPrevious, this); } else { weakSource = nullptr; } @@ -294,7 +326,7 @@ void MediaControls::SetSource(obs_source_t *source) void MediaControls::SetSliderPosition() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) { return; } @@ -302,19 +334,15 @@ void MediaControls::SetSliderPosition() float time = (float)obs_source_media_get_time(source); float duration = (float)obs_source_media_get_duration(source); - float sliderPosition = (time / duration) * (float)ui->slider->maximum(); + float sliderPosition; - ui->slider->setValue((int)sliderPosition); - - ui->timerLabel->setText(FormatSeconds((int)(time / 1000.0f))); - - if (!countDownTimer) - ui->durationLabel->setText( - FormatSeconds((int)(duration / 1000.0f))); + if (duration) + sliderPosition = (time / duration) * (float)ui->slider->maximum(); else - ui->durationLabel->setText( - QString("-") + - FormatSeconds((int)((duration - time) / 1000.0f))); + sliderPosition = 0.0f; + + ui->slider->setValue((int)sliderPosition); + UpdateLabels((int)sliderPosition); } QString MediaControls::FormatSeconds(int totalSeconds) @@ -329,7 +357,7 @@ QString MediaControls::FormatSeconds(int totalSeconds) void MediaControls::on_playPauseButton_clicked() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) { return; } @@ -354,7 +382,7 @@ void MediaControls::on_playPauseButton_clicked() void MediaControls::RestartMedia() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_restart(source); } @@ -362,7 +390,7 @@ void MediaControls::RestartMedia() void MediaControls::PlayMedia() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_play_pause(source, false); } @@ -370,7 +398,7 @@ void MediaControls::PlayMedia() void MediaControls::PauseMedia() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_play_pause(source, true); } @@ -378,7 +406,7 @@ void MediaControls::PauseMedia() void MediaControls::StopMedia() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_stop(source); } @@ -386,7 +414,7 @@ void MediaControls::StopMedia() void MediaControls::PlaylistNext() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_next(source); } @@ -394,7 +422,7 @@ void MediaControls::PlaylistNext() void MediaControls::PlaylistPrevious() { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (source) { obs_source_media_previous(source); } @@ -425,7 +453,7 @@ void MediaControls::on_durationLabel_clicked() void MediaControls::MoveSliderFoward(int seconds) { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) return; @@ -439,7 +467,7 @@ void MediaControls::MoveSliderFoward(int seconds) void MediaControls::MoveSliderBackwards(int seconds) { - obs_source_t *source = OBSGetStrongRef(weakSource); + OBSSource source = OBSGetStrongRef(weakSource); if (!source) return; @@ -450,3 +478,52 @@ void MediaControls::MoveSliderBackwards(int seconds) obs_source_media_set_time(source, ms); SetSliderPosition(); } + +void MediaControls::UpdateSlideCounter() +{ + if (!isSlideshow) + return; + + OBSSource source = OBSGetStrongRef(weakSource); + + if (!source) + return; + + proc_handler_t *ph = obs_source_get_proc_handler(source); + calldata_t cd = {}; + + proc_handler_call(ph, "current_index", &cd); + int slide = (int)calldata_int(&cd, "current_index"); + + proc_handler_call(ph, "total_files", &cd); + int total = (int)calldata_int(&cd, "total_files"); + calldata_free(&cd); + + if (total > 0) { + ui->timerLabel->setText(QString::number(slide + 1)); + ui->durationLabel->setText(QString::number(total)); + } else { + ui->timerLabel->setText("-"); + ui->durationLabel->setText("-"); + } +} + +void MediaControls::UpdateLabels(int val) +{ + OBSSource source = OBSGetStrongRef(weakSource); + if (!source) { + return; + } + + float duration = (float)obs_source_media_get_duration(source); + float percent = (float)val / (float)ui->slider->maximum(); + + float time = percent * duration; + + ui->timerLabel->setText(FormatSeconds((int)(time / 1000.0f))); + + if (!countDownTimer) + ui->durationLabel->setText(FormatSeconds((int)(duration / 1000.0f))); + else + ui->durationLabel->setText(QString("-") + FormatSeconds((int)((duration - time) / 1000.0f))); +} diff --git a/src/media-controls.hpp b/src/media-controls.hpp index 51224d5..4fb8c72 100644 --- a/src/media-controls.hpp +++ b/src/media-controls.hpp @@ -3,17 +3,14 @@ #include #include #include -#include #include -#include "ui_media-controls.h" - class Ui_MediaControls; class MediaControls : public QWidget { Q_OBJECT - friend class Soundboard; +friend class Soundboard; private: std::vector sigs; @@ -23,6 +20,7 @@ class MediaControls : public QWidget { int seek; int lastSeek; bool prevPaused = false; + bool countDownTimer = false; bool isSlideshow = false; QString FormatSeconds(int totalSeconds); @@ -36,6 +34,8 @@ class MediaControls : public QWidget { static void OBSMediaPlay(void *data, calldata_t *calldata); static void OBSMediaPause(void *data, calldata_t *calldata); static void OBSMediaStarted(void *data, calldata_t *calldata); + static void OBSMediaNext(void *data, calldata_t *calldata); + static void OBSMediaPrevious(void *data, calldata_t *calldata); std::unique_ptr ui; @@ -46,10 +46,10 @@ private slots: void on_previousButton_clicked(); void on_durationLabel_clicked(); - void MediaSliderClicked(); - void MediaSliderReleased(); - void MediaSliderHovered(int val); - void MediaSliderMoved(int val); + void AbsoluteSliderClicked(); + void AbsoluteSliderReleased(); + void AbsoluteSliderHovered(int val); + void AbsoluteSliderMoved(int val); void SetSliderPosition(); void SetPlayingState(); void SetPausedState(); @@ -64,6 +64,9 @@ private slots: void MoveSliderFoward(int seconds = 5); void MoveSliderBackwards(int seconds = 5); + void UpdateSlideCounter(); + void UpdateLabels(int val); + public slots: void PlayMedia(); void PauseMedia(); @@ -72,9 +75,7 @@ public slots: MediaControls(QWidget *parent = nullptr); ~MediaControls(); - obs_source_t *GetSource(); - void SetSource(obs_source_t *newSource); + OBSSource GetSource(); + void SetSource(OBSSource newSource); bool MediaPaused(); - - bool countDownTimer = false; }; diff --git a/src/media-controls.ui b/src/media-controls.ui index cede5c3..1a2a47f 100644 --- a/src/media-controls.ui +++ b/src/media-controls.ui @@ -6,8 +6,8 @@ 0 0 - 764 - 26 + 888 + 22 @@ -19,7 +19,7 @@ 0 - 0 + 22 @@ -42,86 +42,90 @@ 0 - - - Qt::Horizontal + + + + 0 + 0 + - - QSizePolicy::Fixed + + + 22 + 22 + - + + ContextBar.MediaControls.RestartMedia + + + + + + + :/res/images/media/media_restart.svg:/res/images/media/media_restart.svg + + - 4 + 20 20 - + + true + + - + - + 0 0 - 0 - 0 - - - - - 16777215 - 16777215 + 22 + 22 - ContextBar.MediaControls.RestartMedia + ContextBar.MediaControls.PlaylistPrevious - - :/res/images/media/media_restart.svg:/res/images/media/media_restart.svg + + :/res/images/media/media_previous.svg:/res/images/media/media_previous.svg - 22 - 22 + 20 + 20 - Space + P true - - contextBarButton - - + 0 0 - 0 - 0 - - - - - 16777215 - 16777215 + 22 + 22 @@ -131,13 +135,13 @@ - + :/res/images/media/media_stop.svg:/res/images/media/media_stop.svg - 22 - 22 + 20 + 20 @@ -146,17 +150,52 @@ true - - contextBarButton + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + ContextBar.MediaControls.PlaylistNext + + + + + + + :/res/images/media/media_next.svg:/res/images/media/media_next.svg + + + + 20 + 20 + + + + N + + + true - + 0 - 0 + 22 @@ -184,7 +223,7 @@ 0 - 0 + 22 @@ -203,7 +242,7 @@ 0 - 0 + 22 @@ -222,7 +261,7 @@ 0 - 0 + 22 @@ -231,34 +270,28 @@ - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 9 - 20 - + + + + 0 + 0 + - + - - MediaSlider - QSlider -
media-slider.hpp
-
ClickableLabel QLabel
clickable-label.hpp
+ + AbsoluteSlider + QSlider +
absolute-slider.hpp
+
diff --git a/src/media-slider.cpp b/src/media-slider.cpp deleted file mode 100644 index 86c3109..0000000 --- a/src/media-slider.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "slider-absoluteset-style.hpp" -#include "media-slider.hpp" -#include - -MediaSlider::MediaSlider(QWidget *parent) : SliderIgnoreScroll(parent) -{ - installEventFilter(this); - setMouseTracking(true); - - QString styleName = style()->objectName(); - QStyle *style; - style = QStyleFactory::create(styleName); - if (!style) { - style = new SliderAbsoluteSetStyle(); - } else { - style = new SliderAbsoluteSetStyle(style); - } - - style->setParent(this); - this->setStyle(style); -} - -void MediaSlider::mouseMoveEvent(QMouseEvent *event) -{ - int val = minimum() + - ((maximum() - minimum()) * event->pos().x()) / width(); - - if (val > maximum()) - val = maximum(); - else if (val < minimum()) - val = minimum(); - - emit mediaSliderHovered(val); - event->accept(); - QSlider::mouseMoveEvent(event); -} - -bool MediaSlider::eventFilter(QObject *obj, QEvent *event) -{ - if (event->type() == QEvent::KeyPress) { - QKeyEvent *keyEvent = static_cast(event); - - if (keyEvent->key() == Qt::Key_Up || - keyEvent->key() == Qt::Key_Down) { - return true; - } - } - - if (event->type() == QEvent::Wheel) - return true; - - return QSlider::eventFilter(obj, event); -} diff --git a/src/media-slider.hpp b/src/media-slider.hpp deleted file mode 100644 index e29ea9f..0000000 --- a/src/media-slider.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include -#include "slider-ignorewheel.hpp" - -class MediaSlider : public SliderIgnoreScroll { - Q_OBJECT - -public: - MediaSlider(QWidget *parent = nullptr); - -signals: - void mediaSliderHovered(int value); - -protected: - virtual void mouseMoveEvent(QMouseEvent *event) override; - virtual bool eventFilter(QObject *obj, QEvent *event) override; -}; diff --git a/src/slider-absoluteset-style.cpp b/src/slider-absoluteset-style.cpp deleted file mode 100644 index 79fd14e..0000000 --- a/src/slider-absoluteset-style.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "slider-absoluteset-style.hpp" - -SliderAbsoluteSetStyle::SliderAbsoluteSetStyle(const QString &baseStyle) - : QProxyStyle(baseStyle) -{ -} -SliderAbsoluteSetStyle::SliderAbsoluteSetStyle(QStyle *baseStyle) - : QProxyStyle(baseStyle) -{ -} - -int SliderAbsoluteSetStyle::styleHint(QStyle::StyleHint hint, - const QStyleOption *option = 0, - const QWidget *widget = 0, - QStyleHintReturn *returnData = 0) const -{ - if (hint == QStyle::SH_Slider_AbsoluteSetButtons) - return (Qt::LeftButton | Qt::MiddleButton); - return QProxyStyle::styleHint(hint, option, widget, returnData); -} diff --git a/src/slider-absoluteset-style.hpp b/src/slider-absoluteset-style.hpp deleted file mode 100644 index 63b4e68..0000000 --- a/src/slider-absoluteset-style.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include - -class SliderAbsoluteSetStyle : public QProxyStyle { -public: - SliderAbsoluteSetStyle(const QString &baseStyle); - SliderAbsoluteSetStyle(QStyle *baseStyle = Q_NULLPTR); - int styleHint(QStyle::StyleHint hint, const QStyleOption *option, - const QWidget *widget, - QStyleHintReturn *returnData) const; -}; diff --git a/src/slider-ignorewheel.cpp b/src/slider-ignorewheel.cpp index 617f220..2740ca7 100644 --- a/src/slider-ignorewheel.cpp +++ b/src/slider-ignorewheel.cpp @@ -1,13 +1,11 @@ -#include "slider-ignorewheel.hpp" +#include "moc_slider-ignorewheel.cpp" SliderIgnoreScroll::SliderIgnoreScroll(QWidget *parent) : QSlider(parent) { setFocusPolicy(Qt::StrongFocus); } -SliderIgnoreScroll::SliderIgnoreScroll(Qt::Orientation orientation, - QWidget *parent) - : QSlider(parent) +SliderIgnoreScroll::SliderIgnoreScroll(Qt::Orientation orientation, QWidget *parent) : QSlider(parent) { setFocusPolicy(Qt::StrongFocus); setOrientation(orientation); @@ -21,76 +19,30 @@ void SliderIgnoreScroll::wheelEvent(QWheelEvent *event) QSlider::wheelEvent(event); } -VolumeSlider::VolumeSlider(obs_fader_t *fader, QWidget *parent) - : SliderIgnoreScroll(parent) +void SliderIgnoreClick::mousePressEvent(QMouseEvent *event) { - fad = fader; -} - -VolumeSlider::VolumeSlider(obs_fader_t *fader, Qt::Orientation orientation, - QWidget *parent) - : SliderIgnoreScroll(orientation, parent) -{ - fad = fader; -} - -VolumeAccessibleInterface::VolumeAccessibleInterface(QWidget *w) - : QAccessibleWidget(w) -{ -} - -VolumeSlider *VolumeAccessibleInterface::slider() const -{ - return qobject_cast(object()); -} - -QString VolumeAccessibleInterface::text(QAccessible::Text t) const -{ - if (slider()->isVisible()) { - switch (t) { - case QAccessible::Text::Value: - return currentValue().toString(); - default: - break; - } + QStyleOptionSlider styleOption; + initStyleOption(&styleOption); + QRect handle = style()->subControlRect(QStyle::CC_Slider, &styleOption, QStyle::SC_SliderHandle, this); + if (handle.contains(event->position().toPoint())) { + SliderIgnoreScroll::mousePressEvent(event); + dragging = true; + } else { + event->accept(); } - return QAccessibleWidget::text(t); -} - -QVariant VolumeAccessibleInterface::currentValue() const -{ - QString text; - float db = obs_fader_get_db(slider()->fad); - - if (db < -96.0f) - text = "-inf dB"; - else - text = QString::number(db, 'f', 1).append(" dB"); - - return text; -} - -void VolumeAccessibleInterface::setCurrentValue(const QVariant &value) -{ - slider()->setValue(value.toInt()); } -QVariant VolumeAccessibleInterface::maximumValue() const +void SliderIgnoreClick::mouseReleaseEvent(QMouseEvent *event) { - return slider()->maximum(); + dragging = false; + SliderIgnoreScroll::mouseReleaseEvent(event); } -QVariant VolumeAccessibleInterface::minimumValue() const +void SliderIgnoreClick::mouseMoveEvent(QMouseEvent *event) { - return slider()->minimum(); -} - -QVariant VolumeAccessibleInterface::minimumStepSize() const -{ - return slider()->singleStep(); -} - -QAccessible::Role VolumeAccessibleInterface::role() const -{ - return QAccessible::Role::Slider; + if (dragging) { + SliderIgnoreScroll::mouseMoveEvent(event); + } else { + event->accept(); + } } diff --git a/src/slider-ignorewheel.hpp b/src/slider-ignorewheel.hpp index 40d0448..68c1032 100644 --- a/src/slider-ignorewheel.hpp +++ b/src/slider-ignorewheel.hpp @@ -1,51 +1,33 @@ #pragma once -#include "obs.hpp" #include #include #include -#include +#include class SliderIgnoreScroll : public QSlider { Q_OBJECT public: SliderIgnoreScroll(QWidget *parent = nullptr); - SliderIgnoreScroll(Qt::Orientation orientation, - QWidget *parent = nullptr); + SliderIgnoreScroll(Qt::Orientation orientation, QWidget *parent = nullptr); protected: virtual void wheelEvent(QWheelEvent *event) override; }; -class VolumeSlider : public SliderIgnoreScroll { - Q_OBJECT - -public: - obs_fader_t *fad; - - VolumeSlider(obs_fader_t *fader, QWidget *parent = nullptr); - VolumeSlider(obs_fader_t *fader, Qt::Orientation orientation, - QWidget *parent = nullptr); -}; - -class VolumeAccessibleInterface : public QAccessibleWidget { - +class SliderIgnoreClick : public SliderIgnoreScroll { public: - VolumeAccessibleInterface(QWidget *w); - - QVariant currentValue() const; - void setCurrentValue(const QVariant &value); - - QVariant maximumValue() const; - QVariant minimumValue() const; + inline SliderIgnoreClick(Qt::Orientation orientation, QWidget *parent = nullptr) + : SliderIgnoreScroll(orientation, parent) + { + } - QVariant minimumStepSize() const; +protected: + virtual void mousePressEvent(QMouseEvent *event) override; + virtual void mouseReleaseEvent(QMouseEvent *event) override; + virtual void mouseMoveEvent(QMouseEvent *event) override; private: - VolumeSlider *slider() const; - -protected: - virtual QAccessible::Role role() const override; - virtual QString text(QAccessible::Text t) const override; + bool dragging = false; }; diff --git a/src/soundboard.cpp b/src/soundboard.cpp index f79742d..a2c0124 100644 --- a/src/soundboard.cpp +++ b/src/soundboard.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "scene-tree.hpp" #include "media-controls.hpp" @@ -157,7 +158,7 @@ void Soundboard::CreateSource() nullptr, nullptr); obs_source_set_hidden(source, true); - ui->mediaControls->SetSource(source); + ui->mediaControls->SetSource(source.Get()); } obs_set_output_source(8, source); @@ -259,7 +260,7 @@ void Soundboard::LoadSource(OBSData saveData) if (obs_obj_invalid(source)) return; - ui->mediaControls->SetSource(source); + ui->mediaControls->SetSource(source.Get()); } }