diff --git a/src/kekengine/cpp/ui/uielements.cpp b/src/kekengine/cpp/ui/uielements.cpp index 22bf5d9..b36551f 100644 --- a/src/kekengine/cpp/ui/uielements.cpp +++ b/src/kekengine/cpp/ui/uielements.cpp @@ -206,8 +206,6 @@ TextFieldElement::TextFieldElement(UIValue x, UIValue y, UIValue w, std::shared_ this->focusColor = Colors::GRAY; this->text = ""; - RectangleElement::color = color; - this->textElement = new TextElement(uiPx(0), uiPx(0)); textElement->textBounds = TextBounds::LINE; textElement->color = Colors::BLACK; @@ -264,7 +262,6 @@ UIElementType TextFieldElement::getType() { } void TextFieldElement::focusEnter() { - RectangleElement::color = focusColor; cursor->visible = true; capture = Input::captureKeyboardInput( @@ -290,6 +287,7 @@ void TextFieldElement::focusEnter() { switch(event.key) { case GLFW_KEY_ENTER: Input::uncaptureKeyboardInput(_this->capture); + _this->onSubmit(_this->text); break; case GLFW_KEY_LEFT: { std::u32string str = Unicode::convertStdToU32(_this->text); @@ -321,7 +319,6 @@ void TextFieldElement::focusEnter() { } void TextFieldElement::focusExit() { - RectangleElement::color = color; cursor->visible = false; Input::uncaptureKeyboardInput(capture); @@ -332,6 +329,7 @@ void TextFieldElement::focusExit() { } void TextFieldElement::draw(UIPoint screenPos, glm::mat4 projection) { + RectangleElement::color = focused ? focusColor : color; RectangleElement::draw(screenPos, projection); double time = glfwGetTime(); diff --git a/src/kekengine/include/uielements.h b/src/kekengine/include/uielements.h index f86baba..5f704ba 100644 --- a/src/kekengine/include/uielements.h +++ b/src/kekengine/include/uielements.h @@ -1,6 +1,7 @@ #pragma once #include "ui.h" +#include "utils.h" #include namespace kek { @@ -96,6 +97,8 @@ class ButtonElement: public RectangleElement { virtual void draw(UIPoint screenPos, glm::mat4 projection); }; +typedef GenericCallable SubmitCallback; + class TextFieldElement: public RectangleElement { protected: @@ -114,6 +117,8 @@ class TextFieldElement: public RectangleElement { TextElement *textElement; RectangleElement *cursor; + SubmitCallback onSubmit; + TextFieldElement(UIValue x, UIValue y, UIValue w, std::shared_ptr font); TextFieldElement(UIValue x, UIValue y, UIValue w); diff --git a/src/kekgame/cpp/kekgame.cpp b/src/kekgame/cpp/kekgame.cpp index aac1525..833c402 100644 --- a/src/kekgame/cpp/kekgame.cpp +++ b/src/kekgame/cpp/kekgame.cpp @@ -8,11 +8,14 @@ #include #include #include +#include +#include #include "internal.h" #include "internal/physics.h" #include "ui.h" #include "uielements.h" +#include "utils.h" using namespace kek; @@ -126,9 +129,32 @@ int main(int argc, char **argv) { UI::addElement(button3); TextFieldElement *textField = new TextFieldElement(uiPx(10), uiPx(200), uiPx(500)); + textField->color = Colors::GREEN; + textField->focusColor = Colors::RED; + textField->textElement->color = Colors::WHITE; + + struct es { + ButtonElement *b; + TextFieldElement *t; + + ~es() { + std::cout << "oh nyo, I got destroyed" << std::endl; + } + } e; + + e.b = button3; + e.t = textField; + + textField->onSubmit = SubmitCallback([](std::string text, void *data) { + es *ep = (es *) data; + ep->b->text->setText(text); + ep->t->setText(""); + ep->t->onSubmit = SubmitCallback(); + }, + &e); UI::addElement(textField); - TextElement *text = new TextElement(uiPx(0), uiPx(260)); + TextElement *text = new TextElement(uiPx(10), uiPx(260)); text->setText("Lorem ipsum\ndolor sit amet\nsussy amogus, KekEngine sample text\nWhen the impostor is\nAmogus"); UI::addElement(text);