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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatertools.cpp
  3.  * @brief The edit tools, including move, position, land, etc.
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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 "llfloatertools.h"
  34. #include "llfontgl.h"
  35. #include "llcoord.h"
  36. //#include "llgl.h"
  37. #include "llagent.h"
  38. #include "llbutton.h"
  39. #include "llcheckboxctrl.h"
  40. #include "llcombobox.h"
  41. #include "lldraghandle.h"
  42. #include "llerror.h"
  43. #include "llfloaterbuildoptions.h"
  44. #include "llfloatermediasettings.h"
  45. #include "llfloateropenobject.h"
  46. #include "llfloaterreg.h"
  47. #include "llfocusmgr.h"
  48. #include "llmediaentry.h"
  49. #include "llmediactrl.h"
  50. #include "llmenugl.h"
  51. #include "llnotificationsutil.h"
  52. #include "llpanelcontents.h"
  53. #include "llpanelface.h"
  54. #include "llpanelland.h"
  55. #include "llpanelobjectinventory.h"
  56. #include "llpanelobject.h"
  57. #include "llpanelvolume.h"
  58. #include "llpanelpermissions.h"
  59. #include "llradiogroup.h"
  60. #include "llresmgr.h"
  61. #include "llselectmgr.h"
  62. #include "llslider.h"
  63. #include "llstatusbar.h"
  64. #include "lltabcontainer.h"
  65. #include "lltextbox.h"
  66. #include "lltoolbrush.h"
  67. #include "lltoolcomp.h"
  68. #include "lltooldraganddrop.h"
  69. #include "lltoolface.h"
  70. #include "lltoolfocus.h"
  71. #include "lltoolgrab.h"
  72. #include "lltoolgrab.h"
  73. #include "lltoolindividual.h"
  74. #include "lltoolmgr.h"
  75. #include "lltoolpie.h"
  76. #include "lltoolpipette.h"
  77. #include "lltoolplacer.h"
  78. #include "lltoolselectland.h"
  79. #include "lltrans.h"
  80. #include "llui.h"
  81. #include "llviewercontrol.h"
  82. #include "llviewerjoystick.h"
  83. #include "llviewerregion.h"
  84. #include "llviewermenu.h"
  85. #include "llviewerparcelmgr.h"
  86. #include "llviewerwindow.h"
  87. #include "llvovolume.h"
  88. #include "lluictrlfactory.h"
  89. // Globals
  90. LLFloaterTools *gFloaterTools = NULL;
  91. bool LLFloaterTools::sShowObjectCost = true;
  92. const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
  93. {
  94. std::string("General"),  // PANEL_GENERAL,
  95. std::string("Object"),  // PANEL_OBJECT,
  96. std::string("Features"), // PANEL_FEATURES,
  97. std::string("Texture"), // PANEL_FACE,
  98. std::string("Content"), // PANEL_CONTENTS,
  99. };
  100. // Local prototypes
  101. void commit_select_component(void *data);
  102. void click_show_more(void*);
  103. void click_popup_info(void*);
  104. void click_popup_done(void*);
  105. void click_popup_minimize(void*);
  106. void click_popup_rotate_left(void*);
  107. void click_popup_rotate_reset(void*);
  108. void click_popup_rotate_right(void*);
  109. void commit_slider_dozer_force(LLUICtrl *);
  110. void click_apply_to_selection(void*);
  111. void commit_radio_group_focus(LLUICtrl* ctrl);
  112. void commit_radio_group_move(LLUICtrl* ctrl);
  113. void commit_radio_group_edit(LLUICtrl* ctrl);
  114. void commit_radio_group_land(LLUICtrl* ctrl);
  115. void commit_grid_mode(LLUICtrl *);
  116. void commit_slider_zoom(LLUICtrl *ctrl);
  117. //static
  118. void* LLFloaterTools::createPanelPermissions(void* data)
  119. {
  120. LLFloaterTools* floater = (LLFloaterTools*)data;
  121. floater->mPanelPermissions = new LLPanelPermissions();
  122. return floater->mPanelPermissions;
  123. }
  124. //static
  125. void* LLFloaterTools::createPanelObject(void* data)
  126. {
  127. LLFloaterTools* floater = (LLFloaterTools*)data;
  128. floater->mPanelObject = new LLPanelObject();
  129. return floater->mPanelObject;
  130. }
  131. //static
  132. void* LLFloaterTools::createPanelVolume(void* data)
  133. {
  134. LLFloaterTools* floater = (LLFloaterTools*)data;
  135. floater->mPanelVolume = new LLPanelVolume();
  136. return floater->mPanelVolume;
  137. }
  138. //static
  139. void* LLFloaterTools::createPanelFace(void* data)
  140. {
  141. LLFloaterTools* floater = (LLFloaterTools*)data;
  142. floater->mPanelFace = new LLPanelFace();
  143. return floater->mPanelFace;
  144. }
  145. //static
  146. void* LLFloaterTools::createPanelContents(void* data)
  147. {
  148. LLFloaterTools* floater = (LLFloaterTools*)data;
  149. floater->mPanelContents = new LLPanelContents();
  150. return floater->mPanelContents;
  151. }
  152. //static
  153. void* LLFloaterTools::createPanelLandInfo(void* data)
  154. {
  155. LLFloaterTools* floater = (LLFloaterTools*)data;
  156. floater->mPanelLandInfo = new LLPanelLandInfo();
  157. return floater->mPanelLandInfo;
  158. }
  159. static const std::string toolNames[]={
  160. "ToolCube",
  161. "ToolPrism",
  162. "ToolPyramid",
  163. "ToolTetrahedron",
  164. "ToolCylinder",
  165. "ToolHemiCylinder",
  166. "ToolCone",
  167. "ToolHemiCone",
  168. "ToolSphere",
  169. "ToolHemiSphere",
  170. "ToolTorus",
  171. "ToolTube",
  172. "ToolRing",
  173. "ToolTree",
  174. "ToolGrass"};
  175. LLPCode toolData[]={
  176. LL_PCODE_CUBE,
  177. LL_PCODE_PRISM,
  178. LL_PCODE_PYRAMID,
  179. LL_PCODE_TETRAHEDRON,
  180. LL_PCODE_CYLINDER,
  181. LL_PCODE_CYLINDER_HEMI,
  182. LL_PCODE_CONE,
  183. LL_PCODE_CONE_HEMI,
  184. LL_PCODE_SPHERE,
  185. LL_PCODE_SPHERE_HEMI,
  186. LL_PCODE_TORUS,
  187. LLViewerObject::LL_VO_SQUARE_TORUS,
  188. LLViewerObject::LL_VO_TRIANGLE_TORUS,
  189. LL_PCODE_LEGACY_TREE,
  190. LL_PCODE_LEGACY_GRASS};
  191. BOOL LLFloaterTools::postBuild()
  192. {
  193. // Hide until tool selected
  194. setVisible(FALSE);
  195. // Since we constantly show and hide this during drags, don't
  196. // make sounds on visibility changes.
  197. setSoundFlags(LLView::SILENT);
  198. getDragHandle()->setEnabled( !gSavedSettings.getBOOL("ToolboxAutoMove") );
  199. LLRect rect;
  200. mBtnFocus = getChild<LLButton>("button focus");//btn;
  201. mBtnMove = getChild<LLButton>("button move");
  202. mBtnEdit = getChild<LLButton>("button edit");
  203. mBtnCreate = getChild<LLButton>("button create");
  204. mBtnLand = getChild<LLButton>("button land" );
  205. mTextStatus = getChild<LLTextBox>("text status");
  206. mRadioGroupFocus = getChild<LLRadioGroup>("focus_radio_group");
  207. mRadioGroupMove = getChild<LLRadioGroup>("move_radio_group");
  208. mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
  209. mBtnGridOptions = getChild<LLButton>("Options...");
  210. mTitleMedia = getChild<LLMediaCtrl>("title_media");
  211. mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
  212. childSetValue("checkbox edit linked parts",(BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
  213. mCheckSnapToGrid = getChild<LLCheckBoxCtrl>("checkbox snap to grid");
  214. childSetValue("checkbox snap to grid",(BOOL)gSavedSettings.getBOOL("SnapEnabled"));
  215. mCheckStretchUniform = getChild<LLCheckBoxCtrl>("checkbox uniform");
  216. childSetValue("checkbox uniform",(BOOL)gSavedSettings.getBOOL("ScaleUniform"));
  217. mCheckStretchTexture = getChild<LLCheckBoxCtrl>("checkbox stretch textures");
  218. childSetValue("checkbox stretch textures",(BOOL)gSavedSettings.getBOOL("ScaleStretchTextures"));
  219. mTextGridMode = getChild<LLTextBox>("text ruler mode");
  220. mComboGridMode = getChild<LLComboBox>("combobox grid mode");
  221. //
  222. // Create Buttons
  223. //
  224. for(size_t t=0; t<LL_ARRAY_SIZE(toolNames); ++t)
  225. {
  226. LLButton *found = getChild<LLButton>(toolNames[t]);
  227. if(found)
  228. {
  229. found->setClickedCallback(boost::bind(&LLFloaterTools::setObjectType, toolData[t]));
  230. mButtons.push_back( found );
  231. }else{
  232. llwarns << "Tool button not found! DOA Pending." << llendl;
  233. }
  234. }
  235. mCheckCopySelection = getChild<LLCheckBoxCtrl>("checkbox copy selection");
  236. childSetValue("checkbox copy selection",(BOOL)gSavedSettings.getBOOL("CreateToolCopySelection"));
  237. mCheckSticky = getChild<LLCheckBoxCtrl>("checkbox sticky");
  238. childSetValue("checkbox sticky",(BOOL)gSavedSettings.getBOOL("CreateToolKeepSelected"));
  239. mCheckCopyCenters = getChild<LLCheckBoxCtrl>("checkbox copy centers");
  240. childSetValue("checkbox copy centers",(BOOL)gSavedSettings.getBOOL("CreateToolCopyCenters"));
  241. mCheckCopyRotates = getChild<LLCheckBoxCtrl>("checkbox copy rotates");
  242. childSetValue("checkbox copy rotates",(BOOL)gSavedSettings.getBOOL("CreateToolCopyRotates"));
  243. mRadioGroupLand = getChild<LLRadioGroup>("land_radio_group");
  244. mBtnApplyToSelection = getChild<LLButton>("button apply to selection");
  245. mSliderDozerSize = getChild<LLSlider>("slider brush size");
  246. childSetValue( "slider brush size", gSavedSettings.getF32("LandBrushSize"));
  247. mSliderDozerForce = getChild<LLSlider>("slider force");
  248. // the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here
  249. childSetValue( "slider force", log10(gSavedSettings.getF32("LandBrushForce")));
  250. mTab = getChild<LLTabContainer>("Object Info Tabs");
  251. if(mTab)
  252. {
  253. mTab->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
  254. mTab->setBorderVisible(FALSE);
  255. mTab->selectFirstTab();
  256. }
  257. mStatusText["rotate"] = getString("status_rotate");
  258. mStatusText["scale"] = getString("status_scale");
  259. mStatusText["move"] = getString("status_move");
  260. mStatusText["modifyland"] = getString("status_modifyland");
  261. mStatusText["camera"] = getString("status_camera");
  262. mStatusText["grab"] = getString("status_grab");
  263. mStatusText["place"] = getString("status_place");
  264. mStatusText["selectland"] = getString("status_selectland");
  265. sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");
  266. return TRUE;
  267. }
  268. // Create the popupview with a dummy center.  It will be moved into place
  269. // during LLViewerWindow's per-frame hover processing.
  270. LLFloaterTools::LLFloaterTools(const LLSD& key)
  271. : LLFloater(key),
  272. mBtnFocus(NULL),
  273. mBtnMove(NULL),
  274. mBtnEdit(NULL),
  275. mBtnCreate(NULL),
  276. mBtnLand(NULL),
  277. mTextStatus(NULL),
  278. mRadioGroupFocus(NULL),
  279. mRadioGroupMove(NULL),
  280. mRadioGroupEdit(NULL),
  281. mCheckSelectIndividual(NULL),
  282. mCheckSnapToGrid(NULL),
  283. mBtnGridOptions(NULL),
  284. mTitleMedia(NULL),
  285. mTextGridMode(NULL),
  286. mComboGridMode(NULL),
  287. mCheckStretchUniform(NULL),
  288. mCheckStretchTexture(NULL),
  289. mBtnRotateLeft(NULL),
  290. mBtnRotateReset(NULL),
  291. mBtnRotateRight(NULL),
  292. mBtnDelete(NULL),
  293. mBtnDuplicate(NULL),
  294. mBtnDuplicateInPlace(NULL),
  295. mCheckSticky(NULL),
  296. mCheckCopySelection(NULL),
  297. mCheckCopyCenters(NULL),
  298. mCheckCopyRotates(NULL),
  299. mRadioGroupLand(NULL),
  300. mSliderDozerSize(NULL),
  301. mSliderDozerForce(NULL),
  302. mBtnApplyToSelection(NULL),
  303. mTab(NULL),
  304. mPanelPermissions(NULL),
  305. mPanelObject(NULL),
  306. mPanelVolume(NULL),
  307. mPanelContents(NULL),
  308. mPanelFace(NULL),
  309. mPanelLandInfo(NULL),
  310. mTabLand(NULL),
  311. mDirty(TRUE),
  312. mNeedMediaTitle(TRUE)
  313. {
  314. gFloaterTools = this;
  315. setAutoFocus(FALSE);
  316. mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
  317. mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
  318. mFactoryMap["Features"] = LLCallbackMap(createPanelVolume, this);//LLPanelVolume
  319. mFactoryMap["Texture"] = LLCallbackMap(createPanelFace, this);//LLPanelFace
  320. mFactoryMap["Contents"] = LLCallbackMap(createPanelContents, this);//LLPanelContents
  321. mFactoryMap["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo
  322. //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_tools.xml",FALSE);
  323. mCommitCallbackRegistrar.add("BuildTool.setTool", boost::bind(&LLFloaterTools::setTool,this, _2));
  324. mCommitCallbackRegistrar.add("BuildTool.commitZoom", boost::bind(&commit_slider_zoom, _1));
  325. mCommitCallbackRegistrar.add("BuildTool.commitRadioFocus", boost::bind(&commit_radio_group_focus, _1));
  326. mCommitCallbackRegistrar.add("BuildTool.commitRadioMove", boost::bind(&commit_radio_group_move,_1));
  327. mCommitCallbackRegistrar.add("BuildTool.commitRadioEdit", boost::bind(&commit_radio_group_edit,_1));
  328. mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&commit_select_component, this));
  329. mCommitCallbackRegistrar.add("BuildTool.gridOptions", boost::bind(&LLFloaterTools::onClickGridOptions,this));
  330. mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this));
  331. mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1));
  332. mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1));
  333. mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1));
  334. mCommitCallbackRegistrar.add("BuildTool.AddMedia", boost::bind(&LLFloaterTools::onClickBtnAddMedia,this));
  335. mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
  336. mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
  337. }
  338. LLFloaterTools::~LLFloaterTools()
  339. {
  340. // children automatically deleted
  341. gFloaterTools = NULL;
  342. }
  343. void LLFloaterTools::setStatusText(const std::string& text)
  344. {
  345. std::map<std::string, std::string>::iterator iter = mStatusText.find(text);
  346. if (iter != mStatusText.end())
  347. {
  348. mTextStatus->setText(iter->second);
  349. }
  350. else
  351. {
  352. mTextStatus->setText(text);
  353. }
  354. }
  355. void LLFloaterTools::refresh()
  356. {
  357. const S32 INFO_WIDTH = getRect().getWidth();
  358. const S32 INFO_HEIGHT = 384;
  359. LLRect object_info_rect(0, 0, INFO_WIDTH, -INFO_HEIGHT);
  360. BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME );
  361. S32 idx_features = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FEATURES]);
  362. S32 idx_face = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_FACE]);
  363. S32 idx_contents = mTab->getPanelIndexByTitle(PANEL_NAMES[PANEL_CONTENTS]);
  364. S32 selected_index = mTab->getCurrentPanelIndex();
  365. if (!all_volume && (selected_index == idx_features || selected_index == idx_face ||
  366. selected_index == idx_contents))
  367. {
  368. mTab->selectFirstTab();
  369. }
  370. mTab->enableTabButton(idx_features, all_volume);
  371. mTab->enableTabButton(idx_face, all_volume);
  372. mTab->enableTabButton(idx_contents, all_volume);
  373. // Refresh object and prim count labels
  374. LLLocale locale(LLLocale::USER_LOCALE);
  375. std::string obj_count_string;
  376. LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
  377. childSetTextArg("obj_count",  "[COUNT]", obj_count_string);
  378. std::string prim_count_string;
  379. LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
  380. childSetTextArg("prim_count", "[COUNT]", prim_count_string);
  381. // calculate selection rendering cost
  382. if (sShowObjectCost)
  383. {
  384. std::string prim_cost_string;
  385. LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
  386. childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
  387. }
  388. // disable the object and prim counts if nothing selected
  389. bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
  390. childSetEnabled("obj_count", have_selection);
  391. childSetEnabled("prim_count", have_selection);
  392. childSetEnabled("RenderingCost", have_selection && sShowObjectCost);
  393. // Refresh child tabs
  394. mPanelPermissions->refresh();
  395. mPanelObject->refresh();
  396. mPanelVolume->refresh();
  397. mPanelFace->refresh();
  398. refreshMedia();
  399. mPanelContents->refresh();
  400. mPanelLandInfo->refresh();
  401. }
  402. void LLFloaterTools::draw()
  403. {
  404. if (mDirty)
  405. {
  406. refresh();
  407. mDirty = FALSE;
  408. }
  409. // grab media name/title and update the UI widget
  410. updateMediaTitle();
  411. // mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
  412. LLFloater::draw();
  413. }
  414. void LLFloaterTools::dirty()
  415. {
  416. mDirty = TRUE; 
  417. LLFloaterOpenObject* instance = LLFloaterReg::findTypedInstance<LLFloaterOpenObject>("openobject");
  418. if (instance) instance->dirty();
  419. }
  420. // Clean up any tool state that should not persist when the
  421. // floater is closed.
  422. void LLFloaterTools::resetToolState()
  423. {
  424. gCameraBtnZoom = TRUE;
  425. gCameraBtnOrbit = FALSE;
  426. gCameraBtnPan = FALSE;
  427. gGrabBtnSpin = FALSE;
  428. gGrabBtnVertical = FALSE;
  429. }
  430. void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
  431. {
  432. LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
  433. // HACK to allow seeing the buttons when you have the app in a window.
  434. // Keep the visibility the same as it 
  435. if (tool == gToolNull)
  436. {
  437. return;
  438. }
  439. if ( isMinimized() )
  440. { // SL looks odd if we draw the tools while the window is minimized
  441. return;
  442. }
  443. // Focus buttons
  444. BOOL focus_visible = ( tool == LLToolCamera::getInstance() );
  445. mBtnFocus ->setToggleState( focus_visible );
  446. mRadioGroupFocus->setVisible( focus_visible );
  447. childSetVisible("slider zoom", focus_visible);
  448. childSetEnabled("slider zoom", gCameraBtnZoom);
  449. if (!gCameraBtnOrbit &&
  450. !gCameraBtnPan &&
  451. !(mask == MASK_ORBIT) &&
  452. !(mask == (MASK_ORBIT | MASK_ALT)) &&
  453. !(mask == MASK_PAN) &&
  454. !(mask == (MASK_PAN | MASK_ALT)) )
  455. {
  456. mRadioGroupFocus->setValue("radio zoom");
  457. }
  458. else if ( gCameraBtnOrbit || 
  459. (mask == MASK_ORBIT) ||
  460. (mask == (MASK_ORBIT | MASK_ALT)) )
  461. {
  462. mRadioGroupFocus->setValue("radio orbit");
  463. }
  464. else if ( gCameraBtnPan ||
  465. (mask == MASK_PAN) ||
  466. (mask == (MASK_PAN | MASK_ALT)) )
  467. {
  468. mRadioGroupFocus->setValue("radio pan");
  469. }
  470. // multiply by correction factor because volume sliders go [0, 0.5]
  471. childSetValue( "slider zoom", gAgent.getCameraZoomFraction() * 0.5f);
  472. // Move buttons
  473. BOOL move_visible = (tool == LLToolGrab::getInstance());
  474. if (mBtnMove) mBtnMove ->setToggleState( move_visible );
  475. // HACK - highlight buttons for next click
  476. mRadioGroupMove->setVisible(move_visible);
  477. if (!gGrabBtnSpin && 
  478. !gGrabBtnVertical &&
  479. !(mask == MASK_VERTICAL) && 
  480. !(mask == MASK_SPIN) )
  481. {
  482. mRadioGroupMove->setValue("radio move");
  483. }
  484. else if (gGrabBtnVertical || 
  485.  (mask == MASK_VERTICAL) )
  486. {
  487. mRadioGroupMove->setValue("radio lift");
  488. }
  489. else if (gGrabBtnSpin || 
  490.  (mask == MASK_SPIN) )
  491. {
  492. mRadioGroupMove->setValue("radio spin");
  493. }
  494. // Edit buttons
  495. BOOL edit_visible = tool == LLToolCompTranslate::getInstance() ||
  496. tool == LLToolCompRotate::getInstance() ||
  497. tool == LLToolCompScale::getInstance() ||
  498. tool == LLToolFace::getInstance() ||
  499. tool == LLToolIndividual::getInstance() ||
  500. tool == LLToolPipette::getInstance();
  501. mBtnEdit ->setToggleState( edit_visible );
  502. mRadioGroupEdit->setVisible( edit_visible );
  503. bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
  504. childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
  505. if (mCheckSelectIndividual)
  506. {
  507. mCheckSelectIndividual->setVisible(edit_visible);
  508. //mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
  509. }
  510. if ( tool == LLToolCompTranslate::getInstance() )
  511. {
  512. mRadioGroupEdit->setValue("radio position");
  513. }
  514. else if ( tool == LLToolCompRotate::getInstance() )
  515. {
  516. mRadioGroupEdit->setValue("radio rotate");
  517. }
  518. else if ( tool == LLToolCompScale::getInstance() )
  519. {
  520. mRadioGroupEdit->setValue("radio stretch");
  521. }
  522. else if ( tool == LLToolFace::getInstance() )
  523. {
  524. mRadioGroupEdit->setValue("radio select face");
  525. }
  526. if (mComboGridMode) 
  527. {
  528. mComboGridMode->setVisible( edit_visible );
  529. S32 index = mComboGridMode->getCurrentIndex();
  530. mComboGridMode->removeall();
  531. switch (mObjectSelection->getSelectType())
  532. {
  533. case SELECT_TYPE_HUD:
  534.   mComboGridMode->add(getString("grid_screen_text"));
  535.   mComboGridMode->add(getString("grid_local_text"));
  536.   //mComboGridMode->add(getString("grid_reference_text"));
  537.   break;
  538. case SELECT_TYPE_WORLD:
  539.   mComboGridMode->add(getString("grid_world_text"));
  540.   mComboGridMode->add(getString("grid_local_text"));
  541.   mComboGridMode->add(getString("grid_reference_text"));
  542.   break;
  543. case SELECT_TYPE_ATTACHMENT:
  544.   mComboGridMode->add(getString("grid_attachment_text"));
  545.   mComboGridMode->add(getString("grid_local_text"));
  546.   mComboGridMode->add(getString("grid_reference_text"));
  547.   break;
  548. }
  549. mComboGridMode->setCurrentByIndex(index);
  550. }
  551. if (mTextGridMode) mTextGridMode->setVisible( edit_visible );
  552. // Snap to grid disabled for grab tool - very confusing
  553. if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
  554. if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
  555. //mCheckSelectLinked ->setVisible( edit_visible );
  556. if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible );
  557. if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible );
  558. // Create buttons
  559. BOOL create_visible = (tool == LLToolCompCreate::getInstance());
  560. mBtnCreate ->setToggleState( tool == LLToolCompCreate::getInstance() );
  561. if (mCheckCopySelection
  562. && mCheckCopySelection->get())
  563. {
  564. // don't highlight any placer button
  565. for (std::vector<LLButton*>::size_type i = 0; i < mButtons.size(); i++)
  566. {
  567. mButtons[i]->setToggleState(FALSE);
  568. mButtons[i]->setVisible( create_visible );
  569. }
  570. }
  571. else
  572. {
  573. // Highlight the correct placer button
  574. for( S32 t = 0; t < (S32)mButtons.size(); t++ )
  575. {
  576. LLPCode pcode = LLToolPlacer::getObjectType();
  577. LLPCode button_pcode = toolData[t];
  578. BOOL state = (pcode == button_pcode);
  579. mButtons[t]->setToggleState( state );
  580. mButtons[t]->setVisible( create_visible );
  581. }
  582. }
  583. if (mCheckSticky) mCheckSticky ->setVisible( create_visible );
  584. if (mCheckCopySelection) mCheckCopySelection ->setVisible( create_visible );
  585. if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
  586. if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
  587. if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
  588. if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
  589. // Land buttons
  590. BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
  591. if (mBtnLand) mBtnLand ->setToggleState( land_visible );
  592. mRadioGroupLand->setVisible( land_visible );
  593. if ( tool == LLToolSelectLand::getInstance() )
  594. {
  595. mRadioGroupLand->setValue("radio select land");
  596. }
  597. else if ( tool == LLToolBrushLand::getInstance() )
  598. {
  599. S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction");
  600. switch(dozer_mode)
  601. {
  602. case 0:
  603. mRadioGroupLand->setValue("radio flatten");
  604. break;
  605. case 1:
  606. mRadioGroupLand->setValue("radio raise");
  607. break;
  608. case 2:
  609. mRadioGroupLand->setValue("radio lower");
  610. break;
  611. case 3:
  612. mRadioGroupLand->setValue("radio smooth");
  613. break;
  614. case 4:
  615. mRadioGroupLand->setValue("radio noise");
  616. break;
  617. case 5:
  618. mRadioGroupLand->setValue("radio revert");
  619. break;
  620. default:
  621. break;
  622. }
  623. }
  624. if (mBtnApplyToSelection)
  625. {
  626. mBtnApplyToSelection->setVisible( land_visible );
  627. mBtnApplyToSelection->setEnabled( land_visible && !LLViewerParcelMgr::getInstance()->selectionEmpty() && tool != LLToolSelectLand::getInstance());
  628. }
  629. if (mSliderDozerSize)
  630. {
  631. mSliderDozerSize ->setVisible( land_visible );
  632. childSetVisible("Bulldozer:", land_visible);
  633. childSetVisible("Dozer Size:", land_visible);
  634. }
  635. if (mSliderDozerForce)
  636. {
  637. mSliderDozerForce ->setVisible( land_visible );
  638. childSetVisible("Strength:", land_visible);
  639. }
  640. childSetVisible("obj_count", !land_visible);
  641. childSetVisible("prim_count", !land_visible);
  642. mTab->setVisible(!land_visible);
  643. mPanelLandInfo->setVisible(land_visible);
  644. }
  645. // virtual
  646. BOOL LLFloaterTools::canClose()
  647. {
  648. // don't close when quitting, so camera will stay put
  649. return !LLApp::isExiting();
  650. }
  651. // virtual
  652. void LLFloaterTools::onOpen(const LLSD& key)
  653. {
  654. mParcelSelection = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
  655. mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
  656. std::string panel = key.asString();
  657. if (!panel.empty())
  658. {
  659. mTab->selectTabByName(panel);
  660. }
  661. //gMenuBarView->setItemVisible("BuildTools", TRUE);
  662. }
  663. // virtual
  664. void LLFloaterTools::onClose(bool app_quitting)
  665. {
  666. mTab->setVisible(FALSE);
  667. LLViewerJoystick::getInstance()->moveAvatar(false);
  668. // destroy media source used to grab media title
  669. if( mTitleMedia )
  670. mTitleMedia->unloadMediaSource();
  671.     // Different from handle_reset_view in that it doesn't actually 
  672. //   move the camera if EditCameraMovement is not set.
  673. gAgent.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
  674. // exit component selection mode
  675. LLSelectMgr::getInstance()->promoteSelectionToRoot();
  676. gSavedSettings.setBOOL("EditLinkedParts", FALSE);
  677. gViewerWindow->showCursor();
  678. resetToolState();
  679. mParcelSelection = NULL;
  680. mObjectSelection = NULL;
  681. // Switch back to basic toolset
  682. LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
  683. // we were already in basic toolset, using build tools
  684. // so manually reset tool to default (pie menu tool)
  685. LLToolMgr::getInstance()->getCurrentToolset()->selectFirstTool();
  686. //gMenuBarView->setItemVisible("BuildTools", FALSE);
  687. LLFloaterReg::hideInstance("media_settings");
  688. }
  689. void click_popup_info(void*)
  690. {
  691. }
  692. void click_popup_done(void*)
  693. {
  694. handle_reset_view();
  695. }
  696. void commit_radio_group_move(LLUICtrl* ctrl)
  697. {
  698. LLRadioGroup* group = (LLRadioGroup*)ctrl;
  699. std::string selected = group->getValue().asString();
  700. if (selected == "radio move")
  701. {
  702. gGrabBtnVertical = FALSE;
  703. gGrabBtnSpin = FALSE;
  704. }
  705. else if (selected == "radio lift")
  706. {
  707. gGrabBtnVertical = TRUE;
  708. gGrabBtnSpin = FALSE;
  709. }
  710. else if (selected == "radio spin")
  711. {
  712. gGrabBtnVertical = FALSE;
  713. gGrabBtnSpin = TRUE;
  714. }
  715. }
  716. void commit_radio_group_focus(LLUICtrl* ctrl)
  717. {
  718. LLRadioGroup* group = (LLRadioGroup*)ctrl;
  719. std::string selected = group->getValue().asString();
  720. if (selected == "radio zoom")
  721. {
  722. gCameraBtnZoom = TRUE;
  723. gCameraBtnOrbit = FALSE;
  724. gCameraBtnPan = FALSE;
  725. }
  726. else if (selected == "radio orbit")
  727. {
  728. gCameraBtnZoom = FALSE;
  729. gCameraBtnOrbit = TRUE;
  730. gCameraBtnPan = FALSE;
  731. }
  732. else if (selected == "radio pan")
  733. {
  734. gCameraBtnZoom = FALSE;
  735. gCameraBtnOrbit = FALSE;
  736. gCameraBtnPan = TRUE;
  737. }
  738. }
  739. void commit_slider_zoom(LLUICtrl *ctrl)
  740. {
  741. // renormalize value, since max "volume" level is 0.5 for some reason
  742. F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f; // / 0.5f;
  743. gAgent.setCameraZoomFraction(zoom_level);
  744. }
  745. void click_popup_rotate_left(void*)
  746. {
  747. LLSelectMgr::getInstance()->selectionRotateAroundZ( 45.f );
  748. dialog_refresh_all();
  749. }
  750. void click_popup_rotate_reset(void*)
  751. {
  752. LLSelectMgr::getInstance()->selectionResetRotation();
  753. dialog_refresh_all();
  754. }
  755. void click_popup_rotate_right(void*)
  756. {
  757. LLSelectMgr::getInstance()->selectionRotateAroundZ( -45.f );
  758. dialog_refresh_all();
  759. }
  760. void commit_slider_dozer_force(LLUICtrl *ctrl)
  761. {
  762. // the slider is logarithmic, so we exponentiate to get the actual force multiplier
  763. F32 dozer_force = pow(10.f, (F32)ctrl->getValue().asReal());
  764. gSavedSettings.setF32("LandBrushForce", dozer_force);
  765. }
  766. void click_apply_to_selection(void*)
  767. {
  768. LLToolBrushLand::getInstance()->modifyLandInSelectionGlobal();
  769. }
  770. void commit_radio_group_edit(LLUICtrl *ctrl)
  771. {
  772. S32 show_owners = gSavedSettings.getBOOL("ShowParcelOwners");
  773. LLRadioGroup* group = (LLRadioGroup*)ctrl;
  774. std::string selected = group->getValue().asString();
  775. if (selected == "radio position")
  776. {
  777. LLFloaterTools::setEditTool( LLToolCompTranslate::getInstance() );
  778. }
  779. else if (selected == "radio rotate")
  780. {
  781. LLFloaterTools::setEditTool( LLToolCompRotate::getInstance() );
  782. }
  783. else if (selected == "radio stretch")
  784. {
  785. LLFloaterTools::setEditTool( LLToolCompScale::getInstance() );
  786. }
  787. else if (selected == "radio select face")
  788. {
  789. LLFloaterTools::setEditTool( LLToolFace::getInstance() );
  790. }
  791. gSavedSettings.setBOOL("ShowParcelOwners", show_owners);
  792. }
  793. void commit_radio_group_land(LLUICtrl* ctrl)
  794. {
  795. LLRadioGroup* group = (LLRadioGroup*)ctrl;
  796. std::string selected = group->getValue().asString();
  797. if (selected == "radio select land")
  798. {
  799. LLFloaterTools::setEditTool( LLToolSelectLand::getInstance() );
  800. }
  801. else
  802. {
  803. LLFloaterTools::setEditTool( LLToolBrushLand::getInstance() );
  804. S32 dozer_mode = gSavedSettings.getS32("RadioLandBrushAction");
  805. if (selected == "radio flatten")
  806. dozer_mode = 0;
  807. else if (selected == "radio raise")
  808. dozer_mode = 1;
  809. else if (selected == "radio lower")
  810. dozer_mode = 2;
  811. else if (selected == "radio smooth")
  812. dozer_mode = 3;
  813. else if (selected == "radio noise")
  814. dozer_mode = 4;
  815. else if (selected == "radio revert")
  816. dozer_mode = 5;
  817. gSavedSettings.setS32("RadioLandBrushAction", dozer_mode);
  818. }
  819. }
  820. void commit_select_component(void *data)
  821. {
  822. LLFloaterTools* floaterp = (LLFloaterTools*)data;
  823. //forfeit focus
  824. if (gFocusMgr.childHasKeyboardFocus(floaterp))
  825. {
  826. gFocusMgr.setKeyboardFocus(NULL);
  827. }
  828. BOOL select_individuals = floaterp->mCheckSelectIndividual->get();
  829. gSavedSettings.setBOOL("EditLinkedParts", select_individuals);
  830. floaterp->dirty();
  831. if (select_individuals)
  832. {
  833. LLSelectMgr::getInstance()->demoteSelectionToIndividuals();
  834. }
  835. else
  836. {
  837. LLSelectMgr::getInstance()->promoteSelectionToRoot();
  838. }
  839. }
  840. void commit_grid_mode(LLUICtrl *ctrl)   
  841. {   
  842. LLComboBox* combo = (LLComboBox*)ctrl;   
  843.     
  844. LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
  845. // static 
  846. void LLFloaterTools::setObjectType( LLPCode pcode )
  847. {
  848. LLToolPlacer::setObjectType( pcode );
  849. gSavedSettings.setBOOL("CreateToolCopySelection", FALSE);
  850. gFocusMgr.setMouseCapture(NULL);
  851. }
  852. void LLFloaterTools::onClickGridOptions()
  853. {
  854. LLFloaterReg::showInstance("build_options");
  855. // RN: this makes grid options dependent on build tools window
  856. //floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
  857. }
  858. S32 LLFloaterTools::calcRenderCost()
  859. {
  860. S32 cost = 0;
  861. std::set<LLUUID> textures;
  862. for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
  863.   selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
  864.   ++selection_iter)
  865. {
  866. LLSelectNode *select_node = *selection_iter;
  867. if (select_node)
  868. {
  869. LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
  870. if (viewer_volume)
  871. {
  872. cost += viewer_volume->getRenderCost(textures);
  873. cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
  874. textures.clear();
  875. }
  876. }
  877. }
  878. return cost;
  879. }
  880. // static
  881. void LLFloaterTools::setEditTool(void* tool_pointer)
  882. {
  883. LLTool *tool = (LLTool *)tool_pointer;
  884. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( tool );
  885. }
  886. void LLFloaterTools::setTool(const LLSD& user_data)
  887. {
  888. std::string control_name = user_data.asString();
  889. if(control_name == "Focus")
  890. LLToolMgr::getInstance()->getCurrentToolset()->selectTool((LLTool *) LLToolCamera::getInstance() );
  891. else if (control_name == "Move" )
  892. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *)LLToolGrab::getInstance() );
  893. else if (control_name == "Edit" )
  894. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolCompTranslate::getInstance());
  895. else if (control_name == "Create" )
  896. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolCompCreate::getInstance());
  897. else if (control_name == "Land" )
  898. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( (LLTool *) LLToolSelectLand::getInstance());
  899. else
  900. llwarns<<" no parameter name "<<control_name<<" found!! No Tool selected!!"<< llendl;
  901. }
  902. void LLFloaterTools::onFocusReceived()
  903. {
  904. LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
  905. LLFloater::onFocusReceived();
  906. }
  907. // Media stuff
  908. void LLFloaterTools::refreshMedia()
  909. {
  910. getMediaState();
  911. }
  912. bool LLFloaterTools::selectedMediaEditable()
  913. {
  914. U32 owner_mask_on;
  915. U32 owner_mask_off;
  916. U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER, 
  917.   &owner_mask_on, &owner_mask_off );
  918. U32 group_mask_on;
  919. U32 group_mask_off;
  920. U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP, 
  921.   &group_mask_on, &group_mask_off );
  922. U32 everyone_mask_on;
  923. U32 everyone_mask_off;
  924. S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE, 
  925.  &everyone_mask_on, &everyone_mask_off );
  926. bool selected_Media_editable = false;
  927. // if perms we got back are valid
  928. if ( valid_owner_perms &&
  929. valid_group_perms && 
  930. valid_everyone_perms )
  931. {
  932. if ( ( owner_mask_on & PERM_MODIFY ) ||
  933. ( group_mask_on & PERM_MODIFY ) || 
  934. ( group_mask_on & PERM_MODIFY ) )
  935. {
  936. selected_Media_editable = true;
  937. }
  938. else
  939. // user is NOT allowed to press the RESET button
  940. {
  941. selected_Media_editable = false;
  942. };
  943. };
  944. return selected_Media_editable;
  945. }
  946. void LLFloaterTools::getMediaState()
  947. {
  948. LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
  949. LLViewerObject* first_object = selected_objects->getFirstObject();
  950. LLTextBox* media_info = getChild<LLTextBox>("media_info");
  951. if( !(first_object 
  952.   && first_object->getPCode() == LL_PCODE_VOLUME
  953.   &&first_object->permModify() 
  954.       ))
  955. {
  956. childSetEnabled("Add_Media",  FALSE);
  957. media_info->clear();
  958. clearMediaSettings();
  959. return;
  960. }
  961. std::string url = first_object->getRegion()->getCapability("ObjectMedia");
  962. bool has_media_capability = (!url.empty());
  963. if(!has_media_capability)
  964. {
  965. childSetEnabled("Add_Media",  FALSE);
  966. LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL;
  967. clearMediaSettings();
  968. return;
  969. }
  970. bool editable = (first_object->permModify() || selectedMediaEditable());
  971. // Check modify permissions and whether any selected objects are in
  972. // the process of being fetched.  If they are, then we're not editable
  973. if (editable)
  974. {
  975. LLObjectSelection::iterator iter = selected_objects->begin(); 
  976. LLObjectSelection::iterator end = selected_objects->end();
  977. for ( ; iter != end; ++iter)
  978. {
  979. LLSelectNode* node = *iter;
  980. LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
  981. if (NULL != object)
  982. {
  983. if (!object->permModify())
  984. {
  985. LL_INFOS("LLFloaterTools: media")
  986. << "Selection not editable due to lack of modify permissions on object id "
  987. << object->getID() << LL_ENDL;
  988. editable = false;
  989. break;
  990. }
  991. // XXX DISABLE this for now, because when the fetch finally 
  992. // does come in, the state of this floater doesn't properly
  993. // update.  Re-selecting fixes the problem, but there is 
  994. // contention as to whether this is a sufficient solution.
  995. // if (object->isMediaDataBeingFetched())
  996. // {
  997. // LL_INFOS("LLFloaterTools: media")
  998. // << "Selection not editable due to media data being fetched for object id "
  999. // << object->getID() << LL_ENDL;
  1000. //
  1001. // editable = false;
  1002. // break;
  1003. // }
  1004. }
  1005. }
  1006. }
  1007. // Media settings
  1008. bool bool_has_media = false;
  1009. struct media_functor : public LLSelectedTEGetFunctor<bool>
  1010. {
  1011. bool get(LLViewerObject* object, S32 face)
  1012. {
  1013. LLTextureEntry *te = object->getTE(face);
  1014. if (te)
  1015. {
  1016. return te->hasMedia();
  1017. }
  1018. return false;
  1019. }
  1020. } func;
  1021. // check if all faces have media(or, all dont have media)
  1022. LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
  1023. const LLMediaEntry default_media_data;
  1024. struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
  1025.     {
  1026. functor_getter_media_data(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1027.         LLMediaEntry get( LLViewerObject* object, S32 face )
  1028.         {
  1029.             if ( object )
  1030.                 if ( object->getTE(face) )
  1031.                     if ( object->getTE(face)->getMediaData() )
  1032.                         return *(object->getTE(face)->getMediaData());
  1033. return mMediaEntry;
  1034.         };
  1035. const LLMediaEntry& mMediaEntry;
  1036.     } func_media_data(default_media_data);
  1037. LLMediaEntry media_data_get;
  1038.     LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue( &func_media_data, media_data_get ));
  1039. std::string multi_media_info_str = LLTrans::getString("Multiple Media");
  1040. std::string media_title = "";
  1041. mNeedMediaTitle = false;
  1042. // update UI depending on whether "object" (prim or face) has media
  1043. // and whether or not you are allowed to edit it.
  1044. childSetEnabled("Add_Media",  editable);
  1045. // IF all the faces have media (or all dont have media)
  1046. if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
  1047. {
  1048. // TODO: get media title and set it.
  1049. media_info->clear();
  1050. // if identical is set, all faces are same (whether all empty or has the same media)
  1051. if(!(LLFloaterMediaSettings::getInstance()->mMultipleMedia) )
  1052. {
  1053. // Media data is valid
  1054. if(media_data_get!=default_media_data)
  1055. {
  1056. // initial media title is the media URL (until we get the name)
  1057. media_title = media_data_get.getHomeURL();
  1058. // kick off a navigate and flag that we need to update the title
  1059. navigateToTitleMedia( media_data_get.getHomeURL() );
  1060. mNeedMediaTitle = true;
  1061. }
  1062. // else all faces might be empty. 
  1063. }
  1064. else // there' re Different Medias' been set on on the faces.
  1065. {
  1066. media_title = multi_media_info_str;
  1067. mNeedMediaTitle = false;
  1068. }
  1069. childSetEnabled("media_tex",  bool_has_media && editable);
  1070. childSetEnabled( "edit_media", bool_has_media && LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo && editable );
  1071. childSetEnabled( "delete_media", bool_has_media && editable );
  1072. childSetEnabled( "add_media", ( ! bool_has_media ) && editable );
  1073. // TODO: display a list of all media on the face - use 'identical' flag
  1074. }
  1075. else // not all face has media but at least one does.
  1076. {
  1077. // seleted faces have not identical value
  1078. LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data );
  1079. if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
  1080. {
  1081. media_title = multi_media_info_str;
  1082. mNeedMediaTitle = false;
  1083. }
  1084. else
  1085. {
  1086. // Media data is valid
  1087. if(media_data_get!=default_media_data)
  1088. {
  1089. // initial media title is the media URL (until we get the name)
  1090. media_title = media_data_get.getHomeURL();
  1091. // kick off a navigate and flag that we need to update the title
  1092. navigateToTitleMedia( media_data_get.getHomeURL() );
  1093. mNeedMediaTitle = true;
  1094. }
  1095. }
  1096. childSetEnabled("media_tex",  TRUE);
  1097. childSetEnabled( "edit_media", LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo);
  1098. childSetEnabled( "delete_media", TRUE);
  1099. childSetEnabled( "add_media", FALSE );
  1100. }
  1101. media_info->setText(media_title);
  1102. // load values for media settings
  1103. updateMediaSettings();
  1104. LLFloaterMediaSettings::initValues(mMediaSettings, editable );
  1105. }
  1106. //////////////////////////////////////////////////////////////////////////////
  1107. // called when a user wants to add media to a prim or prim face
  1108. void LLFloaterTools::onClickBtnAddMedia()
  1109. {
  1110. // check if multiple faces are selected
  1111. if(LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
  1112. {
  1113. LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
  1114. }
  1115. else
  1116. {
  1117. onClickBtnEditMedia();
  1118. }
  1119. }
  1120. // static
  1121. bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
  1122. {
  1123. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1124. switch( option )
  1125. {
  1126. case 0:  // "Yes"
  1127. gFloaterTools->onClickBtnEditMedia();
  1128. break;
  1129. case 1:  // "No"
  1130. default:
  1131. break;
  1132. }
  1133. return false;
  1134. }
  1135. //////////////////////////////////////////////////////////////////////////////
  1136. // called when a user wants to edit existing media settings on a prim or prim face
  1137. // TODO: test if there is media on the item and only allow editing if present
  1138. void LLFloaterTools::onClickBtnEditMedia()
  1139. {
  1140. refreshMedia();
  1141. LLFloaterReg::showInstance("media_settings");
  1142. }
  1143. //////////////////////////////////////////////////////////////////////////////
  1144. // called when a user wants to delete media from a prim or prim face
  1145. void LLFloaterTools::onClickBtnDeleteMedia()
  1146. {
  1147. LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
  1148. }
  1149. // static
  1150. bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
  1151. {
  1152. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1153. switch( option )
  1154. {
  1155. case 0:  // "Yes"
  1156. LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() );
  1157. if(LLFloaterReg::instanceVisible("media_settings"))
  1158. {
  1159. LLFloaterReg::hideInstance("media_settings");
  1160. }
  1161. break;
  1162. case 1:  // "No"
  1163. default:
  1164. break;
  1165. }
  1166. return false;
  1167. }
  1168. //////////////////////////////////////////////////////////////////////////////
  1169. //
  1170. void LLFloaterTools::clearMediaSettings()
  1171. {
  1172. LLFloaterMediaSettings::getInstance();
  1173. LLFloaterMediaSettings::clearValues(false);
  1174. }
  1175. //////////////////////////////////////////////////////////////////////////////
  1176. //
  1177. void LLFloaterTools::navigateToTitleMedia( const std::string url )
  1178. {
  1179. if ( mTitleMedia )
  1180. {
  1181. LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
  1182. if ( media_plugin )
  1183. {
  1184. // if it's a movie, we don't want to hear it
  1185. media_plugin->setVolume( 0 );
  1186. };
  1187. mTitleMedia->navigateTo( url );
  1188. };
  1189. }
  1190. //////////////////////////////////////////////////////////////////////////////
  1191. //
  1192. void LLFloaterTools::updateMediaTitle()
  1193. {
  1194. // only get the media name if we need it
  1195. if ( ! mNeedMediaTitle )
  1196. return;
  1197. // get plugin impl
  1198. LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
  1199. if ( media_plugin )
  1200. {
  1201. // get the media name (asynchronous - must call repeatedly)
  1202. std::string media_title = media_plugin->getMediaName();
  1203. // only replace the title if what we get contains something
  1204. if ( ! media_title.empty() )
  1205. {
  1206. // update the UI widget
  1207. LLTextBox* media_title_field = getChild<LLTextBox>("media_info");
  1208. if ( media_title_field )
  1209. {
  1210. media_title_field->setText( media_title );
  1211. // stop looking for a title when we get one
  1212. // FIXME: check this is the right approach
  1213. mNeedMediaTitle = false;
  1214. };
  1215. };
  1216. };
  1217. }
  1218. //////////////////////////////////////////////////////////////////////////////
  1219. //
  1220. void LLFloaterTools::updateMediaSettings()
  1221. {
  1222.     bool identical( false );
  1223.     std::string base_key( "" );
  1224.     std::string value_str( "" );
  1225.     int value_int = 0;
  1226.     bool value_bool = false;
  1227. LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
  1228.     // TODO: (CP) refactor this using something clever or boost or both !!
  1229.     const LLMediaEntry default_media_data;
  1230.     // controls 
  1231.     U8 value_u8 = default_media_data.getControls();
  1232.     struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
  1233.     {
  1234. functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
  1235.         U8 get( LLViewerObject* object, S32 face )
  1236.         {
  1237.             if ( object )
  1238.                 if ( object->getTE(face) )
  1239.                     if ( object->getTE(face)->getMediaData() )
  1240.                         return object->getTE(face)->getMediaData()->getControls();
  1241.             return mMediaEntry.getControls();
  1242.         };
  1243. const LLMediaEntry &mMediaEntry;
  1244.     } func_controls(default_media_data);
  1245.     identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
  1246.     base_key = std::string( LLMediaEntry::CONTROLS_KEY );
  1247.     mMediaSettings[ base_key ] = value_u8;
  1248.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1249.     // First click (formerly left click)
  1250.     value_bool = default_media_data.getFirstClickInteract();
  1251.     struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
  1252.     {
  1253. functor_getter_first_click(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1254.         bool get( LLViewerObject* object, S32 face )
  1255.         {
  1256.             if ( object )
  1257.                 if ( object->getTE(face) )
  1258.                     if ( object->getTE(face)->getMediaData() )
  1259.                         return object->getTE(face)->getMediaData()->getFirstClickInteract();
  1260.             return mMediaEntry.getFirstClickInteract();
  1261.         };
  1262. const LLMediaEntry &mMediaEntry;
  1263.     } func_first_click(default_media_data);
  1264.     identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
  1265.     base_key = std::string( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
  1266.     mMediaSettings[ base_key ] = value_bool;
  1267.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1268.     // Home URL
  1269.     value_str = default_media_data.getHomeURL();
  1270.     struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
  1271.     {
  1272. functor_getter_home_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1273.         std::string get( LLViewerObject* object, S32 face )
  1274.         {
  1275.             if ( object )
  1276.                 if ( object->getTE(face) )
  1277.                     if ( object->getTE(face)->getMediaData() )
  1278.                         return object->getTE(face)->getMediaData()->getHomeURL();
  1279.             return mMediaEntry.getHomeURL();
  1280.         };
  1281. const LLMediaEntry &mMediaEntry;
  1282.     } func_home_url(default_media_data);
  1283.     identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
  1284.     base_key = std::string( LLMediaEntry::HOME_URL_KEY );
  1285.     mMediaSettings[ base_key ] = value_str;
  1286.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1287.     // Current URL
  1288.     value_str = default_media_data.getCurrentURL();
  1289.     struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
  1290.     {
  1291. functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1292.         
  1293. std::string get( LLViewerObject* object, S32 face )
  1294.         {
  1295.             if ( object )
  1296.                 if ( object->getTE(face) )
  1297.                     if ( object->getTE(face)->getMediaData() )
  1298.                         return object->getTE(face)->getMediaData()->getCurrentURL();
  1299.             return mMediaEntry.getCurrentURL();
  1300.         };
  1301. const LLMediaEntry &mMediaEntry;
  1302.     } func_current_url(default_media_data);
  1303.     identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
  1304.     base_key = std::string( LLMediaEntry::CURRENT_URL_KEY );
  1305.     mMediaSettings[ base_key ] = value_str;
  1306.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1307.     // Auto zoom
  1308.     value_bool = default_media_data.getAutoZoom();
  1309.     struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
  1310.     {
  1311. functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1312.         bool get( LLViewerObject* object, S32 face )
  1313.         {
  1314.             if ( object )
  1315.                 if ( object->getTE(face) )
  1316.                     if ( object->getTE(face)->getMediaData() )
  1317.                         return object->getTE(face)->getMediaData()->getAutoZoom();
  1318.             return mMediaEntry.getAutoZoom();
  1319.         };
  1320. const LLMediaEntry &mMediaEntry;
  1321.     } func_auto_zoom(default_media_data);
  1322.     identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
  1323.     base_key = std::string( LLMediaEntry::AUTO_ZOOM_KEY );
  1324.     mMediaSettings[ base_key ] = value_bool;
  1325.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1326.     // Auto play
  1327.     //value_bool = default_media_data.getAutoPlay();
  1328. // set default to auto play TRUE -- angela  EXT-5172
  1329. value_bool = true;
  1330.     struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
  1331.     {
  1332. functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1333.         bool get( LLViewerObject* object, S32 face )
  1334.         {
  1335.             if ( object )
  1336.                 if ( object->getTE(face) )
  1337.                     if ( object->getTE(face)->getMediaData() )
  1338.                         return object->getTE(face)->getMediaData()->getAutoPlay();
  1339.             //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela  EXT-5172
  1340. return true;
  1341.         };
  1342. const LLMediaEntry &mMediaEntry;
  1343.     } func_auto_play(default_media_data);
  1344.     identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
  1345.     base_key = std::string( LLMediaEntry::AUTO_PLAY_KEY );
  1346.     mMediaSettings[ base_key ] = value_bool;
  1347.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1348.     // Auto scale
  1349. // set default to auto scale TRUE -- angela  EXT-5172
  1350.     //value_bool = default_media_data.getAutoScale();
  1351. value_bool = true;
  1352.     struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
  1353.     {
  1354. functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1355.         bool get( LLViewerObject* object, S32 face )
  1356.         {
  1357.             if ( object )
  1358.                 if ( object->getTE(face) )
  1359.                     if ( object->getTE(face)->getMediaData() )
  1360.                         return object->getTE(face)->getMediaData()->getAutoScale();
  1361.            // return mMediaEntry.getAutoScale();  set default to auto scale TRUE -- angela  EXT-5172
  1362. return true;
  1363. };
  1364. const LLMediaEntry &mMediaEntry;
  1365.     } func_auto_scale(default_media_data);
  1366.     identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
  1367.     base_key = std::string( LLMediaEntry::AUTO_SCALE_KEY );
  1368.     mMediaSettings[ base_key ] = value_bool;
  1369.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1370.     // Auto loop
  1371.     value_bool = default_media_data.getAutoLoop();
  1372.     struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
  1373.     {
  1374. functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1375.         bool get( LLViewerObject* object, S32 face )
  1376.         {
  1377.             if ( object )
  1378.                 if ( object->getTE(face) )
  1379.                     if ( object->getTE(face)->getMediaData() )
  1380.                         return object->getTE(face)->getMediaData()->getAutoLoop();
  1381.             return mMediaEntry.getAutoLoop();
  1382.         };
  1383. const LLMediaEntry &mMediaEntry;
  1384.     } func_auto_loop(default_media_data);
  1385.     identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
  1386.     base_key = std::string( LLMediaEntry::AUTO_LOOP_KEY );
  1387.     mMediaSettings[ base_key ] = value_bool;
  1388.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1389.     // width pixels (if not auto scaled)
  1390.     value_int = default_media_data.getWidthPixels();
  1391.     struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
  1392.     {
  1393. functor_getter_width_pixels(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1394.         int get( LLViewerObject* object, S32 face )
  1395.         {
  1396.             if ( object )
  1397.                 if ( object->getTE(face) )
  1398.                     if ( object->getTE(face)->getMediaData() )
  1399.                         return object->getTE(face)->getMediaData()->getWidthPixels();
  1400.             return mMediaEntry.getWidthPixels();
  1401.         };
  1402. const LLMediaEntry &mMediaEntry;
  1403.     } func_width_pixels(default_media_data);
  1404.     identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
  1405.     base_key = std::string( LLMediaEntry::WIDTH_PIXELS_KEY );
  1406.     mMediaSettings[ base_key ] = value_int;
  1407.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1408.     // height pixels (if not auto scaled)
  1409.     value_int = default_media_data.getHeightPixels();
  1410.     struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
  1411.     {
  1412. functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1413.         
  1414. int get( LLViewerObject* object, S32 face )
  1415.         {
  1416.             if ( object )
  1417.                 if ( object->getTE(face) )
  1418.                     if ( object->getTE(face)->getMediaData() )
  1419.                         return object->getTE(face)->getMediaData()->getHeightPixels();
  1420.             return mMediaEntry.getHeightPixels();
  1421.         };
  1422. const LLMediaEntry &mMediaEntry;
  1423.     } func_height_pixels(default_media_data);
  1424.     identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
  1425.     base_key = std::string( LLMediaEntry::HEIGHT_PIXELS_KEY );
  1426.     mMediaSettings[ base_key ] = value_int;
  1427.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1428.     // Enable Alt image
  1429.     value_bool = default_media_data.getAltImageEnable();
  1430.     struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
  1431.     {
  1432. functor_getter_enable_alt_image(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1433.         
  1434. bool get( LLViewerObject* object, S32 face )
  1435.         {
  1436.             if ( object )
  1437.                 if ( object->getTE(face) )
  1438.                     if ( object->getTE(face)->getMediaData() )
  1439.                         return object->getTE(face)->getMediaData()->getAltImageEnable();
  1440.             return mMediaEntry.getAltImageEnable();
  1441.         };
  1442. const LLMediaEntry &mMediaEntry;
  1443.     } func_enable_alt_image(default_media_data);
  1444.     identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
  1445.     base_key = std::string( LLMediaEntry::ALT_IMAGE_ENABLE_KEY );
  1446.     mMediaSettings[ base_key ] = value_bool;
  1447.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1448.     // Perms - owner interact
  1449.     value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER );
  1450.     struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
  1451.     {
  1452. functor_getter_perms_owner_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1453.         
  1454. bool get( LLViewerObject* object, S32 face )
  1455.         {
  1456.             if ( object )
  1457.                 if ( object->getTE(face) )
  1458.                     if ( object->getTE(face)->getMediaData() )
  1459.                         return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
  1460.             return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
  1461.         };
  1462. const LLMediaEntry &mMediaEntry;
  1463.     } func_perms_owner_interact(default_media_data);
  1464.     identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
  1465.     base_key = std::string( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
  1466.     mMediaSettings[ base_key ] = value_bool;
  1467.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1468.     // Perms - owner control
  1469.     value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER );
  1470.     struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
  1471.     {
  1472. functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1473.         
  1474.         bool get( LLViewerObject* object, S32 face )
  1475.         {
  1476.             if ( object )
  1477.                 if ( object->getTE(face) )
  1478.                     if ( object->getTE(face)->getMediaData() )
  1479.                         return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
  1480.             return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
  1481.         };
  1482. const LLMediaEntry &mMediaEntry;
  1483.     } func_perms_owner_control(default_media_data);
  1484.     identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
  1485.     base_key = std::string( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
  1486.     mMediaSettings[ base_key ] = value_bool;
  1487.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1488.     // Perms - group interact
  1489.     value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP );
  1490.     struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
  1491.     {
  1492. functor_getter_perms_group_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1493.         
  1494.         bool get( LLViewerObject* object, S32 face )
  1495.         {
  1496.             if ( object )
  1497.                 if ( object->getTE(face) )
  1498.                     if ( object->getTE(face)->getMediaData() )
  1499.                         return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
  1500.             return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
  1501.         };
  1502. const LLMediaEntry &mMediaEntry;
  1503.     } func_perms_group_interact(default_media_data);
  1504.     identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
  1505.     base_key = std::string( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
  1506.     mMediaSettings[ base_key ] = value_bool;
  1507.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1508.     // Perms - group control
  1509.     value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP );
  1510.     struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
  1511.     {
  1512. functor_getter_perms_group_control(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1513.         
  1514.         bool get( LLViewerObject* object, S32 face )
  1515.         {
  1516.             if ( object )
  1517.                 if ( object->getTE(face) )
  1518.                     if ( object->getTE(face)->getMediaData() )
  1519.                         return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
  1520.             return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
  1521.         };
  1522. const LLMediaEntry &mMediaEntry;
  1523.     } func_perms_group_control(default_media_data);
  1524.     identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
  1525.     base_key = std::string( LLPanelContents::PERMS_GROUP_CONTROL_KEY );
  1526.     mMediaSettings[ base_key ] = value_bool;
  1527.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1528.     // Perms - anyone interact
  1529.     value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
  1530.     struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
  1531.     {
  1532. functor_getter_perms_anyone_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1533.         
  1534.         bool get( LLViewerObject* object, S32 face )
  1535.         {
  1536.             if ( object )
  1537.                 if ( object->getTE(face) )
  1538.                     if ( object->getTE(face)->getMediaData() )
  1539.                         return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
  1540.             return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
  1541.         };
  1542. const LLMediaEntry &mMediaEntry;
  1543.     } func_perms_anyone_interact(default_media_data);
  1544.     identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
  1545.     base_key = std::string( LLPanelContents::PERMS_ANYONE_INTERACT_KEY );
  1546.     mMediaSettings[ base_key ] = value_bool;
  1547.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1548.     // Perms - anyone control
  1549.     value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE );
  1550.     struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
  1551.     {
  1552. functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1553.         
  1554.         bool get( LLViewerObject* object, S32 face )
  1555.         {
  1556.             if ( object )
  1557.                 if ( object->getTE(face) )
  1558.                     if ( object->getTE(face)->getMediaData() )
  1559.                         return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
  1560.             return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
  1561.         };
  1562. const LLMediaEntry &mMediaEntry;
  1563.     } func_perms_anyone_control(default_media_data);
  1564.     identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
  1565.     base_key = std::string( LLPanelContents::PERMS_ANYONE_CONTROL_KEY );
  1566.     mMediaSettings[ base_key ] = value_bool;
  1567.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1568.     // security - whitelist enable
  1569.     value_bool = default_media_data.getWhiteListEnable();
  1570.     struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
  1571.     {
  1572. functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {}
  1573.         
  1574.         bool get( LLViewerObject* object, S32 face )
  1575.         {
  1576.             if ( object )
  1577.                 if ( object->getTE(face) )
  1578.                     if ( object->getTE(face)->getMediaData() )
  1579.                         return object->getTE(face)->getMediaData()->getWhiteListEnable();
  1580.             return mMediaEntry.getWhiteListEnable();
  1581.         };
  1582. const LLMediaEntry &mMediaEntry;
  1583.     } func_whitelist_enable(default_media_data);
  1584.     identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
  1585.     base_key = std::string( LLMediaEntry::WHITELIST_ENABLE_KEY );
  1586.     mMediaSettings[ base_key ] = value_bool;
  1587.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1588.     // security - whitelist URLs
  1589.     std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
  1590.     struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
  1591.     {
  1592. functor_getter_whitelist_urls(const LLMediaEntry& entry): mMediaEntry(entry) {}
  1593.         
  1594.         std::vector<std::string> get( LLViewerObject* object, S32 face )
  1595.         {
  1596.             if ( object )
  1597.                 if ( object->getTE(face) )
  1598.                     if ( object->getTE(face)->getMediaData() )
  1599.                         return object->getTE(face)->getMediaData()->getWhiteList();
  1600.             return mMediaEntry.getWhiteList();
  1601.         };
  1602. const LLMediaEntry &mMediaEntry;
  1603.     } func_whitelist_urls(default_media_data);
  1604.     identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
  1605.     base_key = std::string( LLMediaEntry::WHITELIST_KEY );
  1606. mMediaSettings[ base_key ].clear();
  1607.     std::vector< std::string >::iterator iter = value_vector_str.begin();
  1608.     while( iter != value_vector_str.end() )
  1609.     {
  1610.         std::string white_list_url = *iter;
  1611.         mMediaSettings[ base_key ].append( white_list_url );
  1612.         ++iter;
  1613.     };
  1614.     mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
  1615. }