第二人生的源码分析(八十七)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 };
 
通过设置这个按钮的名称,按钮处理事件的回调函数,就基本上可以生成一个上面图片的按钮了。
 
posted @ 2008-06-11 20:47  ajuanabc  阅读(116)  评论(0编辑  收藏  举报