From 1725765ef74960baad5f9c25724a10bec3408b78 Mon Sep 17 00:00:00 2001 From: Akash Kumar Date: Mon, 17 Feb 2025 20:38:18 +0530 Subject: [PATCH] MediaPlayer SeekSlider: show playing time corresponding to mouse position Fixes #8567. Change-Id: I03f06f1ac5014d718919280686970a3dbd6ae7dc Reviewed-on: https://review.haiku-os.org/c/haiku/+/8997 Reviewed-by: waddlesplash Tested-by: Commit checker robot --- src/apps/mediaplayer/Controller.cpp | 12 ++++++++++ src/apps/mediaplayer/Controller.h | 1 + src/apps/mediaplayer/ControllerView.cpp | 8 +++++++ src/apps/mediaplayer/ControllerView.h | 1 + .../mediaplayer/interface/DurationView.cpp | 7 ++++++ src/apps/mediaplayer/interface/DurationView.h | 2 ++ src/apps/mediaplayer/interface/SeekSlider.cpp | 16 ++++++++++++-- src/apps/mediaplayer/interface/SeekSlider.h | 6 ++++- .../interface/TransportControlGroup.cpp | 22 ++++++++++++++----- .../interface/TransportControlGroup.h | 1 + 10 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/apps/mediaplayer/Controller.cpp b/src/apps/mediaplayer/Controller.cpp index 4c5c055c0f..1d341a7494 100644 --- a/src/apps/mediaplayer/Controller.cpp +++ b/src/apps/mediaplayer/Controller.cpp @@ -700,6 +700,18 @@ Controller::TimePosition() } +bigtime_t +Controller::TimePositionFor(float value) +{ + if (fDuration == 0) + return 0; + + int32 frame = std::max((int32)0, + std::min((int32)_FrameDuration(), (int32)(_FrameDuration() * value))); + return frame * fDuration / _FrameDuration(); +} + + status_t Controller::SaveState(bool reset) { diff --git a/src/apps/mediaplayer/Controller.h b/src/apps/mediaplayer/Controller.h index a4eb64abb5..43de122b18 100644 --- a/src/apps/mediaplayer/Controller.h +++ b/src/apps/mediaplayer/Controller.h @@ -104,6 +104,7 @@ public: bigtime_t TimeDuration(); bigtime_t TimePosition(); + bigtime_t TimePositionFor(float value); status_t SaveState(bool reset = false); void RestoreState(); diff --git a/src/apps/mediaplayer/ControllerView.cpp b/src/apps/mediaplayer/ControllerView.cpp index 023c1f0c6e..9339f43ade 100644 --- a/src/apps/mediaplayer/ControllerView.cpp +++ b/src/apps/mediaplayer/ControllerView.cpp @@ -159,6 +159,14 @@ ControllerView::PositionChanged(float value) } +bigtime_t +ControllerView::TimePositionFor(float value) +{ + // 0.0 ... 1.0 + return fController->TimePositionFor(value); +} + + // #pragma mark - diff --git a/src/apps/mediaplayer/ControllerView.h b/src/apps/mediaplayer/ControllerView.h index 9919367eff..0dcc1df93d 100644 --- a/src/apps/mediaplayer/ControllerView.h +++ b/src/apps/mediaplayer/ControllerView.h @@ -35,6 +35,7 @@ public: virtual void VolumeChanged(float value); virtual void ToggleMute(); virtual void PositionChanged(float value); + virtual bigtime_t TimePositionFor(float value); private: void AttachedToWindow(); diff --git a/src/apps/mediaplayer/interface/DurationView.cpp b/src/apps/mediaplayer/interface/DurationView.cpp index 08c15f0287..102e6dba62 100644 --- a/src/apps/mediaplayer/interface/DurationView.cpp +++ b/src/apps/mediaplayer/interface/DurationView.cpp @@ -78,6 +78,13 @@ DurationView::MaxSize() } +bigtime_t +DurationView::TimeDuration() +{ + return fDuration; +} + + // #pragma mark - diff --git a/src/apps/mediaplayer/interface/DurationView.h b/src/apps/mediaplayer/interface/DurationView.h index 63e40bd497..6378039895 100644 --- a/src/apps/mediaplayer/interface/DurationView.h +++ b/src/apps/mediaplayer/interface/DurationView.h @@ -21,6 +21,8 @@ public: virtual BSize MinSize(); virtual BSize MaxSize(); + bigtime_t TimeDuration(); + // DurationView void Update(bigtime_t position, bigtime_t duration); diff --git a/src/apps/mediaplayer/interface/SeekSlider.cpp b/src/apps/mediaplayer/interface/SeekSlider.cpp index fbdf07cead..839bbdce90 100644 --- a/src/apps/mediaplayer/interface/SeekSlider.cpp +++ b/src/apps/mediaplayer/interface/SeekSlider.cpp @@ -17,11 +17,12 @@ static const rgb_color kThumbRed = (rgb_color){ 255, 52, 52, 255 }; -SeekSlider::SeekSlider(const char* name, BMessage* message, int32 minValue, - int32 maxValue) +SeekSlider::SeekSlider(const char* name, BMessage* message, BMessage* hoverMessage, + int32 minValue, int32 maxValue) : BSlider(name, NULL, NULL, minValue, maxValue, B_HORIZONTAL, B_TRIANGLE_THUMB), + fHoverMessage(hoverMessage), fTracking(false), fLastTrackTime(0), fDisabledString(""), @@ -120,6 +121,17 @@ SeekSlider::MouseUp(BPoint where) } +void +SeekSlider::MouseMoved(BPoint point, uint32 transit, const BMessage* dragMessage) +{ + if (!IsTracking()) { + fHoverMessage->SetInt32("value", ValueForPoint(point)); + Invoke(fHoverMessage); + } + BSlider::MouseMoved(point, transit, dragMessage); +} + + void SeekSlider::GetPreferredSize(float* _width, float* _height) { diff --git a/src/apps/mediaplayer/interface/SeekSlider.h b/src/apps/mediaplayer/interface/SeekSlider.h index 94b4b80ce7..2c3d675322 100644 --- a/src/apps/mediaplayer/interface/SeekSlider.h +++ b/src/apps/mediaplayer/interface/SeekSlider.h @@ -13,7 +13,7 @@ class SeekSlider : public BSlider { public: SeekSlider(const char* name, BMessage* message, - int32 minValue, int32 maxValue); + BMessage* hoverMessage, int32 minValue, int32 maxValue); virtual ~SeekSlider(); @@ -24,6 +24,8 @@ public: virtual void DrawThumb(); virtual void MouseDown(BPoint where); virtual void MouseUp(BPoint where); + virtual void MouseMoved(BPoint point, uint32 transit, + const BMessage* dragMessage); virtual void GetPreferredSize(float* _width, float* _height); virtual BSize MinSize(); @@ -36,6 +38,8 @@ public: void SetSymbolScale(float scale); private: + BMessage* fHoverMessage; + bool fTracking; bigtime_t fLastTrackTime; diff --git a/src/apps/mediaplayer/interface/TransportControlGroup.cpp b/src/apps/mediaplayer/interface/TransportControlGroup.cpp index a298845eea..33ff523499 100644 --- a/src/apps/mediaplayer/interface/TransportControlGroup.cpp +++ b/src/apps/mediaplayer/interface/TransportControlGroup.cpp @@ -31,6 +31,7 @@ enum { MSG_SEEK = 'seek', + MSG_SEEK_HOVER = 'hovr', MSG_PLAY = 'play', MSG_STOP = 'stop', MSG_REWIND = 'rwnd', @@ -39,7 +40,7 @@ enum { MSG_SKIP_FORWARD = 'skpf', MSG_SET_VOLUME = 'stvl', MSG_SET_MUTE = 'stmt', - MSG_DURATION_TOOLTIP = 'msdt' + MSG_DURATION_TOOLTIP = 'msdt', }; // the range of the volume sliders (in dB) @@ -83,7 +84,7 @@ TransportControlGroup::TransportControlGroup(BRect frame, bool useSkipButtons, // Seek slider fSeekSlider = new SeekSlider("seek slider", new BMessage(MSG_SEEK), - 0, kPositionFactor); + new BMessage(MSG_SEEK_HOVER), 0, kPositionFactor); fSeekLayout->AddView(fSeekSlider); fPositionToolTip = new PositionToolTip(); @@ -284,6 +285,16 @@ TransportControlGroup::MessageReceived(BMessage* message) break; } + case MSG_SEEK_HOVER: + { + int32 value; + if (message->FindInt32("value", &value) == B_OK) { + bigtime_t position = TimePositionFor(value / (float)kPositionFactor); + fPositionToolTip->Update(position, fDurationView->TimeDuration()); + } + break; + } + default: BView::MessageReceived(message); break; @@ -310,7 +321,7 @@ void TransportControlGroup::SkipForward() {} void TransportControlGroup::VolumeChanged(float value) {} void TransportControlGroup::ToggleMute() {} void TransportControlGroup::PositionChanged(float value) {} - +bigtime_t TransportControlGroup::TimePositionFor(float value) { return 0; } // #pragma mark - @@ -492,11 +503,12 @@ void TransportControlGroup::SetPosition(float value, bigtime_t position, bigtime_t duration) { - fPositionToolTip->Update(position, duration); fDurationView->Update(position, duration); - if (fSeekSlider->IsTracking()) + if (fSeekSlider->IsTracking()) { + fPositionToolTip->Update(position, duration); return; + } fSeekSlider->SetPosition(value); } diff --git a/src/apps/mediaplayer/interface/TransportControlGroup.h b/src/apps/mediaplayer/interface/TransportControlGroup.h index b2eb225eb1..6f0eeeae7f 100644 --- a/src/apps/mediaplayer/interface/TransportControlGroup.h +++ b/src/apps/mediaplayer/interface/TransportControlGroup.h @@ -57,6 +57,7 @@ public: virtual void VolumeChanged(float value); virtual void ToggleMute(); virtual void PositionChanged(float value); + virtual bigtime_t TimePositionFor(float value); void SetEnabled(uint32 whichButtons);