ProgressBar.gd 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. extends Control
  2. @export var textureProgress : Texture2D
  3. @export var textureBackground : Texture2D
  4. @export var labelColor : Color
  5. @export var labelUnit : String
  6. @export var labelScale : float
  7. @export var labelOffset : Vector2
  8. @export var delayToFillSec : float
  9. @export var delayToInitSec : float
  10. @export var precisionDivider : int
  11. @export var numberAfterComma : int
  12. @export var displayMax : bool = true
  13. @export var displayRatio : bool = false
  14. @export var fillMode : ProgressBar.FillMode = ProgressBar.FILL_BEGIN_TO_END
  15. @onready var bar : TextureProgressBar = $Bar
  16. @onready var label : Label = $Label
  17. var isUpdating : bool = false
  18. var remainsToFillSec : float = 0.0
  19. var initDelayToFillSec : float = 0.0
  20. var valueFrom : float = 0.0
  21. var valueTo : float = 0.0
  22. var valueMax : float = 0.0
  23. var valueTmp : float = 0.0
  24. #
  25. func GetRatio(currentValue : float, maxValue : float) -> float:
  26. var ratio : float = 0.0
  27. if maxValue > 0:
  28. ratio = currentValue / maxValue * 100.0
  29. return ratio
  30. func GetBarFormat(currentValue : float, maxValue : float) -> String:
  31. var formatedText : String = Util.GetFormatedText("%.2f" % ((currentValue / maxValue * 100.0) if displayRatio else currentValue), numberAfterComma)
  32. if displayMax:
  33. var maxValueText : String = Util.GetFormatedText(String.num(maxValue), numberAfterComma)
  34. formatedText += " / " + maxValueText
  35. if labelUnit.length() > 0.0:
  36. formatedText += labelUnit
  37. return formatedText
  38. #
  39. func SetStat(newValue : float, maxValue : float):
  40. assert(bar != null && label != null, "ProgressBar childs are missing")
  41. if valueTo != newValue || valueMax != maxValue:
  42. var previousValue : float = valueTo
  43. valueTo = newValue
  44. valueMax = maxValue
  45. if not isUpdating:
  46. isUpdating = true
  47. valueFrom = previousValue
  48. if valueFrom == 0.0:
  49. remainsToFillSec = delayToInitSec
  50. initDelayToFillSec = delayToInitSec
  51. else:
  52. remainsToFillSec = delayToFillSec
  53. initDelayToFillSec = delayToFillSec
  54. _physics_process(0.0)
  55. #
  56. func _ready():
  57. assert(bar != null, "ProgressBar bar child is missing")
  58. if bar:
  59. bar.fill_mode = fillMode
  60. if textureProgress:
  61. bar.texture_progress = textureProgress
  62. if anchor_bottom == anchor_top && anchor_left == anchor_right:
  63. set_deferred("bar.size", textureProgress.get_size())
  64. if textureBackground:
  65. bar.texture_under = textureBackground
  66. assert(label != null, "ProgressBar label child is missing")
  67. if label:
  68. if labelScale != 1:
  69. label.set_scale(Vector2(labelScale,labelScale))
  70. label.position.y -= ceil((1 - labelScale) * 10)
  71. if labelColor:
  72. label.set("theme_override_colors/font_color", labelColor)
  73. if labelOffset != Vector2.ZERO:
  74. label.position += labelOffset
  75. func _physics_process(delta : float):
  76. if isUpdating:
  77. remainsToFillSec -= delta
  78. var ratioToFinish : float = 0.0
  79. if initDelayToFillSec != 0:
  80. ratioToFinish = (initDelayToFillSec - remainsToFillSec) / initDelayToFillSec
  81. ratioToFinish = ease(ratioToFinish, 0.3)
  82. valueTmp = lerpf(valueFrom, valueTo, ratioToFinish)
  83. if bar:
  84. bar.set_value(GetRatio(valueTmp, valueMax))
  85. if precisionDivider != 0:
  86. valueTmp = round(valueTmp * precisionDivider) / precisionDivider
  87. else:
  88. valueTmp = round(valueTmp)
  89. if label:
  90. label.set_text(GetBarFormat(valueTmp, valueMax))
  91. if valueFrom == valueTo || remainsToFillSec <= 0:
  92. if bar:
  93. bar.set_value(GetRatio(valueTo, valueMax))
  94. if label:
  95. label.set_text(GetBarFormat(valueTo, valueMax))
  96. isUpdating = false
  97. remainsToFillSec = 0
  98. initDelayToFillSec = 0
  99. valueFrom = valueTo