diff --git a/src/guiengine/widgets/label_widget.cpp b/src/guiengine/widgets/label_widget.cpp index 2df832162..0ffbafbe1 100644 --- a/src/guiengine/widgets/label_widget.cpp +++ b/src/guiengine/widgets/label_widget.cpp @@ -40,7 +40,9 @@ LabelWidget::LabelWidget(LabelType type) : Widget(WTYPE_LABEL) { m_type = type; m_scroll_speed = 0; + m_per_character_size = 0; m_scroll_offset = 0; + m_expand_if_needed = false; if (m_type == BRIGHT) { @@ -109,6 +111,8 @@ void LabelWidget::add() irrwidget->setOverrideColor( video::SColor(255,255,255,255) ); irrwidget->setOverrideFont( GUIEngine::getTinyTitleFont() ); } + m_per_character_size = getCurrentFont()->getDimension(L"X").Height; + //irrwidget->setBackgroundColor( video::SColor(255,255,0,0) ); //irrwidget->setDrawBackground(true); @@ -129,19 +133,27 @@ void LabelWidget::add() void LabelWidget::setText(const core::stringw& text, bool expandIfNeeded) { m_scroll_offset = 0; + m_expand_if_needed = expandIfNeeded; + updateExpandedText(text); + Widget::setText(text); +} // setText - if (expandIfNeeded) +// ---------------------------------------------------------------------------- +irr::gui::IGUIFont* LabelWidget::getCurrentFont() const +{ + IGUIFont* font = static_cast(m_element)->getOverrideFont(); + if (!font) + font = GUIEngine::getFont(); + return font; +} // getCurrentFont + +// ---------------------------------------------------------------------------- +void LabelWidget::updateExpandedText(const irr::core::stringw& text) +{ + if (m_expand_if_needed) { assert(m_element != NULL); - int fwidth; - if(m_type == TITLE) - fwidth = GUIEngine::getTitleFont()->getDimension(text.c_str()).Width; - else if(m_type == SMALL_TITLE) - fwidth = GUIEngine::getSmallTitleFont()->getDimension(text.c_str()).Width; - else if(m_type == TINY_TITLE) - fwidth = GUIEngine::getTinyTitleFont()->getDimension(text.c_str()).Width; - else - fwidth = GUIEngine::getFont()->getDimension(text.c_str()).Width; + int fwidth = getCurrentFont()->getDimension(text.c_str()).Width; core::rect rect = m_element->getRelativePosition(); if (rect.getWidth() < fwidth) @@ -151,12 +163,7 @@ void LabelWidget::setText(const core::stringw& text, bool expandIfNeeded) m_element->updateAbsolutePosition(); } } - - if (m_scroll_speed > 0) - m_scroll_offset = (float)m_w; - - Widget::setText(text); -} // setText +} // updateExpandedText // ---------------------------------------------------------------------------- /** Needs to be called to update scrolling. @@ -166,8 +173,9 @@ void LabelWidget::update(float dt) { if (m_scroll_speed != 0) { - m_scroll_offset -= dt*m_scroll_speed*5.0f; - m_element->setRelativePosition( core::position2di( /*m_x +*/ (int)m_scroll_offset, + m_scroll_offset -= dt * m_scroll_speed * 5.0f; + int offset = (float)m_w + m_scroll_offset * m_per_character_size; + m_element->setRelativePosition( core::position2di( /*m_x +*/ offset, /*m_y*/ 0 ) ); } } // update @@ -177,7 +185,8 @@ bool LabelWidget::scrolledOff() const { // This method may only be called after this widget has been add()ed assert(m_element != NULL); - return m_scroll_offset <= -m_element->getAbsolutePosition().getWidth(); + return (float)m_w + m_scroll_offset * m_per_character_size <= + -1.0f * (float)m_element->getAbsolutePosition().getWidth(); } // ---------------------------------------------------------------------------- @@ -189,6 +198,23 @@ void LabelWidget::setScrollSpeed(float speed) // ---------------------------------------------------------------------------- +void LabelWidget::resize() +{ + m_per_character_size = getCurrentFont()->getDimension(L"X").Height; + if (m_scroll_speed != 0) + { + rect widget_size = rect(m_x, m_y, m_x + m_w, m_y + m_h); + core::rect r(core::position2di(0, 0), widget_size.getSize()); + m_element->getParent()->setRelativePosition(widget_size); + m_element->setRelativePosition(r); + updateExpandedText(m_text); + } + else + Widget::resize(); +} // resize + +// ---------------------------------------------------------------------------- + void LabelWidget::setColor(const irr::video::SColor& color) { assert(m_element != NULL); diff --git a/src/guiengine/widgets/label_widget.hpp b/src/guiengine/widgets/label_widget.hpp index e03808d6f..26cf1c2df 100644 --- a/src/guiengine/widgets/label_widget.hpp +++ b/src/guiengine/widgets/label_widget.hpp @@ -27,6 +27,11 @@ #include "utils/leak_check.hpp" #include "utils/ptr_vector.hpp" +namespace irr +{ + namespace gui { class IGUIFont; } +} + namespace GUIEngine { /** \brief A simple label widget. @@ -51,10 +56,16 @@ namespace GUIEngine LabelType m_type; irr::video::SColor m_color; bool m_has_color; + bool m_expand_if_needed; + + irr::gui::IGUIFont* getCurrentFont() const; + void updateExpandedText(const irr::core::stringw& text); /** Scroll speed in characters/seconds (0 if no scrolling). */ float m_scroll_speed; - + + float m_per_character_size; + /** Current scroll offset. */ float m_scroll_offset; @@ -114,6 +125,7 @@ namespace GUIEngine */ bool scrolledOff() const; + virtual void resize(); }; } diff --git a/src/states_screens/main_menu_screen.cpp b/src/states_screens/main_menu_screen.cpp index 6a91c728e..91c4964fb 100644 --- a/src/states_screens/main_menu_screen.cpp +++ b/src/states_screens/main_menu_screen.cpp @@ -86,7 +86,7 @@ MainMenuScreen::MainMenuScreen() : Screen("main_menu.stkgui") void MainMenuScreen::loadedFromFile() { LabelWidget* w = getWidget("info_addons"); - w->setScrollSpeed(GUIEngine::getFontHeight() / 2); + w->setScrollSpeed(0.5f); RibbonWidget* rw_top = getWidget("menu_toprow"); assert(rw_top != NULL); diff --git a/src/states_screens/online/networking_lobby.cpp b/src/states_screens/online/networking_lobby.cpp index d6a950bef..6db6736da 100644 --- a/src/states_screens/online/networking_lobby.cpp +++ b/src/states_screens/online/networking_lobby.cpp @@ -450,7 +450,7 @@ void NetworkingLobby::onUpdate(float delta) m_header->getIrrlichtElement()->remove(); if (m_header_text_width > m_header->m_w) { - m_header->setScrollSpeed(GUIEngine::getTitleFontHeight() / 2); + m_header->setScrollSpeed(0.5f); m_header->add(); m_header->setText(m_header_text, true); }