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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llpanelmediasettingsgeneral.cpp
  3.  * @brief LLPanelMediaSettingsGeneral class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-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. #include "llpanelmediasettingsgeneral.h"
  34. // library includes
  35. #include "llcombobox.h"
  36. #include "llcheckboxctrl.h"
  37. #include "llnotificationsutil.h"
  38. #include "llspinctrl.h"
  39. #include "lluictrlfactory.h"
  40. // project includes
  41. #include "llagent.h"
  42. #include "llviewerwindow.h"
  43. #include "llviewermedia.h"
  44. #include "llsdutil.h"
  45. #include "llselectmgr.h"
  46. #include "llbutton.h"
  47. #include "lltexturectrl.h"
  48. #include "llurl.h"
  49. #include "llwindow.h"
  50. #include "llmediaentry.h"
  51. #include "llmediactrl.h"
  52. #include "llpanelcontents.h"
  53. #include "llpermissions.h"
  54. #include "llpluginclassmedia.h"
  55. #include "llfloatermediasettings.h"
  56. #include "llfloatertools.h"
  57. #include "lltrans.h"
  58. #include "lltextbox.h"
  59. #include "llpanelmediasettingssecurity.h"
  60. const char *CHECKERBOARD_DATA_URL = "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E";
  61. ////////////////////////////////////////////////////////////////////////////////
  62. //
  63. LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
  64. mAutoLoop( NULL ),
  65. mFirstClick( NULL ),
  66. mAutoZoom( NULL ),
  67. mAutoPlay( NULL ),
  68. mAutoScale( NULL ),
  69. mWidthPixels( NULL ),
  70. mHeightPixels( NULL ),
  71. mHomeURL( NULL ),
  72. mCurrentURL( NULL ),
  73. mParent( NULL ),
  74. mMediaEditable(false)
  75. {
  76. // build dialog from XML
  77. LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml");
  78. }
  79. ////////////////////////////////////////////////////////////////////////////////
  80. //
  81. BOOL LLPanelMediaSettingsGeneral::postBuild()
  82. {
  83. // connect member vars with UI widgets
  84. mAutoLoop = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_LOOP_KEY );
  85. mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
  86. mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
  87. mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY );
  88. mCurrentURL = getChild< LLTextBox >( LLMediaEntry::CURRENT_URL_KEY );
  89. mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
  90. mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY );
  91. mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY );
  92. mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY );
  93. mPreviewMedia = getChild<LLMediaCtrl>("preview_media");
  94. mFailWhiteListText = getChild<LLTextBox>( "home_fails_whitelist_label" );
  95. // watch commit action for HOME URL
  96. childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
  97. childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
  98. // interrogates controls and updates widgets as required
  99. updateMediaPreview();
  100. return true;
  101. }
  102. ////////////////////////////////////////////////////////////////////////////////
  103. // virtual
  104. LLPanelMediaSettingsGeneral::~LLPanelMediaSettingsGeneral()
  105. {
  106. }
  107. ////////////////////////////////////////////////////////////////////////////////
  108. // static
  109. void LLPanelMediaSettingsGeneral::draw()
  110. {
  111. // housekeeping
  112. LLPanel::draw();
  113. // TODO: we need to call this repeatedly until the floater panels are fully
  114. // created but once we have a valid answer, we should stop looking here - the
  115. // commit callback will handle it
  116. checkHomeUrlPassesWhitelist();
  117. // enable/disable pixel values image entry based on auto scale checkbox 
  118. if ( mAutoScale->getValue().asBoolean() == false )
  119. {
  120. childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, true );
  121. childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, true );
  122. }
  123. else
  124. {
  125. childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, false );
  126. childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, false );
  127. };
  128. // enable/disable UI based on type of media
  129. bool reset_button_is_active = true;
  130. if( mPreviewMedia )
  131. {
  132. LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
  133. if( media_plugin )
  134. {
  135. // turn off volume (if we can) for preview. Note: this really only
  136. // works for QuickTime movies right now - no way to control the 
  137. // volume of a flash app embedded in a page for example
  138. media_plugin->setVolume( 0 );
  139. // some controls are only appropriate for time or browser type plugins
  140. // so we selectively enable/disable them - need to do it in draw
  141. // because the information from plugins arrives assynchronously
  142. bool show_time_controls = media_plugin->pluginSupportsMediaTime();
  143. if ( show_time_controls )
  144. {
  145. childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, false );
  146. reset_button_is_active = false;
  147. childSetEnabled( "current_url_label", false );
  148. childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, true );
  149. }
  150. else
  151. {
  152. childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, true );
  153. reset_button_is_active = true;
  154. childSetEnabled( "current_url_label", true );
  155. childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, false );
  156. };
  157. };
  158. };
  159. // current URL can change over time, update it here
  160. updateCurrentUrl();
  161. LLPermissions perm;
  162. bool user_can_press_reset = mMediaEditable;
  163. // several places modify this widget so we must collect states in one place
  164. if ( reset_button_is_active )
  165. {
  166. // user has perms to press reset button and it is active
  167. if ( user_can_press_reset )
  168. {
  169. childSetEnabled( "current_url_reset_btn", true );
  170. }
  171. // user does not has perms to press reset button and it is active
  172. else
  173. {
  174. childSetEnabled( "current_url_reset_btn", false );
  175. };
  176. }
  177. else
  178. // reset button is inactive so we just slam it to off - other states don't matter
  179. {
  180. childSetEnabled( "current_url_reset_btn", false );
  181. };
  182. }
  183. ////////////////////////////////////////////////////////////////////////////////
  184. // static 
  185. void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
  186. {
  187. LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
  188. self->mAutoLoop->clear();
  189. self->mAutoPlay->clear();
  190. self->mAutoScale->clear();
  191. self->mAutoZoom ->clear();
  192. self->mCurrentURL->clear();
  193. self->mFirstClick->clear();
  194. self->mHeightPixels->clear();
  195. self->mHomeURL->clear();
  196. self->mWidthPixels->clear();
  197. self->mAutoLoop ->setEnabled(editable);
  198. self->mAutoPlay ->setEnabled(editable);
  199. self->mAutoScale ->setEnabled(editable);
  200. self->mAutoZoom  ->setEnabled(editable);
  201. self->mCurrentURL ->setEnabled(editable);
  202. self->mFirstClick ->setEnabled(editable);
  203. self->mHeightPixels ->setEnabled(editable);
  204. self->mHomeURL ->setEnabled(editable);
  205. self->mWidthPixels ->setEnabled(editable);
  206. self->updateMediaPreview();
  207. }
  208. // static
  209. bool LLPanelMediaSettingsGeneral::isMultiple()
  210. {
  211. // IF all the faces have media (or all dont have media)
  212. if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
  213. {
  214. if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) 
  215. {
  216. return true;
  217. }
  218. }
  219. else
  220. {
  221. if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) 
  222. {
  223. return true;
  224. }
  225. }
  226. return false;
  227. }
  228. ////////////////////////////////////////////////////////////////////////////////
  229. // static 
  230. void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& _media_settings, bool editable)
  231. {
  232. LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
  233. self->mMediaEditable = editable;
  234. LLSD media_settings = _media_settings;
  235. if ( LLPanelMediaSettingsGeneral::isMultiple() )
  236. {
  237. // *HACK:  "edit" the incoming media_settings
  238. media_settings[LLMediaEntry::CURRENT_URL_KEY] = LLTrans::getString("Multiple Media");
  239. media_settings[LLMediaEntry::HOME_URL_KEY] = LLTrans::getString("Multiple Media");
  240. }
  241. std::string base_key( "" );
  242. std::string tentative_key( "" );
  243. struct 
  244. {
  245. std::string key_name;
  246. LLUICtrl* ctrl_ptr;
  247. std::string ctrl_type;
  248. } data_set [] = 
  249.         { LLMediaEntry::AUTO_LOOP_KEY, self->mAutoLoop, "LLCheckBoxCtrl" },
  250. { LLMediaEntry::AUTO_PLAY_KEY, self->mAutoPlay, "LLCheckBoxCtrl" },
  251. { LLMediaEntry::AUTO_SCALE_KEY, self->mAutoScale, "LLCheckBoxCtrl" },
  252. { LLMediaEntry::AUTO_ZOOM_KEY, self->mAutoZoom, "LLCheckBoxCtrl" },
  253. { LLMediaEntry::CURRENT_URL_KEY, self->mCurrentURL, "LLTextBox" },
  254. { LLMediaEntry::HEIGHT_PIXELS_KEY, self->mHeightPixels, "LLSpinCtrl" },
  255. { LLMediaEntry::HOME_URL_KEY, self->mHomeURL, "LLLineEditor" },
  256. { LLMediaEntry::FIRST_CLICK_INTERACT_KEY, self->mFirstClick, "LLCheckBoxCtrl" },
  257. { LLMediaEntry::WIDTH_PIXELS_KEY, self->mWidthPixels, "LLSpinCtrl" },
  258. { "", NULL , "" }
  259. };
  260. for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
  261. {
  262. base_key = std::string( data_set[ i ].key_name );
  263. tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
  264. // TODO: CP - I bet there is a better way to do this using Boost
  265. if ( media_settings[ base_key ].isDefined() )
  266. {
  267. if ( data_set[ i ].ctrl_type == "LLLineEditor" )
  268. {
  269. static_cast< LLLineEditor* >( data_set[ i ].ctrl_ptr )->
  270. setText( media_settings[ base_key ].asString() );
  271. }
  272. else
  273. if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
  274. static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
  275. setValue( media_settings[ base_key ].asBoolean() );
  276. else
  277. if ( data_set[ i ].ctrl_type == "LLComboBox" )
  278. static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
  279. setCurrentByIndex( media_settings[ base_key ].asInteger() );
  280. else
  281. if ( data_set[ i ].ctrl_type == "LLSpinCtrl" )
  282. static_cast< LLSpinCtrl* >( data_set[ i ].ctrl_ptr )->
  283. setValue( media_settings[ base_key ].asInteger() );
  284. data_set[ i ].ctrl_ptr->setEnabled(self->mMediaEditable);
  285. data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
  286. };
  287. };
  288. // interrogates controls and updates widgets as required
  289. self->updateMediaPreview();
  290. }
  291. ////////////////////////////////////////////////////////////////////////////////
  292. // Helper to set media control to media URL as required
  293. void LLPanelMediaSettingsGeneral::updateMediaPreview()
  294. {
  295. if ( mHomeURL->getValue().asString().length() > 0 )
  296. {
  297. if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString())
  298. {
  299. mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
  300. }
  301. }
  302. else
  303. // new home URL will be empty if media is deleted so display a 
  304. // "preview goes here" data url page
  305. {
  306. if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL)
  307. {
  308. mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
  309. }
  310. };
  311. }
  312. ////////////////////////////////////////////////////////////////////////////////
  313. // virtual
  314. void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
  315. {
  316. if(mPreviewMedia)
  317. {
  318. mPreviewMedia->unloadMediaSource();
  319. }
  320. }
  321. ////////////////////////////////////////////////////////////////////////////////
  322. // 
  323. void LLPanelMediaSettingsGeneral::checkHomeUrlPassesWhitelist()
  324. {
  325. // parent floater has not constructed the security panel yet
  326. if ( mParent->getPanelSecurity() == 0 ) 
  327. return;
  328. std::string home_url = getHomeUrl();
  329. if ( home_url.empty() || mParent->getPanelSecurity()->urlPassesWhiteList( home_url ) )
  330. {
  331. // Home URL is empty or passes the white list so hide the warning message
  332. mFailWhiteListText->setVisible( false );
  333. }
  334. else
  335. {
  336. // Home URL does not pass the white list so show the warning message
  337. mFailWhiteListText->setVisible( true );
  338. };
  339. }
  340. ////////////////////////////////////////////////////////////////////////////////
  341. // static
  342. void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata )
  343. {
  344. LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
  345. // check home url passes whitelist and display warning if not
  346. self->checkHomeUrlPassesWhitelist();
  347. self->updateMediaPreview();
  348. }
  349. ////////////////////////////////////////////////////////////////////////////////
  350. // static
  351. void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata)
  352. {
  353. LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
  354. self->navigateHomeSelectedFace(false);
  355. }
  356. ////////////////////////////////////////////////////////////////////////////////
  357. // 
  358. void LLPanelMediaSettingsGeneral::preApply()
  359. {
  360. // Make sure the home URL entry is committed
  361. mHomeURL->onCommit();
  362. }
  363. ////////////////////////////////////////////////////////////////////////////////
  364. //
  365. void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in, bool include_tentative )
  366. {
  367. if (include_tentative || !mAutoLoop->getTentative()) fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue();
  368. if (include_tentative || !mAutoPlay->getTentative()) fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
  369. if (include_tentative || !mAutoScale->getTentative()) fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
  370. if (include_tentative || !mAutoZoom->getTentative()) fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
  371. //Don't fill in current URL: this is only supposed to get changed via navigate
  372. // if (include_tentative || !mCurrentURL->getTentative()) fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
  373. if (include_tentative || !mHeightPixels->getTentative()) fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
  374. // Don't fill in the home URL if it is the special "Multiple Media" string!
  375. if ((include_tentative || !mHomeURL->getTentative())
  376. && LLTrans::getString("Multiple Media") != mHomeURL->getValue())
  377. fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue();
  378. if (include_tentative || !mFirstClick->getTentative()) fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue();
  379. if (include_tentative || !mWidthPixels->getTentative()) fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();
  380. }
  381. ////////////////////////////////////////////////////////////////////////////////
  382. // 
  383. void LLPanelMediaSettingsGeneral::postApply()
  384. {
  385. // Make sure to navigate to the home URL if the current URL is empty and 
  386. // autoplay is on
  387. navigateHomeSelectedFace(true);
  388. }
  389. ////////////////////////////////////////////////////////////////////////////////
  390. //
  391. void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent )
  392. {
  393. mParent = parent;
  394. };
  395. ////////////////////////////////////////////////////////////////////////////////
  396. //
  397. bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_is_empty)
  398. {
  399. struct functor_navigate_media : public LLSelectedTEGetFunctor< bool>
  400. {
  401. functor_navigate_media(bool flag) : only_if_current_is_empty(flag) {}
  402. bool get( LLViewerObject* object, S32 face )
  403. {
  404. if ( object && object->getTE(face) && object->permModify() )
  405. {
  406. const LLMediaEntry *media_data = object->getTE(face)->getMediaData();
  407. if ( media_data )
  408. {
  409. if (!only_if_current_is_empty || (media_data->getCurrentURL().empty() && media_data->getAutoPlay()))
  410. {
  411. viewer_media_t media_impl =
  412. LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID());
  413. if(media_impl)
  414. {
  415. media_impl->navigateHome();
  416. return true;
  417. }
  418. }
  419. }
  420. }
  421. return false;
  422. };
  423. bool only_if_current_is_empty;
  424. } functor_navigate_media(only_if_current_is_empty);
  425. bool all_face_media_navigated = false;
  426. LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
  427. selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated );
  428. // Note: we don't update the 'current URL' field until the media data itself changes
  429. return all_face_media_navigated;
  430. }
  431. ////////////////////////////////////////////////////////////////////////////////
  432. //
  433. const std::string LLPanelMediaSettingsGeneral::getHomeUrl()
  434. {
  435. return mHomeURL->getValue().asString(); 
  436. }
  437. ////////////////////////////////////////////////////////////////////////////////
  438. //
  439. void LLPanelMediaSettingsGeneral::updateCurrentUrl()
  440. {
  441. // Get the current URL from the selection
  442. const LLMediaEntry default_media_data;
  443. std::string value_str = default_media_data.getCurrentURL();
  444. struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
  445. {
  446. functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
  447. std::string get( LLViewerObject* object, S32 face )
  448. {
  449. if ( object )
  450. if ( object->getTE(face) )
  451. if ( object->getTE(face)->getMediaData() )
  452. return object->getTE(face)->getMediaData()->getCurrentURL();
  453. return mMediaEntry.getCurrentURL();
  454. };
  455. const LLMediaEntry &  mMediaEntry;
  456. } func_current_url(default_media_data);
  457. bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_current_url, value_str );
  458. mCurrentURL->setText(value_str);
  459. mCurrentURL->setTentative(identical);
  460. if ( LLPanelMediaSettingsGeneral::isMultiple() )
  461. {
  462. mCurrentURL->setText(LLTrans::getString("Multiple Media"));
  463. }
  464. }