llpanelprimmediacontrols.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:37k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpanelprimmediacontrols.cpp
  3.  * @brief media controls popup panel
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. //LLPanelPrimMediaControls
  34. #include "llagent.h"
  35. #include "llparcel.h"
  36. #include "llpanel.h"
  37. #include "llselectmgr.h"
  38. #include "llmediaentry.h"
  39. #include "llrender.h"
  40. #include "lldrawable.h"
  41. #include "llviewerwindow.h"
  42. #include "lluictrlfactory.h"
  43. #include "llbutton.h"
  44. #include "llface.h"
  45. #include "llcombobox.h"
  46. #include "lllayoutstack.h"
  47. #include "llslider.h"
  48. #include "llhudview.h"
  49. #include "lliconctrl.h"
  50. #include "lltoolpie.h"
  51. #include "llviewercamera.h"
  52. #include "llviewerobjectlist.h"
  53. #include "llpanelprimmediacontrols.h"
  54. #include "llpluginclassmedia.h"
  55. #include "llprogressbar.h"
  56. #include "llsliderctrl.h"
  57. #include "llstring.h"
  58. #include "llviewercontrol.h"
  59. #include "llviewerdisplay.h"
  60. #include "llviewerparcelmgr.h"
  61. #include "llviewermedia.h"
  62. #include "llviewermediafocus.h"
  63. #include "llvovolume.h"
  64. #include "llweb.h"
  65. #include "llwindow.h"
  66. #include "llfloatertools.h"  // to enable hide if build tools are up
  67. // Functions pulled from pipeline.cpp
  68. glh::matrix4f glh_get_current_modelview();
  69. glh::matrix4f glh_get_current_projection();
  70. // Functions pulled from llviewerdisplay.cpp
  71. bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model);
  72. // Warning: make sure these two match!
  73. const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
  74. const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
  75. //
  76. // LLPanelPrimMediaControls
  77. //
  78. LLPanelPrimMediaControls::LLPanelPrimMediaControls() : 
  79. mAlpha(1.f),
  80. mCurrentURL(""),
  81. mPreviousURL(""),
  82. mPauseFadeout(false),
  83. mUpdateSlider(true),
  84. mClearFaceOnFade(false),
  85. mCurrentRate(0.0),
  86. mMovieDuration(0.0),
  87. mTargetObjectID(LLUUID::null),
  88. mTargetObjectFace(0),
  89. mTargetImplID(LLUUID::null),
  90. mTargetObjectNormal(LLVector3::zero),
  91. mZoomObjectID(LLUUID::null),
  92. mZoomObjectFace(0),
  93. mVolumeSliderVisible(0)
  94. {
  95. mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
  96. mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
  97. mCommitCallbackRegistrar.add("MediaCtrl.Forward", boost::bind(&LLPanelPrimMediaControls::onClickForward, this));
  98. mCommitCallbackRegistrar.add("MediaCtrl.Home", boost::bind(&LLPanelPrimMediaControls::onClickHome, this));
  99. mCommitCallbackRegistrar.add("MediaCtrl.Stop", boost::bind(&LLPanelPrimMediaControls::onClickStop, this));
  100. mCommitCallbackRegistrar.add("MediaCtrl.MediaStop", boost::bind(&LLPanelPrimMediaControls::onClickMediaStop, this));
  101. mCommitCallbackRegistrar.add("MediaCtrl.Reload", boost::bind(&LLPanelPrimMediaControls::onClickReload, this));
  102. mCommitCallbackRegistrar.add("MediaCtrl.Play", boost::bind(&LLPanelPrimMediaControls::onClickPlay, this));
  103. mCommitCallbackRegistrar.add("MediaCtrl.Pause", boost::bind(&LLPanelPrimMediaControls::onClickPause, this));
  104. mCommitCallbackRegistrar.add("MediaCtrl.Open", boost::bind(&LLPanelPrimMediaControls::onClickOpen, this));
  105. mCommitCallbackRegistrar.add("MediaCtrl.Zoom", boost::bind(&LLPanelPrimMediaControls::onClickZoom, this));
  106. mCommitCallbackRegistrar.add("MediaCtrl.CommitURL", boost::bind(&LLPanelPrimMediaControls::onCommitURL, this));
  107. mCommitCallbackRegistrar.add("MediaCtrl.JumpProgress", boost::bind(&LLPanelPrimMediaControls::onCommitSlider, this));
  108. mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));
  109. mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));
  110. mCommitCallbackRegistrar.add("MediaCtrl.Volume", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeSlider, this));
  111. mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute", boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
  112. mCommitCallbackRegistrar.add("MediaCtrl.ShowVolumeSlider", boost::bind(&LLPanelPrimMediaControls::showVolumeSlider, this));
  113. mCommitCallbackRegistrar.add("MediaCtrl.HideVolumeSlider", boost::bind(&LLPanelPrimMediaControls::hideVolumeSlider, this));
  114. mCommitCallbackRegistrar.add("MediaCtrl.SkipBack", boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
  115. mCommitCallbackRegistrar.add("MediaCtrl.SkipForward", boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
  116. LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml");
  117. mInactivityTimer.reset();
  118. mFadeTimer.stop();
  119. mCurrentZoom = ZOOM_NONE;
  120. mScrollState = SCROLL_NONE;
  121. mPanelHandle.bind(this);
  122. mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
  123. mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
  124. }
  125. LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
  126. {
  127. }
  128. BOOL LLPanelPrimMediaControls::postBuild()
  129. {
  130. mMediaRegion = getChild<LLView>("media_region");
  131. mBackCtrl = getChild<LLUICtrl>("back");
  132. mFwdCtrl = getChild<LLUICtrl>("fwd");
  133. mReloadCtrl = getChild<LLUICtrl>("reload");
  134. mPlayCtrl = getChild<LLUICtrl>("play");
  135. mPauseCtrl = getChild<LLUICtrl>("pause");
  136. mStopCtrl = getChild<LLUICtrl>("stop");
  137. mMediaStopCtrl = getChild<LLUICtrl>("media_stop");
  138. mHomeCtrl = getChild<LLUICtrl>("home");
  139. mUnzoomCtrl = getChild<LLUICtrl>("close"); // This is actually "unzoom" 
  140. mOpenCtrl = getChild<LLUICtrl>("new_window");
  141. mZoomCtrl = getChild<LLUICtrl>("zoom_frame");
  142. mMediaProgressPanel = getChild<LLPanel>("media_progress_indicator");
  143. mMediaProgressBar = getChild<LLProgressBar>("media_progress_bar");
  144. mMediaAddressCtrl = getChild<LLUICtrl>("media_address");
  145. mMediaAddress = getChild<LLUICtrl>("media_address_url");
  146. mMediaPlaySliderPanel = getChild<LLUICtrl>("media_play_position");
  147. mMediaPlaySliderCtrl = getChild<LLUICtrl>("media_play_slider");
  148. mSkipFwdCtrl = getChild<LLUICtrl>("skip_forward");
  149. mSkipBackCtrl = getChild<LLUICtrl>("skip_back");
  150. mVolumeCtrl = getChild<LLUICtrl>("media_volume");
  151. mMuteBtn = getChild<LLButton>("media_mute_button");
  152. mVolumeSliderCtrl       = getChild<LLSliderCtrl>("volume_slider");
  153. mWhitelistIcon = getChild<LLIconCtrl>("media_whitelist_flag");
  154. mSecureLockIcon = getChild<LLIconCtrl>("media_secure_lock_flag");
  155. mMediaControlsStack = getChild<LLLayoutStack>("media_controls");
  156. mLeftBookend = getChild<LLUICtrl>("left_bookend");
  157. mRightBookend = getChild<LLUICtrl>("right_bookend");
  158. mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
  159. mVolumeSliderBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
  160. LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
  161. LLStringUtil::convertToS32(getString("min_width"), mMinWidth);
  162. LLStringUtil::convertToS32(getString("min_height"), mMinHeight);
  163. LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
  164. LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
  165. LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
  166. LLStringUtil::convertToS32(getString("top_world_view_avoid_zone"), mTopWorldViewAvoidZone);
  167. // These are currently removed...but getChild creates a "dummy" widget.
  168. // This class handles them missing.
  169. mMediaPanelScroll = findChild<LLUICtrl>("media_panel_scroll");
  170. mScrollUpCtrl = findChild<LLButton>("scrollup");
  171. mScrollLeftCtrl = findChild<LLButton>("scrollleft");
  172. mScrollRightCtrl = findChild<LLButton>("scrollright");
  173. mScrollDownCtrl = findChild<LLButton>("scrolldown");
  174. if (mScrollUpCtrl)
  175. {
  176. mScrollUpCtrl->setClickedCallback(onScrollUp, this);
  177. mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this);
  178. mScrollUpCtrl->setMouseUpCallback(onScrollStop, this);
  179. }
  180. if (mScrollLeftCtrl)
  181. {
  182. mScrollLeftCtrl->setClickedCallback(onScrollLeft, this);
  183. mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this);
  184. mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this);
  185. }
  186. if (mScrollRightCtrl)
  187. {
  188. mScrollRightCtrl->setClickedCallback(onScrollRight, this);
  189. mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this);
  190. mScrollRightCtrl->setMouseUpCallback(onScrollStop, this);
  191. }
  192. if (mScrollDownCtrl)
  193. {
  194. mScrollDownCtrl->setClickedCallback(onScrollDown, this);
  195. mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this);
  196. mScrollDownCtrl->setMouseUpCallback(onScrollStop, this);
  197. }
  198. mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
  199. mCurrentZoom = ZOOM_NONE;
  200. // clicks on buttons do not remove keyboard focus from media
  201. setIsChrome(TRUE);
  202. return TRUE;
  203. }
  204. void LLPanelPrimMediaControls::setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal)
  205. {
  206. if (media_impl.notNull() && objectp.notNull())
  207. {
  208. LLUUID prev_id = mTargetImplID;
  209. mTargetImplID = media_impl->getMediaTextureID();
  210. mTargetObjectID = objectp->getID();
  211. mTargetObjectFace = face;
  212. mTargetObjectNormal = pick_normal;
  213. mClearFaceOnFade = false;
  214. if (prev_id != mTargetImplID)
  215. mVolumeSliderCtrl->setValue(media_impl->getVolume());
  216. }
  217. else
  218. {
  219. // This happens on a timer now.
  220. // mTargetImplID = LLUUID::null;
  221. // mTargetObjectID = LLUUID::null;
  222. // mTargetObjectFace = 0;
  223. mClearFaceOnFade = true;
  224. }
  225. updateShape();
  226. }
  227. void LLPanelPrimMediaControls::focusOnTarget()
  228. {
  229. // Sets the media focus to the current target of the LLPanelPrimMediaControls.
  230. // This is how we transition from hover to focus when the user clicks on a control.
  231. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  232. if(media_impl)
  233. {
  234. if(!media_impl->hasFocus())
  235. {
  236. // The current target doesn't have media focus -- focus on it.
  237. LLViewerObject* objectp = getTargetObject();
  238. LLViewerMediaFocus::getInstance()->setFocusFace(objectp, mTargetObjectFace, media_impl, mTargetObjectNormal);
  239. }
  240. }
  241. }
  242. LLViewerMediaImpl* LLPanelPrimMediaControls::getTargetMediaImpl()
  243. {
  244. return LLViewerMedia::getMediaImplFromTextureID(mTargetImplID);
  245. }
  246. LLViewerObject* LLPanelPrimMediaControls::getTargetObject()
  247. {
  248. return gObjectList.findObject(mTargetObjectID);
  249. }
  250. LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()
  251. {
  252. LLViewerMediaImpl* impl = getTargetMediaImpl();
  253. if(impl && impl->hasMedia())
  254. {
  255. return impl->getMediaPlugin();
  256. }
  257. return NULL;
  258. }
  259. void LLPanelPrimMediaControls::updateShape()
  260. {
  261. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  262. LLViewerObject* objectp = getTargetObject();
  263. if(!media_impl || gFloaterTools->getVisible())
  264. {
  265. setVisible(FALSE);
  266. return;
  267. }
  268. LLPluginClassMedia* media_plugin = NULL;
  269. if(media_impl->hasMedia())
  270. {
  271. media_plugin = media_impl->getMediaPlugin();
  272. }
  273. LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
  274. bool can_navigate = parcel->getMediaAllowNavigate();
  275. bool enabled = false;
  276. bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
  277. // There is no such thing as "has_focus" being different from normal controls set
  278. // anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus'
  279. // to 'true' (or, actually, we use a setting)
  280. bool has_focus = (gSavedSettings.getBOOL("PrimMediaControlsUseHoverControlSet")) ? media_impl->hasFocus() : true;
  281. setVisible(enabled);
  282. if (objectp)
  283. {
  284. bool mini_controls = false;
  285. LLMediaEntry *media_data = objectp->getTE(mTargetObjectFace)->getMediaData();
  286. if (media_data && NULL != dynamic_cast<LLVOVolume*>(objectp))
  287. {
  288. // Don't show the media controls if we do not have permissions
  289. enabled = dynamic_cast<LLVOVolume*>(objectp)->hasMediaPermission(media_data, LLVOVolume::MEDIA_PERM_CONTROL);
  290. mini_controls = (LLMediaEntry::MINI == media_data->getControls());
  291. }
  292. const bool is_hud = objectp->isHUDAttachment();
  293. //
  294. // Set the state of the buttons
  295. //
  296. // XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in,
  297. // and that only the proper controls get made visible/enabled according to that mode. 
  298. mBackCtrl->setVisible(has_focus);
  299. mFwdCtrl->setVisible(has_focus);
  300. mReloadCtrl->setVisible(has_focus);
  301. mStopCtrl->setVisible(false);
  302. mHomeCtrl->setVisible(has_focus);
  303. mZoomCtrl->setVisible(!is_zoomed);
  304. mUnzoomCtrl->setVisible(is_zoomed);
  305. mOpenCtrl->setVisible(true);
  306. mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
  307. mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
  308. mVolumeCtrl->setVisible(false);
  309. mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
  310. // Disable zoom if HUD
  311. mZoomCtrl->setEnabled(!is_hud);
  312. mUnzoomCtrl->setEnabled(!is_hud);
  313. mSecureLockIcon->setVisible(false);
  314. mCurrentURL = media_impl->getCurrentMediaURL();
  315. mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
  316. mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
  317. mStopCtrl->setEnabled(has_focus && can_navigate);
  318. mHomeCtrl->setEnabled(has_focus && can_navigate);
  319. LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;
  320. if(media_plugin && media_plugin->pluginSupportsMediaTime())
  321. {
  322. mReloadCtrl->setEnabled(false);
  323. mReloadCtrl->setVisible(false);
  324. mMediaStopCtrl->setVisible(has_focus);
  325. mHomeCtrl->setVisible(has_focus);
  326. mBackCtrl->setVisible(false);
  327. mFwdCtrl->setVisible(false);
  328. mMediaAddressCtrl->setVisible(false);
  329. mMediaAddressCtrl->setEnabled(false);
  330. mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
  331. mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
  332. mSkipFwdCtrl->setVisible(has_focus && !mini_controls);
  333. mSkipFwdCtrl->setEnabled(has_focus && !mini_controls);
  334. mSkipBackCtrl->setVisible(has_focus && !mini_controls);
  335. mSkipBackCtrl->setEnabled(has_focus && !mini_controls);
  336. mVolumeCtrl->setVisible(has_focus);
  337. mVolumeCtrl->setEnabled(has_focus);
  338. mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible());
  339. mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible());
  340. mWhitelistIcon->setVisible(false);
  341. mSecureLockIcon->setVisible(false);
  342. if (mMediaPanelScroll)
  343. {
  344. mMediaPanelScroll->setVisible(false);
  345. mScrollUpCtrl->setVisible(false);
  346. mScrollDownCtrl->setVisible(false);
  347. mScrollRightCtrl->setVisible(false);
  348. mScrollDownCtrl->setVisible(false);
  349. }
  350. F32 volume = media_impl->getVolume();
  351. // movie's url changed
  352. if(mCurrentURL!=mPreviousURL)
  353. {
  354. mMovieDuration = media_plugin->getDuration();
  355. mPreviousURL = mCurrentURL;
  356. }
  357. if(mMovieDuration == 0) 
  358. {
  359. mMovieDuration = media_plugin->getDuration();
  360. mMediaPlaySliderCtrl->setValue(0);
  361. mMediaPlaySliderCtrl->setEnabled(false);
  362. }
  363. // TODO: What if it's not fully loaded
  364. if(mUpdateSlider && mMovieDuration!= 0)
  365. {
  366. F64 current_time =  media_plugin->getCurrentTime();
  367. F32 percent = current_time / mMovieDuration;
  368. mMediaPlaySliderCtrl->setValue(percent);
  369. mMediaPlaySliderCtrl->setEnabled(true);
  370. }
  371. // video vloume
  372. if(volume <= 0.0)
  373. {
  374. mMuteBtn->setToggleState(true);
  375. }
  376. else if (volume >= 1.0)
  377. {
  378. mMuteBtn->setToggleState(false);
  379. }
  380. else
  381. {
  382. mMuteBtn->setToggleState(false);
  383. }
  384. switch(result)
  385. {
  386. case LLPluginClassMediaOwner::MEDIA_PLAYING:
  387. mPlayCtrl->setEnabled(FALSE);
  388. mPlayCtrl->setVisible(FALSE);
  389. mPauseCtrl->setEnabled(TRUE);
  390. mPauseCtrl->setVisible(has_focus);
  391. break;
  392. case LLPluginClassMediaOwner::MEDIA_PAUSED:
  393. default:
  394. mPauseCtrl->setEnabled(FALSE);
  395. mPauseCtrl->setVisible(FALSE);
  396. mPlayCtrl->setEnabled(TRUE);
  397. mPlayCtrl->setVisible(has_focus);
  398. break;
  399. }
  400. }
  401. else   // web based
  402. {
  403. if(media_plugin)
  404. {
  405. mCurrentURL = media_plugin->getLocation();
  406. }
  407. else
  408. {
  409. mCurrentURL.clear();
  410. }
  411. mPlayCtrl->setVisible(FALSE);
  412. mPauseCtrl->setVisible(FALSE);
  413. mMediaStopCtrl->setVisible(FALSE);
  414. mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
  415. mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
  416. mMediaPlaySliderPanel->setVisible(FALSE);
  417. mMediaPlaySliderPanel->setEnabled(FALSE);
  418. mSkipFwdCtrl->setVisible(FALSE);
  419. mSkipFwdCtrl->setEnabled(FALSE);
  420. mSkipBackCtrl->setVisible(FALSE);
  421. mSkipBackCtrl->setEnabled(FALSE);
  422. mVolumeCtrl->setVisible(FALSE);
  423. mVolumeSliderCtrl->setVisible(FALSE);
  424. mVolumeCtrl->setEnabled(FALSE);
  425. mVolumeSliderCtrl->setEnabled(FALSE);
  426. if (mMediaPanelScroll)
  427. {
  428. mMediaPanelScroll->setVisible(has_focus);
  429. mScrollUpCtrl->setVisible(has_focus);
  430. mScrollDownCtrl->setVisible(has_focus);
  431. mScrollRightCtrl->setVisible(has_focus);
  432. mScrollDownCtrl->setVisible(has_focus);
  433. }
  434. // TODO: get the secure lock bool from media plug in
  435. std::string prefix =  std::string("https://");
  436. std::string test_prefix = mCurrentURL.substr(0, prefix.length());
  437. LLStringUtil::toLower(test_prefix);
  438. if(test_prefix == prefix)
  439. {
  440. mSecureLockIcon->setVisible(has_focus);
  441. }
  442. if(mCurrentURL!=mPreviousURL)
  443. {
  444. setCurrentURL();
  445. mPreviousURL = mCurrentURL;
  446. }
  447. if(result == LLPluginClassMediaOwner::MEDIA_LOADING)
  448. {
  449. mReloadCtrl->setEnabled(FALSE);
  450. mReloadCtrl->setVisible(FALSE);
  451. mStopCtrl->setEnabled(TRUE);
  452. mStopCtrl->setVisible(has_focus);
  453. }
  454. else
  455. {
  456. mReloadCtrl->setEnabled(TRUE);
  457. mReloadCtrl->setVisible(has_focus);
  458. mStopCtrl->setEnabled(FALSE);
  459. mStopCtrl->setVisible(FALSE);
  460. }
  461. }
  462. if(media_plugin)
  463. {
  464. //
  465. // Handle progress bar
  466. //
  467. if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus())
  468. {
  469. mMediaProgressPanel->setVisible(true);
  470. mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
  471. }
  472. else
  473. {
  474. mMediaProgressPanel->setVisible(false);
  475. }
  476. }
  477. if(media_impl)
  478. {
  479. //
  480. // Handle Scrolling
  481. //
  482. switch (mScrollState) 
  483. {
  484. case SCROLL_UP:
  485. media_impl->scrollWheel(0, -1, MASK_NONE);
  486. break;
  487. case SCROLL_DOWN:
  488. media_impl->scrollWheel(0, 1, MASK_NONE);
  489. break;
  490. case SCROLL_LEFT:
  491. media_impl->scrollWheel(1, 0, MASK_NONE);
  492. // media_impl->handleKeyHere(KEY_LEFT, MASK_NONE);
  493. break;
  494. case SCROLL_RIGHT:
  495. media_impl->scrollWheel(-1, 0, MASK_NONE);
  496. // media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE);
  497. break;
  498. case SCROLL_NONE:
  499. default:
  500. break;
  501. }
  502. }
  503. setVisible(enabled);
  504. //
  505. // Calculate position and shape of the controls
  506. //
  507. std::vector<LLVector3>::iterator vert_it;
  508. std::vector<LLVector3>::iterator vert_end;
  509. std::vector<LLVector3> vect_face;
  510. LLVolume* volume = objectp->getVolume();
  511. if (volume)
  512. {
  513. const LLVolumeFace& vf = volume->getVolumeFace(mTargetObjectFace);
  514. const LLVector3* ext = vf.mExtents;
  515. LLVector3 center = (ext[0]+ext[1])*0.5f;
  516. LLVector3 size = (ext[1]-ext[0])*0.5f;
  517. LLVector3 vert[] =
  518. {
  519. center + size.scaledVec(LLVector3(1,1,1)),
  520. center + size.scaledVec(LLVector3(-1,1,1)),
  521. center + size.scaledVec(LLVector3(1,-1,1)),
  522. center + size.scaledVec(LLVector3(-1,-1,1)),
  523. center + size.scaledVec(LLVector3(1,1,-1)),
  524. center + size.scaledVec(LLVector3(-1,1,-1)),
  525. center + size.scaledVec(LLVector3(1,-1,-1)),
  526. center + size.scaledVec(LLVector3(-1,-1,-1)),
  527. };
  528. LLVOVolume* vo = (LLVOVolume*) objectp;
  529. for (U32 i = 0; i < 8; i++)
  530. {
  531. vect_face.push_back(vo->volumePositionToAgent(vert[i]));
  532. }
  533. }
  534. vert_it = vect_face.begin();
  535. vert_end = vect_face.end();
  536. glh::matrix4f mat;
  537. if (!is_hud) 
  538. {
  539. mat = glh_get_current_projection() * glh_get_current_modelview();
  540. }
  541. else {
  542. glh::matrix4f proj, modelview;
  543. if (get_hud_matrices(proj, modelview))
  544. mat = proj * modelview;
  545. }
  546. LLVector3 min = LLVector3(1,1,1);
  547. LLVector3 max = LLVector3(-1,-1,-1);
  548. for(; vert_it != vert_end; ++vert_it)
  549. {
  550. // project silhouette vertices into screen space
  551. glh::vec3f screen_vert = glh::vec3f(vert_it->mV); 
  552. mat.mult_matrix_vec(screen_vert);
  553. // add to screenspace bounding box
  554. update_min_max(min, max, LLVector3(screen_vert.v));
  555. }
  556. // convert screenspace bbox to pixels (in screen coords)
  557. LLRect window_rect = gViewerWindow->getWorldViewRectScaled();
  558. LLCoordGL screen_min;
  559. screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f);
  560. screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f);
  561. LLCoordGL screen_max;
  562. screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f);
  563. screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f);
  564. // grow panel so that screenspace bounding box fits inside "media_region" element of panel
  565. LLRect media_panel_rect;
  566. // Get the height of the controls (less the volume slider)
  567. S32 controls_height = mMediaControlsStack->getRect().getHeight() - mVolumeSliderCtrl->getRect().getHeight();
  568. getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_panel_rect);
  569. media_panel_rect.mTop += controls_height;
  570. // keep all parts of panel on-screen
  571. // Area of the top of the world view to avoid putting the controls
  572. window_rect.mTop -= mTopWorldViewAvoidZone;
  573. // Don't include "spacing" bookends on left & right of the media controls
  574. window_rect.mLeft -= mLeftBookend->getRect().getWidth();
  575. window_rect.mRight += mRightBookend->getRect().getWidth();
  576. // Don't include the volume slider
  577. window_rect.mBottom -= mVolumeSliderCtrl->getRect().getHeight();
  578. media_panel_rect.intersectWith(window_rect);
  579. // clamp to minimum size, keeping rect inside window
  580. S32 centerX = media_panel_rect.getCenterX();
  581. S32 centerY = media_panel_rect.getCenterY();
  582. // Shrink screen rect by min width and height, to ensure containment
  583. window_rect.stretch(-mMinWidth/2, -mMinHeight/2);
  584. window_rect.clampPointToRect(centerX, centerY);
  585. media_panel_rect.setCenterAndSize(centerX, centerY, 
  586.   llmax(mMinWidth, media_panel_rect.getWidth()),
  587.   llmax(mMinHeight, media_panel_rect.getHeight()));
  588. // Finally set the size of the panel
  589. setShape(media_panel_rect, true);
  590. // Test mouse position to see if the cursor is stationary
  591. LLCoordWindow cursor_pos_window;
  592. getWindow()->getCursorPosition(&cursor_pos_window);
  593. // If last pos is not equal to current pos, the mouse has moved
  594. // We need to reset the timer, and make sure the panel is visible
  595. if(cursor_pos_window.mX != mLastCursorPos.mX ||
  596.    cursor_pos_window.mY != mLastCursorPos.mY ||
  597.    mScrollState != SCROLL_NONE)
  598. {
  599. mInactivityTimer.start();
  600. mLastCursorPos = cursor_pos_window;
  601. }
  602. if(isMouseOver() || hasFocus())
  603. {
  604. // Never fade the controls if the mouse is over them or they have keyboard focus.
  605. mFadeTimer.stop();
  606. }
  607. else if(!mClearFaceOnFade && (mInactivityTimer.getElapsedTimeF32() < mInactiveTimeout))
  608. {
  609. // Mouse is over the object, but has not been stationary for long enough to fade the UI
  610. mFadeTimer.stop();
  611. }
  612. else if(! mFadeTimer.getStarted() )
  613. {
  614. // we need to start fading the UI (and we have not already started)
  615. mFadeTimer.reset();
  616. mFadeTimer.start();
  617. }
  618. else
  619. {
  620. // I don't think this is correct anymore.  This is done in draw() after the fade has completed.
  621. // setVisible(FALSE);
  622. }
  623. }
  624. }
  625. /*virtual*/
  626. void LLPanelPrimMediaControls::draw()
  627. {
  628. F32 alpha = getDrawContext().mAlpha;
  629. if(mFadeTimer.getStarted())
  630. {
  631. F32 time = mFadeTimer.getElapsedTimeF32();
  632. alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f);
  633. if(time >= mControlFadeTime)
  634. {
  635. if(mClearFaceOnFade)
  636. {
  637. // Hiding this object makes scroll events go missing after it fades out 
  638. // (see DEV-41755 for a full description of the train wreck).
  639. // Only hide the controls when we're untargeting.
  640. setVisible(FALSE);
  641. mClearFaceOnFade = false;
  642. mVolumeSliderVisible = 0;
  643. mTargetImplID = LLUUID::null;
  644. mTargetObjectID = LLUUID::null;
  645. mTargetObjectFace = 0;
  646. }
  647. }
  648. }
  649. // Build rect for icon area in coord system of this panel
  650. // Assumes layout_stack is a direct child of this panel
  651. mMediaControlsStack->updateLayout();
  652. // adjust for layout stack spacing
  653. S32 space = mMediaControlsStack->getPanelSpacing() + 2;
  654. LLRect controls_bg_area = mMediaControlsStack->getRect();
  655. controls_bg_area.mTop += space + 2;
  656. // adjust to ignore space from volume slider
  657. controls_bg_area.mBottom += mVolumeSliderCtrl->getRect().getHeight();
  658. // adjust to ignore space from left bookend padding
  659. controls_bg_area.mLeft += mLeftBookend->getRect().getWidth() - space;
  660. // ignore space from right bookend padding
  661. controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space - 2;
  662. // draw control background UI image
  663. mBackgroundImage->draw( controls_bg_area, UI_VERTEX_COLOR % alpha);
  664. // draw volume slider background UI image
  665. if (mVolumeSliderCtrl->getVisible())
  666. {
  667. LLRect volume_slider_rect;
  668. screenRectToLocal(mVolumeSliderCtrl->calcScreenRect(), &volume_slider_rect);
  669. mVolumeSliderBackgroundImage->draw(volume_slider_rect, UI_VERTEX_COLOR % alpha);
  670. }
  671. {
  672. LLViewDrawContext context(alpha);
  673. LLPanel::draw();
  674. }
  675. }
  676. BOOL LLPanelPrimMediaControls::handleScrollWheel(S32 x, S32 y, S32 clicks)
  677. {
  678. mInactivityTimer.start();
  679. return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
  680. }
  681. BOOL LLPanelPrimMediaControls::handleMouseDown(S32 x, S32 y, MASK mask)
  682. {
  683. mInactivityTimer.start();
  684. return LLPanel::handleMouseDown(x, y, mask);
  685. }
  686. BOOL LLPanelPrimMediaControls::handleMouseUp(S32 x, S32 y, MASK mask)
  687. {
  688. mInactivityTimer.start();
  689. return LLPanel::handleMouseUp(x, y, mask);
  690. }
  691. BOOL LLPanelPrimMediaControls::handleKeyHere( KEY key, MASK mask )
  692. {
  693. mInactivityTimer.start();
  694. return LLPanel::handleKeyHere(key, mask);
  695. }
  696. bool LLPanelPrimMediaControls::isMouseOver()
  697. {
  698. bool result = false;
  699. if( getVisible() )
  700. {
  701. LLCoordWindow cursor_pos_window;
  702. LLCoordScreen cursor_pos_screen;
  703. LLCoordGL cursor_pos_gl;
  704. S32 x, y;
  705. getWindow()->getCursorPosition(&cursor_pos_window);
  706. getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
  707. if(mMediaControlsStack->getVisible())
  708. {
  709. mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
  710. LLView *hit_child = mMediaControlsStack->childFromPoint(x, y);
  711. if(hit_child && hit_child->getVisible())
  712. {
  713. // This was useful for debugging both coordinate translation and view hieararchy problems...
  714. // llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl;
  715. // This will be a direct child of the LLLayoutStack, which should be a layout_panel.
  716. // These may not shown/hidden by the logic in updateShape(), so we need to do another hit test on the children of the layout panel,
  717. // which are the actual controls.
  718. hit_child->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
  719. LLView *hit_child_2 = hit_child->childFromPoint(x, y);
  720. if(hit_child_2 && hit_child_2->getVisible())
  721. {
  722. // This was useful for debugging both coordinate translation and view hieararchy problems...
  723. // llinfos << "    mouse coords: " << x << ", " << y << " hit child 2 " << hit_child_2->getName() << llendl;
  724. result = true;
  725. }
  726. }
  727. }
  728. }
  729. return result;
  730. }
  731. void LLPanelPrimMediaControls::onClickClose()
  732. {
  733. close();
  734. }
  735. void LLPanelPrimMediaControls::close()
  736. {
  737. resetZoomLevel(true);
  738. LLViewerMediaFocus::getInstance()->clearFocus();
  739. setVisible(FALSE);
  740. }
  741. void LLPanelPrimMediaControls::onClickBack()
  742. {
  743. focusOnTarget();
  744. LLViewerMediaImpl* impl =getTargetMediaImpl();
  745. if (impl)
  746. {
  747. impl->navigateBack();
  748. }
  749. }
  750. void LLPanelPrimMediaControls::onClickForward()
  751. {
  752. focusOnTarget();
  753. LLViewerMediaImpl* impl = getTargetMediaImpl();
  754. if (impl)
  755. {
  756. impl->navigateForward();
  757. }
  758. }
  759. void LLPanelPrimMediaControls::onClickHome()
  760. {
  761. focusOnTarget();
  762. LLViewerMediaImpl* impl = getTargetMediaImpl();
  763. if(impl)
  764. {
  765. impl->navigateHome();
  766. }
  767. }
  768. void LLPanelPrimMediaControls::onClickOpen()
  769. {
  770. LLViewerMediaImpl* impl = getTargetMediaImpl();
  771. if(impl)
  772. {
  773. LLWeb::loadURL(impl->getCurrentMediaURL());
  774. }
  775. }
  776. void LLPanelPrimMediaControls::onClickReload()
  777. {
  778. focusOnTarget();
  779. //LLViewerMedia::navigateHome();
  780. LLViewerMediaImpl* impl = getTargetMediaImpl();
  781. if(impl)
  782. {
  783. impl->navigateReload();
  784. }
  785. }
  786. void LLPanelPrimMediaControls::onClickPlay()
  787. {
  788. focusOnTarget();
  789. LLViewerMediaImpl* impl = getTargetMediaImpl();
  790. if(impl)
  791. {
  792. impl->play();
  793. }
  794. }
  795. void LLPanelPrimMediaControls::onClickPause()
  796. {
  797. focusOnTarget();
  798. LLViewerMediaImpl* impl = getTargetMediaImpl();
  799. if(impl)
  800. {
  801. impl->pause();
  802. }
  803. }
  804. void LLPanelPrimMediaControls::onClickStop()
  805. {
  806. focusOnTarget();
  807. LLViewerMediaImpl* impl = getTargetMediaImpl();
  808. if(impl)
  809. {
  810. impl->navigateStop();
  811. }
  812. }
  813. void LLPanelPrimMediaControls::onClickMediaStop()
  814. {
  815. focusOnTarget();
  816. LLViewerMediaImpl* impl = getTargetMediaImpl();
  817. if(impl)
  818. {
  819. impl->stop();
  820. }
  821. }
  822. void LLPanelPrimMediaControls::onClickSkipBack()
  823. {
  824. focusOnTarget();
  825. LLViewerMediaImpl* impl =getTargetMediaImpl();
  826. if (impl)
  827. {
  828. impl->skipBack(mSkipStep);
  829. }
  830. }
  831. void LLPanelPrimMediaControls::onClickSkipForward()
  832. {
  833. focusOnTarget();
  834. LLViewerMediaImpl* impl = getTargetMediaImpl();
  835. if (impl)
  836. {
  837. impl->skipForward(mSkipStep);
  838. }
  839. }
  840. void LLPanelPrimMediaControls::onClickZoom()
  841. {
  842. focusOnTarget();
  843. if(mCurrentZoom == ZOOM_NONE)
  844. {
  845. nextZoomLevel();
  846. }
  847. }
  848. void LLPanelPrimMediaControls::nextZoomLevel()
  849. {
  850. int index = 0;
  851. while (index < kNumZoomLevels)
  852. {
  853. if (kZoomLevels[index] == mCurrentZoom) 
  854. {
  855. index++;
  856. break;
  857. }
  858. index++;
  859. }
  860. mCurrentZoom = kZoomLevels[index % kNumZoomLevels];
  861. updateZoom();
  862. }
  863. void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera)
  864. {
  865. if(mCurrentZoom != ZOOM_NONE)
  866. {
  867. mCurrentZoom = ZOOM_NONE;
  868. if(reset_camera)
  869. {
  870. updateZoom();
  871. }
  872. }
  873. }
  874. void LLPanelPrimMediaControls::updateZoom()
  875. {
  876. F32 zoom_padding = 0.0f;
  877. switch (mCurrentZoom)
  878. {
  879. case ZOOM_NONE:
  880. {
  881. gAgent.setFocusOnAvatar(TRUE, ANIMATE);
  882. break;
  883. }
  884. case ZOOM_FAR:
  885. {
  886. zoom_padding = mZoomFarPadding;
  887. break;
  888. }
  889. case ZOOM_MEDIUM:
  890. {
  891. zoom_padding = mZoomMediumPadding;
  892. break;
  893. }
  894. case ZOOM_NEAR:
  895. {
  896. zoom_padding = mZoomNearPadding;
  897. break;
  898. }
  899. default:
  900. {
  901. gAgent.setFocusOnAvatar(TRUE, ANIMATE);
  902. break;
  903. }
  904. }
  905. if (zoom_padding > 0.0f)
  906. {
  907. // since we only zoom into medium for now, always set zoom_in constraint to true
  908. LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
  909. }
  910. // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
  911. mZoomObjectID = mTargetObjectID;
  912. mZoomObjectFace = mTargetObjectFace;
  913. }
  914. void LLPanelPrimMediaControls::onScrollUp(void* user_data)
  915. {
  916. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  917. this_panel->focusOnTarget();
  918. LLViewerMediaImpl* impl = this_panel->getTargetMediaImpl();
  919. if(impl)
  920. {
  921. impl->scrollWheel(0, -1, MASK_NONE);
  922. }
  923. }
  924. void LLPanelPrimMediaControls::onScrollUpHeld(void* user_data)
  925. {
  926. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  927. this_panel->mScrollState = SCROLL_UP;
  928. }
  929. void LLPanelPrimMediaControls::onScrollRight(void* user_data)
  930. {
  931. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  932. this_panel->focusOnTarget();
  933. LLViewerMediaImpl* impl = this_panel->getTargetMediaImpl();
  934. if(impl)
  935. {
  936. impl->scrollWheel(-1, 0, MASK_NONE);
  937. // impl->handleKeyHere(KEY_RIGHT, MASK_NONE);
  938. }
  939. }
  940. void LLPanelPrimMediaControls::onScrollRightHeld(void* user_data)
  941. {
  942. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  943. this_panel->mScrollState = SCROLL_RIGHT;
  944. }
  945. void LLPanelPrimMediaControls::onScrollLeft(void* user_data)
  946. {
  947. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  948. this_panel->focusOnTarget();
  949. LLViewerMediaImpl* impl = this_panel->getTargetMediaImpl();
  950. if(impl)
  951. {
  952. impl->scrollWheel(1, 0, MASK_NONE);
  953. // impl->handleKeyHere(KEY_LEFT, MASK_NONE);
  954. }
  955. }
  956. void LLPanelPrimMediaControls::onScrollLeftHeld(void* user_data)
  957. {
  958. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  959. this_panel->mScrollState = SCROLL_LEFT;
  960. }
  961. void LLPanelPrimMediaControls::onScrollDown(void* user_data)
  962. {
  963. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  964. this_panel->focusOnTarget();
  965. LLViewerMediaImpl* impl = this_panel->getTargetMediaImpl();
  966. if(impl)
  967. {
  968. impl->scrollWheel(0, 1, MASK_NONE);
  969. }
  970. }
  971. void LLPanelPrimMediaControls::onScrollDownHeld(void* user_data)
  972. {
  973. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  974. this_panel->mScrollState = SCROLL_DOWN;
  975. }
  976. void LLPanelPrimMediaControls::onScrollStop(void* user_data)
  977. {
  978. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
  979. this_panel->mScrollState = SCROLL_NONE;
  980. }
  981. void LLPanelPrimMediaControls::onCommitURL()
  982. {
  983. focusOnTarget();
  984. std::string url = mMediaAddress->getValue().asString();
  985. if(getTargetMediaImpl() && !url.empty())
  986. {
  987. getTargetMediaImpl()->navigateTo( url, "", true);
  988. // Make sure keyboard focus is set to the media focus object.
  989. gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance());
  990. }
  991. mPauseFadeout = false;
  992. mFadeTimer.start();
  993. }
  994. void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *userdata)
  995. {
  996. LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (userdata);
  997. this_panel->focusOnTarget();
  998. this_panel->mPauseFadeout = true;
  999. this_panel->mFadeTimer.stop();
  1000. this_panel->mFadeTimer.reset();
  1001. }
  1002. void LLPanelPrimMediaControls::setCurrentURL()
  1003. {
  1004. #ifdef USE_COMBO_BOX_FOR_MEDIA_URL
  1005. // LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo");
  1006. // // redirects will navigate momentarily to about:blank, don't add to history
  1007. // if (media_address_combo && mCurrentURL != "about:blank")
  1008. // {
  1009. // media_address_combo->remove(mCurrentURL);
  1010. // media_address_combo->add(mCurrentURL, ADD_SORTED);
  1011. // media_address_combo->selectByValue(mCurrentURL);
  1012. // }
  1013. #else   // USE_COMBO_BOX_FOR_MEDIA_URL
  1014. if (mMediaAddress && mCurrentURL != "about:blank")
  1015. {
  1016. mMediaAddress->setValue(mCurrentURL);
  1017. }
  1018. #endif // USE_COMBO_BOX_FOR_MEDIA_URL
  1019. }
  1020. void LLPanelPrimMediaControls::onCommitSlider()
  1021. {
  1022. focusOnTarget();
  1023. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  1024. if (media_impl) 
  1025. {
  1026. // get slider value
  1027. F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();
  1028. if(slider_value <= 0.0)
  1029. {
  1030. media_impl->stop();
  1031. }
  1032. else 
  1033. {
  1034. media_impl->seek(slider_value*mMovieDuration);
  1035. //mUpdateSlider= false;
  1036. }
  1037. }
  1038. }
  1039. void LLPanelPrimMediaControls::onCommitVolumeUp()
  1040. {
  1041. focusOnTarget();
  1042. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  1043. if (media_impl) 
  1044. {
  1045. F32 volume = media_impl->getVolume();
  1046. volume += 0.1f;
  1047. if(volume >= 1.0f)
  1048. {
  1049. volume = 1.0f;
  1050. }
  1051. media_impl->setVolume(volume);
  1052. mMuteBtn->setToggleState(false);
  1053. }
  1054. }
  1055. void LLPanelPrimMediaControls::onCommitVolumeDown()
  1056. {
  1057. focusOnTarget();
  1058. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  1059. if (media_impl) 
  1060. {
  1061. F32 volume = media_impl->getVolume();
  1062. volume -= 0.1f;
  1063. if(volume <= 0.0f)
  1064. {
  1065. volume = 0.0f;
  1066. }
  1067. media_impl->setVolume(volume);
  1068. mMuteBtn->setToggleState(false);
  1069. }
  1070. }
  1071. void LLPanelPrimMediaControls::onCommitVolumeSlider()
  1072. {
  1073. focusOnTarget();
  1074. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  1075. if (media_impl) 
  1076. {
  1077. media_impl->setVolume(mVolumeSliderCtrl->getValueF32());
  1078. }
  1079. }
  1080. void LLPanelPrimMediaControls::onToggleMute()
  1081. {
  1082. focusOnTarget();
  1083. LLViewerMediaImpl* media_impl = getTargetMediaImpl();
  1084. if (media_impl) 
  1085. {
  1086. F32 volume = media_impl->getVolume();
  1087. if(volume > 0.0)
  1088. {
  1089. media_impl->setVolume(0.0);
  1090. }
  1091. else if (mVolumeSliderCtrl->getValueF32() == 0.0)
  1092. {
  1093. media_impl->setVolume(1.0);
  1094. mVolumeSliderCtrl->setValue(1.0);
  1095. }
  1096. else 
  1097. {
  1098. media_impl->setVolume(mVolumeSliderCtrl->getValueF32());
  1099. }
  1100. }
  1101. }
  1102. void LLPanelPrimMediaControls::showVolumeSlider()
  1103. {
  1104. mVolumeSliderVisible++;
  1105. }
  1106. void LLPanelPrimMediaControls::hideVolumeSlider()
  1107. {
  1108. mVolumeSliderVisible--;
  1109. }
  1110. bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
  1111. {
  1112. return mVolumeSliderVisible > 0;
  1113. }