第二人生的源码分析(八十七)LLButton类实现按钮功能

在前面介绍了登录过程的界面里有一个退出按钮,如果当用户不想登录时,就可以随时按这个按钮退出登录的过程,它的界面如下面,那么这个按钮是怎么样实现的呢?
 
从上图右下角可以看到 Quit按钮,它的功能实现是由类LLButton来实现的,这个类的声明如下:
#001 class LLButton
#002 : public LLUICtrl
#003 {
#004 public:
 
按钮的构造函数,主要设置显示的字符串,如果想使用这个类显示中文是不行的,因为这个函数里的 LLString是单字节的字符串,而不是宽字节字符串,因此想把第二人生改为中文显示需要添加一个构造函数可以保存UNICODE的字符串。
#005     // simple button with text label
#006     LLButton(const LLString& name, const LLRect &rect, const LLString& control_name = LLString(),
#007              void (*on_click)(void*) = NULL, void *data = NULL);
#008 
#009     LLButton(const LLString& name, const LLRect& rect,
#010              const LLString &unselected_image,
#011              const LLString &selected_image,
#012              const LLString& control_name, 
#013              void (*click_callback)(void*),
#014              void *callback_data = NULL,
#015              const LLFontGL* mGLFont = NULL,
#016              const LLString& unselected_label = LLString::null,
#017              const LLString& selected_label = LLString::null );
#018 
#019     virtual ~LLButton();
 
初始化一个按钮的回调函数,回调的数据,显示的字体。
#020     void init(void (*click_callback)(void*), void *callback_data, const LLFontGL* font, const LLString& control_name);
#021     virtual EWidgetType getWidgetType() const;
#022     virtual LLString getWidgetTag() const;
#023    
#024     void            addImageAttributeToXML(LLXMLNodePtr node, const LLString& imageName,
#025                                         const LLUUID&  
#026 imageID,const LLString&     xmlTagName) const;
#027     virtual LLXMLNodePtr getXML(bool save_children = true) const;
#028     static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
#029 
#030     virtual BOOL    handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent);
 
处理按钮的按钮消息。
#031     virtual BOOL    handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
#032     virtual BOOL    handleMouseDown(S32 x, S32 y, MASK mask);
#033     virtual BOOL    handleMouseUp(S32 x, S32 y, MASK mask);
#034     virtual BOOL    handleHover(S32 x, S32 y, MASK mask);
 
