// SuperTuxKart - a fun racing game with go-kart // Copyright (C) 2009-2015 Marianne Gagnon // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 3 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "guiengine/widgets/label_widget.hpp" #include "guiengine/engine.hpp" #include "guiengine/scalable_font.hpp" #include "guiengine/skin.hpp" #include "utils/translation.hpp" #include #include #include #include #include using namespace GUIEngine; using namespace irr::core; using namespace irr::gui; using namespace irr; // ---------------------------------------------------------------------------- LabelWidget::LabelWidget(bool title, bool bright) : Widget(WTYPE_LABEL) { m_title_font = title; m_scroll_speed = 0; m_scroll_offset = 0; m_bright = bright; if (m_bright) { m_has_color = true; m_color = Skin::getColor("brighttext::neutral"); } else m_has_color = false; setFocusable(false); } // LabelWidget // ---------------------------------------------------------------------------- /** Adds the stk widget to the irrlicht widget set. */ void LabelWidget::add() { rect widget_size = rect(m_x, m_y, m_x + m_w, m_y + m_h); const bool word_wrap = m_properties[PROP_WORD_WRAP] == "true"; stringw message = getText(); EGUI_ALIGNMENT align = EGUIA_UPPERLEFT; if (m_properties[PROP_TEXT_ALIGN] == "center") align = EGUIA_CENTER; else if (m_properties[PROP_TEXT_ALIGN] == "right") align = EGUIA_LOWERRIGHT; EGUI_ALIGNMENT valign = EGUIA_CENTER ; if (m_properties[PROP_TEXT_VALIGN] == "top") valign = EGUIA_UPPERLEFT; if (m_properties[PROP_TEXT_VALIGN] == "bottom") valign = EGUIA_LOWERRIGHT; IGUIStaticText* irrwidget; if (m_scroll_speed != 0) { IGUIElement* container = GUIEngine::getGUIEnv()->addButton(widget_size, m_parent, -1); core::rect r(core::position2di(0,0), widget_size.getSize()); irrwidget = GUIEngine::getGUIEnv()->addStaticText(message.c_str(), r, false, word_wrap, /*m_parent*/ container, -1); } else { irrwidget = GUIEngine::getGUIEnv()->addStaticText(message.c_str(), widget_size, false, word_wrap, m_parent, -1); irrwidget->setTextRestrainedInside(false); } irrwidget->setRightToLeft(translations->isRTLText(message)); m_element = irrwidget; irrwidget->setTextAlignment( align, valign ); if (m_has_color) { irrwidget->setOverrideColor(m_color); } if (m_title_font) { irrwidget->setOverrideColor( video::SColor(255,255,255,255) ); irrwidget->setOverrideFont( GUIEngine::getTitleFont() ); } //irrwidget->setBackgroundColor( video::SColor(255,255,0,0) ); //irrwidget->setDrawBackground(true); m_id = m_element->getID(); m_element->setTabStop(false); m_element->setTabGroup(false); if (m_scroll_speed <= 0) m_element->setNotClipped(true); if (!m_is_visible) m_element->setVisible(false); } // add // ---------------------------------------------------------------------------- void LabelWidget::setText(const wchar_t *text, bool expandIfNeeded) { m_scroll_offset = 0; if (expandIfNeeded) { assert(m_element != NULL); const int fwidth = (m_title_font ? GUIEngine::getTitleFont() : GUIEngine::getFont())->getDimension(text).Width; core::rect rect = m_element->getRelativePosition(); if (rect.getWidth() < fwidth) { rect.LowerRightCorner.X = rect.UpperLeftCorner.X + fwidth; m_element->setRelativePosition(rect); m_element->updateAbsolutePosition(); } } if (m_scroll_speed > 0) m_scroll_offset = (float)m_w; Widget::setText(text); if (m_element) getIrrlichtElement()->setRightToLeft(translations->isRTLText(getText())); } // setText // ---------------------------------------------------------------------------- /** Needs to be called to update scrolling. * \param dt Time step size. */ 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_y*/ 0 ) ); } } // update // ---------------------------------------------------------------------------- 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(); } // ---------------------------------------------------------------------------- void LabelWidget::setScrollSpeed(float speed) { m_scroll_speed = speed; } // setScrollSpeed // ---------------------------------------------------------------------------- void LabelWidget::setColor(const irr::video::SColor& color) { assert(m_element != NULL); m_color = color; m_has_color = true; ((IGUIStaticText*)m_element)->setOverrideColor(m_color); } // ---------------------------------------------------------------------------- void LabelWidget::setErrorColor() { setColor(irr::video::SColor(255, 255, 0, 0)); } // ---------------------------------------------------------------------------- void LabelWidget::setDefaultColor() { if (m_bright) { setColor(Skin::getColor("brighttext::neutral")); } else { if(m_has_color) { assert(m_element != NULL); m_has_color = false; ((IGUIStaticText*)m_element)->enableOverrideColor(false); } } } // ----------------------------------------------------------------------------