mouse caret movement

This commit is contained in:
MihailRis 2024-02-22 13:32:27 +03:00
parent c674bd4ec5
commit 90057e1f30
4 changed files with 31 additions and 11 deletions

View File

@ -257,6 +257,8 @@ TextBox::TextBox(std::wstring placeholder, glm::vec4 padding)
void TextBox::draw(const GfxContext* pctx, Assets* assets) { void TextBox::draw(const GfxContext* pctx, Assets* assets) {
Panel::draw(pctx, assets); Panel::draw(pctx, assets);
font = assets->getFont(label->getFontName());
if (!isFocused()) if (!isFocused())
return; return;
@ -266,7 +268,6 @@ void TextBox::draw(const GfxContext* pctx, Assets* assets) {
batch->color = glm::vec4(1.0f); batch->color = glm::vec4(1.0f);
glm::vec2 lcoord = label->calcCoord(); glm::vec2 lcoord = label->calcCoord();
auto font = assets->getFont(label->getFontName());
int width = font->calcWidth(input.substr(0, caret)); int width = font->calcWidth(input.substr(0, caret));
batch->rect(lcoord.x + width, lcoord.y, 2, font->getLineHeight()); batch->rect(lcoord.x + width, lcoord.y, 2, font->getLineHeight());
} }
@ -313,7 +314,7 @@ void TextBox::paste(const std::wstring& text) {
auto right = input.substr(caret); auto right = input.substr(caret);
input = left + text + right; input = left + text + right;
} }
caret += text.length(); setCaret(caret + text.length());
validate(); validate();
} }
@ -345,7 +346,7 @@ void TextBox::setOnEditStart(runnable oneditstart) {
void TextBox::focus(GUI* gui) { void TextBox::focus(GUI* gui) {
Panel::focus(gui); Panel::focus(gui);
if (onEditStart){ if (onEditStart){
caret = input.size(); setCaret(input.size());
onEditStart(); onEditStart();
} }
} }
@ -355,6 +356,21 @@ void TextBox::refresh() {
label->setSize(size-glm::vec2(padding.z+padding.x, padding.w+padding.y)); label->setSize(size-glm::vec2(padding.z+padding.x, padding.w+padding.y));
} }
void TextBox::clicked(GUI*, int button) {
}
void TextBox::mouseMove(GUI*, int x, int y) {
if (font == nullptr)
return;
glm::vec2 lcoord = label->calcCoord();
uint offset = 0;
while (lcoord.x + font->calcWidth(input, offset) < x && offset <= input.length()) {
offset++;
}
setCaret(offset);
}
void TextBox::keyPressed(int key) { void TextBox::keyPressed(int key) {
if (key == keycode::BACKSPACE) { if (key == keycode::BACKSPACE) {
if (caret > 0 && input.length() > 0) { if (caret > 0 && input.length() > 0) {
@ -362,7 +378,7 @@ void TextBox::keyPressed(int key) {
caret = input.length(); caret = input.length();
} }
input = input.substr(0, caret-1) + input.substr(caret); input = input.substr(0, caret-1) + input.substr(caret);
caret--; setCaret(caret-1);
validate(); validate();
} }
} else if (key == keycode::DELETE) { } else if (key == keycode::DELETE) {
@ -378,15 +394,14 @@ void TextBox::keyPressed(int key) {
} else if (key == keycode::LEFT) { } else if (key == keycode::LEFT) {
if (caret > 0) { if (caret > 0) {
if (caret > input.length()) { if (caret > input.length()) {
caret = input.length()-1; setCaret(input.length()-1);
} else { } else {
caret--; setCaret(caret-1);
} }
caretLastMove = Window::time();
} }
} else if (key == keycode::RIGHT) { } else if (key == keycode::RIGHT) {
if (caret < input.length()) { if (caret < input.length()) {
caret++; setCaret(caret+1);
caretLastMove = Window::time(); caretLastMove = Window::time();
} }
} }
@ -455,6 +470,7 @@ uint TextBox::getCaret() const {
void TextBox::setCaret(uint position) { void TextBox::setCaret(uint position) {
this->caret = position; this->caret = position;
caretLastMove = Window::time();
} }
// ============================== InputBindBox ================================ // ============================== InputBindBox ================================

View File

@ -15,6 +15,7 @@
class Batch2D; class Batch2D;
class Assets; class Assets;
class Font;
namespace gui { namespace gui {
class Label : public UINode { class Label : public UINode {
@ -111,6 +112,7 @@ namespace gui {
/// @brief text input pointer, value may be greather than text length /// @brief text input pointer, value may be greather than text length
uint caret = 0; uint caret = 0;
double caretLastMove = 0.0; double caretLastMove = 0.0;
Font* font = nullptr;
void paste(const std::wstring& text); void paste(const std::wstring& text);
public: public:
@ -145,6 +147,8 @@ namespace gui {
virtual void setOnEditStart(runnable oneditstart); virtual void setOnEditStart(runnable oneditstart);
virtual void focus(GUI*) override; virtual void focus(GUI*) override;
virtual void refresh() override; virtual void refresh() override;
virtual void clicked(GUI*, int button) override;
virtual void mouseMove(GUI*, int x, int y) override;
}; };
class InputBindBox : public Panel { class InputBindBox : public Panel {

View File

@ -34,8 +34,8 @@ bool Font::isPrintableChar(int c) {
const int RES = 16; const int RES = 16;
int Font::calcWidth(std::wstring text) { int Font::calcWidth(std::wstring text, size_t length) {
return text.length() * 8; return std::min(text.length(), length) * 8;
} }
void Font::draw(Batch2D* batch, std::wstring text, int x, int y) { void Font::draw(Batch2D* batch, std::wstring text, int x, int y) {

View File

@ -23,7 +23,7 @@ public:
int getLineHeight() const; int getLineHeight() const;
int getYOffset() const; int getYOffset() const;
int calcWidth(std::wstring text); int calcWidth(std::wstring text, size_t length=-1);
// int getGlyphWidth(char c); // int getGlyphWidth(char c);
bool isPrintableChar(int c); bool isPrintableChar(int c);
void draw(Batch2D* batch, std::wstring text, int x, int y); void draw(Batch2D* batch, std::wstring text, int x, int y);