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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llpanellandmedia.cpp
  3.  * @brief Allows configuration of "media" for a land parcel,
  4.  *   for example movies, web pages, and audio.
  5.  *
  6.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2007-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "llviewerprecompiledheaders.h"
  34. #include "llpanellandmedia.h"
  35. // viewer includes
  36. #include "llmimetypes.h"
  37. #include "llviewerparcelmgr.h"
  38. #include "llviewerregion.h"
  39. #include "llviewermedia.h"
  40. #include "llviewerparcelmedia.h"
  41. #include "lluictrlfactory.h"
  42. // library includes
  43. #include "llcheckboxctrl.h"
  44. #include "llcombobox.h"
  45. #include "llfloaterurlentry.h"
  46. #include "llfocusmgr.h"
  47. #include "lllineeditor.h"
  48. #include "llparcel.h"
  49. #include "lltextbox.h"
  50. #include "llradiogroup.h"
  51. #include "llspinctrl.h"
  52. #include "llsdutil.h"
  53. #include "lltexturectrl.h"
  54. #include "roles_constants.h"
  55. #include "llscrolllistctrl.h"
  56. //---------------------------------------------------------------------------
  57. // LLPanelLandMedia
  58. //---------------------------------------------------------------------------
  59. LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
  60. : LLPanel(),
  61. mParcel(parcel),
  62. mMediaURLEdit(NULL),
  63. mMediaDescEdit(NULL),
  64. mMediaTypeCombo(NULL),
  65. mSetURLButton(NULL),
  66. mMediaHeightCtrl(NULL),
  67. mMediaWidthCtrl(NULL),
  68. mMediaSizeCtrlLabel(NULL),
  69. mMediaTextureCtrl(NULL),
  70. mMediaAutoScaleCheck(NULL),
  71. mMediaLoopCheck(NULL),
  72. mMediaUrlCheck(NULL)
  73. {
  74. }
  75. // virtual
  76. LLPanelLandMedia::~LLPanelLandMedia()
  77. {
  78. }
  79. BOOL LLPanelLandMedia::postBuild()
  80. {
  81. mMediaTextureCtrl = getChild<LLTextureCtrl>("media texture");
  82. mMediaTextureCtrl->setCommitCallback( onCommitAny, this );
  83. mMediaTextureCtrl->setAllowNoTexture ( TRUE );
  84. mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
  85. mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
  86. mMediaAutoScaleCheck = getChild<LLCheckBoxCtrl>("media_auto_scale");
  87. childSetCommitCallback("media_auto_scale", onCommitAny, this);
  88. mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
  89. childSetCommitCallback("media_loop", onCommitAny, this );
  90. mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
  91. childSetCommitCallback("hide_media_url", onCommitAny, this );
  92. mMediaURLEdit = getChild<LLLineEditor>("media_url");
  93. childSetCommitCallback("media_url", onCommitAny, this );
  94. mMediaDescEdit = getChild<LLLineEditor>("url_description");
  95. childSetCommitCallback("url_description", onCommitAny, this);
  96. mMediaTypeCombo = getChild<LLComboBox>("media type");
  97. childSetCommitCallback("media type", onCommitType, this);
  98. populateMIMECombo();
  99. mMediaWidthCtrl = getChild<LLSpinCtrl>("media_size_width");
  100. childSetCommitCallback("media_size_width", onCommitAny, this);
  101. mMediaHeightCtrl = getChild<LLSpinCtrl>("media_size_height");
  102. childSetCommitCallback("media_size_height", onCommitAny, this);
  103. mMediaSizeCtrlLabel = getChild<LLTextBox>("media_size");
  104. mSetURLButton = getChild<LLButton>("set_media_url");
  105. childSetAction("set_media_url", onSetBtn, this);
  106. return TRUE;
  107. }
  108. // public
  109. void LLPanelLandMedia::refresh()
  110. {
  111. LLParcel *parcel = mParcel->getParcel();
  112. if (!parcel)
  113. {
  114. clearCtrls();
  115. }
  116. else
  117. {
  118. // something selected, hooray!
  119. // Display options
  120. BOOL can_change_media = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA);
  121. mMediaURLEdit->setText(parcel->getMediaURL());
  122. mMediaURLEdit->setEnabled( FALSE );
  123. childSetText("current_url", parcel->getMediaCurrentURL());
  124. mMediaDescEdit->setText(parcel->getMediaDesc());
  125. mMediaDescEdit->setEnabled( can_change_media );
  126. std::string mime_type = parcel->getMediaType();
  127. if (mime_type.empty())
  128. {
  129. mime_type = "none/none";
  130. }
  131. setMediaType(mime_type);
  132. mMediaTypeCombo->setEnabled( can_change_media );
  133. childSetText("mime_type", mime_type);
  134. mMediaUrlCheck->set( parcel->getObscureMedia() );
  135. mMediaUrlCheck->setEnabled( can_change_media );
  136. // don't display urls if you're not able to change it
  137. // much requested change in forums so people can't 'steal' urls
  138. // NOTE: bug#2009 means this is still vunerable - however, bug
  139. // should be closed since this bug opens up major security issues elsewhere.
  140. bool obscure_media = ! can_change_media && parcel->getObscureMedia();
  141. // Special code to disable asterixes for html type
  142. if(mime_type == "text/html")
  143. {
  144. obscure_media = false;
  145. mMediaUrlCheck->set( 0 );
  146. mMediaUrlCheck->setEnabled( false );
  147. }
  148. mMediaURLEdit->setDrawAsterixes( obscure_media );
  149. mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
  150. mMediaAutoScaleCheck->setEnabled ( can_change_media );
  151. // Special code to disable looping checkbox for HTML MIME type
  152. // (DEV-10042 -- Parcel Media: "Loop Media" should be disabled for static media types)
  153. bool allow_looping = LLMIMETypes::findAllowLooping( mime_type );
  154. if ( allow_looping )
  155. mMediaLoopCheck->set( parcel->getMediaLoop () );
  156. else
  157. mMediaLoopCheck->set( false );
  158. mMediaLoopCheck->setEnabled ( can_change_media && allow_looping );
  159. // disallow media size change for mime types that don't allow it
  160. bool allow_resize = LLMIMETypes::findAllowResize( mime_type );
  161. if ( allow_resize )
  162. mMediaWidthCtrl->setValue( parcel->getMediaWidth() );
  163. else
  164. mMediaWidthCtrl->setValue( 0 );
  165. mMediaWidthCtrl->setEnabled ( can_change_media && allow_resize );
  166. if ( allow_resize )
  167. mMediaHeightCtrl->setValue( parcel->getMediaHeight() );
  168. else
  169. mMediaHeightCtrl->setValue( 0 );
  170. mMediaHeightCtrl->setEnabled ( can_change_media && allow_resize );
  171. // enable/disable for text label for completeness
  172. mMediaSizeCtrlLabel->setEnabled( can_change_media && allow_resize );
  173. LLUUID tmp = parcel->getMediaID();
  174. mMediaTextureCtrl->setImageAssetID ( parcel->getMediaID() );
  175. mMediaTextureCtrl->setEnabled( can_change_media );
  176. mSetURLButton->setEnabled( can_change_media );
  177. }
  178. }
  179. void LLPanelLandMedia::populateMIMECombo()
  180. {
  181. std::string default_mime_type = "none/none";
  182. std::string default_label;
  183. LLMIMETypes::mime_widget_set_map_t::const_iterator it;
  184. for (it = LLMIMETypes::sWidgetMap.begin(); it != LLMIMETypes::sWidgetMap.end(); ++it)
  185. {
  186. const std::string& mime_type = it->first;
  187. const LLMIMETypes::LLMIMEWidgetSet& info = it->second;
  188. if (info.mDefaultMimeType == default_mime_type)
  189. {
  190. // Add this label at the end to make UI look cleaner
  191. default_label = info.mLabel;
  192. }
  193. else
  194. {
  195. mMediaTypeCombo->add(info.mLabel, mime_type);
  196. }
  197. }
  198. // *TODO: The sort order is based on std::map key, which is
  199. // ASCII-sorted and is wrong in other languages.  TRANSLATE
  200. mMediaTypeCombo->add( default_label, default_mime_type, ADD_BOTTOM );
  201. }
  202. void LLPanelLandMedia::setMediaType(const std::string& mime_type)
  203. {
  204. LLParcel *parcel = mParcel->getParcel();
  205. if(parcel)
  206. parcel->setMediaType(mime_type);
  207. std::string media_key = LLMIMETypes::widgetType(mime_type);
  208. mMediaTypeCombo->setValue(media_key);
  209. childSetText("mime_type", mime_type);
  210. }
  211. void LLPanelLandMedia::setMediaURL(const std::string& media_url)
  212. {
  213. mMediaURLEdit->setText(media_url);
  214. LLParcel *parcel = mParcel->getParcel();
  215. if(parcel)
  216. parcel->setMediaCurrentURL(media_url);
  217. // LLViewerMedia::navigateHome();
  218. mMediaURLEdit->onCommit();
  219. // LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
  220. childSetText("current_url", media_url);
  221. }
  222. std::string LLPanelLandMedia::getMediaURL()
  223. {
  224. return mMediaURLEdit->getText();
  225. }
  226. // static
  227. void LLPanelLandMedia::onCommitType(LLUICtrl *ctrl, void *userdata)
  228. {
  229. LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
  230. std::string current_type = LLMIMETypes::widgetType(self->childGetText("mime_type"));
  231. std::string new_type = self->mMediaTypeCombo->getValue();
  232. if(current_type != new_type)
  233. {
  234. self->childSetText("mime_type", LLMIMETypes::findDefaultMimeType(new_type));
  235. }
  236. onCommitAny(ctrl, userdata);
  237. }
  238. // static
  239. void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
  240. {
  241. LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
  242. LLParcel* parcel = self->mParcel->getParcel();
  243. if (!parcel)
  244. {
  245. return;
  246. }
  247. // Extract data from UI
  248. std::string media_url = self->mMediaURLEdit->getText();
  249. std::string media_desc = self->mMediaDescEdit->getText();
  250. std::string mime_type = self->childGetText("mime_type");
  251. U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
  252. U8 media_loop           = self->mMediaLoopCheck->get();
  253. U8 obscure_media = self->mMediaUrlCheck->get();
  254. S32 media_width = (S32)self->mMediaWidthCtrl->get();
  255. S32 media_height = (S32)self->mMediaHeightCtrl->get();
  256. LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
  257. self->childSetText("mime_type", mime_type);
  258. // Remove leading/trailing whitespace (common when copying/pasting)
  259. LLStringUtil::trim(media_url);
  260. // Push data into current parcel
  261. parcel->setMediaURL(media_url);
  262. parcel->setMediaType(mime_type);
  263. parcel->setMediaDesc(media_desc);
  264. parcel->setMediaWidth(media_width);
  265. parcel->setMediaHeight(media_height);
  266. parcel->setMediaID(media_id);
  267. parcel->setMediaAutoScale ( media_auto_scale );
  268. parcel->setMediaLoop ( media_loop );
  269. parcel->setObscureMedia( obscure_media );
  270. // Send current parcel data upstream to server
  271. LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
  272. // Might have changed properties, so let's redraw!
  273. self->refresh();
  274. }
  275. // static
  276. void LLPanelLandMedia::onSetBtn(void *userdata)
  277. {
  278. LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
  279. self->mURLEntryFloater = LLFloaterURLEntry::show( self->getHandle(), self->getMediaURL() );
  280. LLFloater* parent_floater = gFloaterView->getParentFloater(self);
  281. if (parent_floater)
  282. {
  283. parent_floater->addDependentFloater(self->mURLEntryFloater.get());
  284. }
  285. }
  286. // static
  287. void LLPanelLandMedia::onResetBtn(void *userdata)
  288. {
  289. LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
  290. LLParcel* parcel = self->mParcel->getParcel();
  291. // LLViewerMedia::navigateHome();
  292. self->refresh();
  293. self->childSetText("current_url", parcel->getMediaURL());
  294. // LLViewerParcelMedia::sendMediaNavigateMessage(parcel->getMediaURL());
  295. }