显示这个按钮的函数。
#035     virtual void    draw();
#036 
#037     virtual void    onMouseCaptureLost();
#038 
#039     // HACK: "committing" a button is the same as clicking on it.
#040     virtual void    onCommit();
#041 
#042     void            setUnselectedLabelColor( const LLColor4& c )        { mUnselectedLabelColor = c; }
#043     void            setSelectedLabelColor( const LLColor4& c )          { mSelectedLabelColor = c; }
#044 
#045     void            setClickedCallback( void (*cb)(void *data), void* data = NULL ); // mouse down and up within button
#046     void            setMouseDownCallback( void (*cb)(void *data) )      { mMouseDownCallback = cb; }    // mouse down
#047 within button
#048     void            setMouseUpCallback( void (*cb)(void *data) )        { mMouseUpCallback = cb; }       
#049 // mouse up, EVEN IF NOT IN BUTTON
#050     void            setHeldDownCallback( void (*cb)(void *data) )       { mHeldDownCallback = cb; }       
#051 // Mouse button held down and in button
#052     void            setHeldDownDelay( F32 seconds, S32 frames = 0)      { mHeldDownDelay = seconds;
#053 mHeldDownFrameDelay = frames; }
#054 
#055      F32             getHeldDownTime() const                
#056             { return mMouseDownTimer.getElapsedTimeF32(); }
#057 
#058     BOOL            getIsToggle() const { return mIsToggle; }
#059     void            setIsToggle(BOOL is_toggle) { mIsToggle = is_toggle; }
#060     BOOL            toggleState();
#061      BOOL            getToggleState() const { return mToggleState; }
#062     void            setToggleState(BOOL b);
#063 
#064     void            setFlashing( BOOL b );
#065     BOOL            getFlashing() const     { return mFlashing; }
#066 
#067     void            setHAlign( LLFontGL::HAlign align )     { mHAlign = align; }
#068     LLFontGL::HAlign getHAlign() const                      { return mHAlign; }
#069     void            setLeftHPad( S32 pad )                  { mLeftHPad =
#070 pad; }
#071     void            setRightHPad( S32 pad )                 { mRightHPad =
#072 pad; }
#073 
#074     const LLString getLabelUnselected() const { return wstring_to_utf8str(mUnselectedLabel); }
#075     const LLString getLabelSelected() const { return wstring_to_utf8str(mSelectedLabel); }
#076 
#077     void            setImageColor(const LLString& color_control);
#078     void            setImageColor(const LLColor4& c);
#079     virtual void    setColor(const LLColor4& c);
#080 
#081     void            setImages(const LLString &image_name, const LLString &selected_name);
#082     void            setDisabledImages(const LLString &image_name, const LLString &selected_name);
#083     void            setDisabledImages(const LLString &image_name, const LLString &selected_name, const LLColor4& c);
#084    
#085     void            setHoverImages(const LLString &image_name, const LLString &selected_name);
#086 
#087     void            setDisabledImageColor(const LLColor4& c)        { mDisabledImageColor = c; }
#088 
#089     void            setDisabledSelectedLabelColor( const LLColor4& c ) { mDisabledSelectedLabelColor = c; }
#090 
#091     void            setImageOverlay(const LLString &image_name, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4&
#092 color = LLColor4::white);
#093     LLPointer<LLUIImage> getImageOverlay() { return mImageOverlay; }
#094    
#095 
#096     virtual void    setValue(const LLSD& value );
#097     virtual LLSD    getValue() const;
#098 
#099     void            setLabel( const LLStringExplicit& label);
#100     virtual BOOL    setLabelArg( const LLString& key, const LLStringExplicit& text );
#101     void            setLabelUnselected(const LLStringExplicit& label);
#102     void            setLabelSelected(const LLStringExplicit& label);
#103     void            setDisabledLabel(const LLStringExplicit& disabled_label);
#104     void            setDisabledSelectedLabel(const LLStringExplicit& disabled_label);
#105     void            setDisabledLabelColor( const LLColor4& c )      { mDisabledLabelColor = c; }
#106    
#107     void            setFont(const LLFontGL *font)      
#108         { mGLFont = ( font ? font : LLFontGL::sSansSerif); }
#109     void            setScaleImage(BOOL scale)           { mScaleImage = scale; }
#110     BOOL            getScaleImage() const               { return mScaleImage; }
#111 
#112     void            setDropShadowedText(BOOL b)         { mDropShadowedText = b; }
#113 
#114     void            setBorderEnabled(BOOL b)                    {
#115 mBorderEnabled = b; }
#116 
#117     static void     onHeldDown(void *userdata); // to be called by gIdleCallbacks
#118 
#119     void            setHoverGlowStrength(F32 strength) { mHoverGlowStrength = strength; }
#120 
#121     void            setImageUnselected(const LLString &image_name);
#122     const LLString& getImageUnselectedName() const { return mImageUnselectedName; }
#123     void            setImageSelected(const LLString &image_name);
#124     const LLString& getImageSelectedName() const { return mImageSelectedName; }
#125     void            setImageHoverSelected(const LLString &image_name);
#126     void            setImageHoverUnselected(const LLString &image_name);
#127     void            setImageDisabled(const LLString &image_name);
#128     void            setImageDisabledSelected(const LLString &image_name);
#129 
#130     void            setImageUnselected(LLPointer<LLUIImage> image);
#131     void            setImageSelected(LLPointer<LLUIImage> image);
#132     void            setImageHoverSelected(LLPointer<LLUIImage> image);
#133     void            setImageHoverUnselected(LLPointer<LLUIImage> image);
#134     void            setImageDisabled(LLPointer<LLUIImage> image);
#135     void            setImageDisabledSelected(LLPointer<LLUIImage> image);
#136 
#137     void            setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
#138     BOOL            getCommitOnReturn() const { return mCommitOnReturn; }
#139 
#140     void            setHelpURLCallback(const LLString &help_url);
#141     const LLString& getHelpURL() const { return mHelpURL; }
#142 
#143 protected:
#144 
#145     virtual void    drawBorder(const LLColor4& color, S32 size);
#146 
#147     void            setImageUnselectedID(const LLUUID &image_id);
#148     const LLUUID&   getImageUnselectedID() const { return mImageUnselectedID; }
#149      void            setImageSelectedID(const LLUUID &image_id);
#150     const LLUUID&   getImageSelectedID() const { return mImageSelectedID; }
#151     void            setImageHoverSelectedID(const LLUUID &image_id);
#152     void            setImageHoverUnselectedID(const LLUUID &image_id);
#153     void            setImageDisabledID(const LLUUID &image_id);
#154     void            setImageDisabledSelectedID(const LLUUID &image_id);
#155     const LLPointer<LLUIImage>& getImageUnselected() const { return mImageUnselected; }
#156     const LLPointer<LLUIImage>& getImageSelected() const    { return mImageSelected; }
#157 
#158     LLFrameTimer    mMouseDownTimer;
#159 
#160 private:
#161 
#162     void            (*mClickedCallback)(void* data );
#163     void            (*mMouseDownCallback)(void *data);
#164     void            (*mMouseUpCallback)(void *data);
#165     void            (*mHeldDownCallback)(void *data);
#166 
#167     const LLFontGL *mGLFont;
#168    
#169     S32             mMouseDownFrame;
#170      F32             mHeldDownDelay;     // seconds, after which held-down callbacks get
#171 called
#172     S32             mHeldDownFrameDelay;    // frames, after which held-down callbacks get called
#173 
#174     LLPointer<LLUIImage>    mImageOverlay;
#175     LLFontGL::HAlign        mImageOverlayAlignment;
#176     LLColor4                mImageOverlayColor;
#177 
#178     LLPointer<LLUIImage>    mImageUnselected;
#179     LLUIString              mUnselectedLabel;
#180     LLColor4                mUnselectedLabelColor;
#181 
#182     LLPointer<LLUIImage>    mImageSelected;
#183     LLUIString              mSelectedLabel;
#184     LLColor4                mSelectedLabelColor;
#185 
#186     LLPointer<LLUIImage>    mImageHoverSelected;
#187 
#188     LLPointer<LLUIImage>    mImageHoverUnselected;
#189 
#190     LLPointer<LLUIImage>    mImageDisabled;
#191     LLUIString              mDisabledLabel;
#192     LLColor4                mDisabledLabelColor;
#193 
#194     LLPointer<LLUIImage>    mImageDisabledSelected;
#195     LLUIString              mDisabledSelectedLabel;
#196     LLColor4                mDisabledSelectedLabelColor;
#197 
#198     LLUUID          mImageUnselectedID;
#199     LLUUID          mImageSelectedID;
#200     LLUUID          mImageHoverSelectedID;
#201     LLUUID          mImageHoverUnselectedID;
#202     LLUUID          mImageDisabledID;
#203     LLUUID          mImageDisabledSelectedID;
#204     LLString        mImageUnselectedName;
#205     LLString        mImageSelectedName;
#206     LLString        mImageHoverSelectedName;
#207     LLString        mImageHoverUnselectedName;
#208     LLString        mImageDisabledName;
#209     LLString        mImageDisabledSelectedName;
#210 
#211     LLColor4        mHighlightColor;
#212     LLColor4        mUnselectedBgColor;
#213     LLColor4        mSelectedBgColor;
#214 
#215     LLColor4        mImageColor;
#216     LLColor4        mDisabledImageColor;
#217 
#218     BOOL            mIsToggle;
#219     BOOL            mToggleState;
#220     BOOL            mScaleImage;
#221 
#222     BOOL            mDropShadowedText;
#223 
#224     BOOL            mBorderEnabled;
#225 
#226     BOOL            mFlashing;
#227 
#228     LLFontGL::HAlign mHAlign;
#229     S32             mLeftHPad;
#230     S32             mRightHPad;
#231 
#232      F32             mHoverGlowStrength;
#233      F32             mCurGlowStrength;
#234 
#235     BOOL            mNeedsHighlight;
#236     BOOL            mCommitOnReturn;
#237 
#238     LLString        mHelpURL;
#239 
#240     LLPointer<LLUIImage> mImagep;
#241 
#242     LLFrameTimer    mFlashingTimer;
#243 };
 
通过设置这个按钮的名称,按钮处理事件的回调函数,就基本上可以生成一个上面图片的按钮了。
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值