// SuperTuxKart - a fun racing game with go-kart // Copyright (C) 2009-2013 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. #ifndef HEADER_SPINNER_HPP #define HEADER_SPINNER_HPP #include namespace irr { namespace video { class ITexture; } } #include "guiengine/widget.hpp" #include "utils/leak_check.hpp" #include "utils/ptr_vector.hpp" namespace GUIEngine { /** \brief A spinner or gauge widget (to select numbers / percentages). * \ingroup widgetsgroup */ class SpinnerWidget : public Widget { public: class ISpinnerConfirmListener { public: virtual ~ISpinnerConfirmListener() {} /** * \brief Invoked when the spinner is selected and "fire" is pressed * \return whether to block the event from further processing */ virtual EventPropagation onSpinnerConfirmed() = 0; }; protected: ISpinnerConfirmListener* m_listener; int m_value, m_min, m_max; /** If each value the spinner can take has an associated text, this vector will be non-empty */ std::vector m_labels; /** Whether the value of this spinner is displayed using an icon rather than with a plain label */ bool m_graphical; /** \brief Whether this widget is a gauge * the behaviour is the same but the look is a bit different, instead of displaying a number, * it displays how close the value is to the maximum by filling a line */ bool m_gauge; //for setting background in multiplayer kart selection screen bool m_use_background_color; int m_spinner_widget_player_id; /** \brief Whether to wrap back to the first value when going "beyond" the last value */ bool m_wrap_around; /** \brief implementing method from base class Widget */ virtual EventPropagation transmitEvent(Widget* w, const std::string& originator, const int playerID); /** \brief implementing method from base class Widget */ virtual EventPropagation rightPressed(const int playerID); /** \brief implementing method from base class Widget */ virtual EventPropagation leftPressed(const int playerID); /** When inferring widget size from its label length, this method will be called to * if/how much space must be added to the raw label's size for the widget to be large enough */ virtual int getWidthNeededAroundLabel() const { return 25; } /** When inferring widget size from its label length, this method will be called to * if/how much space must be added to the raw label's size for the widget to be large enough */ virtual int getHeightNeededAroundLabel() const { return 8; } /** Call only if this spinner is graphical. Returns the current texture to display */ irr::video::ITexture* getTexture(); public: LEAK_CHECK() SpinnerWidget(const bool gauge=false); virtual ~SpinnerWidget() {} virtual void move(const int x, const int y, const int w, const int h); void addLabel(irr::core::stringw label); void clearLabels(); // next four functions are for background colour behind playername in multikart screen selection void setUseBackgroundColor() {m_use_background_color=true;} bool getUseBackgroundColor() {return m_use_background_color;} void setSpinnerWidgetPlayerID(int playerID) {m_spinner_widget_player_id=playerID;} int getSpinnerWidgetPlayerID() {return m_spinner_widget_player_id;} void setListener(ISpinnerConfirmListener* listener) { m_listener = listener; } /** \brief implement method from base class Widget */ virtual void add(); /** * \brief sets the current value of the spinner * \param new_value the new value that will be become the current value of this spinner. */ void setValue(const int new_value); /** * \brief sets the current value of the spinner * \pre the 'new_value' string passed must be the name of an item * (added through SpinnerWidget::addLabel)in the spinner */ void setValue(irr::core::stringw new_value); /** * \return whether this spinner is of "gauge" type */ bool isGauge() const { return m_gauge; } /** * \brief retrieve the current value of the spinner * \return the current value of the spinner, in a int form */ int getValue() const { return m_value; } /** * \brief retrieve the current value of the spinner * \return the current value of the spinner, in a string form */ irr::core::stringw getStringValue() const; /** * \return the maximum value the spinner can take */ int getMax() const { return m_max; } /** * \brief Sets the maximum value for a spinner. */ void setMax(int n) {m_max = n; } /** * \return the minimum value the spinner can take */ int getMin() const { return m_min; } void setMin(int n) { m_min = n; } /** Override method from base class Widget */ virtual void setActivated(); /** Override method from base class Widget */ virtual void setDeactivated(); bool isActivated() { return !m_deactivated; } /** Display custom text in spinner */ void setCustomText(const core::stringw& text); }; } #endif