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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2. * @file llspeakbutton.cpp
  3. * @brief LLSpeakButton class implementation
  4. *
  5. * $LicenseInfo:firstyear=2002&license=viewergpl$
  6. * Copyright (c) 2002-2010, Linden Research, Inc.
  7. * Second Life Viewer Source Code
  8. * The source code in this file ("Source Code") is provided by Linden Lab
  9. * to you under the terms of the GNU General Public License, version 2.0
  10. * ("GPL"), unless you have obtained a separate licensing agreement
  11. * ("Other License"), formally executed by you and Linden Lab.  Terms of
  12. * the GPL can be found in doc/GPL-license.txt in this distribution, or
  13. * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  14. * There are special exceptions to the terms and conditions of the GPL as
  15. * it is applied to this Source Code. View the full text of the exception
  16. * in the file doc/FLOSS-exception.txt in this software distribution, or
  17. * online at
  18. * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  19. * By copying, modifying or distributing this software, you acknowledge
  20. * that you have read and understood your obligations described above,
  21. * and agree to abide by those obligations.
  22. * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  23. * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  24. * COMPLETENESS OR PERFORMANCE.
  25. * $/LicenseInfo$
  26. */
  27. #include "llviewerprecompiledheaders.h" // must be first include
  28. #include "llbutton.h"
  29. #include "llfloaterreg.h"
  30. #include "llagent.h"
  31. #include "llbottomtray.h"
  32. #include "llcallfloater.h"
  33. #include "lloutputmonitorctrl.h"
  34. #include "lltransientfloatermgr.h"
  35. #include "llspeakbutton.h"
  36. static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
  37. //////////////////////////////////////////////////////////////////////////
  38. //////////////////////////////////////////////////////////////////////////
  39. //////////////////////////////////////////////////////////////////////////
  40. LLSpeakButton::Params::Params()
  41.  : speak_button("speak_button")
  42.  , show_button("show_button")
  43.  , monitor("monitor")
  44. {
  45. // See widgets/talk_button.xml
  46. }
  47. void LLSpeakButton::draw()
  48. {
  49. // gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
  50. bool openmic = gVoiceClient->getUserPTTState();
  51. bool voiceenabled = gVoiceClient->voiceEnabled();
  52. mSpeakBtn->setToggleState(openmic && voiceenabled);
  53. mOutputMonitor->setIsMuted(!voiceenabled);
  54. LLUICtrl::draw();
  55. }
  56. void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
  57. {
  58. LLButton* speak_btn = getChild<LLButton>("speak_btn");
  59. speak_btn->setEnabled(enabled);
  60. }
  61. void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
  62. {
  63. LLButton* show_btn = getChild<LLButton>("speak_flyout_btn");
  64. show_btn->setEnabled(enabled);
  65. }
  66. LLSpeakButton::LLSpeakButton(const Params& p)
  67. : LLUICtrl(p)
  68. , mOutputMonitor(NULL)
  69. , mSpeakBtn(NULL)
  70. , mShowBtn(NULL)
  71. {
  72. LLRect rect = p.rect();
  73. LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0);
  74. LLRect show_rect = p.show_button.rect();
  75. show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0);
  76. speak_rect.mRight -= show_rect.getWidth();
  77. show_rect.mLeft = speak_rect.getWidth();
  78. show_rect.mRight = rect.getWidth();
  79. LLButton::Params speak_params = p.speak_button;
  80. speak_params.rect(speak_rect);
  81. mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params);
  82. addChild(mSpeakBtn);
  83. LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn);
  84. mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this));
  85. mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this));
  86. mSpeakBtn->setToggleState(FALSE);
  87. LLButton::Params show_params = p.show_button;
  88. show_params.rect(show_rect);
  89. mShowBtn = LLUICtrlFactory::create<LLButton>(show_params);
  90. addChild(mShowBtn);
  91. LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
  92. //  mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
  93. //  mShowBtn->setToggleState(FALSE);
  94. static const S32 MONITOR_RIGHT_PAD = 2;
  95. LLRect monitor_rect = p.monitor.rect();
  96. S32 monitor_height = monitor_rect.getHeight();
  97. monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD;
  98. monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD;
  99. monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2);
  100. monitor_rect.mTop = monitor_rect.mBottom + monitor_height;
  101. LLOutputMonitorCtrl::Params monitor_params = p.monitor;
  102. monitor_params.draw_border(false);
  103. monitor_params.rect(monitor_rect);
  104. monitor_params.auto_update(true);
  105. monitor_params.speaker_id(gAgentID);
  106. mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params);
  107. mSpeakBtn->addChild(mOutputMonitor);
  108. // never show "muted" because you can't mute yourself
  109. mOutputMonitor->setIsMuted(false);
  110. mOutputMonitor->setIsAgentControl(true);
  111. //*TODO find a better place to do that
  112. LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
  113. }
  114. LLSpeakButton::~LLSpeakButton()
  115. {
  116. LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn);
  117. LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);
  118. }
  119. void LLSpeakButton::setSpeakToolTip(const std::string& msg)
  120. {
  121. mSpeakBtn->setToolTip(msg);
  122. }
  123. void LLSpeakButton::setShowToolTip(const std::string& msg)
  124. {
  125. mShowBtn->setToolTip(msg);
  126. }
  127. void LLSpeakButton::setLabelVisible(bool visible)
  128. {
  129. static std::string label_selected = mSpeakBtn->getLabelSelected();
  130. static std::string label_unselected = mSpeakBtn->getLabelUnselected();
  131. if (visible)
  132. {
  133. mSpeakBtn->setLabelSelected(label_selected);
  134. mSpeakBtn->setLabelUnselected(label_unselected);
  135. }
  136. else
  137. {
  138. static LLStringExplicit empty_string("");
  139. mSpeakBtn->setLabelSelected(empty_string);
  140. mSpeakBtn->setLabelUnselected(empty_string);
  141. }
  142. }
  143. //////////////////////////////////////////////////////////////////////////
  144. /// PROTECTED SECTION
  145. //////////////////////////////////////////////////////////////////////////
  146. void LLSpeakButton::onMouseDown_SpeakBtn()
  147. {
  148. bool down = true;
  149. gVoiceClient->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
  150. }
  151. void LLSpeakButton::onMouseUp_SpeakBtn()
  152. {
  153. bool down = false;
  154. gVoiceClient->inputUserControlState(down);
  155. }