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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcheckboxctrl.cpp
  3.  * @brief LLCheckBoxCtrl base class
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-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. // The mutants are coming!
  33. #include "linden_common.h"
  34. #define LLCHECKBOXCTRL_CPP
  35. #include "llcheckboxctrl.h"
  36. #include "llgl.h"
  37. #include "llui.h"
  38. #include "lluiconstants.h"
  39. #include "lluictrlfactory.h"
  40. #include "llcontrol.h"
  41. #include "llstring.h"
  42. #include "llfontgl.h"
  43. #include "lltextbox.h"
  44. #include "llkeyboard.h"
  45. const U32 MAX_STRING_LENGTH = 10;
  46. static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
  47. // Compiler optimization, generate extern template
  48. template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
  49. const std::string& name, BOOL recurse) const;
  50. LLCheckBoxCtrl::Params::Params()
  51. : text_enabled_color("text_enabled_color"),
  52. text_disabled_color("text_disabled_color"),
  53. initial_value("initial_value", false),
  54. label_text("label_text"),
  55. check_button("check_button"),
  56. radio_style("radio_style")
  57. {}
  58. LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
  59. : LLUICtrl(p),
  60. mTextEnabledColor(p.text_enabled_color()),
  61. mTextDisabledColor(p.text_disabled_color()),
  62. mFont(p.font())
  63. {
  64. mViewModel->setValue(LLSD(p.initial_value));
  65. mViewModel->resetDirty();
  66. static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
  67. static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
  68. static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
  69. static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
  70. // must be big enough to hold all children
  71. setUseBoundingRect(TRUE);
  72. // Label (add a little space to make sure text actually renders)
  73. const S32 FUDGE = 10;
  74. S32 text_width = mFont->getWidth( p.label ) + FUDGE;
  75. S32 text_height = llround(mFont->getLineHeight());
  76. LLRect label_rect;
  77. label_rect.setOriginAndSize(
  78. llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing,
  79. llcheckboxctrl_vpad + 1, // padding to get better alignment
  80. text_width + llcheckboxctrl_hpad,
  81. text_height );
  82. // *HACK Get rid of this with SL-55508... 
  83. // this allows blank check boxes and radio boxes for now
  84. std::string local_label = p.label;
  85. if(local_label.empty())
  86. {
  87. local_label = " ";
  88. }
  89. LLTextBox::Params tbparams = p.label_text;
  90. tbparams.rect(label_rect);
  91. tbparams.initial_value(local_label);
  92. if (p.font.isProvided())
  93. {
  94. tbparams.font(p.font);
  95. }
  96. tbparams.text_color( p.enabled() ? p.text_enabled_color() : p.text_disabled_color() );
  97. mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
  98. addChild(mLabel);
  99. // Button
  100. // Note: button cover the label by extending all the way to the right.
  101. LLRect btn_rect;
  102. btn_rect.setOriginAndSize(
  103. llcheckboxctrl_hpad,
  104. llcheckboxctrl_vpad,
  105. llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width + llcheckboxctrl_hpad,
  106. llmax( text_height, llcheckboxctrl_btn_size() ) + llcheckboxctrl_vpad);
  107. std::string active_true_id, active_false_id;
  108. std::string inactive_true_id, inactive_false_id;
  109. LLButton::Params params = p.check_button;
  110. params.rect(btn_rect);
  111. //params.control_name(p.control_name);
  112. params.click_callback.function(boost::bind(&LLCheckBoxCtrl::onButtonPress, this, _2));
  113. params.commit_on_return(false);
  114. // Checkboxes only allow boolean initial values, but buttons can
  115. // take any LLSD.
  116. params.initial_value(LLSD(p.initial_value));
  117. params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
  118. mButton = LLUICtrlFactory::create<LLButton>(params);
  119. addChild(mButton);
  120. }
  121. LLCheckBoxCtrl::~LLCheckBoxCtrl()
  122. {
  123. // Children all cleaned up by default view destructor.
  124. }
  125. // static
  126. void LLCheckBoxCtrl::onButtonPress( const LLSD& data )
  127. {
  128. //if (mRadioStyle)
  129. //{
  130. // setValue(TRUE);
  131. //}
  132. onCommit();
  133. }
  134. void LLCheckBoxCtrl::onCommit()
  135. {
  136. if( getEnabled() )
  137. {
  138. setTentative(FALSE);
  139. setControlValue(getValue());
  140. LLUICtrl::onCommit();
  141. }
  142. }
  143. void LLCheckBoxCtrl::setEnabled(BOOL b)
  144. {
  145. LLView::setEnabled(b);
  146. if (b)
  147. {
  148. mLabel->setColor( mTextEnabledColor.get() );
  149. }
  150. else
  151. {
  152. mLabel->setColor( mTextDisabledColor.get() );
  153. }
  154. }
  155. void LLCheckBoxCtrl::clear()
  156. {
  157. setValue( FALSE );
  158. }
  159. void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
  160. {
  161. //stretch or shrink bounding rectangle of label when rebuilding UI at new scale
  162. static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
  163. static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
  164. static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
  165. static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
  166. const S32 FUDGE = 10;
  167. S32 text_width = mFont->getWidth( mLabel->getText() ) + FUDGE;
  168. S32 text_height = llround(mFont->getLineHeight());
  169. LLRect label_rect;
  170. label_rect.setOriginAndSize(
  171. llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing,
  172. llcheckboxctrl_vpad,
  173. text_width,
  174. text_height );
  175. mLabel->setRect(label_rect);
  176. LLRect btn_rect;
  177. btn_rect.setOriginAndSize(
  178. llcheckboxctrl_hpad,
  179. llcheckboxctrl_vpad,
  180. llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width,
  181. llmax( text_height, llcheckboxctrl_btn_size() ) );
  182. mButton->setRect( btn_rect );
  183. LLUICtrl::reshape(width, height, called_from_parent);
  184. }
  185. //virtual
  186. void LLCheckBoxCtrl::setValue(const LLSD& value )
  187. {
  188. mButton->setValue( value );
  189. }
  190. //virtual
  191. LLSD LLCheckBoxCtrl::getValue() const
  192. {
  193. return mButton->getValue();
  194. }
  195. //virtual
  196. void LLCheckBoxCtrl::setTentative(BOOL b)
  197. {
  198. mButton->setTentative(b);
  199. }
  200. //virtual
  201. BOOL LLCheckBoxCtrl::getTentative() const
  202. {
  203. return mButton->getTentative();
  204. }
  205. void LLCheckBoxCtrl::setLabel( const LLStringExplicit& label )
  206. {
  207. mLabel->setText( label );
  208. reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
  209. }
  210. std::string LLCheckBoxCtrl::getLabel() const
  211. {
  212. return mLabel->getText();
  213. }
  214. BOOL LLCheckBoxCtrl::setLabelArg( const std::string& key, const LLStringExplicit& text )
  215. {
  216. BOOL res = mLabel->setTextArg(key, text);
  217. reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
  218. return res;
  219. }
  220. // virtual
  221. void LLCheckBoxCtrl::setControlName(const std::string& control_name, LLView* context)
  222. {
  223. mButton->setControlName(control_name, context);
  224. }
  225. // virtual Returns TRUE if the user has modified this control.
  226. BOOL  LLCheckBoxCtrl::isDirty() const
  227. {
  228. if ( mButton )
  229. {
  230. return mButton->isDirty();
  231. }
  232. return FALSE; // Shouldn't get here
  233. }
  234. // virtual Clear dirty state
  235. void LLCheckBoxCtrl::resetDirty()
  236. {
  237. if ( mButton )
  238. {
  239. mButton->resetDirty();
  240. }
  241. }