1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
3 | #include "GUI/BsGUIProgressBar.h" |
4 | #include "GUI/BsGUIWidget.h" |
5 | #include "GUI/BsGUISkin.h" |
6 | #include "GUI/BsGUITexture.h" |
7 | #include "GUI/BsGUIDimensions.h" |
8 | |
9 | using namespace std::placeholders; |
10 | |
11 | namespace bs |
12 | { |
13 | GUIProgressBar::GUIProgressBar(const String& styleName, const GUIDimensions& dimensions) |
14 | :GUIElementContainer(dimensions, styleName), mPercent(0) |
15 | { |
16 | mBar = GUITexture::create(getSubStyleName(getBarStyleType())); |
17 | mBackground = GUITexture::create(getSubStyleName(getBackgroundStyleType())); |
18 | |
19 | mBackground->_setElementDepth(mBar->_getRenderElementDepthRange()); |
20 | |
21 | _registerChildElement(mBar); |
22 | _registerChildElement(mBackground); |
23 | } |
24 | |
25 | const String& GUIProgressBar::getBarStyleType() |
26 | { |
27 | static String HANDLE_STYLE_TYPE = "ProgressBarFill" ; |
28 | return HANDLE_STYLE_TYPE; |
29 | } |
30 | |
31 | const String& GUIProgressBar::getBackgroundStyleType() |
32 | { |
33 | static String BACKGROUND_STYLE_TYPE = "ProgressBarBackground" ; |
34 | return BACKGROUND_STYLE_TYPE; |
35 | } |
36 | |
37 | Vector2I GUIProgressBar::_getOptimalSize() const |
38 | { |
39 | Vector2I optimalSize = mBar->_getOptimalSize(); |
40 | |
41 | Vector2I backgroundSize = mBackground->_getOptimalSize(); |
42 | optimalSize.x = std::max(optimalSize.x, backgroundSize.x); |
43 | optimalSize.y = std::max(optimalSize.y, backgroundSize.y); |
44 | |
45 | return optimalSize; |
46 | } |
47 | |
48 | void GUIProgressBar::_updateLayoutInternal(const GUILayoutData& data) |
49 | { |
50 | mBackground->_setLayoutData(data); |
51 | |
52 | const GUIElementStyle* style = _getStyle(); |
53 | |
54 | GUILayoutData barLayoutData = data; |
55 | |
56 | barLayoutData.area.x += style->margins.left; |
57 | barLayoutData.area.y += style->margins.top; |
58 | |
59 | UINT32 maxProgressBarWidth = std::max((UINT32)0, (UINT32)(data.area.width - style->margins.left - style->margins.right)); |
60 | UINT32 progressBarHeight = std::max((UINT32)0, (UINT32)(data.area.height - style->margins.top - style->margins.bottom)); |
61 | |
62 | barLayoutData.area.width = (UINT32)Math::floorToInt(maxProgressBarWidth * mPercent); |
63 | barLayoutData.area.height = progressBarHeight; |
64 | |
65 | mBar->_setLayoutData(barLayoutData); |
66 | } |
67 | |
68 | void GUIProgressBar::styleUpdated() |
69 | { |
70 | mBar->setStyle(getSubStyleName(getBarStyleType())); |
71 | mBackground->setStyle(getSubStyleName(getBackgroundStyleType())); |
72 | } |
73 | |
74 | void GUIProgressBar::setPercent(float pct) |
75 | { |
76 | mPercent = pct; |
77 | _markLayoutAsDirty(); |
78 | } |
79 | |
80 | void GUIProgressBar::setTint(const Color& color) |
81 | { |
82 | mBar->setTint(color); |
83 | mBackground->setTint(color); |
84 | } |
85 | |
86 | GUIProgressBar* GUIProgressBar::create(const String& styleName) |
87 | { |
88 | return new (bs_alloc<GUIProgressBar>()) GUIProgressBar(getStyleName<GUIProgressBar>(styleName), GUIDimensions::create()); |
89 | } |
90 | |
91 | GUIProgressBar* GUIProgressBar::create(const GUIOptions& options, const String& styleName) |
92 | { |
93 | return new (bs_alloc<GUIProgressBar>()) GUIProgressBar(getStyleName<GUIProgressBar>(styleName), GUIDimensions::create(options)); |
94 | } |
95 | |
96 | const String& GUIProgressBar::getGUITypeName() |
97 | { |
98 | static String typeName = "ProgressBar" ; |
99 | return typeName; |
100 | } |
101 | } |