123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #include "CGUICheckBox.h"
- #ifdef _IRR_COMPILE_WITH_GUI_
- #include "IGUISkin.h"
- #include "IGUIEnvironment.h"
- #include "IVideoDriver.h"
- #include "IGUIFont.h"
- #include "os.h"
- namespace irr
- {
- namespace gui
- {
- //! constructor
- CGUICheckBox::CGUICheckBox(bool checked, IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
- : IGUICheckBox(environment, parent, id, rectangle), checkTime(0), Pressed(false), Checked(checked)
- {
- #ifdef _DEBUG
- setDebugName("CGUICheckBox");
- #endif
- // this element can be tabbed into
- setTabStop(true);
- setTabOrder(-1);
- }
- //! called if an event happened.
- bool CGUICheckBox::OnEvent(const SEvent& event)
- {
- if (isEnabled())
- {
- switch(event.EventType)
- {
- case EET_KEY_INPUT_EVENT:
- if (event.KeyInput.PressedDown &&
- (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE))
- {
- Pressed = true;
- return true;
- }
- else
- if (Pressed && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE)
- {
- Pressed = false;
- return true;
- }
- else
- if (!event.KeyInput.PressedDown && Pressed &&
- (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE))
- {
- Pressed = false;
- if (Parent)
- {
- SEvent newEvent;
- newEvent.EventType = EET_GUI_EVENT;
- newEvent.GUIEvent.Caller = this;
- newEvent.GUIEvent.Element = 0;
- Checked = !Checked;
- newEvent.GUIEvent.EventType = EGET_CHECKBOX_CHANGED;
- Parent->OnEvent(newEvent);
- }
- return true;
- }
- break;
- case EET_GUI_EVENT:
- if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
- {
- if (event.GUIEvent.Caller == this)
- Pressed = false;
- }
- break;
- case EET_MOUSE_INPUT_EVENT:
- if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
- {
- Pressed = true;
- checkTime = os::Timer::getTime();
- Environment->setFocus(this);
- return true;
- }
- else
- if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
- {
- bool wasPressed = Pressed;
- Environment->removeFocus(this);
- Pressed = false;
- if (wasPressed && Parent)
- {
- if ( !AbsoluteClippingRect.isPointInside( core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y) ) )
- {
- Pressed = false;
- return true;
- }
- SEvent newEvent;
- newEvent.EventType = EET_GUI_EVENT;
- newEvent.GUIEvent.Caller = this;
- newEvent.GUIEvent.Element = 0;
- Checked = !Checked;
- newEvent.GUIEvent.EventType = EGET_CHECKBOX_CHANGED;
- Parent->OnEvent(newEvent);
- }
- return true;
- }
- break;
- default:
- break;
- }
- }
- return IGUIElement::OnEvent(event);
- }
- //! draws the element and its children
- void CGUICheckBox::draw()
- {
- if (!IsVisible)
- return;
- IGUISkin* skin = Environment->getSkin();
- if (skin)
- {
- const s32 height = skin->getSize(EGDS_CHECK_BOX_WIDTH);
- core::rect<s32> checkRect(AbsoluteRect.UpperLeftCorner.X,
- ((AbsoluteRect.getHeight() - height) / 2) + AbsoluteRect.UpperLeftCorner.Y,
- 0, 0);
- checkRect.LowerRightCorner.X = checkRect.UpperLeftCorner.X + height;
- checkRect.LowerRightCorner.Y = checkRect.UpperLeftCorner.Y + height;
- EGUI_DEFAULT_COLOR col = EGDC_GRAY_EDITABLE;
- if ( isEnabled() )
- col = Pressed ? EGDC_FOCUSED_EDITABLE : EGDC_EDITABLE;
- skin->draw3DSunkenPane(this, skin->getColor(col),
- false, true, checkRect, &AbsoluteClippingRect);
- if (Checked)
- {
- skin->drawIcon(this, EGDI_CHECK_BOX_CHECKED, checkRect.getCenter(),
- checkTime, os::Timer::getTime(), false, &AbsoluteClippingRect);
- }
- if (Text.size())
- {
- checkRect = AbsoluteRect;
- checkRect.UpperLeftCorner.X += height + 5;
- IGUIFont* font = skin->getFont();
- if (font)
- {
- font->draw(Text.c_str(), checkRect,
- skin->getColor(isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT), false, true, &AbsoluteClippingRect);
- }
- }
- }
- IGUIElement::draw();
- }
- //! set if box is checked
- void CGUICheckBox::setChecked(bool checked)
- {
- Checked = checked;
- }
- //! returns if box is checked
- bool CGUICheckBox::isChecked() const
- {
- _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
- return Checked;
- }
- //! Writes attributes of the element.
- void CGUICheckBox::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const
- {
- IGUICheckBox::serializeAttributes(out,options);
- out->addBool("Checked", Checked);
- }
- //! Reads attributes of the element
- void CGUICheckBox::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
- {
- Checked = in->getAttributeAsBool ("Checked");
- IGUICheckBox::deserializeAttributes(in,options);
- }
- } // end namespace gui
- } // end namespace irr
- #endif // _IRR_COMPILE_WITH_GUI_
|