diff options
author | adrido <robots_only_adrido@gmx.com> | 2017-10-09 06:57:18 +0200 |
---|---|---|
committer | Loic Blot <loic.blot@unix-experience.fr> | 2017-10-09 08:11:03 +0200 |
commit | e6e5fa3bf8853f149fdef16b39af3981097176a4 (patch) | |
tree | 968de4d77eabd89ac62534975888c7d859d83857 /src/intlGUIEditBox.cpp | |
parent | 9b8fa99fe30728c1fcfa73cdf74211841bdae9fb (diff) | |
download | hax-minetest-server-e6e5fa3bf8853f149fdef16b39af3981097176a4.tar.gz hax-minetest-server-e6e5fa3bf8853f149fdef16b39af3981097176a4.zip |
Formspec: textarea with scrollbar improvements
Increase scrollrate depending on fontsize
Scroll on mousewheel
Allow scrolling and marking text on non writable textareas
Update lua api about readonly mode
Show scrollbar if text overflows
Diffstat (limited to 'src/intlGUIEditBox.cpp')
-rw-r--r-- | src/intlGUIEditBox.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/src/intlGUIEditBox.cpp b/src/intlGUIEditBox.cpp index a6175231f..ab470c4fc 100644 --- a/src/intlGUIEditBox.cpp +++ b/src/intlGUIEditBox.cpp @@ -260,7 +260,7 @@ void intlGUIEditBox::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT //! called if an event happened. bool intlGUIEditBox::OnEvent(const SEvent& event) { - if (IsEnabled && m_writable) + if (IsEnabled) { switch(event.EventType) @@ -780,7 +780,7 @@ void intlGUIEditBox::draw() if (Border) { - if (m_writable) { + if (m_writable) { skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW), false, true, FrameRect, &AbsoluteClippingRect); } @@ -944,8 +944,7 @@ void intlGUIEditBox::draw() font->getKerningWidth(L"_", CursorPos-startPos > 0 ? &((*txtLine)[CursorPos-startPos-1]) : 0); if (m_writable) { - if (focus && (porting::getTimeMs() - BlinkStartTime) % 700 < 350) - { + if (focus && (porting::getTimeMs() - BlinkStartTime) % 700 < 350) { setTextRect(cursorLine); CurrentTextRect.UpperLeftCorner.X += charcursorpos; @@ -1086,6 +1085,14 @@ bool intlGUIEditBox::processMouse(const SEvent& event) calculateScrollPos(); return true; } + break; + case EMIE_MOUSE_WHEEL: + if (m_vscrollbar) { + s32 pos = m_vscrollbar->getPos(); + s32 step = m_vscrollbar->getSmallStep(); + m_vscrollbar->setPos(pos - event.MouseInput.Wheel * step); + } + break; default: break; } @@ -1433,9 +1440,8 @@ void intlGUIEditBox::calculateScrollPos() VScrollPos = 0; // todo: adjust scrollbar - if (m_vscrollbar) { + if (m_vscrollbar) m_vscrollbar->setPos(VScrollPos); - } } //! set text markers @@ -1467,20 +1473,31 @@ void intlGUIEditBox::sendGuiEvent(EGUI_EVENT_TYPE type) //! Create a vertical scrollbar void intlGUIEditBox::createVScrollBar() { + s32 fontHeight = 1; + + if (OverrideFont) { + fontHeight = OverrideFont->getDimension(L"").Height; + } else { + if (IGUISkin* skin = Environment->getSkin()) { + if (IGUIFont* font = skin->getFont()) { + fontHeight = font->getDimension(L"").Height; + } + } + } + irr::core::rect<s32> scrollbarrect = FrameRect; scrollbarrect.UpperLeftCorner.X += FrameRect.getWidth() - m_scrollbar_width; m_vscrollbar = Environment->addScrollBar(false, scrollbarrect, getParent(), getID()); m_vscrollbar->setVisible(false); - m_vscrollbar->setSmallStep(1); - m_vscrollbar->setLargeStep(1); + m_vscrollbar->setSmallStep(3 * fontHeight); + m_vscrollbar->setLargeStep(10 * fontHeight); } //! Update the vertical scrollbar (visibilty & scroll position) void intlGUIEditBox::updateVScrollBar() { - if (!m_vscrollbar) { + if (!m_vscrollbar) return; - } // OnScrollBarChanged(...) if (m_vscrollbar->getPos() != VScrollPos) { |