Skip to content

Commit

Permalink
Merge pull request #107 from PringlesGang/turbo-on-hold-component
Browse files Browse the repository at this point in the history
Turbo on hold component
  • Loading branch information
Dextinfire committed Feb 10, 2025
2 parents 4684a35 + a992bd6 commit abdc6fe
Show file tree
Hide file tree
Showing 15 changed files with 241 additions and 215 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ set(Impacto_Src

src/ui/mapsystem.cpp
src/ui/widget.cpp
src/ui/turboonholdhandler.cpp
src/ui/menu.cpp
src/ui/nullmenu.cpp
src/ui/selectionmenu.cpp
Expand Down Expand Up @@ -528,6 +529,7 @@ set(Impacto_Header

src/ui/ui.h
src/ui/mapsystem.h
src/ui/turboonholdhandler.cpp
src/ui/menu.h
src/ui/nullmenu.h
src/ui/selectionmenu.h
Expand Down
2 changes: 1 addition & 1 deletion profiles/cclcc/hud/optionsmenu.lua
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ root.OptionsMenu = {
VoicePosition = { X = 454, Y = 310 },

MinButtonHoldTime = 0.5,
ButtonHoldTimeInterval = 0.05,
ButtonHoldFireInterval = 0.07,

MenuMask = "MenuMask",
};
Expand Down
2 changes: 1 addition & 1 deletion profiles/chlcc/hud/optionsmenu.lua
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ root.OptionsMenu = {
},

MinButtonHoldTime = 0.5,
ButtonHoldTimeInterval = 0.05,
ButtonHoldFireInterval = 0.07,
};

root.Sprites["CircleConfig"] = {
Expand Down
2 changes: 1 addition & 1 deletion profiles/mo6tw/hud/optionsmenu.lua
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ root.OptionsMenu = {
FadeOutDuration = 0.2,

MinButtonHoldTime = 0.5,
ButtonHoldTimeInterval = 0.05,
ButtonHoldFireInterval = 0.07,
};

root.Sprites["OptionsBackground"] = {
Expand Down
2 changes: 1 addition & 1 deletion profiles/mo8/hud/optionsmenu.lua
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ root.OptionsMenu = {
FadeOutDuration = 0.33,

MinButtonHoldTime = 0.5,
ButtonHoldTimeInterval = 0.05,
ButtonHoldFireInterval = 0.07,
};

root.Sprites["OptionsBackground"] = {
Expand Down
2 changes: 1 addition & 1 deletion src/profile/ui/optionsmenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void Configure() {
OptionsMenuType::_from_integral_unchecked(EnsureGetMemberInt("Type"));

MinButtonHoldTime = EnsureGetMemberFloat("MinButtonHoldTime");
ButtonHoldTimeInterval = EnsureGetMemberFloat("ButtonHoldTimeInterval");
ButtonHoldFireInterval = EnsureGetMemberFloat("ButtonHoldFireInterval");

FadeInDuration = EnsureGetMemberFloat("FadeInDuration");
FadeOutDuration = EnsureGetMemberFloat("FadeOutDuration");
Expand Down
2 changes: 1 addition & 1 deletion src/profile/ui/optionsmenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ inline float FadeInDuration;
inline float FadeOutDuration;

inline float MinButtonHoldTime;
inline float ButtonHoldTimeInterval;
inline float ButtonHoldFireInterval;

void Configure();

Expand Down
80 changes: 29 additions & 51 deletions src/ui/backlogmenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ void BacklogMenu::MenuButtonOnClick(Widgets::BacklogEntry* target) {
}
}

BacklogMenu::BacklogMenu() {
BacklogMenu::BacklogMenu()
: DirectionButtonHeldHandler(MinHoldTime, AdvanceFocusTimeInterval,
PAD1UP | PAD1DOWN),
PageUpDownButtonHeldHandler(MinHoldTime, AdvanceFocusTimeInterval,
PAD1LEFT | PAD1RIGHT) {
MainItems = new Widgets::Group(this, EntriesStart);
MainItems->RenderingBounds = RenderingBounds;
MainItems->WrapFocus = false;
Expand Down Expand Up @@ -69,8 +73,8 @@ void BacklogMenu::Show() {
}
UI::FocusedMenu = this;

DirectionalButtonHeldTime = 0.0f;
PageUpDownButtonHeldTime = 0.0f;
DirectionButtonHeldHandler.Reset();
PageUpDownButtonHeldHandler.Reset();

// Set scrollbar back to default position
if (ItemsHeight > MainItems->RenderingBounds.Height) {
Expand All @@ -85,9 +89,6 @@ void BacklogMenu::Hide() {
State = Hiding;
FadeAnimation.StartOut();

DirectionalButtonHeldTime = 0.0f;
PageUpDownButtonHeldTime = 0.0f;

if (LastFocusedMenu != nullptr) {
UI::FocusedMenu = LastFocusedMenu;
LastFocusedMenu->IsFocused = true;
Expand All @@ -105,33 +106,20 @@ static bool IsBeyondShiftedHoverBounds(const Widget* el, float delta, bool up) {
}

void BacklogMenu::UpdatePageUpDownInput(float dt) {
bool pageUpDown = (bool)(PADinputButtonIsDown & PAD1LEFT) ^
(bool)(PADinputButtonIsDown & PAD1RIGHT);
if (!pageUpDown) {
PageUpDownButtonHeldTime = 0.0f;
PageUpDownWaitTime = 0.0f;
return;
}

if (0.0f < PageUpDownButtonHeldTime &&
PageUpDownButtonHeldTime < MinHoldTime) {
PageUpDownButtonHeldTime += dt;
PageUpDownWaitTime = 0.0f;
return;
}
PageUpDownButtonHeldHandler.Update(dt);
const int shouldFire = PageUpDownButtonHeldHandler.ShouldFire();

if (PageUpDownWaitTime > 0.0f) {
PageUpDownWaitTime -= dt;
const bool move =
(bool)(shouldFire & PAD1LEFT) ^ (bool)(shouldFire & PAD1RIGHT);
if (!move) {
if (shouldFire) PageUpDownButtonHeldHandler.Reset();
return;
}

PageUpDownButtonHeldTime += dt;
PageUpDownWaitTime = AdvanceFocusTimeInterval;

FocusDirection dir = (PADinputButtonIsDown & PAD1LEFT) ? FDIR_UP : FDIR_DOWN;
const FocusDirection dir = (shouldFire & PAD1LEFT) ? FDIR_UP : FDIR_DOWN;

if (MainScrollbar->Enabled) {
float delta = (dir == FDIR_UP) ? PageUpDownHeight : -PageUpDownHeight;
const float delta = (dir == FDIR_UP) ? PageUpDownHeight : -PageUpDownHeight;
PageY += delta;
MainScrollbar->ClampValue();

Expand Down Expand Up @@ -168,14 +156,12 @@ static bool InVerticalHoverBounds(const Widget* entry) {
}

void BacklogMenu::UpdateScrollingInput(float dt) {
bool padScrolling = (bool)(PADinputButtonIsDown & PAD1DOWN) ^
(bool)(PADinputButtonIsDown & PAD1UP);
if (!padScrolling) {
DirectionalButtonHeldTime = 0.0f;
return;
}
DirectionButtonHeldHandler.Update(dt);
const int held = DirectionButtonHeldHandler.Held();
const bool padScrolling = (bool)(held & PAD1DOWN) ^ (bool)(held & PAD1UP);
if (!padScrolling) return;

FocusDirection dir = (PADinputButtonIsDown & PAD1DOWN) ? FDIR_DOWN : FDIR_UP;
FocusDirection dir = (held & PAD1DOWN) ? FDIR_DOWN : FDIR_UP;

bool focusOnEdge = false;
const Widget* nextEl = nullptr;
Expand All @@ -193,30 +179,22 @@ void BacklogMenu::UpdateScrollingInput(float dt) {

if (focusOnEdge) {
if (nextEl) {
float excess = (dir == FDIR_UP)
? HoverBounds.Y - nextEl->Bounds.Y
: nextEl->Bounds.Y + nextEl->Bounds.Height -
HoverBounds.Y - HoverBounds.Height;
const float excess = (dir == FDIR_UP)
? HoverBounds.Y - nextEl->Bounds.Y
: nextEl->Bounds.Y + nextEl->Bounds.Height -
HoverBounds.Y - HoverBounds.Height;
if (excess < ScrollingSpeed * dt) AdvanceFocus(dir);
}
} else {
if (DirectionalButtonHeldTime == 0.0f) {
// Button just pressed
AdvanceFocusWaitTime = 0.0f;
const int shouldFire = DirectionButtonHeldHandler.ShouldFire();

if ((shouldFire & PAD1UP) ^ (shouldFire & PAD1DOWN)) {
dir = (shouldFire & PAD1DOWN) ? FDIR_DOWN : FDIR_UP;
AdvanceFocus(dir);
} else if (DirectionalButtonHeldTime > MinHoldTime) {
// Button held down
if (AdvanceFocusWaitTime <= 0.0f) {
AdvanceFocus(dir);
AdvanceFocusWaitTime = AdvanceFocusTimeInterval;
}

AdvanceFocusWaitTime -= dt;
} else if (shouldFire) {
DirectionButtonHeldHandler.Reset();
}
}

DirectionalButtonHeldTime += dt;
}

void BacklogMenu::UpdateInput(float dt) {
Expand Down
8 changes: 3 additions & 5 deletions src/ui/backlogmenu.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "menu.h"
#include "turboonholdhandler.h"
#include "widgets/group.h"
#include "widgets/backlogentry.h"
#include "widgets/scrollbar.h"
Expand Down Expand Up @@ -32,11 +33,8 @@ class BacklogMenu : public Menu {
Animation FadeAnimation;
Widgets::Scrollbar* MainScrollbar;

float DirectionalButtonHeldTime = 0.0f;
float AdvanceFocusWaitTime = 0.0f;

float PageUpDownButtonHeldTime = 0.0f;
float PageUpDownWaitTime = 0.0f;
TurboOnHoldHandler DirectionButtonHeldHandler;
TurboOnHoldHandler PageUpDownButtonHeldHandler;

void RenderHighlight() const;
virtual Widgets::BacklogEntry* CreateBacklogEntry(
Expand Down
90 changes: 33 additions & 57 deletions src/ui/optionsmenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ using namespace Impacto::Profile::ScriptVars;
using namespace Impacto::UI::Widgets;
using namespace Impacto::Vm::Interface;

OptionsMenu::OptionsMenu() {
OptionsMenu::OptionsMenu()
: DirectionButtonHeldHandler(MinButtonHoldTime, ButtonHoldFireInterval,
PAD1UP | PAD1DOWN | PAD1LEFT | PAD1RIGHT),
PageButtonHeldHandler(MinButtonHoldTime, ButtonHoldFireInterval,
PAD1L1 | PAD1R1) {
FadeAnimation.Direction = AnimationDirection::In;
FadeAnimation.LoopMode = AnimationLoopMode::Stop;
FadeAnimation.DurationIn = FadeInDuration;
Expand All @@ -29,6 +33,9 @@ void OptionsMenu::Show() {
Pages[0]->HasFocus = true;
Pages[0]->Show();
Highlight(Pages[0]->GetFirstFocusableChild());

DirectionButtonHeldHandler.Reset();
PageButtonHeldHandler.Reset();
}
State = Showing;

Expand Down Expand Up @@ -74,80 +81,41 @@ void OptionsMenu::Update(float dt) {
}

void OptionsMenu::UpdatePageInput(float dt) {
// Button input
const int direction = (bool)(PADinputButtonIsDown & PAD1R1) -
(bool)(PADinputButtonIsDown & PAD1L1);

if (direction == 0) {
PageDirectionButtonHeldTime = 0.0f;
PageDirectionButtonWaitTime = 0.0f;
return;
}
PageButtonHeldHandler.Update(dt);
const int shouldFire = PageButtonHeldHandler.ShouldFire();

if (0.0f < PageDirectionButtonHeldTime &&
PageDirectionButtonHeldTime < MinButtonHoldTime) {
PageDirectionButtonHeldTime += dt;
PageDirectionButtonWaitTime = 0.0f;
return;
}
// Button input
const int direction =
(bool)(shouldFire & PAD1R1) - (bool)(shouldFire & PAD1L1);

if (PageDirectionButtonWaitTime > 0.0f) {
PageDirectionButtonWaitTime -= dt;
if (direction == 0 && shouldFire) {
PageButtonHeldHandler.Reset();
return;
}

// Page advancement fired
PageDirectionButtonHeldTime += dt;
PageDirectionButtonWaitTime = ButtonHoldTimeInterval;

GoToPage((CurrentPage + direction) % Pages.size());
}

void OptionsMenu::UpdateEntryMovementInput(float dt) {
const int verticalMovement = (bool)(PADinputButtonIsDown & PAD1DOWN) -
(bool)(PADinputButtonIsDown & PAD1UP);
DirectionButtonHeldHandler.Update(dt);
const int shouldFire = DirectionButtonHeldHandler.ShouldFire();

const int verticalMovement =
(bool)(shouldFire & PAD1DOWN) - (bool)(shouldFire & PAD1UP);
const FocusDirection verticalDirection = verticalMovement == -1
? FocusDirection::FDIR_UP
: FocusDirection::FDIR_DOWN;
const int horizontalMovement = (bool)(PADinputButtonIsDown & PAD1RIGHT) -
(bool)(PADinputButtonIsDown & PAD1LEFT);
const int horizontalMovement =
(bool)(shouldFire & PAD1RIGHT) - (bool)(shouldFire & PAD1LEFT);
const FocusDirection horizontalDirection = horizontalMovement == -1
? FocusDirection::FDIR_LEFT
: FocusDirection::FDIR_RIGHT;

// Don't count towards holding the movement button if it is not
// in a valid movement direction
bool moving = CurrentlyFocusedElement &&
(verticalMovement &&
CurrentlyFocusedElement->GetFocus(verticalDirection) ||
horizontalMovement &&
CurrentlyFocusedElement->GetFocus(horizontalDirection));
moving |=
!CurrentlyFocusedElement && (verticalMovement || horizontalMovement);

if (!moving) {
DirectionButtonHeldTime = 0.0f;
DirectionButtonWaitTime = 0.0f;
if (!verticalMovement && !horizontalMovement) {
if (shouldFire) DirectionButtonHeldHandler.Reset();
return;
}

if (0.0f < DirectionButtonHeldTime &&
DirectionButtonHeldTime < MinButtonHoldTime) {
DirectionButtonHeldTime += dt;
DirectionButtonWaitTime = 0.0f;
return;
}

if (DirectionButtonWaitTime > 0.0f) {
DirectionButtonWaitTime -= dt;
return;
}

// Advance entry

DirectionButtonHeldTime += dt;
DirectionButtonWaitTime = ButtonHoldTimeInterval;

if (horizontalMovement != 0) AdvanceFocus(horizontalDirection);
if (verticalMovement != 0) AdvanceFocus(verticalDirection);

Expand Down Expand Up @@ -185,7 +153,15 @@ void OptionsMenu::Highlight(Widget* toHighlight) {
entry->HasFocus = false;
}

if (toHighlight) toHighlight->HasFocus = true;
if (toHighlight) {
toHighlight->HasFocus = true;

DirectionButtonHeldHandler.PADinputButtonHoldMask =
(PAD1UP * (bool)toHighlight->GetFocus(FDIR_UP)) |
(PAD1DOWN * (bool)toHighlight->GetFocus(FDIR_DOWN)) |
(PAD1LEFT * (bool)toHighlight->GetFocus(FDIR_LEFT)) |
(PAD1RIGHT * (bool)toHighlight->GetFocus(FDIR_RIGHT));
}
CurrentlyFocusedElement = toHighlight;
}

Expand Down
8 changes: 3 additions & 5 deletions src/ui/optionsmenu.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "menu.h"
#include "turboonholdhandler.h"
#include "widgets/group.h"

namespace Impacto {
Expand Down Expand Up @@ -28,11 +29,8 @@ class OptionsMenu : public Menu {
int CurrentPage = 0;
std::vector<std::unique_ptr<Widgets::Group>> Pages;

float DirectionButtonHeldTime = 0.0f;
float DirectionButtonWaitTime = 0.0f;

float PageDirectionButtonHeldTime = 0.0f;
float PageDirectionButtonWaitTime = 0.0f;
TurboOnHoldHandler DirectionButtonHeldHandler;
TurboOnHoldHandler PageButtonHeldHandler;
};

} // namespace UI
Expand Down
Loading

0 comments on commit abdc6fe

Please sign in to comment.