|
3 | 3 |
|
4 | 4 | #include "Core/Settings.h"
|
5 | 5 |
|
| 6 | +#define MAX_OPTIONS_TO_DISPLAY 8 |
| 7 | + |
6 | 8 | OptionGroup::OptionGroup()
|
7 |
| - : m_CurrentSelectedOptionIndex(0), m_CachedMinWidth(0.0f), m_CachedMinHeight(0.0f) |
| 9 | + : m_OptionsToDisplay(0), |
| 10 | + m_FirstOptionIndex(0), |
| 11 | + m_LastOptionIndex(0), |
| 12 | + m_CurrentSelectedOptionIndex(0), |
| 13 | + m_CachedMinWidth(0.0f), |
| 14 | + m_CachedMinHeight(0.0f) |
8 | 15 | {
|
9 | 16 | }
|
10 | 17 |
|
11 | 18 | OptionGroup::OptionGroup(const std::vector<std::shared_ptr<Option>> &options)
|
12 |
| - : m_Name(""), m_Options(options), m_CurrentSelectedOptionIndex(0), m_CachedMinWidth(0.0f), m_CachedMinHeight(0.0f) |
| 19 | + : m_Options(options), |
| 20 | + m_OptionsToDisplay(m_Options.size() < MAX_OPTIONS_TO_DISPLAY ? m_Options.size() : MAX_OPTIONS_TO_DISPLAY), |
| 21 | + m_FirstOptionIndex(0), |
| 22 | + m_LastOptionIndex(m_OptionsToDisplay - 1), |
| 23 | + m_CurrentSelectedOptionIndex(0), |
| 24 | + m_CachedMinWidth(0.0f), |
| 25 | + m_CachedMinHeight(0.0f) |
13 | 26 | {
|
14 | 27 | }
|
15 | 28 |
|
16 | 29 | OptionGroup::OptionGroup(const std::string &name, const std::vector<std::shared_ptr<Option>> &options)
|
17 |
| - : m_Name(name), m_Options(options), m_CurrentSelectedOptionIndex(0), m_CachedMinWidth(0.0f), m_CachedMinHeight(0.0f) |
| 30 | + : m_Name(name), |
| 31 | + m_Options(options), |
| 32 | + m_OptionsToDisplay(m_Options.size() < MAX_OPTIONS_TO_DISPLAY ? m_Options.size() : MAX_OPTIONS_TO_DISPLAY), |
| 33 | + m_FirstOptionIndex(0), |
| 34 | + m_LastOptionIndex(m_OptionsToDisplay - 1), |
| 35 | + m_CurrentSelectedOptionIndex(0), |
| 36 | + m_CachedMinWidth(0.0f), |
| 37 | + m_CachedMinHeight(0.0f) |
18 | 38 | {
|
19 | 39 | }
|
20 | 40 |
|
@@ -56,7 +76,23 @@ void OptionGroup::Render(float x, float y, float width, float height)
|
56 | 76 |
|
57 | 77 | RenderBackground(x, y, widthToUse, heightToUse);
|
58 | 78 |
|
59 |
| - for (size_t i = 0; i < m_Options.size(); i++) |
| 79 | + // If the scroller is going down past the last displayed option, |
| 80 | + // shift the view down |
| 81 | + if (m_CurrentSelectedOptionIndex > m_LastOptionIndex) |
| 82 | + { |
| 83 | + m_FirstOptionIndex = m_CurrentSelectedOptionIndex - m_OptionsToDisplay + 1; |
| 84 | + m_LastOptionIndex = m_CurrentSelectedOptionIndex; |
| 85 | + } |
| 86 | + |
| 87 | + // If the scroller is going up past the first displayed option, |
| 88 | + // shift the view up |
| 89 | + if (m_CurrentSelectedOptionIndex < m_FirstOptionIndex) |
| 90 | + { |
| 91 | + m_FirstOptionIndex = m_CurrentSelectedOptionIndex; |
| 92 | + m_LastOptionIndex = m_CurrentSelectedOptionIndex + m_OptionsToDisplay - 1; |
| 93 | + } |
| 94 | + |
| 95 | + for (size_t i = m_FirstOptionIndex; i <= m_LastOptionIndex; i++) |
60 | 96 | {
|
61 | 97 | m_Options[i]->Render(x, y, widthToUse);
|
62 | 98 | y += m_Options[i]->GetMinHeight();
|
@@ -86,7 +122,7 @@ float OptionGroup::GetMinHeight()
|
86 | 122 | if (m_CachedMinHeight != 0.0f)
|
87 | 123 | return m_CachedMinHeight;
|
88 | 124 |
|
89 |
| - for (size_t i = 0; i < m_Options.size(); i++) |
| 125 | + for (size_t i = 0; i < m_OptionsToDisplay; i++) |
90 | 126 | m_CachedMinHeight += m_Options[i]->GetMinHeight();
|
91 | 127 |
|
92 | 128 | return m_CachedMinHeight;
|
|
0 commit comments