diff options
Diffstat (limited to 'Samples/CommonSrc/Util/OptionMenu.cpp')
-rw-r--r-- | Samples/CommonSrc/Util/OptionMenu.cpp | 103 |
1 files changed, 68 insertions, 35 deletions
diff --git a/Samples/CommonSrc/Util/OptionMenu.cpp b/Samples/CommonSrc/Util/OptionMenu.cpp index d9acc44..2d3c3d0 100644 --- a/Samples/CommonSrc/Util/OptionMenu.cpp +++ b/Samples/CommonSrc/Util/OptionMenu.cpp @@ -30,7 +30,7 @@ limitations under the License. //------------------------------------------------------------------------------------- bool OptionShortcut::MatchKey(OVR::KeyCode key, bool shift) const { - for (UInt32 i = 0; i < Keys.GetSize(); i++) + for (uint32_t i = 0; i < Keys.GetSize(); i++) { if (Keys[i].Key != key) continue; @@ -54,9 +54,9 @@ bool OptionShortcut::MatchKey(OVR::KeyCode key, bool shift) const return false; } -bool OptionShortcut::MatchGamepadButton(UInt32 gamepadButtonMask) const +bool OptionShortcut::MatchGamepadButton(uint32_t gamepadButtonMask) const { - for (UInt32 i = 0; i < GamepadButtons.GetSize(); i++) + for (uint32_t i = 0; i < GamepadButtons.GetSize(); i++) { if (GamepadButtons[i] & gamepadButtonMask) { @@ -75,7 +75,7 @@ bool OptionShortcut::MatchGamepadButton(UInt32 gamepadButtonMask) const String OptionMenuItem::PopNamespaceFrom(OptionMenuItem* menuItem) { String label = menuItem->Label; - for (UInt32 i = 0; i < label.GetLength(); i++) + for (uint32_t i = 0; i < label.GetLength(); i++) { if (label.GetCharAt(i) == '.') { @@ -91,7 +91,7 @@ String OptionMenuItem::PopNamespaceFrom(OptionMenuItem* menuItem) String OptionVar::FormatEnum(OptionVar* var) { - UInt32 index = var->GetEnumIndex(); + uint32_t index = var->GetEnumIndex(); if (index < var->EnumValues.GetSize()) return var->EnumValues[index].Name; return String("<Bad enum index>"); @@ -116,6 +116,12 @@ String OptionVar::FormatBool(OptionVar* var) return *var->AsBool() ? "On" : "Off"; } +String OptionVar::FormatTrigger(OptionVar* var) +{ + OVR_UNUSED(var); + return "[Trigger]"; +} + OptionVar::OptionVar(const char* name, void* pvar, VarType type, FormatFunction formatFunction, @@ -124,13 +130,13 @@ OptionVar::OptionVar(const char* name, void* pvar, VarType type, Label = name; Type = type; this->pVar = pvar; - fFormat = formatFunction; + fFormat = ((Type == Type_Trigger) && !formatFunction) ? FormatTrigger : formatFunction; fUpdate = updateFunction; pNotify = 0; FormatString= 0; - MaxFloat = Math<float>::MaxValue; - MinFloat = -Math<float>::MaxValue; + MaxFloat = MATH_FLOAT_MAXVALUE; + MinFloat = -MATH_FLOAT_MAXVALUE; StepFloat = 1.0f; FormatScale = 1.0f; @@ -138,12 +144,14 @@ OptionVar::OptionVar(const char* name, void* pvar, VarType type, MinInt = -(MaxInt) - 1; StepInt = 1; + SelectedIndex = 0; + ShortcutUp.pNotify = new FunctionNotifyContext<OptionVar, bool>(this, &OptionVar::NextValue); ShortcutDown.pNotify = new FunctionNotifyContext<OptionVar, bool>(this, &OptionVar::PrevValue); } -OptionVar::OptionVar(const char* name, SInt32* pvar, - SInt32 min, SInt32 max, SInt32 stepSize, +OptionVar::OptionVar(const char* name, int32_t* pvar, + int32_t min, int32_t max, int32_t stepSize, const char* formatString, FormatFunction formatFunction, UpdateFunction updateFunction) @@ -160,6 +168,8 @@ OptionVar::OptionVar(const char* name, SInt32* pvar, MaxInt = max; StepInt = stepSize; + SelectedIndex = 0; + ShortcutUp.pNotify = new FunctionNotifyContext<OptionVar, bool>(this, &OptionVar::NextValue); ShortcutDown.pNotify = new FunctionNotifyContext<OptionVar, bool>(this, &OptionVar::PrevValue); } @@ -184,6 +194,8 @@ OptionVar::OptionVar(const char* name, float* pvar, StepFloat = stepSize; FormatScale = formatScale; + SelectedIndex = 0; + ShortcutUp.pNotify = new FunctionNotifyContext<OptionVar, bool>(this, &OptionVar::NextValue); ShortcutDown.pNotify = new FunctionNotifyContext<OptionVar, bool>(this, &OptionVar::PrevValue); } @@ -204,7 +216,7 @@ void OptionVar::NextValue(bool* pFastStep) break; case Type_Int: - *AsInt() = Alg::Min<SInt32>(*AsInt() + StepInt * (fastStep ? 5 : 1), MaxInt); + *AsInt() = Alg::Min<int32_t>(*AsInt() + StepInt * (fastStep ? 5 : 1), MaxInt); break; case Type_Float: @@ -215,6 +227,11 @@ void OptionVar::NextValue(bool* pFastStep) case Type_Bool: *AsBool() = !*AsBool(); break; + + case Type_Trigger: + break; // nothing to do + + default: OVR_ASSERT(false); break; // unhandled } SignalUpdate(); @@ -226,11 +243,11 @@ void OptionVar::PrevValue(bool* pFastStep) switch (Type) { case Type_Enum: - *AsInt() = ((GetEnumIndex() + (UInt32)EnumValues.GetSize() - 1) % EnumValues.GetSize()); + *AsInt() = ((GetEnumIndex() + (uint32_t)EnumValues.GetSize() - 1) % EnumValues.GetSize()); break; case Type_Int: - *AsInt() = Alg::Max<SInt32>(*AsInt() - StepInt * (fastStep ? 5 : 1), MinInt); + *AsInt() = Alg::Max<int32_t>(*AsInt() - StepInt * (fastStep ? 5 : 1), MinInt); break; case Type_Float: @@ -241,6 +258,11 @@ void OptionVar::PrevValue(bool* pFastStep) case Type_Bool: *AsBool() = !*AsBool(); break; + + case Type_Trigger: + break; // nothing to do + + default: OVR_ASSERT(false); break; // unhandled } SignalUpdate(); @@ -248,8 +270,16 @@ void OptionVar::PrevValue(bool* pFastStep) String OptionVar::HandleShortcutUpdate() { - SignalUpdate(); - return Label + " - " + GetValue(); + if(Type != Type_Trigger) + { + SignalUpdate(); + return Label + " - " + GetValue(); + } + else + { + // Avoid double trigger (shortcut key already triggers NextValue()) + return String("Triggered: ") + Label; + } } String OptionVar::ProcessShortcutKey(OVR::KeyCode key, bool shift) @@ -262,7 +292,7 @@ String OptionVar::ProcessShortcutKey(OVR::KeyCode key, bool shift) return String(); } -String OptionVar::ProcessShortcutButton(UInt32 buttonMask) +String OptionVar::ProcessShortcutButton(uint32_t buttonMask) { if (ShortcutUp.MatchGamepadButton(buttonMask) || ShortcutDown.MatchGamepadButton(buttonMask)) { @@ -272,7 +302,7 @@ String OptionVar::ProcessShortcutButton(UInt32 buttonMask) } -OptionVar& OptionVar::AddEnumValue(const char* displayName, SInt32 value) +OptionVar& OptionVar::AddEnumValue(const char* displayName, int32_t value) { EnumEntry entry; entry.Name = displayName; @@ -283,16 +313,19 @@ OptionVar& OptionVar::AddEnumValue(const char* displayName, SInt32 value) String OptionVar::GetValue() { - return fFormat(this); + if(fFormat == NULL) + return String(); + else + return fFormat(this); } -UInt32 OptionVar::GetEnumIndex() +uint32_t OptionVar::GetEnumIndex() { OVR_ASSERT(Type == Type_Enum); OVR_ASSERT(EnumValues.GetSize() > 0); // TODO: Change this from a linear search to binary or a hash. - for (UInt32 i = 0; i < EnumValues.GetSize(); i++) + for (uint32_t i = 0; i < EnumValues.GetSize(); i++) { if (EnumValues[i].Value == *AsInt()) return i; @@ -353,7 +386,7 @@ OptionSelectionMenu::OptionSelectionMenu(OptionSelectionMenu* parentMenu) OptionSelectionMenu::~OptionSelectionMenu() { - for (UInt32 i = 0; i < Items.GetSize(); i++) + for (uint32_t i = 0; i < Items.GetSize(); i++) delete Items[i]; } @@ -400,7 +433,7 @@ bool OptionSelectionMenu::OnKey(OVR::KeyCode key, int chr, bool down, int modifi return false; } -bool OptionSelectionMenu::OnGamepad(UInt32 buttonMask) +bool OptionSelectionMenu::OnGamepad(uint32_t buttonMask) { // Check global shortcuts first. String s = ProcessShortcutButton(buttonMask); @@ -436,7 +469,7 @@ String OptionSelectionMenu::ProcessShortcutKey(OVR::KeyCode key, bool shift) { String s; - for (UPInt i = 0; (i < Items.GetSize()) && s.IsEmpty(); i++) + for (size_t i = 0; (i < Items.GetSize()) && s.IsEmpty(); i++) { s = Items[i]->ProcessShortcutKey(key, shift); } @@ -444,11 +477,11 @@ String OptionSelectionMenu::ProcessShortcutKey(OVR::KeyCode key, bool shift) return s; } -String OptionSelectionMenu::ProcessShortcutButton(UInt32 buttonMask) +String OptionSelectionMenu::ProcessShortcutButton(uint32_t buttonMask) { String s; - for (UPInt i = 0; (i < Items.GetSize()) && s.IsEmpty(); i++) + for (size_t i = 0; (i < Items.GetSize()) && s.IsEmpty(); i++) { s = Items[i]->ProcessShortcutButton(buttonMask); } @@ -457,9 +490,9 @@ String OptionSelectionMenu::ProcessShortcutButton(UInt32 buttonMask) } // Fills in inclusive character range; returns false if line not found. -bool FindLineCharRange(const char* text, int searchLine, UPInt charRange[2]) +bool FindLineCharRange(const char* text, int searchLine, size_t charRange[2]) { - UPInt i = 0; + size_t i = 0; for (int line = 0; line <= searchLine; line ++) { @@ -522,11 +555,9 @@ void OptionSelectionMenu::Render(RenderDevice* prender, String title) float valuesSize[2] = {0.0f, 0.0f}; float maxValueWidth = 0.0f; - UPInt selection[2] = { 0, 0 }; + size_t selection[2] = { 0, 0 }; Vector2f labelSelectionRect[2]; Vector2f valueSelectionRect[2]; - bool havelLabelSelection = false; - bool haveValueSelection = false; float textSize = 22.0f; prender->MeasureText(&DejaVu, " ", textSize, bufferSize); @@ -538,14 +569,14 @@ void OptionSelectionMenu::Render(RenderDevice* prender, String title) if (DisplayState == Display_Menu) { highlightIndex = SelectedIndex; - for (UInt32 i = 0; i < Items.GetSize(); i++) + for (uint32_t i = 0; i < Items.GetSize(); i++) { if (i > 0) values += "\n"; values += Items[i]->GetValue(); } - for (UInt32 i = 0; i < Items.GetSize(); i++) + for (uint32_t i = 0; i < Items.GetSize(); i++) { if (i > 0) menuItems += "\n"; @@ -560,13 +591,15 @@ void OptionSelectionMenu::Render(RenderDevice* prender, String title) // Measure labels const char* menuItemsCStr = menuItems.ToCStr(); - havelLabelSelection = FindLineCharRange(menuItemsCStr, highlightIndex, selection); + bool havelLabelSelection = FindLineCharRange(menuItemsCStr, highlightIndex, selection); + OVR_UNUSED(havelLabelSelection); prender->MeasureText(&DejaVu, menuItemsCStr, textSize, labelsSize, selection, labelSelectionRect); // Measure label-to-value gap const char* valuesCStr = values.ToCStr(); - haveValueSelection = FindLineCharRange(valuesCStr, highlightIndex, selection); + bool haveValueSelection = FindLineCharRange(valuesCStr, highlightIndex, selection); + OVR_UNUSED(haveValueSelection); prender->MeasureText(&DejaVu, valuesCStr, textSize, valuesSize, selection, valueSelectionRect); // Measure max value size (absolute size varies, so just use a reasonable max) @@ -712,7 +745,7 @@ OptionSelectionMenu* OptionSelectionMenu::GetSubmenu() OptionSelectionMenu* OptionSelectionMenu::GetOrCreateSubmenu(String submenuName) { - for (UInt32 i = 0; i < Items.GetSize(); i++) + for (uint32_t i = 0; i < Items.GetSize(); i++) { if (!Items[i]->IsMenu()) continue; |