CheckBox.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright (c) 2008-2022 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../Core/Context.h"
  5. #include "../Input/InputEvents.h"
  6. #include "../UI/CheckBox.h"
  7. #include "../UI/UIEvents.h"
  8. #include "../DebugNew.h"
  9. namespace Urho3D
  10. {
  11. extern const char* UI_CATEGORY;
  12. CheckBox::CheckBox(Context* context) :
  13. BorderImage(context),
  14. checkedOffset_(IntVector2::ZERO),
  15. checked_(false)
  16. {
  17. SetEnabled(true);
  18. focusMode_ = FM_FOCUSABLE_DEFOCUSABLE;
  19. }
  20. CheckBox::~CheckBox() = default;
  21. void CheckBox::RegisterObject(Context* context)
  22. {
  23. context->RegisterFactory<CheckBox>(UI_CATEGORY);
  24. URHO3D_COPY_BASE_ATTRIBUTES(BorderImage);
  25. URHO3D_UPDATE_ATTRIBUTE_DEFAULT_VALUE("Is Enabled", true);
  26. URHO3D_UPDATE_ATTRIBUTE_DEFAULT_VALUE("Focus Mode", FM_FOCUSABLE_DEFOCUSABLE);
  27. URHO3D_ACCESSOR_ATTRIBUTE("Is Checked", IsChecked, SetChecked, false, AM_FILE);
  28. URHO3D_ACCESSOR_ATTRIBUTE("Checked Image Offset", GetCheckedOffset, SetCheckedOffset, IntVector2::ZERO, AM_FILE);
  29. }
  30. void CheckBox::GetBatches(Vector<UIBatch>& batches, Vector<float>& vertexData, const IntRect& currentScissor)
  31. {
  32. IntVector2 offset(IntVector2::ZERO);
  33. if (enabled_)
  34. {
  35. if (hovering_ || selected_ || HasFocus())
  36. offset += hoverOffset_;
  37. }
  38. else
  39. offset += disabledOffset_;
  40. if (checked_)
  41. offset += checkedOffset_;
  42. BorderImage::GetBatches(batches, vertexData, currentScissor, offset);
  43. }
  44. void CheckBox::OnClickBegin(const IntVector2& position, const IntVector2& screenPosition, MouseButton button, MouseButtonFlags buttons, QualifierFlags qualifiers,
  45. Cursor* cursor)
  46. {
  47. if (button == MOUSEB_LEFT && editable_)
  48. SetChecked(!checked_);
  49. }
  50. void CheckBox::OnKey(Key key, MouseButtonFlags buttons, QualifierFlags qualifiers)
  51. {
  52. if (HasFocus() && key == KEY_SPACE)
  53. {
  54. // Simulate LMB click
  55. OnClickBegin(IntVector2(), IntVector2(), MOUSEB_LEFT, MOUSEB_NONE, QUAL_NONE, nullptr);
  56. }
  57. }
  58. void CheckBox::SetChecked(bool enable)
  59. {
  60. if (enable != checked_)
  61. {
  62. checked_ = enable;
  63. using namespace Toggled;
  64. VariantMap& eventData = GetEventDataMap();
  65. eventData[P_ELEMENT] = this;
  66. eventData[P_STATE] = checked_;
  67. SendEvent(E_TOGGLED, eventData);
  68. }
  69. }
  70. void CheckBox::SetCheckedOffset(const IntVector2& offset)
  71. {
  72. checkedOffset_ = offset;
  73. }
  74. void CheckBox::SetCheckedOffset(int x, int y)
  75. {
  76. checkedOffset_ = IntVector2(x, y);
  77. }
  78. }