kick
/Users/morten/Programmering/cpp/kick/src/kick/2d/button.cpp
00001 //
00002 // Created by morten on 19/07/14.
00003 //
00004 
00005 #include "button.h"
00006 #include "kick/scene/scene.h"
00007 #include "kick/scene/transform.h"
00008 #include "canvas.h"
00009 #include <iostream>
00010 
00011 using namespace std;
00012 
00013 namespace kick {
00014     Button::Button(GameObject *gameObject, std::shared_ptr<Canvas> canvas)
00015             : Sprite{gameObject, canvas},
00016               onClick{[](Button*){}}
00017     {
00018         setType(SpriteType::Sliced);
00019         setAnchor({0.5f,0.5f});
00020         mTextComponent = mCanvas->createLabel(mText);
00021         mTextComponent->transform()->setParent(transform());
00022         mTextComponent->setText(mText);
00023         mTextComponent->setAnchor({0.5f,0.5f});
00024         mTextComponent->setOrder(order() + 1);
00025         setOrder(order()); // force setting render order of text
00026         updateTextureAndTxtColor();
00027     }
00028 
00029     void Button::setText(std::string const &text) {
00030         Button::mText = text;
00031         if (mTextComponent){
00032             mTextComponent->setText(text);
00033         }
00034     }
00035 
00036     std::string Button::text() const {
00037         return mText;
00038     }
00039 
00040     void Button::setPressedSprite(std::string const &pressed) {
00041         Button::mPressedName = pressed;
00042         updateTextureAndTxtColor();
00043     }
00044 
00045     std::string Button::pressedSprite() const {
00046         return mPressedName;
00047     }
00048 
00049     void Button::setHoverSprite(std::string const &hover) {
00050         Button::mHoverName = hover;
00051         updateTextureAndTxtColor();
00052     }
00053 
00054     std::string Button::hoverSprite() const {
00055         return mHoverName;
00056     }
00057 
00058     void Button::setNormalSprite(std::string const &normal) {
00059         Button::mNormalName = normal;
00060         updateTextureAndTxtColor();
00061     }
00062 
00063     std::string Button::normalSprite() const {
00064         return mNormalName;
00065     }
00066 
00067     void Button::setOnClick(std::function<void(Button*)> const &onClick) {
00068         Button::onClick = onClick;
00069     }
00070 
00071     std::function<void(Button*)> const &Button::getOnClick() const {
00072         return onClick;
00073     }
00074 
00075     void Button::updateTextureAndTxtColor() {
00076         setSpriteName(currentSpriteName());
00077         if (mPressedButtons.size()>0){
00078             mTextComponent->material()->setUniform("mainColor", mPressedColor);
00079         } else {
00080             if (mState == ButtonState::normal){
00081                 mTextComponent->material()->setUniform("mainColor", mNormalColor);
00082             } else {
00083                 mTextComponent->material()->setUniform("mainColor", mHoverColor);
00084             }
00085         }
00086     }
00087 
00088     std::string Button::currentSpriteName() {
00089         if (mPressedButtons.size()>0){
00090             return mPressedName;
00091         }
00092         switch (mState){
00093             case ButtonState::normal:
00094                 return mNormalName;
00095             case ButtonState::hover:
00096                 return mHoverName;
00097             default: 
00098                 return mPressedName;
00099         }
00100     }
00101 
00102 
00103 
00104     void Button::deactivated() {
00105         Sprite::deactivated();
00106         gameObject()->scene()->destroyGameObject(mTextComponent->gameObject());
00107     }
00108 
00109     void Button::down(int button) {
00110         mPressedButtons.insert(button);
00111         updateTextureAndTxtColor();
00112         invokeClick();
00113     }
00114 
00115     void Button::pressed(int button) {
00116 
00117     }
00118 
00119     void Button::up(int button) {
00120         mPressedButtons.erase(button);
00121         updateTextureAndTxtColor();
00122     }
00123 
00124     void Button::over() {
00125         mState = ButtonState::hover;
00126         updateTextureAndTxtColor();
00127     }
00128 
00129     void Button::out() {
00130         mState = ButtonState::normal;
00131         updateTextureAndTxtColor();
00132     }
00133 
00134     void Button::setOrder(int order) {
00135         Component2D::setOrder(order);
00136         if (mTextComponent){
00137             mTextComponent->setOrder(order + 1);
00138         }
00139     }
00140 
00141     void Button::setPressedColor(glm::vec4 const &pressedColor) {
00142         Button::mPressedColor = pressedColor;
00143     }
00144 
00145     glm::vec4 const &Button::pressedColor() const {
00146         return mPressedColor;
00147     }
00148 
00149     void Button::setHoverColor(glm::vec4 const &hoverColor) {
00150         Button::mHoverColor = hoverColor;
00151     }
00152 
00153     glm::vec4 const &Button::hoverColor() const {
00154         return mHoverColor;
00155     }
00156 
00157     void Button::setNormalColor(glm::vec4 const &normalColor) {
00158         Button::mNormalColor = normalColor;
00159     }
00160 
00161     glm::vec4 const &Button::normalColor() const {
00162         return mNormalColor;
00163     }
00164 
00165     void Button::invokeClick() {
00166         onClick(this);
00167     }
00168 }
 All Classes Functions Variables