Skip to content

Commit 1d8a1ed

Browse files
Use Panorama event handlers for handling dropdown selection changes
1 parent a0f0a11 commit 1d8a1ed

25 files changed

+478
-321
lines changed

Source/CS2/Panorama/CDropDown.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
#pragma once
22

33
#include "CPanel2D.h"
4+
#include "PanelHandle.h"
45

56
namespace cs2
67
{
78

89
struct CDropDown : CPanel2D {
10+
PanelHandle dropdownMenu;
11+
912
using SetSelectedIndex = void(CDropDown* thisptr, int index);
13+
using selectedOption = PanelHandle;
14+
15+
using DropDownSelectionChangedHandler = bool(void* delegateThisptr, CPanel2D* panel);
16+
};
17+
18+
struct CDropDownMenu : CPanel2D {
19+
CDropDown* dropdown;
20+
CPanel2D* selectedChild;
1021
};
1122

1223
}

Source/CS2/Panorama/CPanel2D.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include "PanelHandle.h"
4+
35
namespace cs2
46
{
57

@@ -8,6 +10,8 @@ struct CUIPanel;
810
struct CPanel2D {
911
const void* vmt;
1012
CUIPanel* uiPanel;
13+
PanelHandle tooltipHandle;
14+
void* v8Pointer;
1115

1216
using Create = CPanel2D*(const char* id, CPanel2D* parent);
1317
};

Source/EntryPoints/GuiEntryPoints.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,31 @@
33
#include <CS2/Panorama/CPanel2D.h>
44
#include <Utils/TemplateParameterCstring.h>
55

6-
template <typename HookContext, typename ConfigVariable, TemplateParameterCstring kPanelName>
6+
template <typename HookContext>
77
class GuiEntryPoints {
88
public:
9+
template <typename ConfigVariable, TemplateParameterCstring kPanelName>
910
LINUX_ONLY([[gnu::aligned(8)]]) static bool hueSliderValueChanged(void* /* thisptr */, cs2::CPanel2D* /* panel */, float value)
1011
{
1112
HookContext hookContext;
1213
hookContext.gui().template onHueSliderValueChanged<ConfigVariable>(kPanelName, value);
1314
return true;
1415
}
1516

17+
template <typename ConfigVariable, TemplateParameterCstring kPanelName>
1618
LINUX_ONLY([[gnu::aligned(8)]]) static bool hueSliderTextEntrySubmit(void* /* thisptr */, cs2::CPanel2D* /* panel */, const char* value)
1719
{
1820
HookContext hookContext;
1921
hookContext.gui().template onHueSliderTextEntrySubmit<ConfigVariable>(kPanelName, value);
2022
return true;
2123
}
24+
25+
template <typename DropdownSelectionChangedHandler>
26+
LINUX_ONLY([[gnu::aligned(8)]]) static bool dropDownSelectionChanged(void* /* thisptr */, cs2::CPanel2D* panel)
27+
{
28+
HookContext hookContext;
29+
auto&& dropdown = hookContext.template make<ClientPanel>(panel).template as<PanoramaDropDown>();
30+
hookContext.template make<DropdownSelectionChangedHandler>().onSelectionChanged(dropdown.getSelectedIndex());
31+
return true;
32+
}
2233
};

Source/Features/Visuals/ModelGlow/ModelGlowToggle.h

Lines changed: 0 additions & 94 deletions
This file was deleted.

Source/Features/Visuals/OutlineGlow/PlayerOutlineGlow/PlayerOutlineGlowToggle.h

Lines changed: 0 additions & 40 deletions
This file was deleted.

Source/Features/Visuals/PlayerInfoInWorld/PlayerInfoInWorld.h

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,48 +10,6 @@
1010
#include "PlayerPositionArrow/PlayerPositionArrowColorType.h"
1111
#include "PlayerStateIcons/PlayerStateIconsToShow.h"
1212

13-
template <typename HookContext>
14-
struct PlayerInfoInWorldToggle {
15-
PlayerInfoInWorldToggle(HookContext& hookContext) noexcept
16-
: hookContext{hookContext}
17-
{
18-
}
19-
20-
void update(char option) noexcept
21-
{
22-
switch (option) {
23-
case '0': setVariable<player_info_vars::Enabled>(true); setVariable<player_info_vars::OnlyEnemies>(true); break;
24-
case '1': setVariable<player_info_vars::Enabled>(true); setVariable<player_info_vars::OnlyEnemies>(false); break;
25-
case '2': setVariable<player_info_vars::Enabled>(false); break;
26-
}
27-
}
28-
29-
void updatePlayerPositionArrowColorMode(char option) const noexcept
30-
{
31-
switch (option) {
32-
case '0': hookContext.config().template setVariable<player_info_vars::PlayerPositionArrowColorMode>(PlayerPositionArrowColorType::PlayerOrTeamColor); break;
33-
case '1': hookContext.config().template setVariable<player_info_vars::PlayerPositionArrowColorMode>(PlayerPositionArrowColorType::TeamColor); break;
34-
}
35-
}
36-
37-
void updatePlayerHealthColorMode(char option) const noexcept
38-
{
39-
switch (option) {
40-
case '0': hookContext.config().template setVariable<player_info_vars::PlayerHealthColorMode>(PlayerHealthTextColor::HealthBased); break;
41-
case '1': hookContext.config().template setVariable<player_info_vars::PlayerHealthColorMode>(PlayerHealthTextColor::White); break;
42-
}
43-
}
44-
45-
private:
46-
template <typename ConfigVariable>
47-
void setVariable(ConfigVariable::ValueType value) const noexcept
48-
{
49-
hookContext.config().template setVariable<ConfigVariable>(value);
50-
}
51-
52-
HookContext& hookContext;
53-
};
54-
5513
template <typename HookContext>
5614
class PlayerInfoInWorld {
5715
public:
@@ -85,10 +43,5 @@ class PlayerInfoInWorld {
8543
return hookContext.template make<PlayerInfoInWorldContext>();
8644
}
8745

88-
[[nodiscard]] auto& state() const noexcept
89-
{
90-
return hookContext.featuresStates().visualFeaturesStates.playerInfoInWorldState;
91-
}
92-
9346
HookContext& hookContext;
9447
};

Source/GameClient/Panorama/PanoramaDropDown.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,47 @@
33
#include <CS2/Panorama/CDropDown.h>
44
#include <MemoryPatterns/PatternTypes/PanoramaDropDownPatternTypes.h>
55

6+
template <typename HookContext>
7+
class DropdownMenu {
8+
public:
9+
DropdownMenu(HookContext& hookContext, cs2::CDropDownMenu* dropdownMenu) noexcept
10+
: hookContext{hookContext}
11+
, dropdownMenu{dropdownMenu}
12+
{
13+
}
14+
15+
using RawType = cs2::CDropDownMenu;
16+
17+
[[nodiscard]] int getSelectedIndex() const
18+
{
19+
const auto selectedOption = getSelected();
20+
if (!selectedOption)
21+
return -1;
22+
23+
int i = 0;
24+
for (auto&& child : uiPanel().children()) {
25+
if (child == selectedOption)
26+
return i;
27+
++i;
28+
}
29+
return -1;
30+
}
31+
32+
private:
33+
[[nodiscard]] cs2::CUIPanel* getSelected() const
34+
{
35+
return hookContext.template make<ClientPanel>(dropdownMenu ? dropdownMenu->selectedChild : nullptr).uiPanel();
36+
}
37+
38+
[[nodiscard]] decltype(auto) uiPanel() const
39+
{
40+
return hookContext.uiPanel(dropdownMenu ? dropdownMenu->uiPanel : nullptr);
41+
}
42+
43+
HookContext& hookContext;
44+
cs2::CDropDownMenu* dropdownMenu;
45+
};
46+
647
template <typename HookContext>
748
class PanoramaDropDown {
849
public:
@@ -14,14 +55,41 @@ class PanoramaDropDown {
1455

1556
using RawType = cs2::CDropDown;
1657

58+
[[nodiscard]] int getSelectedIndex() const
59+
{
60+
return dropdownMenu().getSelectedIndex();
61+
}
62+
1763
void setSelectedIndex(int index) const noexcept
1864
{
1965
const auto setSelectedIndexFn = hookContext.patternSearchResults().template get<SetSelectedIndexFunctionPointer>();
2066
if (dropDown && setSelectedIndexFn)
2167
setSelectedIndexFn(dropDown, index);
2268
}
2369

70+
void registerSelectionChangedHandler(cs2::CDropDown::DropDownSelectionChangedHandler* func)
71+
{
72+
auto&& uiEngine = hookContext.template make<PanoramaUiEngine>();
73+
uiEngine.registerEventHandler(
74+
uiEngine.makeSymbol(0, "DropDownSelectionChanged"),
75+
uiPanel(),
76+
cs2::CUtlAbstractDelegate{func}
77+
);
78+
}
79+
2480
private:
81+
[[nodiscard]] decltype(auto) dropdownMenu() const
82+
{
83+
if (dropDown)
84+
return hookContext.template make<PanoramaUiEngine>().getPanelFromHandle(dropDown->dropdownMenu).clientPanel().template as<DropdownMenu>();
85+
return hookContext.template make<DropdownMenu>(nullptr);
86+
}
87+
88+
[[nodiscard]] decltype(auto) uiPanel() const
89+
{
90+
return hookContext.uiPanel(dropDown ? dropDown->uiPanel : nullptr);
91+
}
92+
2593
HookContext& hookContext;
2694
cs2::CDropDown* dropDown;
2795
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
22

33
#define GET_CONFIG_VAR(name) hookContext.config().template getVariable<name>()
4+
#define SET_CONFIG_VAR(name, value) hookContext.config().template setVariable<name>(value)
45
#define GET_CONVAR_VALUE(name) hookContext.cvarSystem().template getConVarValue<name>()

0 commit comments

Comments
 (0)