ProgressBar.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 "../IO/Log.h"
  7. #include "../UI/ProgressBar.h"
  8. #include "../UI/UIEvents.h"
  9. namespace Urho3D
  10. {
  11. extern const char* orientations[];
  12. extern const char* UI_CATEGORY;
  13. ProgressBar::ProgressBar(Context * context) :
  14. BorderImage(context),
  15. orientation_(O_HORIZONTAL),
  16. loadingPercentStyle_("Text"),
  17. range_(1.0f),
  18. value_(0.0f),
  19. showPercentText_(true)
  20. {
  21. SetEnabled(false);
  22. SetEditable(false);
  23. SetFocus(false);
  24. knob_ = CreateChild<BorderImage>("S_Knob");
  25. knob_->SetInternal(true);
  26. loadingText_ = CreateChild<Text>("S_Text");
  27. loadingText_->SetInternal(true);
  28. UpdateProgressBar();
  29. }
  30. ProgressBar::~ProgressBar() = default;
  31. void ProgressBar::RegisterObject(Context * context)
  32. {
  33. context->RegisterFactory<ProgressBar>(UI_CATEGORY);
  34. URHO3D_COPY_BASE_ATTRIBUTES(BorderImage);
  35. URHO3D_UPDATE_ATTRIBUTE_DEFAULT_VALUE("Is Enabled", true);
  36. URHO3D_ENUM_ACCESSOR_ATTRIBUTE("Orientation", GetOrientation, SetOrientation, orientations, O_HORIZONTAL, AM_FILE);
  37. URHO3D_ACCESSOR_ATTRIBUTE("Range", GetRange, SetRange, 1.0f, AM_FILE);
  38. URHO3D_ACCESSOR_ATTRIBUTE("Value", GetValue, SetValue, 0.0f, AM_FILE);
  39. URHO3D_ACCESSOR_ATTRIBUTE("Show Percent Text", GetShowPercentText, SetShowPercentText, true, AM_FILE);
  40. }
  41. void ProgressBar::OnResize(const IntVector2& /*newSize*/, const IntVector2& /*delta*/)
  42. {
  43. UpdateProgressBar();
  44. }
  45. void ProgressBar::SetOrientation(Orientation orientation)
  46. {
  47. orientation_ = orientation;
  48. UpdateProgressBar();
  49. }
  50. void ProgressBar::SetRange(float range)
  51. {
  52. range = Max(range, 0.0f);
  53. if (range != range_)
  54. {
  55. range_ = range;
  56. UpdateProgressBar();
  57. }
  58. }
  59. void ProgressBar::SetValue(float value)
  60. {
  61. value = Clamp(value, 0.0f, range_);
  62. if (value != value_)
  63. {
  64. value_ = value;
  65. UpdateProgressBar();
  66. using namespace ProgressBarChanged;
  67. VariantMap& eventData = GetEventDataMap();
  68. eventData[P_ELEMENT] = this;
  69. eventData[P_VALUE] = value_;
  70. SendEvent(E_PROGRESSBARCHANGED, eventData);
  71. }
  72. }
  73. void ProgressBar::ChangeValue(float delta)
  74. {
  75. SetValue(value_ + delta);
  76. }
  77. void ProgressBar::SetShowPercentText(bool enable)
  78. {
  79. showPercentText_ = enable;
  80. loadingText_->SetVisible(showPercentText_);
  81. }
  82. bool ProgressBar::FilterImplicitAttributes(XMLElement &dest) const
  83. {
  84. if (!BorderImage::FilterImplicitAttributes(dest))
  85. return false;
  86. XMLElement childElem = dest.GetChild("element");
  87. if (!childElem)
  88. return false;
  89. if (!RemoveChildXML(childElem, "Name", "S_Knob"))
  90. return false;
  91. if (!RemoveChildXML(childElem, "Name", "S_Text"))
  92. return false;
  93. if (!RemoveChildXML(childElem, "Position"))
  94. return false;
  95. if (!RemoveChildXML(childElem, "Size"))
  96. return false;
  97. return true;
  98. }
  99. void ProgressBar::UpdateProgressBar()
  100. {
  101. const IntRect &border = knob_->GetBorder();
  102. if (range_ > 0.0f)
  103. {
  104. if (orientation_ == O_HORIZONTAL)
  105. {
  106. auto loadingBarLength = (int) Max((float) GetWidth() * value_ / range_,
  107. (float) (border.left_ + border.right_));
  108. knob_->SetSize(loadingBarLength, GetHeight());
  109. knob_->SetPosition(Clamp(0, 0, GetWidth() - knob_->GetWidth()), 0);
  110. }
  111. else
  112. {
  113. auto loadingBarLength = (int) Max((float) GetHeight() * value_ / range_,
  114. (float) (border.top_ + border.bottom_));
  115. knob_->SetSize(GetWidth(), loadingBarLength);
  116. knob_->SetPosition(0, Clamp(GetHeight() - knob_->GetHeight(), 0, GetHeight() - knob_->GetHeight()));
  117. }
  118. }
  119. else
  120. {
  121. knob_->SetSize(GetSize());
  122. knob_->SetPosition(0, 0);
  123. }
  124. // Update the text.
  125. loadingText_->SetStyle(loadingPercentStyle_);
  126. loadingText_->SetAlignment(HA_CENTER, VA_CENTER);
  127. loadingText_->SetText(Urho3D::ToString("%d %%", RoundToInt((value_ / range_) * 100.0f)));
  128. }
  129. }