#ifndef DUI_FRAME_HPP
#define DUI_FRAME_HPP
//Includes
#include "CloseButton.hpp"
#include <type_traits>
namespace dui {
class Frame : public Stencil {
private:
sf::Vector2i prevMS;
bool draggable, dragged, screenlocked, showclose, prevState;
CloseButton cb;
sf::Text text;
sf::Color bodyColor, frameBorder, topColor, nameColor;
sf::RectangleShape body, top;
public:
Frame(): prevMS(0,0), draggable(true), dragged(false), screenlocked(false), showclose(true), prevState(false),
bodyColor(232,232,232), topColor(102,194,255), nameColor(255,255,255) {
text.setFont(defaultFont);
text.setString("Frame");
text.setCharacterSize(10);
cb.setPosition(100,100);
cb.setSize(190,100);
cb.onClick([&]{
this->clearChildren();
this->hide();
});
rect.width = 300;
rect.height = 150;
frameBorder = borderColor;
parent = this;
}
void draw() {
if(window == nullptr || !visible)
return;
updateHover();
bool validClick = visible && enabled && draggable && hover;
bool buttonPressed = sf::Mouse::isButtonPressed(sf::Mouse::Left);
//Key is pressed
if(buttonPressed && !prevState && validClick) {
dragged = true;
prevMS = sf::Mouse::getPosition(*window) - sf::Vector2i(rect.left,rect.top);
}
//Key is held down
if(buttonPressed && prevState && validClick) {
dragged = true;
}
//Key is released
if(!buttonPressed && prevState && validClick) {
dragged = false;
}
prevState = buttonPressed;
if(dragged) {
sf::Vector2i ms = sf::Mouse::getPosition(*window);
rect.left = ms.x - prevMS.x;
rect.top = ms.y - prevMS.y;
}
//Draw the body
body.setPosition(rect.left,rect.top);
body.setSize(sf::Vector2f(rect.width,rect.height));
body.setFillColor(bodyColor);
window->draw(body);
gradientColor.r = topColor.r - 20;
gradientColor.g = topColor.g - 20;
gradientColor.b = topColor.b - 20;
//Draw the top.
top.setPosition(rect.left,rect.top);
top.setSize(sf::Vector2f(rect.width,25));
top.setFillColor(topColor);
window->draw(top);
drawGradient(rect.left,rect.top,rect.width,25,gradientColor);
drawOutlineRect(rect.left, rect.top + 25, rect.width, 1, frameBorder);
//Draw the text.
text.setPosition(rect.left + 5, rect.top + 5);
text.setColor(nameColor);
window->draw(text);
//draw the border
drawOutlineRect(rect.left,rect.top,rect.width,rect.height,frameBorder);
//Children
cb.setPosition(rect.width + rect.left - 10, rect.height - rect.top + 10); //This is buggy.
cb.setWindow(*window);
cb.draw();
renderChildren();
}
template<typename Control>
void addControl(Control& control) {
static_assert(!std::is_base_of<Control,Stencil>::value, "Controls must inherit from Stencil.");
this->children.push_back(&control);
}
};
} //namespace dui
#endif //DUI_FRAME_HPP
I2lmbmRlZiBEVUlfRlJBTUVfSFBQCiNkZWZpbmUgRFVJX0ZSQU1FX0hQUAoKLy9JbmNsdWRlcwojaW5jbHVkZSAiQ2xvc2VCdXR0b24uaHBwIgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpuYW1lc3BhY2UgZHVpIHsKY2xhc3MgRnJhbWUgOiBwdWJsaWMgU3RlbmNpbCB7CnByaXZhdGU6CiAgICBzZjo6VmVjdG9yMmkgcHJldk1TOwogICAgYm9vbCBkcmFnZ2FibGUsIGRyYWdnZWQsIHNjcmVlbmxvY2tlZCwgc2hvd2Nsb3NlLCBwcmV2U3RhdGU7CiAgICBDbG9zZUJ1dHRvbiBjYjsKICAgIHNmOjpUZXh0IHRleHQ7CiAgICBzZjo6Q29sb3IgYm9keUNvbG9yLCBmcmFtZUJvcmRlciwgdG9wQ29sb3IsIG5hbWVDb2xvcjsKICAgIHNmOjpSZWN0YW5nbGVTaGFwZSBib2R5LCB0b3A7CgpwdWJsaWM6CiAgICBGcmFtZSgpOiBwcmV2TVMoMCwwKSwgZHJhZ2dhYmxlKHRydWUpLCBkcmFnZ2VkKGZhbHNlKSwgc2NyZWVubG9ja2VkKGZhbHNlKSwgc2hvd2Nsb3NlKHRydWUpLCBwcmV2U3RhdGUoZmFsc2UpLAogICAgYm9keUNvbG9yKDIzMiwyMzIsMjMyKSwgdG9wQ29sb3IoMTAyLDE5NCwyNTUpLCBuYW1lQ29sb3IoMjU1LDI1NSwyNTUpIHsKICAgICAgICB0ZXh0LnNldEZvbnQoZGVmYXVsdEZvbnQpOwogICAgICAgIHRleHQuc2V0U3RyaW5nKCJGcmFtZSIpOwogICAgICAgIHRleHQuc2V0Q2hhcmFjdGVyU2l6ZSgxMCk7CiAgICAgICAgY2Iuc2V0UG9zaXRpb24oMTAwLDEwMCk7CiAgICAgICAgY2Iuc2V0U2l6ZSgxOTAsMTAwKTsKICAgICAgICBjYi5vbkNsaWNrKFsmXXsKICAgICAgICAgICAgdGhpcy0+Y2xlYXJDaGlsZHJlbigpOwogICAgICAgICAgICB0aGlzLT5oaWRlKCk7CiAgICAgICAgfSk7CiAgICAgICAgcmVjdC53aWR0aCA9IDMwMDsKICAgICAgICByZWN0LmhlaWdodCA9IDE1MDsKICAgICAgICBmcmFtZUJvcmRlciA9IGJvcmRlckNvbG9yOwogICAgICAgIHBhcmVudCA9IHRoaXM7CiAgICB9CgogICAgdm9pZCBkcmF3KCkgewogICAgICAgIGlmKHdpbmRvdyA9PSBudWxscHRyIHx8ICF2aXNpYmxlKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgIHVwZGF0ZUhvdmVyKCk7CgogICAgICAgIGJvb2wgdmFsaWRDbGljayA9IHZpc2libGUgJiYgZW5hYmxlZCAmJiBkcmFnZ2FibGUgJiYgaG92ZXI7CiAgICAgICAgYm9vbCBidXR0b25QcmVzc2VkID0gc2Y6Ok1vdXNlOjppc0J1dHRvblByZXNzZWQoc2Y6Ok1vdXNlOjpMZWZ0KTsKICAgICAgICAKICAgICAgICAvL0tleSBpcyBwcmVzc2VkCiAgICAgICAgaWYoYnV0dG9uUHJlc3NlZCAmJiAhcHJldlN0YXRlICYmIHZhbGlkQ2xpY2spIHsKICAgICAgICAgICAgZHJhZ2dlZCA9IHRydWU7CiAgICAgICAgICAgIHByZXZNUyA9IHNmOjpNb3VzZTo6Z2V0UG9zaXRpb24oKndpbmRvdykgLSBzZjo6VmVjdG9yMmkocmVjdC5sZWZ0LHJlY3QudG9wKTsKICAgICAgICB9CiAgICAgICAgLy9LZXkgaXMgaGVsZCBkb3duCiAgICAgICAgaWYoYnV0dG9uUHJlc3NlZCAmJiBwcmV2U3RhdGUgJiYgdmFsaWRDbGljaykgewogICAgICAgICAgICBkcmFnZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy9LZXkgaXMgcmVsZWFzZWQKICAgICAgICBpZighYnV0dG9uUHJlc3NlZCAmJiBwcmV2U3RhdGUgJiYgdmFsaWRDbGljaykgewogICAgICAgICAgICBkcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBwcmV2U3RhdGUgPSBidXR0b25QcmVzc2VkOwoKICAgICAgICBpZihkcmFnZ2VkKSB7CiAgICAgICAgICAgIHNmOjpWZWN0b3IyaSBtcyA9IHNmOjpNb3VzZTo6Z2V0UG9zaXRpb24oKndpbmRvdyk7CiAgICAgICAgICAgIHJlY3QubGVmdCA9IG1zLnggLSBwcmV2TVMueDsKICAgICAgICAgICAgcmVjdC50b3AgPSBtcy55IC0gcHJldk1TLnk7CiAgICAgICAgfQoKICAgICAgICAvL0RyYXcgdGhlIGJvZHkKICAgICAgICBib2R5LnNldFBvc2l0aW9uKHJlY3QubGVmdCxyZWN0LnRvcCk7CiAgICAgICAgYm9keS5zZXRTaXplKHNmOjpWZWN0b3IyZihyZWN0LndpZHRoLHJlY3QuaGVpZ2h0KSk7CiAgICAgICAgYm9keS5zZXRGaWxsQ29sb3IoYm9keUNvbG9yKTsKICAgICAgICB3aW5kb3ctPmRyYXcoYm9keSk7CgogICAgICAgIGdyYWRpZW50Q29sb3IuciA9IHRvcENvbG9yLnIgLSAyMDsKICAgICAgICBncmFkaWVudENvbG9yLmcgPSB0b3BDb2xvci5nIC0gMjA7CiAgICAgICAgZ3JhZGllbnRDb2xvci5iID0gdG9wQ29sb3IuYiAtIDIwOwoKICAgICAgICAvL0RyYXcgdGhlIHRvcC4KICAgICAgICB0b3Auc2V0UG9zaXRpb24ocmVjdC5sZWZ0LHJlY3QudG9wKTsKICAgICAgICB0b3Auc2V0U2l6ZShzZjo6VmVjdG9yMmYocmVjdC53aWR0aCwyNSkpOwogICAgICAgIHRvcC5zZXRGaWxsQ29sb3IodG9wQ29sb3IpOwogICAgICAgIHdpbmRvdy0+ZHJhdyh0b3ApOwogICAgICAgIGRyYXdHcmFkaWVudChyZWN0LmxlZnQscmVjdC50b3AscmVjdC53aWR0aCwyNSxncmFkaWVudENvbG9yKTsKICAgICAgICBkcmF3T3V0bGluZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCArIDI1LCByZWN0LndpZHRoLCAxLCBmcmFtZUJvcmRlcik7CgogICAgICAgIC8vRHJhdyB0aGUgdGV4dC4KICAgICAgICB0ZXh0LnNldFBvc2l0aW9uKHJlY3QubGVmdCArIDUsIHJlY3QudG9wICsgNSk7CiAgICAgICAgdGV4dC5zZXRDb2xvcihuYW1lQ29sb3IpOwogICAgICAgIHdpbmRvdy0+ZHJhdyh0ZXh0KTsKCiAgICAgICAgLy9kcmF3IHRoZSBib3JkZXIKICAgICAgICBkcmF3T3V0bGluZVJlY3QocmVjdC5sZWZ0LHJlY3QudG9wLHJlY3Qud2lkdGgscmVjdC5oZWlnaHQsZnJhbWVCb3JkZXIpOwoKICAgICAgICAvL0NoaWxkcmVuCiAgICAgICAgY2Iuc2V0UG9zaXRpb24ocmVjdC53aWR0aCArIHJlY3QubGVmdCAtIDEwLCByZWN0LmhlaWdodCAtIHJlY3QudG9wICsgMTApOyAvL1RoaXMgaXMgYnVnZ3kuCiAgICAgICAgY2Iuc2V0V2luZG93KCp3aW5kb3cpOwogICAgICAgIGNiLmRyYXcoKTsKCiAgICAgICAgcmVuZGVyQ2hpbGRyZW4oKTsKICAgIH0KCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb250cm9sPgogICAgdm9pZCBhZGRDb250cm9sKENvbnRyb2wmIGNvbnRyb2wpIHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2Jhc2Vfb2Y8Q29udHJvbCxTdGVuY2lsPjo6dmFsdWUsICJDb250cm9scyBtdXN0IGluaGVyaXQgZnJvbSBTdGVuY2lsLiIpOwogICAgICAgIHRoaXMtPmNoaWxkcmVuLnB1c2hfYmFjaygmY29udHJvbCk7CiAgICB9Cn07Cn0gLy9uYW1lc3BhY2UgZHVpCgoKI2VuZGlmIC8vRFVJX0ZSQU1FX0hQUA==