From 8cd9569cefdd7877859e87a67dd93d1962328e6d Mon Sep 17 00:00:00 2001
From: Callum Linden <callum@lindenlab.com>
Date: Thu, 21 Jul 2016 21:06:06 -0700
Subject: First pass at enabling time based media (videos) scrubbing controls

---
 indra/media_plugins/libvlc/media_plugin_libvlc.cpp |  5 +++
 indra/newview/llpanelprimmediacontrols.cpp         | 46 ++++++++++++++--------
 indra/newview/llpanelprimmediacontrols.h           |  8 +++-
 .../default/xui/en/panel_prim_media_controls.xml   |  8 ++--
 4 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
index 9b5b51f56a..c1e34b5c8f 100644
--- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
+++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
@@ -572,6 +572,11 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
 				}
 				else if (message_name == "seek")
 				{
+					if (mDuration > 0)
+					{
+						F64 normalized_offset = message_in.getValueReal("time") / mDuration;
+						libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset);
+					}
 				}
 				else if (message_name == "set_loop")
 				{
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 763657ebad..0bcd8a9e63 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -95,7 +95,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mVolumeSliderVisible(0),
 	mWindowShade(NULL),
 	mHideImmediately(false),
-    mSecureURL(false)
+    mSecureURL(false),
+	mMediaPlaySliderCtrlMouseDownValue(0.0)
 {
 	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -109,7 +110,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mCommitCallbackRegistrar.add("MediaCtrl.Open",		boost::bind(&LLPanelPrimMediaControls::onClickOpen, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Zoom",		boost::bind(&LLPanelPrimMediaControls::onClickZoom, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitURL",	boost::bind(&LLPanelPrimMediaControls::onCommitURL, this));
-	mCommitCallbackRegistrar.add("MediaCtrl.JumpProgress",		boost::bind(&LLPanelPrimMediaControls::onCommitSlider, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.MouseDown", boost::bind(&LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseDown, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.MouseUp", boost::bind(&LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseUp, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Volume",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeSlider, this));
@@ -1246,26 +1248,38 @@ void LLPanelPrimMediaControls::setCurrentURL()
 #endif	// USE_COMBO_BOX_FOR_MEDIA_URL
 }
 
-void LLPanelPrimMediaControls::onCommitSlider()
+
+void LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseDown()
 {
-	focusOnTarget();
+	mMediaPlaySliderCtrlMouseDownValue = mMediaPlaySliderCtrl->getValue().asReal();
 
-	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
-	if (media_impl) 
+	mUpdateSlider = false;
+}
+
+void LLPanelPrimMediaControls::onMediaPlaySliderCtrlMouseUp()
+{
+	F64 cur_value = mMediaPlaySliderCtrl->getValue().asReal();
+
+	if (mMediaPlaySliderCtrlMouseDownValue != cur_value)
 	{
-		// get slider value
-		F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();
-		if(slider_value <= 0.0)
-		{	
-			media_impl->stop();
-		}
-		else 
+		focusOnTarget();
+
+		LLViewerMediaImpl* media_impl = getTargetMediaImpl();
+		if (media_impl)
 		{
-			media_impl->seek(slider_value*mMovieDuration);
-			//mUpdateSlider= false;
+			if (cur_value <= 0.0)
+			{
+				media_impl->stop();
+			}
+			else
+			{
+				media_impl->seek(cur_value * mMovieDuration);
+			}
 		}
+
+		mUpdateSlider = true;
 	}
-}		
+}
 
 void LLPanelPrimMediaControls::onCommitVolumeUp()
 {
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 6d2eb3430e..21d5236074 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -107,8 +107,10 @@ private:
 	
 	void updateZoom();
 	void setCurrentURL();
-	void onCommitSlider();
-	
+
+	void onMediaPlaySliderCtrlMouseDown();
+	void onMediaPlaySliderCtrlMouseUp();
+
 	void onCommitVolumeUp();
 	void onCommitVolumeDown();
 	void onCommitVolumeSlider();
@@ -219,6 +221,8 @@ private:
 	S32 mVolumeSliderVisible;
 
 	LLNotificationPtr mActiveNotification;
+
+	F64 mMediaPlaySliderCtrlMouseDownValue;
 };
 
 #endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index eb67d07601..068e4420bc 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -374,9 +374,11 @@
 		  layout="topleft"
 		  tool_tip="Movie play progress"
 		  width="200">
-		<slider_bar.commit_callback
-			function="MediaCtrl.JumpProgress" />
-	  </slider_bar>
+      <slider_bar.mouse_down_callback
+        function="MediaCtrl.MouseDown" />
+      <slider_bar.mouse_up_callback
+        function="MediaCtrl.MouseUp" />
+    </slider_bar>
 	</layout_panel>
 	<layout_panel
 		name="skip_back"
-- 
cgit v1.2.3