#ifndef DUI_BUTTON_HPP
#define DUI_BUTTON_HPP
//Includes
#include "Template.hpp"
#include <SFML/Graphics/Text.hpp>
namespace dui {
class Button : public Stencil {
private:
sf::Text text;
bool clicked, clickable;
sf::Color bodyClicked, bodyNoHover, bodyHover;
sf::Color textClicked, textNoHover, textHover;
sf::Color bodyNonclickable, textNonclickable;
sf::Color borderClicked, borderNoHover, borderHover;
std::function<void(void)> onClickf;
sf::RectangleShape body, border;
void drawHelper(sf::FloatRect& textbounds, sf::Color& bodyC, sf::Color& textC, sf::Color& borderC, sf::Color& gradientC) {
//draw body
body.setPosition(rect.left + 1, rect.top + 1);
body.setSize(sf::Vector2f(rect.width - 2,rect.height - 2));
body.setFillColor(bodyC);
window->draw(body);
gradientC.r = bodyC.r - 20;
gradientC.g = bodyC.g - 20;
gradientC.b = bodyC.b - 20;
drawGradient(rect.left, rect.top - 1, rect.width, rect.height, gradientC);
//draw text
text.setColor(textC);
text.setPosition(static_cast<int>(rect.left + rect.width/2 - textbounds.width/2), static_cast<int>(rect.top + rect.height/2 - textbounds.height/2));
window->draw(text);
//draw border
drawOutlineRect(rect.left, rect.top, rect.width, rect.height, borderC);
}
public:
Button(): clicked(false), clickable(true),
bodyClicked(128,204,255), bodyNoHover(255,255,255), bodyHover(153,214,255),
textClicked(255,255,255), textNoHover(0,0,0,200), textHover(255,255,255),
bodyNonclickable(220,220,220), textNonclickable(0,0,0,100) {
text.setFont(defaultFont);
text.setString("Button");
text.setCharacterSize(10);
borderClicked = borderColor;
borderHover = borderColor;
borderNoHover = borderColor;
}
void draw() {
sf::FloatRect textbounds = text.getLocalBounds();
updateHover();
if(hover && sf::Mouse::isButtonPressed(sf::Mouse::Left))
clicked = true;
else
clicked = false;
if(window == nullptr)
return; //Can't draw on a null window.
if(!enabled || !clickable) {
drawHelper(textbounds, bodyNonclickable,textNonclickable,borderNoHover,gradientColor);
return;
}
if(clicked) {
drawHelper(textbounds,bodyClicked,textClicked,borderClicked,gradientColor);
//Call the callback
if(onClickf && clicked) {
onClickf();
}
return;
}
else if(hover) {
drawHelper(textbounds, bodyHover,textHover,borderHover, gradientColor);
}
else {
drawHelper(textbounds,bodyNoHover,textNoHover,borderNoHover,gradientColor);
}
}
void draw(sf::RenderWindow& renderWindow) {
if(window == nullptr)
window = &renderWindow;
draw();
}
void onClick(std::function<void(void)> func) {
onClickf = func;
}
bool isClicked() const {
return clicked;
}
void setText(const sf::String& str) {
text.setString(str);
}
};
} //namespace dui
#endif //DUI_BUTTON_HPP
I2lmbmRlZiBEVUlfQlVUVE9OX0hQUAojZGVmaW5lIERVSV9CVVRUT05fSFBQCgovL0luY2x1ZGVzCiNpbmNsdWRlICJUZW1wbGF0ZS5ocHAiCiNpbmNsdWRlIDxTRk1ML0dyYXBoaWNzL1RleHQuaHBwPgoKbmFtZXNwYWNlIGR1aSB7CmNsYXNzIEJ1dHRvbiA6IHB1YmxpYyBTdGVuY2lsIHsKcHJpdmF0ZToKICAgIHNmOjpUZXh0IHRleHQ7CiAgICBib29sIGNsaWNrZWQsIGNsaWNrYWJsZTsKICAgIHNmOjpDb2xvciBib2R5Q2xpY2tlZCwgYm9keU5vSG92ZXIsIGJvZHlIb3ZlcjsKICAgIHNmOjpDb2xvciB0ZXh0Q2xpY2tlZCwgdGV4dE5vSG92ZXIsIHRleHRIb3ZlcjsKICAgIHNmOjpDb2xvciBib2R5Tm9uY2xpY2thYmxlLCB0ZXh0Tm9uY2xpY2thYmxlOwogICAgc2Y6OkNvbG9yIGJvcmRlckNsaWNrZWQsIGJvcmRlck5vSG92ZXIsIGJvcmRlckhvdmVyOwogICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBvbkNsaWNrZjsKICAgIHNmOjpSZWN0YW5nbGVTaGFwZSBib2R5LCBib3JkZXI7CgogICAgdm9pZCBkcmF3SGVscGVyKHNmOjpGbG9hdFJlY3QmIHRleHRib3VuZHMsIHNmOjpDb2xvciYgYm9keUMsIHNmOjpDb2xvciYgdGV4dEMsIHNmOjpDb2xvciYgYm9yZGVyQywgc2Y6OkNvbG9yJiBncmFkaWVudEMpIHsKICAgICAgICAvL2RyYXcgYm9keQogICAgICAgIGJvZHkuc2V0UG9zaXRpb24ocmVjdC5sZWZ0ICsgMSwgcmVjdC50b3AgKyAxKTsKICAgICAgICBib2R5LnNldFNpemUoc2Y6OlZlY3RvcjJmKHJlY3Qud2lkdGggLSAyLHJlY3QuaGVpZ2h0IC0gMikpOwogICAgICAgIGJvZHkuc2V0RmlsbENvbG9yKGJvZHlDKTsKICAgICAgICB3aW5kb3ctPmRyYXcoYm9keSk7CgogICAgICAgIGdyYWRpZW50Qy5yID0gYm9keUMuciAtIDIwOwogICAgICAgIGdyYWRpZW50Qy5nID0gYm9keUMuZyAtIDIwOwogICAgICAgIGdyYWRpZW50Qy5iID0gYm9keUMuYiAtIDIwOwogICAgICAgIGRyYXdHcmFkaWVudChyZWN0LmxlZnQsIHJlY3QudG9wIC0gMSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGdyYWRpZW50Qyk7CgogICAgICAgIC8vZHJhdyB0ZXh0CiAgICAgICAgdGV4dC5zZXRDb2xvcih0ZXh0Qyk7CiAgICAgICAgdGV4dC5zZXRQb3NpdGlvbihzdGF0aWNfY2FzdDxpbnQ+KHJlY3QubGVmdCArIHJlY3Qud2lkdGgvMiAtIHRleHRib3VuZHMud2lkdGgvMiksIHN0YXRpY19jYXN0PGludD4ocmVjdC50b3AgKyByZWN0LmhlaWdodC8yIC0gdGV4dGJvdW5kcy5oZWlnaHQvMikpOwogICAgICAgIHdpbmRvdy0+ZHJhdyh0ZXh0KTsKCiAgICAgICAgLy9kcmF3IGJvcmRlcgogICAgICAgIGRyYXdPdXRsaW5lUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgYm9yZGVyQyk7CiAgICB9CnB1YmxpYzoKICAgIEJ1dHRvbigpOiBjbGlja2VkKGZhbHNlKSwgY2xpY2thYmxlKHRydWUpLCAKICAgIGJvZHlDbGlja2VkKDEyOCwyMDQsMjU1KSwgYm9keU5vSG92ZXIoMjU1LDI1NSwyNTUpLCBib2R5SG92ZXIoMTUzLDIxNCwyNTUpLAogICAgdGV4dENsaWNrZWQoMjU1LDI1NSwyNTUpLCB0ZXh0Tm9Ib3ZlcigwLDAsMCwyMDApLCB0ZXh0SG92ZXIoMjU1LDI1NSwyNTUpLAogICAgYm9keU5vbmNsaWNrYWJsZSgyMjAsMjIwLDIyMCksIHRleHROb25jbGlja2FibGUoMCwwLDAsMTAwKSB7CiAgICAgICAgdGV4dC5zZXRGb250KGRlZmF1bHRGb250KTsKICAgICAgICB0ZXh0LnNldFN0cmluZygiQnV0dG9uIik7CiAgICAgICAgdGV4dC5zZXRDaGFyYWN0ZXJTaXplKDEwKTsKICAgICAgICBib3JkZXJDbGlja2VkID0gYm9yZGVyQ29sb3I7CiAgICAgICAgYm9yZGVySG92ZXIgPSBib3JkZXJDb2xvcjsKICAgICAgICBib3JkZXJOb0hvdmVyID0gYm9yZGVyQ29sb3I7CiAgICB9CgogICAgdm9pZCBkcmF3KCkgewogICAgICAgIHNmOjpGbG9hdFJlY3QgdGV4dGJvdW5kcyA9IHRleHQuZ2V0TG9jYWxCb3VuZHMoKTsKICAgICAgICB1cGRhdGVIb3ZlcigpOwoKICAgICAgICBpZihob3ZlciAmJiBzZjo6TW91c2U6OmlzQnV0dG9uUHJlc3NlZChzZjo6TW91c2U6OkxlZnQpKQogICAgICAgICAgICBjbGlja2VkID0gdHJ1ZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNsaWNrZWQgPSBmYWxzZTsKCiAgICAgICAgaWYod2luZG93ID09IG51bGxwdHIpCiAgICAgICAgICAgIHJldHVybjsgLy9DYW4ndCBkcmF3IG9uIGEgbnVsbCB3aW5kb3cuCiAgICAgICAgaWYoIWVuYWJsZWQgfHwgIWNsaWNrYWJsZSkgewogICAgICAgICAgICBkcmF3SGVscGVyKHRleHRib3VuZHMsIGJvZHlOb25jbGlja2FibGUsdGV4dE5vbmNsaWNrYWJsZSxib3JkZXJOb0hvdmVyLGdyYWRpZW50Q29sb3IpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmKGNsaWNrZWQpIHsKICAgICAgICAgICAgZHJhd0hlbHBlcih0ZXh0Ym91bmRzLGJvZHlDbGlja2VkLHRleHRDbGlja2VkLGJvcmRlckNsaWNrZWQsZ3JhZGllbnRDb2xvcik7CiAgICAgICAgICAgIC8vQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgICAgICAgaWYob25DbGlja2YgJiYgY2xpY2tlZCkgewogICAgICAgICAgICAgICAgb25DbGlja2YoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoaG92ZXIpIHsKICAgICAgICAgICAgZHJhd0hlbHBlcih0ZXh0Ym91bmRzLCBib2R5SG92ZXIsdGV4dEhvdmVyLGJvcmRlckhvdmVyLCBncmFkaWVudENvbG9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRyYXdIZWxwZXIodGV4dGJvdW5kcyxib2R5Tm9Ib3Zlcix0ZXh0Tm9Ib3Zlcixib3JkZXJOb0hvdmVyLGdyYWRpZW50Q29sb3IpOwogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIGRyYXcoc2Y6OlJlbmRlcldpbmRvdyYgcmVuZGVyV2luZG93KSB7CiAgICAgICAgaWYod2luZG93ID09IG51bGxwdHIpCiAgICAgICAgICAgIHdpbmRvdyA9ICZyZW5kZXJXaW5kb3c7CiAgICAgICAgZHJhdygpOwogICAgfQoKICAgIHZvaWQgb25DbGljayhzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGZ1bmMpIHsKICAgICAgICBvbkNsaWNrZiA9IGZ1bmM7CiAgICB9CgogICAgYm9vbCBpc0NsaWNrZWQoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIGNsaWNrZWQ7CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IHNmOjpTdHJpbmcmIHN0cikgewogICAgICAgIHRleHQuc2V0U3RyaW5nKHN0cik7CiAgICB9Cn07Cn0gLy9uYW1lc3BhY2UgZHVpCgojZW5kaWYgLy9EVUlfQlVUVE9OX0hQUA==