123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- // 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"
- #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), Border(false), Background(false)
- {
- // 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();
- return true;
- } else if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
- bool wasPressed = Pressed;
- 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) {
- video::IVideoDriver *driver = Environment->getVideoDriver();
- core::rect<s32> frameRect(AbsoluteRect);
- // draw background
- if (Background) {
- video::SColor bgColor = skin->getColor(gui::EGDC_3D_FACE);
- driver->draw2DRectangle(bgColor, frameRect, &AbsoluteClippingRect);
- }
- // draw the border
- if (Border) {
- skin->draw3DSunkenPane(this, 0, true, false, frameRect, &AbsoluteClippingRect);
- frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
- frameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X);
- }
- const s32 height = skin->getSize(EGDS_CHECK_BOX_WIDTH);
- // the rectangle around the "checked" area.
- core::rect<s32> checkRect(frameRect.UpperLeftCorner.X,
- ((frameRect.getHeight() - height) / 2) + frameRect.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);
- // the checked icon
- if (Checked) {
- skin->drawIcon(this, EGDI_CHECK_BOX_CHECKED, checkRect.getCenter(),
- CheckTime, os::Timer::getTime(), false, &AbsoluteClippingRect);
- }
- // associated text
- if (Text.size()) {
- checkRect = frameRect;
- 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
- {
- return Checked;
- }
- //! Sets whether to draw the background
- void CGUICheckBox::setDrawBackground(bool draw)
- {
- Background = draw;
- }
- //! Checks if background drawing is enabled
- bool CGUICheckBox::isDrawBackgroundEnabled() const
- {
- return Background;
- }
- //! Sets whether to draw the border
- void CGUICheckBox::setDrawBorder(bool draw)
- {
- Border = draw;
- }
- //! Checks if border drawing is enabled
- bool CGUICheckBox::isDrawBorderEnabled() const
- {
- return Border;
- }
- } // end namespace gui
- } // end namespace irr
|