kick
|
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 }