Click here to Skip to main content
15,896,153 members
Articles / Mobile Apps / Android

One-Touch Casual 3D Game Based on OpenGL ES 2.0 3D Engine with Lua, Bullet, and Vorbis Support

Rate me:
Please Sign up or sign in to vote.
4.75/5 (7 votes)
8 Nov 2012CPOL5 min read 50.6K   3.3K   18  
Android-x86 native game-engine - without JNI
#ifndef THEMESTYLE_H_
#define THEMESTYLE_H_

#include "Base.h"
#include "Ref.h"
#include "Font.h"
#include "Rectangle.h"
#include "Texture.h"
#include "Properties.h"
#include "Theme.h"

namespace gameplay
{

/**
 * This class represents the appearance of a control.  A style can have padding and margin values,
 * as well as overlays for each of the control's states.  Each overlay in turn can reference
 * other theme classes to determine the border, background, cursor, and image settings to use for
 * a particular state, as well as color and font settings, etcetera.
 */
class Theme::Style
{
    friend class Theme;
    friend class Control;
    friend class Container;
    friend class Form;

public:

    /**
     * Get the theme this style belongs to.
     *
     * @return The theme this style belongs to.
     */
    Theme* getTheme() const;

private:

    /**
     * A style has one overlay for each possible control state.
     */
    enum OverlayType
    {
        OVERLAY_NORMAL,
        OVERLAY_FOCUS,
        OVERLAY_ACTIVE,
        OVERLAY_DISABLED,
        OVERLAY_MAX
    };

    /**
     * This class represents a control's overlay for one of its states.
     */
    class Overlay : public Ref, public AnimationTarget
    {
        friend class Theme;
        friend class Theme::Style;
        friend class Control;
        friend class Container;
        friend class Form;

    private:

        static const int ANIMATE_OPACITY = 1;

        Overlay();
            
        Overlay(const Overlay& copy);
            
        ~Overlay();

        /**
         * Hidden copy assignment operator.
         */
        Overlay& operator=(const Overlay&);

        static Overlay* create();

        OverlayType getType();

        float getOpacity() const;

        void setOpacity(float opacity);

        void setBorder(float top, float bottom, float left, float right);

        const Theme::Border& getBorder() const;

        void setSkinColor(const Vector4& color);

        const Vector4& getSkinColor() const;

        void setSkinRegion(const Rectangle& region, float tw, float th);

        const Rectangle& getSkinRegion() const;

        const Theme::UVs& getSkinUVs(Theme::Skin::SkinArea area) const;

        Font* getFont() const;

        void setFont(Font* font);

        unsigned int getFontSize() const;

        void setFontSize(unsigned int fontSize);

        Font::Justify getTextAlignment() const;

        void setTextAlignment(Font::Justify alignment);
            
        bool getTextRightToLeft() const;

        void setTextRightToLeft(bool rightToLeft);

        const Vector4& getTextColor() const;

        void setTextColor(const Vector4& color); 

        const Rectangle& getImageRegion(const char* id) const;

        void setImageRegion(const char* id, const Rectangle& region, float tw, float th);

        const Vector4& getImageColor(const char* id) const;

        void setImageColor(const char* id, const Vector4& color);

        const Theme::UVs& getImageUVs(const char* id) const;

        const Rectangle& getCursorRegion() const;

        void setCursorRegion(const Rectangle& region, float tw, float th);

        const Vector4& getCursorColor() const;

        void setCursorColor(const Vector4& color);

        const Theme::UVs& getCursorUVs() const;

        /**
         * @see AnimationTarget::getAnimationPropertyComponentCount
         */
        unsigned int getAnimationPropertyComponentCount(int propertyId) const;

        /**
         * @see AnimationTarget::getAnimationProperty
         */
        void getAnimationPropertyValue(int propertyId, AnimationValue* value);

        /**
         * @see AnimationTarget::setAnimationProperty
         */
        void setAnimationPropertyValue(int propertyId, AnimationValue* value, float blendWeight = 1.0f);
       
        void setSkin(Theme::Skin* Skin);

        Theme::Skin* getSkin() const;

        void setCursor(Theme::ThemeImage* cursor);
            
        Theme::ThemeImage* getCursor() const;
            
        void setImageList(Theme::ImageList* imageList);
            
        Theme::ImageList* getImageList() const;
        
        Skin* _skin;
        Theme::ThemeImage* _cursor;
        Theme::ImageList* _imageList;
        Font* _font;
        unsigned int _fontSize;
        Font::Justify _alignment;
        bool _textRightToLeft;
        Vector4 _textColor;
        float _opacity;
    };

    /**
     * Constructor.
     */
    Style(Theme* theme, const char* id, float tw, float th,
          const Theme::Margin& margin, const Theme::Padding& padding,
          Overlay* normal, Overlay* focus, Overlay* active, Overlay* disabled);

    /**
     * Constructor.
     */
    Style(const Style& style);

    /**
     * Destructor.
     */
    ~Style();

    /**
     * Hidden copy assignment operator.
     */
    Style& operator=(const Style&);

    /**
     * Returns the Id of this Style.
     */
    const char* getId() const;

    /**
     * Gets an overlay from the overlay type.
     */
    Overlay* getOverlay(OverlayType overlayType) const;

    /**
     * Gets the Padding region of this style.
     */
    const Theme::Padding& getPadding() const;

    /**
     * Gets the Margin region of this style.
     */
    const Theme::Margin& getMargin() const;

    /**
     * Set this size of this Style's padding.
     *
     * Padding is the space between a Control's content (all icons and text) and its border.
     */
    void setPadding(float top, float bottom, float left, float right);

    /**
     * Set the size of this Style's margin.
     *
     * The margin is used by Layouts other than AbsoluteLayout to put space between Controls.
     */
    void setMargin(float top, float bottom, float left, float right);
    
    Theme* _theme;
    std::string _id;
    float _tw;
    float _th;
    Theme::Margin _margin;
    Theme::Padding _padding;
    Overlay* _overlays[OVERLAY_MAX];
};

}

#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions