// Copyright (C) 2006-2012 Michael Zeilfelder // This file uses the licence of the Irrlicht Engine. #include "CGUISpinBox.h" #ifdef _IRR_COMPILE_WITH_GUI_ #include "CGUIEditBox.h" #include "CGUIButton.h" #include "IGUIEnvironment.h" #include "IEventReceiver.h" #include "fast_atof.h" #include namespace irr { namespace gui { //! constructor CGUISpinBox::CGUISpinBox(const wchar_t* text, bool border,IGUIEnvironment* environment, IGUIElement* parent, s32 id, const core::rect& rectangle) : IGUISpinBox(environment, parent, id, rectangle), EditBox(0), ButtonSpinUp(0), ButtonSpinDown(0), StepSize(1.f), RangeMin(-FLT_MAX), RangeMax(FLT_MAX), FormatString(L"%f"), DecimalPlaces(-1), ValidateOn(EGUI_SBV_ENTER|EGUI_SBV_LOSE_FOCUS) { #ifdef _DEBUG setDebugName("CGUISpinBox"); #endif CurrentIconColor = video::SColor(255,255,255,255); s32 ButtonWidth = 16; ButtonSpinDown = Environment->addButton( core::rect(rectangle.getWidth() - ButtonWidth, rectangle.getHeight()/2 +1, rectangle.getWidth(), rectangle.getHeight()), this); ButtonSpinDown->grab(); ButtonSpinDown->setSubElement(true); ButtonSpinDown->setTabStop(false); ButtonSpinDown->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_CENTER, EGUIA_LOWERRIGHT); ButtonSpinUp = Environment->addButton( core::rect(rectangle.getWidth() - ButtonWidth, 0, rectangle.getWidth(), rectangle.getHeight()/2), this); ButtonSpinUp->grab(); ButtonSpinUp->setSubElement(true); ButtonSpinUp->setTabStop(false); ButtonSpinUp->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_CENTER); const core::rect rectEdit(0, 0, rectangle.getWidth() - ButtonWidth - 1, rectangle.getHeight()); EditBox = Environment->addEditBox(text, rectEdit, border, this, -1); EditBox->grab(); EditBox->setSubElement(true); EditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT); refreshSprites(); } //! destructor CGUISpinBox::~CGUISpinBox() { if (ButtonSpinUp) ButtonSpinUp->drop(); if (ButtonSpinDown) ButtonSpinDown->drop(); if (EditBox) EditBox->drop(); } void CGUISpinBox::refreshSprites() { IGUISpriteBank *sb = 0; if (Environment && Environment->getSkin()) { sb = Environment->getSkin()->getSpriteBank(); } if (sb) { IGUISkin * skin = Environment->getSkin(); CurrentIconColor = skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL); ButtonSpinDown->setSpriteBank(sb); ButtonSpinDown->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_SMALL_CURSOR_DOWN), CurrentIconColor); ButtonSpinDown->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_SMALL_CURSOR_DOWN), CurrentIconColor); ButtonSpinUp->setSpriteBank(sb); ButtonSpinUp->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_SMALL_CURSOR_UP), CurrentIconColor); ButtonSpinUp->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_SMALL_CURSOR_UP), CurrentIconColor); } else { ButtonSpinDown->setText(L"-"); ButtonSpinUp->setText(L"+"); } } IGUIEditBox* CGUISpinBox::getEditBox() const { return EditBox; } void CGUISpinBox::setValue(f32 val) { wchar_t str[100]; swprintf_irr(str, 99, FormatString.c_str(), val); EditBox->setText(str); verifyValueRange(); } f32 CGUISpinBox::getValue() const { const wchar_t* val = EditBox->getText(); if ( !val ) return 0.f; core::stringc tmp(val); return core::fast_atof(tmp.c_str()); } void CGUISpinBox::setRange(f32 min, f32 max) { if (maxOnEvent(e); if ( eatEvent ) return true; } } return IGUIElement::OnEvent(event); } void CGUISpinBox::draw() { if ( !isVisible() ) return; IGUISkin* skin = Environment->getSkin(); if (!skin) return; video::SColor iconColor = skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL); if ( iconColor != CurrentIconColor ) { refreshSprites(); } IGUISpinBox::draw(); } void CGUISpinBox::verifyValueRange() { f32 val = getValue(); if ( val+core::ROUNDING_ERROR_f32 < RangeMin ) val = RangeMin; else if ( val-core::ROUNDING_ERROR_f32 > RangeMax ) val = RangeMax; else return; setValue(val); } //! Sets the new caption of the element void CGUISpinBox::setText(const wchar_t* text) { EditBox->setText(text); setValue(getValue()); verifyValueRange(); } //! Returns caption of this element. const wchar_t* CGUISpinBox::getText() const { return EditBox->getText(); } } // end namespace gui } // end namespace irr #endif // _IRR_COMPILE_WITH_GUI_