UI API changes (WIP)
This commit is contained in:
parent
4026a09928
commit
f9041ffc28
@ -67,6 +67,14 @@ static void doUIMouseClick(double x, double y, GLFWMouseButton button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(clickedElement) {
|
if(clickedElement) {
|
||||||
|
/*if(clickedElement != kekData.ui->focusedElement) { // TODO: check for focusable on children etc
|
||||||
|
if(kekData.ui->focusedElement != nullptr) {
|
||||||
|
kekData.ui->focusedElement->focusExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
clickedElement->focusEnter();
|
||||||
|
}*/
|
||||||
|
|
||||||
UIPoint childPos = clickedElement->getPosition();
|
UIPoint childPos = clickedElement->getPosition();
|
||||||
UIPoint clickedAt = UIPoint((int) x - childPos.x, (int) y - childPos.y);
|
UIPoint clickedAt = UIPoint((int) x - childPos.x, (int) y - childPos.y);
|
||||||
clickedElement->clickAll(clickedAt, UIPoint((int) x, (int) y), button);
|
clickedElement->clickAll(clickedAt, UIPoint((int) x, (int) y), button);
|
||||||
|
@ -113,12 +113,24 @@ UIBounds UIElement::offsetUIBounds(int w, int h, Origin origin) {
|
|||||||
|
|
||||||
void UIElement::drawAll(UIPoint screenPos, glm::mat4 projection) {
|
void UIElement::drawAll(UIPoint screenPos, glm::mat4 projection) {
|
||||||
if(!visible) return;
|
if(!visible) return;
|
||||||
|
|
||||||
|
if(enableClipping) {
|
||||||
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
UIPoint pos = getScreenPosition();
|
||||||
|
UIBounds bounds = getBounds();
|
||||||
|
glScissor(pos.x, kekData.screenHeight - (pos.y + bounds.h), bounds.w, bounds.h);
|
||||||
|
}
|
||||||
|
|
||||||
draw(screenPos, projection);
|
draw(screenPos, projection);
|
||||||
|
|
||||||
for(UIElement *child : children) {
|
for(UIElement *child : children) {
|
||||||
UIPoint pos = child->getPosition();
|
UIPoint pos = child->getPosition();
|
||||||
child->drawAll(UIPoint(screenPos.x + pos.x, screenPos.y + pos.y), projection);
|
child->drawAll(UIPoint(screenPos.x + pos.x, screenPos.y + pos.y), projection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(enableClipping) {
|
||||||
|
glDisable(GL_SCISSOR_TEST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIElement::hoverAll(UIPoint pos, UIPoint screenPos) {
|
void UIElement::hoverAll(UIPoint pos, UIPoint screenPos) {
|
||||||
@ -196,7 +208,7 @@ bool UIElement::focusEnterAll(UIPoint pos, UIPoint screenPos) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(focusable) {
|
if(focusable) {
|
||||||
// UI::focusElement(this); FIXME
|
UI::focusElement(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,4 +270,22 @@ std::vector<UIElement *> UI::getElements() {
|
|||||||
return kekData.ui->elements;
|
return kekData.ui->elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UI::focusElement(UIElement *element) {
|
||||||
|
if(kekData.ui->focusedElement != nullptr) {
|
||||||
|
unfocusElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
kekData.ui->focusedElement = element;
|
||||||
|
if(element != nullptr) {
|
||||||
|
element->focusEnter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UI::unfocusElement() {
|
||||||
|
if(kekData.ui->focusedElement == nullptr) return;
|
||||||
|
|
||||||
|
kekData.ui->focusedElement->focusExit();
|
||||||
|
kekData.ui->focusedElement = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "internal/ui.h"
|
#include "internal/ui.h"
|
||||||
|
#include "ui.h"
|
||||||
|
|
||||||
namespace kek {
|
namespace kek {
|
||||||
|
|
||||||
@ -189,4 +190,38 @@ void ButtonElement::draw(UIPoint screenPos, glm::mat4 projection) {
|
|||||||
RectangleElement::draw(screenPos, projection);
|
RectangleElement::draw(screenPos, projection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextFieldElement::TextFieldElement(UIValue x, UIValue y, UIValue w, Font *font)
|
||||||
|
: RectangleElement(x, y, w, uiPx(0)) {
|
||||||
|
this->enableClipping = true;
|
||||||
|
this->focusable = true;
|
||||||
|
this->color = Colors::WHITE;
|
||||||
|
this->text = "Hello World";
|
||||||
|
|
||||||
|
this->textElement = new TextElement(uiPx(0), uiPx(0));
|
||||||
|
textElement->textBounds = TextBounds::LINE;
|
||||||
|
textElement->color = Colors::RED;
|
||||||
|
textElement->setText(text);
|
||||||
|
addChild(textElement);
|
||||||
|
|
||||||
|
int textH = textElement->getBounds().h;
|
||||||
|
std::cout << "TEXTH" << textH << std::endl;
|
||||||
|
h = uiPx(textH);
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldElement::TextFieldElement(UIValue x, UIValue y, UIValue w)
|
||||||
|
: TextFieldElement(x, y, w, kekData.ui->defaultFont) {
|
||||||
|
}
|
||||||
|
|
||||||
|
TextFieldElement::~TextFieldElement() {
|
||||||
|
delete textElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
UIElementType TextFieldElement::getType() {
|
||||||
|
return UIElementType::TEXT_FIELD;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextFieldElement::draw(UIPoint screenPos, glm::mat4 projection) {
|
||||||
|
RectangleElement::draw(screenPos, projection);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ namespace kek {
|
|||||||
|
|
||||||
struct UIData {
|
struct UIData {
|
||||||
std::vector<UIElement *> elements;
|
std::vector<UIElement *> elements;
|
||||||
|
UIElement *focusedElement;
|
||||||
Font *defaultFont;
|
Font *defaultFont;
|
||||||
Shader *rectangleShader;
|
Shader *rectangleShader;
|
||||||
};
|
};
|
||||||
|
@ -133,6 +133,8 @@ class UIElement {
|
|||||||
public:
|
public:
|
||||||
UIValue x, y;
|
UIValue x, y;
|
||||||
Origin origin = Origin::TOP_LEFT;
|
Origin origin = Origin::TOP_LEFT;
|
||||||
|
bool enableClipping = false;
|
||||||
|
|
||||||
bool clickable = false;
|
bool clickable = false;
|
||||||
bool hovering = false;
|
bool hovering = false;
|
||||||
bool visible = true;
|
bool visible = true;
|
||||||
@ -181,7 +183,7 @@ class UIElement {
|
|||||||
virtual void click(UIPoint pos, UIPoint screenPos, GLFWMouseButton button){};
|
virtual void click(UIPoint pos, UIPoint screenPos, GLFWMouseButton button){};
|
||||||
|
|
||||||
bool focusEnterAll(UIPoint pos, UIPoint screenPos);
|
bool focusEnterAll(UIPoint pos, UIPoint screenPos);
|
||||||
virtual void focusEnter(UIPoint pos, UIPoint screenPos){};
|
virtual void focusEnter(){};
|
||||||
virtual void focusExit(){};
|
virtual void focusExit(){};
|
||||||
|
|
||||||
UIElement *dragEnterAll(UIPoint pos, UIPoint screenPos);
|
UIElement *dragEnterAll(UIPoint pos, UIPoint screenPos);
|
||||||
@ -199,6 +201,9 @@ std::vector<UIElement *> getElements();
|
|||||||
void addElement(UIElement *element);
|
void addElement(UIElement *element);
|
||||||
void removeElement(UIElement *element);
|
void removeElement(UIElement *element);
|
||||||
|
|
||||||
|
void focusElement(UIElement *element);
|
||||||
|
void unfocusElement();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace kek {
|
namespace kek {
|
||||||
|
|
||||||
@ -96,4 +97,22 @@ class ButtonElement: public RectangleElement {
|
|||||||
virtual void draw(UIPoint screenPos, glm::mat4 projection);
|
virtual void draw(UIPoint screenPos, glm::mat4 projection);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TextFieldElement: public RectangleElement {
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string text;
|
||||||
|
TextElement *textElement;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TextFieldElement(UIValue x, UIValue y, UIValue w, Font *font);
|
||||||
|
|
||||||
|
TextFieldElement(UIValue x, UIValue y, UIValue w);
|
||||||
|
|
||||||
|
virtual ~TextFieldElement();
|
||||||
|
|
||||||
|
virtual UIElementType getType();
|
||||||
|
|
||||||
|
virtual void draw(UIPoint screenPos, glm::mat4 projection);
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "internal/physics.h"
|
#include "internal/physics.h"
|
||||||
|
#include "ui.h"
|
||||||
|
#include "uielements.h"
|
||||||
|
|
||||||
using namespace kek;
|
using namespace kek;
|
||||||
|
|
||||||
@ -140,6 +142,9 @@ int main(int argc, char **argv) {
|
|||||||
button3->addChild(rect);
|
button3->addChild(rect);
|
||||||
UI::addElement(button3);
|
UI::addElement(button3);
|
||||||
|
|
||||||
|
TextFieldElement *textField = new TextFieldElement(uiPx(10), uiPx(200), uiPx(50));
|
||||||
|
UI::addElement(textField);
|
||||||
|
|
||||||
if(Engine::start() != KEK_SUCCESS) return 1;
|
if(Engine::start() != KEK_SUCCESS) return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user