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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatermediasettings.cpp
  3.  * @brief Tabbed dialog for media settings - class implementation
  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 "llfloaterreg.h"
  34. #include "llfloatermediasettings.h"
  35. #include "llpanelmediasettingsgeneral.h"
  36. #include "llpanelmediasettingssecurity.h"
  37. #include "llpanelmediasettingspermissions.h"
  38. #include "llviewercontrol.h"
  39. #include "lluictrlfactory.h"
  40. #include "llbutton.h"
  41. #include "llselectmgr.h"
  42. #include "llsdutil.h"
  43. LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL;
  44. ////////////////////////////////////////////////////////////////////////////////
  45. // 
  46. LLFloaterMediaSettings::LLFloaterMediaSettings(const LLSD& key)
  47. : LLFloater(key),
  48. mTabContainer(NULL),
  49. mPanelMediaSettingsGeneral(NULL),
  50. mPanelMediaSettingsSecurity(NULL),
  51. mPanelMediaSettingsPermissions(NULL),
  52. mWaitingToClose( false ),
  53. mIdenticalHasMediaInfo( true ),
  54. mMultipleMedia(false),
  55. mMultipleValidMedia(false)
  56. {
  57. }
  58. ////////////////////////////////////////////////////////////////////////////////
  59. //
  60. LLFloaterMediaSettings::~LLFloaterMediaSettings()
  61. {
  62. if ( mPanelMediaSettingsGeneral )
  63. {
  64. delete mPanelMediaSettingsGeneral;
  65. mPanelMediaSettingsGeneral = NULL;
  66. }
  67. if ( mPanelMediaSettingsSecurity )
  68. {
  69. delete mPanelMediaSettingsSecurity;
  70. mPanelMediaSettingsSecurity = NULL;
  71. }
  72. if ( mPanelMediaSettingsPermissions )
  73. {
  74. delete mPanelMediaSettingsPermissions;
  75. mPanelMediaSettingsPermissions = NULL;
  76. }
  77. sInstance = NULL;
  78. }
  79. ////////////////////////////////////////////////////////////////////////////////
  80. //
  81. BOOL LLFloaterMediaSettings::postBuild()
  82. {
  83. mApplyBtn = getChild<LLButton>("Apply");
  84. mApplyBtn->setClickedCallback(onBtnApply, this);
  85. mCancelBtn = getChild<LLButton>("Cancel");
  86. mCancelBtn->setClickedCallback(onBtnCancel, this);
  87. mOKBtn = getChild<LLButton>("OK");
  88. mOKBtn->setClickedCallback(onBtnOK, this);
  89. mTabContainer = getChild<LLTabContainer>( "tab_container" );
  90. mPanelMediaSettingsGeneral = new LLPanelMediaSettingsGeneral();
  91. mTabContainer->addTabPanel( 
  92. LLTabContainer::TabPanelParams().
  93. panel(mPanelMediaSettingsGeneral));
  94. mPanelMediaSettingsGeneral->setParent( this );
  95. // note that "permissions" tab is really "Controls" tab - refs to 'perms' and
  96. // 'permissions' not changed to 'controls' since we don't want to change 
  97. // shared files in server code and keeping everything the same seemed best.
  98. mPanelMediaSettingsPermissions = new LLPanelMediaSettingsPermissions();
  99. mTabContainer->addTabPanel( 
  100. LLTabContainer::TabPanelParams().
  101. panel(mPanelMediaSettingsPermissions));
  102. mPanelMediaSettingsSecurity = new LLPanelMediaSettingsSecurity();
  103. mTabContainer->addTabPanel( 
  104. LLTabContainer::TabPanelParams().
  105. panel(mPanelMediaSettingsSecurity));
  106. mPanelMediaSettingsSecurity->setParent( this );
  107. // restore the last tab viewed from persistance variable storage
  108. if (!mTabContainer->selectTab(gSavedSettings.getS32("LastMediaSettingsTab")))
  109. {
  110. mTabContainer->selectFirstTab();
  111. };
  112. sInstance = this;
  113. return TRUE;
  114. }
  115. //static 
  116. LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
  117. {
  118. if ( !sInstance )
  119. {
  120. sInstance = (LLFloaterReg::getTypedInstance<LLFloaterMediaSettings>("media_settings"));
  121. }
  122. return sInstance;
  123. }
  124. //static 
  125. void LLFloaterMediaSettings::apply()
  126. {
  127. if (sInstance->haveValuesChanged())
  128. {
  129. LLSD settings;
  130. sInstance->mPanelMediaSettingsGeneral->preApply();
  131. sInstance->mPanelMediaSettingsGeneral->getValues( settings, false );
  132. sInstance->mPanelMediaSettingsSecurity->preApply();
  133. sInstance->mPanelMediaSettingsSecurity->getValues( settings, false );
  134. sInstance->mPanelMediaSettingsPermissions->preApply();
  135. sInstance->mPanelMediaSettingsPermissions->getValues( settings, false );
  136. LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA, settings );
  137. sInstance->mPanelMediaSettingsGeneral->postApply();
  138. sInstance->mPanelMediaSettingsSecurity->postApply();
  139. sInstance->mPanelMediaSettingsPermissions->postApply();
  140. }
  141. }
  142. ////////////////////////////////////////////////////////////////////////////////
  143. void LLFloaterMediaSettings::onClose(bool app_quitting)
  144. {
  145. if(mPanelMediaSettingsGeneral)
  146. {
  147. mPanelMediaSettingsGeneral->onClose(app_quitting);
  148. }
  149. LLFloaterReg::hideInstance("whitelist_entry");
  150. }
  151. ////////////////////////////////////////////////////////////////////////////////
  152. //static 
  153. void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable )
  154. {
  155. if (sInstance->hasFocus()) return;
  156. sInstance->clearValues(editable);
  157. // update all panels with values from simulator
  158. sInstance->mPanelMediaSettingsGeneral->
  159. initValues( sInstance->mPanelMediaSettingsGeneral, media_settings, editable );
  160. sInstance->mPanelMediaSettingsSecurity->
  161. initValues( sInstance->mPanelMediaSettingsSecurity, media_settings, editable );
  162. sInstance->mPanelMediaSettingsPermissions->
  163. initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
  164. // Squirrel away initial values 
  165. sInstance->mInitialValues.clear();
  166. sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
  167. sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
  168. sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
  169. sInstance->mApplyBtn->setEnabled(editable);
  170. sInstance->mOKBtn->setEnabled(editable);
  171. }
  172. ////////////////////////////////////////////////////////////////////////////////
  173. // 
  174. void LLFloaterMediaSettings::commitFields()
  175. {
  176. if (hasFocus())
  177. {
  178. LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
  179. if (cur_focus && cur_focus->acceptsTextInput())
  180. {
  181. cur_focus->onCommit();
  182. };
  183. };
  184. }
  185. ////////////////////////////////////////////////////////////////////////////////
  186. //static 
  187. void LLFloaterMediaSettings::clearValues( bool editable)
  188. {
  189. // clean up all panels before updating
  190. sInstance->mPanelMediaSettingsGeneral  ->clearValues(sInstance->mPanelMediaSettingsGeneral,  editable);
  191. sInstance->mPanelMediaSettingsSecurity  ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
  192. sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions,  editable);
  193. }
  194. ////////////////////////////////////////////////////////////////////////////////
  195. // static
  196. void LLFloaterMediaSettings::onBtnOK( void* userdata )
  197. {
  198. sInstance->commitFields();
  199. sInstance->apply();
  200. sInstance->closeFloater();
  201. }
  202. ////////////////////////////////////////////////////////////////////////////////
  203. // static
  204. void LLFloaterMediaSettings::onBtnApply( void* userdata )
  205. {
  206. sInstance->commitFields();
  207. sInstance->apply();
  208. }
  209. ////////////////////////////////////////////////////////////////////////////////
  210. // static
  211. void LLFloaterMediaSettings::onBtnCancel( void* userdata )
  212. {
  213. sInstance->closeFloater(); 
  214. }
  215. ////////////////////////////////////////////////////////////////////////////////
  216. // static
  217. void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
  218. {
  219. LLTabContainer* self = (LLTabContainer*)user_data;
  220. gSavedSettings.setS32("LastMediaSettingsTab", self->getCurrentPanelIndex());
  221. }
  222. ////////////////////////////////////////////////////////////////////////////////
  223. //
  224. const std::string LLFloaterMediaSettings::getHomeUrl()
  225. {
  226. if ( mPanelMediaSettingsGeneral )
  227. return mPanelMediaSettingsGeneral->getHomeUrl();
  228. else
  229. return std::string( "" );
  230. }
  231. ////////////////////////////////////////////////////////////////////////////////
  232. // virtual 
  233. void LLFloaterMediaSettings::draw()
  234. {
  235. if (NULL != mApplyBtn)
  236. {
  237. // Set the enabled state of the "Apply" button if values changed
  238. mApplyBtn->setEnabled( haveValuesChanged() );
  239. }
  240. LLFloater::draw();
  241. }
  242. //private
  243. bool LLFloaterMediaSettings::haveValuesChanged() const
  244. {
  245. bool values_changed = false;
  246. // *NOTE: The code below is very inefficient.  Better to do this
  247. // only when data change.
  248. // Every frame, check to see what the values are.  If they are not
  249. // the same as the initial media data, enable the OK/Apply buttons
  250. LLSD settings;
  251. sInstance->mPanelMediaSettingsGeneral->getValues( settings );
  252. sInstance->mPanelMediaSettingsSecurity->getValues( settings );
  253. sInstance->mPanelMediaSettingsPermissions->getValues( settings );
  254. LLSD::map_const_iterator iter = settings.beginMap();
  255. LLSD::map_const_iterator end = settings.endMap();
  256. for ( ; iter != end; ++iter )
  257. {
  258. const std::string &current_key = iter->first;
  259. const LLSD &current_value = iter->second;
  260. if ( ! llsd_equals(current_value, mInitialValues[current_key]))
  261. {
  262. values_changed = true;
  263. break;
  264. }
  265. }
  266. return values_changed;
  267. }