Skip to content

Commit 40b0d7e

Browse files
feat(ui): implemented scrolling within an option group
1 parent 5328acf commit 40b0d7e

File tree

3 files changed

+45
-6
lines changed

3 files changed

+45
-6
lines changed

deps/XexUtils

src/Options/OptionGroup.cpp

+41-5
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,38 @@
33

44
#include "Core/Settings.h"
55

6+
#define MAX_OPTIONS_TO_DISPLAY 8
7+
68
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)
815
{
916
}
1017

1118
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)
1326
{
1427
}
1528

1629
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)
1838
{
1939
}
2040

@@ -56,7 +76,23 @@ void OptionGroup::Render(float x, float y, float width, float height)
5676

5777
RenderBackground(x, y, widthToUse, heightToUse);
5878

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++)
6096
{
6197
m_Options[i]->Render(x, y, widthToUse);
6298
y += m_Options[i]->GetMinHeight();
@@ -86,7 +122,7 @@ float OptionGroup::GetMinHeight()
86122
if (m_CachedMinHeight != 0.0f)
87123
return m_CachedMinHeight;
88124

89-
for (size_t i = 0; i < m_Options.size(); i++)
125+
for (size_t i = 0; i < m_OptionsToDisplay; i++)
90126
m_CachedMinHeight += m_Options[i]->GetMinHeight();
91127

92128
return m_CachedMinHeight;

src/Options/OptionGroup.h

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class OptionGroup
2828
std::string m_Name;
2929
std::vector<std::shared_ptr<Option>> m_Options;
3030

31+
size_t m_OptionsToDisplay;
32+
size_t m_FirstOptionIndex;
33+
size_t m_LastOptionIndex;
3134
size_t m_CurrentSelectedOptionIndex;
3235

3336
float m_CachedMinWidth;

0 commit comments

Comments
 (0)