在第二人生的登录界面里,可以看到输入密码的下面有一个复选按钮,如下图所示:
这个按钮在这里主要用来设置是否帮助用户保存密码在磁盘里的,这样可以使用户每次不用输入密码,就可以登录进去。那么这个按钮是怎么样实现的呢?现在就分析跟这个相关的代码,它的继承代码如下:
class LLCheckBoxCtrl
: public LLUICtrl
可见
LLCheckBoxCtrl类也是控件类来的,它主要两部分组成:LLButton和LLTextBox。这两个类都是前面学习过的按钮类和静态文本框。在LLCheckBoxCtrl类声明如下:
#001 protected:
#002
// note: value is stored in toggle state of button
#003 LLButton* mButton;
#004 LLTextBox* mLabel;
#005
const LLFontGL* mFont;
#006
LLColor4 mTextEnabledColor;
#007
LLColor4 mTextDisabledColor;
LLCheckBoxCtrl类的显示代码,如下:
#001 void LLCheckBoxCtrl::draw()
#002 {
根据是否选择来显示文本不同的颜色。
#003
if (getEnabled())
#004
{
#005
mLabel->setColor( mTextEnabledColor );
#006
}
#007
else
#008
{
#009
mLabel->setColor( mTextDisabledColor );
#010
}
#011
#012
// Draw children
#013
LLUICtrl::draw();
#014 }
由于使用前面两个现成的组件构造一个新组件,这样不需要使用更多复杂的代码,就可以实现这样的功能了,因此就这样简单的。当然这两个组件的构造是在
LLCheckBoxCtrl类构造函数里创建的,如下:
#001 LLCheckBoxCtrl::LLCheckBoxCtrl(const LLString& name, const LLRect& rect,
#002
const LLString& label,
#003
const LLFontGL* font,
#004
void (*commit_callback)(LLUICtrl* ctrl, void*
#005 userdata),
#006
void* callback_user_data,
#007
BOOL initial_value,
#008
BOOL use_radio_style,
#009
const LLString& control_which)
#010 : LLUICtrl(name, rect, TRUE, commit_callback, callback_user_data, FOLLOWS_LEFT | FOLLOWS_TOP),
#011
mTextEnabledColor( LLUI::sColorsGroup->getColor( "LabelTextColor" ) ),
#012
mTextDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ),
#013
mRadioStyle( use_radio_style ),
#014
mInitialValue( initial_value ),
#015
mSetValue( initial_value )
#016 {
#017
if (font)
#018
{
#019
mFont = font;
#020
}
#021
else
#022
{
#023
mFont = LLFontGL::sSansSerifSmall;
#024
}
#025
#026
// must be big enough to hold all children
#027
setUseBoundingRect(TRUE);
#028
#029
mKeyboardFocusOnClick = TRUE;
#030
#031
// Label (add a little space to make sure text actually renders)
#032
const S32 FUDGE = 10;
#033
S32 text_width = mFont->getWidth( label ) + FUDGE;
#034
S32 text_height = llround(mFont->getLineHeight());
#035
LLRect label_rect;
#036
label_rect.setOriginAndSize(
#037
LLCHECKBOXCTRL_HPAD + LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING,
#038
LLCHECKBOXCTRL_VPAD + 1, // padding to get better alignment
#039
text_width + LLCHECKBOXCTRL_HPAD,
#040
text_height );
#041
#042
// *HACK Get rid of this with SL-55508...
#043
// this allows blank check boxes and radio boxes for now
#044
LLString local_label = label;
#045
if(local_label.empty())
#046
{
#047
local_label = " ";
#048
}
#049
#050 mLabel = new LLTextBox( "CheckboxCtrl Label", label_rect, local_label.c_str(), mFont );
#051
mLabel->setFollowsLeft();
#052
mLabel->setFollowsBottom();
#053 addChild(mLabel);
#054
#055
// Button
#056
// Note: button cover the label by extending all the way to the right.
#057
LLRect btn_rect;
#058
btn_rect.setOriginAndSize(
#059
LLCHECKBOXCTRL_HPAD,
#060
LLCHECKBOXCTRL_VPAD,
#061
LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING + text_width + LLCHECKBOXCTRL_HPAD,
#062
llmax( text_height, LLCHECKBOXCTRL_BTN_SIZE ) + LLCHECKBOXCTRL_VPAD);
#063
LLString active_true_id, active_false_id;
#064
LLString inactive_true_id, inactive_false_id;
#065
if (mRadioStyle)
#066
{
#067
active_true_id = "UIImgRadioActiveSelectedUUID";
#068
active_false_id = "UIImgRadioActiveUUID";
#069
inactive_true_id = "UIImgRadioInactiveSelectedUUID";
#070
inactive_false_id = "UIImgRadioInactiveUUID";
#071 mButton = new LLButton(
#072 "Radio control button", btn_rect,
#073 active_false_id, active_true_id, control_which,
#074 &LLCheckBoxCtrl::onButtonPress, this, LLFontGL::sSansSerif );
#075
mButton->setDisabledImages( inactive_false_id, inactive_true_id );
#076
mButton->setHoverGlowStrength(0.35f);
#077
}
#078
else
#079
{
#080
active_false_id = "UIImgCheckboxActiveUUID";
#081
active_true_id = "UIImgCheckboxActiveSelectedUUID";
#082
inactive_true_id = "UIImgCheckboxInactiveSelectedUUID";
#083
inactive_false_id = "UIImgCheckboxInactiveUUID";
#084 mButton = new LLButton(
#085 "Checkbox control button", btn_rect,
#086 active_false_id, active_true_id, control_which,
#087 &LLCheckBoxCtrl::onButtonPress, this, LLFontGL::sSansSerif );
#088
mButton->setDisabledImages( inactive_false_id, inactive_true_id );
#089
mButton->setHoverGlowStrength(0.35f);
#090
}
#091
mButton->setIsToggle(TRUE);
#092
mButton->setToggleState( initial_value );
#093
mButton->setFollowsLeft();
#094
mButton->setFollowsBottom();
#095
mButton->setCommitOnReturn(FALSE);
#096 addChild(mButton);
#097 }
这样简单就实现了一个复选框的功能。