diff --git a/src/graphics/ui/elements/Container.cpp b/src/graphics/ui/elements/Container.cpp index aa9b5977f..c869e9b3b 100644 --- a/src/graphics/ui/elements/Container.cpp +++ b/src/graphics/ui/elements/Container.cpp @@ -43,20 +43,28 @@ std::shared_ptr Container::getAt(const glm::vec2& pos) { return UINode::getAt(pos); } +void Container::click(int x, int y) { + UINode::click(x, y); + + if (scrollable) { + auto pos = calcPos(); + x -= pos.x; + y -= pos.y; + if (x >= size.x - scrollBarWidth) { + scrollbarTriggered = true; + prevScrollY = y; + } + } +} + void Container::mouseMove(int x, int y) { UINode::mouseMove(x, y); - if (!scrollable) { + if (!scrollable || !scrollbarTriggered) { return; } auto pos = calcPos(); x -= pos.x; y -= pos.y; - if (prevScrollY == -1) { - if (x >= size.x - scrollBarWidth) { - prevScrollY = y; - } - return; - } int diff = (actualLength-size.y); if (diff > 0) { scroll -= (y - prevScrollY) / static_cast(size.y) * actualLength; @@ -69,7 +77,7 @@ void Container::mouseMove(int x, int y) { void Container::mouseRelease(int x, int y) { UINode::mouseRelease(x, y); - prevScrollY = -1; + scrollbarTriggered = false; } void Container::act(float delta) { diff --git a/src/graphics/ui/elements/Container.hpp b/src/graphics/ui/elements/Container.hpp index 0506bf38d..3ede2c2a1 100644 --- a/src/graphics/ui/elements/Container.hpp +++ b/src/graphics/ui/elements/Container.hpp @@ -9,6 +9,7 @@ namespace gui { class Container : public UINode, public ::util::ObjectsKeeper { int prevScrollY = -1; + bool scrollbarTriggered = false; protected: std::vector> nodes; std::vector intervalEvents; @@ -18,13 +19,14 @@ namespace gui { int actualLength = 0; bool scrollable = true; - bool isScrolling() { - return prevScrollY != -1; + bool isScrolling() const { + return scrollbarTriggered; } public: Container(GUI& gui, glm::vec2 size); virtual ~Container(); + virtual void click(int, int) override; virtual void act(float delta) override; virtual void drawBackground(const DrawContext& pctx, const Assets& assets); virtual void draw(const DrawContext& pctx, const Assets& assets) override; diff --git a/src/graphics/ui/elements/TextBox.cpp b/src/graphics/ui/elements/TextBox.cpp index fbf851f84..d04ca5786 100644 --- a/src/graphics/ui/elements/TextBox.cpp +++ b/src/graphics/ui/elements/TextBox.cpp @@ -648,7 +648,7 @@ void TextBox::refresh() { label->setSize( size - glm::vec2( padding.z + padding.x + - LINE_NUMBERS_PANE_WIDTH * showLineNumbers + textOffset, + LINE_NUMBERS_PANE_WIDTH * showLineNumbers - textOffset, padding.w + padding.y ) ); @@ -671,7 +671,9 @@ size_t TextBox::normalizeIndex(int index) { /// @param y screen Y position /// @return non-normalized character index int TextBox::calcIndexAt(int x, int y) const { - if (!rawTextCache.metrics.font.has_value()) return 0; + if (!rawTextCache.metrics.font.has_value()) { + return 0; + } const auto& labelText = label->getText(); glm::vec2 lcoord = label->calcPos(); uint line = label->getLineByYOffset(y - lcoord.y); @@ -733,6 +735,7 @@ void TextBox::doubleClick(int x, int y) { } void TextBox::click(int x, int y) { + Container::click(x, y); int index = normalizeIndex(calcIndexAt(x, y)); selectionStart = index; selectionEnd = index; @@ -1200,7 +1203,7 @@ void TextBox::setCaret(size_t position) { if (font == nullptr) { return; } - int width = label->getSize().x; + int width = size.x - padding.x - padding.z - LINE_NUMBERS_PANE_WIDTH * showLineNumbers; rawTextCache.prepare(font, rawTextCache.metrics, width); rawTextCache.update(input, multiline, label->isTextWrapping()); @@ -1221,12 +1224,12 @@ void TextBox::setCaret(size_t position) { } int lcaret = caret - rawTextCache.getTextLineOffset(line); int realoffset = rawTextCache.metrics.calcWidth(labelText, 0, lcaret) - - static_cast(textOffset) + 2; + static_cast(textOffset); if (realoffset - width > 0) { setTextOffset(textOffset + realoffset - width); } else if (realoffset < 0) { - setTextOffset(std::max(textOffset + realoffset, static_cast(0))); + setTextOffset(std::max(textOffset + realoffset - static_cast(padding.x + padding.w), 0)); } }