Skip to content

Commit 021af0a

Browse files
Use Panorama event handlers for handling hue slider text entry submit
1 parent 6331269 commit 021af0a

File tree

7 files changed

+47
-127
lines changed

7 files changed

+47
-127
lines changed

Source/CS2/Panorama/CTextEntry.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace cs2
77

88
struct CTextEntry : CPanel2D {
99
using SetText = void(CTextEntry* thisptr, const char* text);
10+
11+
using TextEntrySubmitEventHandler = bool(void* delegateThisptr, CPanel2D* panel, const char* value);
1012
};
1113

1214
}

Source/EntryPoints/GuiEntryPoints.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ class GuiEntryPoints {
1212
hookContext.gui().template onHueSliderValueChanged<ConfigVariable>(kPanelName, value);
1313
return true;
1414
}
15+
16+
LINUX_ONLY([[gnu::aligned(8)]]) static bool hueSliderTextEntrySubmit(void* /* thisptr */, cs2::CPanel2D* /* panel */, const char* value)
17+
{
18+
HookContext hookContext;
19+
hookContext.gui().template onHueSliderTextEntrySubmit<ConfigVariable>(kPanelName, value);
20+
return true;
21+
}
1522
};

Source/UI/Panorama/CreateGUI.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,6 @@ u8R"(
456456
style: "width: 75px; margin-left: 10px; padding-left: 10px; text-align: center; font-size: 20px; color: #ccccccff; font-weight: bold; font-family: Stratum2, notosans, 'Arial Unicode MS'; border: 2px solid #cccccc15;"
457457
});
458458

459-
textEntry.SetPanelEvent('ontextentrysubmit', function () { $.Osiris.sliderTextEntryUpdated('visuals', `${id}_text`, textEntry); });
460459
textEntry.SetPanelEvent('onfocus', function () { textEntry.style.backgroundColor = 'gradient(linear, 100% 0%, 0% 0%, from(#00000080), color-stop(0, #00000060), to(#00000080))'; });
461460
textEntry.SetPanelEvent('onblur', function () { textEntry.style.backgroundColor = 'none'; });
462461
textEntry.SetPanelEvent('onmouseover', function () { if (!textEntry.BHasKeyFocus()) textEntry.style.backgroundColor = 'gradient(linear, 100% 0%, 0% 0%, from(#000000ff), color-stop(0, #00000000), to(#00000050));'; });

Source/UI/Panorama/PanoramaGUI.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,13 @@ class PanoramaGUI {
161161
hookContext.config().template setVariable<ConfigVariable>(typename ConfigVariable::ValueType{newVariableValue});
162162
}
163163

164+
template <typename ConfigVariable>
165+
void onHueSliderTextEntrySubmit(const char* panelId, const char* value) const noexcept
166+
{
167+
const auto newVariableValue = handleHueTextEntry(panelId, value, ConfigVariable::ValueType::kMin, ConfigVariable::ValueType::kMax, GET_CONFIG_VAR(ConfigVariable));
168+
hookContext.config().template setVariable<ConfigVariable>(typename ConfigVariable::ValueType{newVariableValue});
169+
}
170+
164171
[[nodiscard]] decltype(auto) modelGlowPreviewPanel(const char* panelId) const noexcept
165172
{
166173
auto&& guiPanel = uiEngine().getPanelFromHandle(state().guiPanelHandle);
@@ -223,6 +230,24 @@ class PanoramaGUI {
223230
return hookContext.template make<HueSlider>(guiPanel.findChildInLayoutFile(sliderId));
224231
}
225232

233+
[[nodiscard]] color::HueInteger handleHueTextEntry(const char* sliderId, const char* value, color::HueInteger min, color::HueInteger max, color::HueInteger current) const noexcept
234+
{
235+
auto&& hueSlider = getHueSlider(sliderId);
236+
color::HueInteger::UnderlyingType hueIntegral;
237+
if (!StringParser{value}.parseInt(hueIntegral) || hueIntegral < min || hueIntegral > max) {
238+
hueSlider.updateTextEntry(current);
239+
return current;
240+
}
241+
242+
if (hueIntegral == current)
243+
return current;
244+
245+
const color::HueInteger hue{hueIntegral};
246+
hueSlider.updateSlider(hue);
247+
hueSlider.updateColorPreview(hue);
248+
return hue;
249+
}
250+
226251
[[nodiscard]] color::HueInteger handleHueSlider(const char* sliderId, float value, color::HueInteger min, color::HueInteger max, color::HueInteger current) const noexcept
227252
{
228253
const auto hueIntegral = static_cast<color::HueInteger::UnderlyingType>(value);

Source/UI/Panorama/SetCommandHandler.h

Lines changed: 0 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -134,80 +134,6 @@ struct SetCommandHandler {
134134
modelGlowToggle().updateDefuseKitModelGlowToggle(parser.getChar());
135135
} else if (feature == "grenade_proj_model_glow") {
136136
modelGlowToggle().updateGrenadeProjectileModelGlowToggle(parser.getChar());
137-
} else if (feature == "player_model_glow_blue_hue_text") {
138-
handleHueTextEntry<model_glow_vars::PlayerBlueHue>("player_model_glow_blue_hue");
139-
} else if (feature == "player_model_glow_green_hue_text") {
140-
handleHueTextEntry<model_glow_vars::PlayerGreenHue>("player_model_glow_green_hue");
141-
} else if (feature == "player_model_glow_yellow_hue_text") {
142-
handleHueTextEntry<model_glow_vars::PlayerYellowHue>("player_model_glow_yellow_hue");
143-
} else if (feature == "player_model_glow_orange_hue_text") {
144-
handleHueTextEntry<model_glow_vars::PlayerOrangeHue>("player_model_glow_orange_hue");
145-
} else if (feature == "player_model_glow_purple_hue_text") {
146-
handleHueTextEntry<model_glow_vars::PlayerPurpleHue>("player_model_glow_purple_hue");
147-
} else if (feature == "player_model_glow_t_hue_text") {
148-
handleHueTextEntry<model_glow_vars::TeamTHue>("player_model_glow_t_hue");
149-
} else if (feature == "player_model_glow_ct_hue_text") {
150-
handleHueTextEntry<model_glow_vars::TeamCTHue>("player_model_glow_ct_hue");
151-
} else if (feature == "player_model_glow_low_hp_hue_text") {
152-
handleHueTextEntry<model_glow_vars::LowHealthHue>("player_model_glow_low_hp_hue");
153-
} else if (feature == "player_model_glow_high_hp_hue_text") {
154-
handleHueTextEntry<model_glow_vars::HighHealthHue>("player_model_glow_high_hp_hue");
155-
} else if (feature == "player_model_glow_enemy_hue_text") {
156-
handleHueTextEntry<model_glow_vars::EnemyHue>("player_model_glow_enemy_hue");
157-
} else if (feature == "player_model_glow_ally_hue_text") {
158-
handleHueTextEntry<model_glow_vars::AllyHue>("player_model_glow_ally_hue");
159-
} else if (feature == "model_glow_molotov_hue_text") {
160-
handleHueTextEntry<model_glow_vars::MolotovHue>("model_glow_molotov_hue");
161-
} else if (feature == "model_glow_flashbang_hue_text") {
162-
handleHueTextEntry<model_glow_vars::FlashbangHue>("model_glow_flashbang_hue");
163-
} else if (feature == "model_glow_hegrenade_hue_text") {
164-
handleHueTextEntry<model_glow_vars::HEGrenadeHue>("model_glow_hegrenade_hue");
165-
} else if (feature == "model_glow_smoke_hue_text") {
166-
handleHueTextEntry<model_glow_vars::SmokeGrenadeHue>("model_glow_smoke_hue");
167-
} else if (feature == "model_glow_dropped_bomb_hue_text") {
168-
handleHueTextEntry<model_glow_vars::DroppedBombHue>("model_glow_dropped_bomb_hue");
169-
} else if (feature == "model_glow_ticking_bomb_hue_text") {
170-
handleHueTextEntry<model_glow_vars::TickingBombHue>("model_glow_ticking_bomb_hue");
171-
} else if (feature == "model_glow_defuse_kit_hue_text") {
172-
handleHueTextEntry<model_glow_vars::DefuseKitHue>("model_glow_defuse_kit_hue");
173-
} else if (feature == "player_outline_glow_blue_hue_text") {
174-
handleHueTextEntry<outline_glow_vars::PlayerBlueHue>("player_outline_glow_blue_hue");
175-
} else if (feature == "player_outline_glow_green_hue_text") {
176-
handleHueTextEntry<outline_glow_vars::PlayerGreenHue>("player_outline_glow_green_hue");
177-
} else if (feature == "player_outline_glow_yellow_hue_text") {
178-
handleHueTextEntry<outline_glow_vars::PlayerYellowHue>("player_outline_glow_yellow_hue");
179-
} else if (feature == "player_outline_glow_orange_hue_text") {
180-
handleHueTextEntry<outline_glow_vars::PlayerOrangeHue>("player_outline_glow_orange_hue");
181-
} else if (feature == "player_outline_glow_purple_hue_text") {
182-
handleHueTextEntry<outline_glow_vars::PlayerPurpleHue>("player_outline_glow_purple_hue");
183-
} else if (feature == "player_outline_glow_t_hue_text") {
184-
handleHueTextEntry<outline_glow_vars::TeamTHue>("player_model_glow_t_hue");
185-
} else if (feature == "player_outline_glow_ct_hue_text") {
186-
handleHueTextEntry<outline_glow_vars::TeamCTHue>("player_outline_glow_ct_hue");
187-
} else if (feature == "player_outline_glow_low_hp_hue_text") {
188-
handleHueTextEntry<outline_glow_vars::LowHealthHue>("player_outline_glow_low_hp_hue");
189-
} else if (feature == "player_outline_glow_high_hp_hue_text") {
190-
handleHueTextEntry<outline_glow_vars::HighHealthHue>("player_outline_glow_high_hp_hue");
191-
} else if (feature == "player_outline_glow_enemy_hue_text") {
192-
handleHueTextEntry<outline_glow_vars::EnemyHue>("player_outline_glow_enemy_hue");
193-
} else if (feature == "player_outline_glow_ally_hue_text") {
194-
handleHueTextEntry<outline_glow_vars::AllyHue>("player_outline_glow_ally_hue");
195-
} else if (feature == "outline_glow_molotov_hue_text") {
196-
handleHueTextEntry<outline_glow_vars::MolotovHue>("outline_glow_molotov_hue");
197-
} else if (feature == "outline_glow_flashbang_hue_text") {
198-
handleHueTextEntry<outline_glow_vars::FlashbangHue>("outline_glow_flashbang_hue");
199-
} else if (feature == "outline_glow_hegrenade_hue_text") {
200-
handleHueTextEntry<outline_glow_vars::HEGrenadeHue>("outline_glow_hegrenade_hue");
201-
} else if (feature == "outline_glow_smoke_hue_text") {
202-
handleHueTextEntry<outline_glow_vars::SmokeGrenadeHue>("outline_glow_smoke_hue");
203-
} else if (feature == "outline_glow_dropped_bomb_hue_text") {
204-
handleHueTextEntry<outline_glow_vars::DroppedBombHue>("outline_glow_dropped_bomb_hue");
205-
} else if (feature == "outline_glow_ticking_bomb_hue_text") {
206-
handleHueTextEntry<outline_glow_vars::TickingBombHue>("outline_glow_ticking_bomb_hue");
207-
} else if (feature == "outline_glow_defuse_kit_hue_text") {
208-
handleHueTextEntry<outline_glow_vars::DefuseKitHue>("outline_glow_defuse_kit_hue");
209-
} else if (feature == "outline_glow_hostage_hue_text") {
210-
handleHueTextEntry<outline_glow_vars::HostageHue>("outline_glow_hostage_hue");
211137
} else if (feature == "viewmodel_mod") {
212138
handleTogglableVariable<viewmodel_mod_vars::Enabled>();
213139
} else if (feature == "viewmodel_fov_mod") {
@@ -273,62 +199,13 @@ struct SetCommandHandler {
273199
return value;
274200
}
275201

276-
template <typename ConfigVariable>
277-
void handleHueTextEntry(const char* sliderId) const noexcept
278-
{
279-
const auto newVariableValue = handleHueTextEntry(sliderId, ConfigVariable::ValueType::kMin, ConfigVariable::ValueType::kMax, GET_CONFIG_VAR(ConfigVariable));
280-
hookContext.config().template setVariable<ConfigVariable>(typename ConfigVariable::ValueType{newVariableValue});
281-
}
282-
283-
[[nodiscard]] color::HueInteger handleHueTextEntry(const char* sliderId, color::HueInteger min, color::HueInteger max, color::HueInteger current) const noexcept
284-
{
285-
auto&& hueSlider = getHueSlider(sliderId);
286-
const auto hue = parseHueVariable(min, max);
287-
if (!hue.has_value()) {
288-
hueSlider.updateTextEntry(current);
289-
return current;
290-
}
291-
292-
if (*hue == current)
293-
return current;
294-
295-
hueSlider.updateSlider(*hue);
296-
hueSlider.updateColorPreview(*hue);
297-
return *hue;
298-
}
299-
300-
[[nodiscard]] decltype(auto) getHueSlider(const char* sliderId) const noexcept
301-
{
302-
const auto mainMenuPointer = hookContext.patternSearchResults().template get<MainMenuPanelPointer>();
303-
auto&& mainMenu = hookContext.template make<ClientPanel>(mainMenuPointer ? *mainMenuPointer : nullptr).uiPanel();
304-
return hookContext.template make<HueSlider>(mainMenu.findChildInLayoutFile(sliderId));
305-
}
306-
307202
[[nodiscard]] decltype(auto) getIntSlider(const char* sliderId) const noexcept
308203
{
309204
const auto mainMenuPointer = hookContext.patternSearchResults().template get<MainMenuPanelPointer>();
310205
auto&& mainMenu = hookContext.template make<ClientPanel>(mainMenuPointer ? *mainMenuPointer : nullptr).uiPanel();
311206
return hookContext.template make<IntSlider>(mainMenu.findChildInLayoutFile(sliderId));
312207
}
313208

314-
[[nodiscard]] [[NOINLINE]] std::optional<color::HueInteger> parseHueVariable(color::HueInteger min, color::HueInteger max) const noexcept
315-
{
316-
const auto hueInteger = parseHueInteger();
317-
if (!hueInteger.has_value())
318-
return {};
319-
320-
if (*hueInteger >= min && *hueInteger <= max)
321-
return *hueInteger;
322-
return {};
323-
}
324-
325-
[[nodiscard]] std::optional<color::HueInteger> parseHueInteger() const noexcept
326-
{
327-
if (color::HueInteger::UnderlyingType underlying; parser.parseInt(underlying) && underlying >= color::HueInteger::kMin && underlying <= color::HueInteger::kMax)
328-
return color::HueInteger{underlying};
329-
return {};
330-
}
331-
332209
[[nodiscard]] auto playerInfoInWorldToggle() const noexcept
333210
{
334211
return PlayerInfoInWorldToggle{hookContext};

Source/UI/Panorama/Tabs/VisualsTab/HueSlider.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ class HueSlider {
4040
);
4141
}
4242

43+
void registerTextEntrySubmitHandler(cs2::CTextEntry::TextEntrySubmitEventHandler* func)
44+
{
45+
auto&& uiEngine = hookContext.template make<PanoramaUiEngine>();
46+
uiEngine.registerEventHandler(
47+
uiEngine.makeSymbol(0, "TextEntrySubmit"),
48+
panel().children()[1],
49+
cs2::CUtlAbstractDelegate{func}
50+
);
51+
}
52+
4353
private:
4454
[[nodiscard]] decltype(auto) panel() const noexcept
4555
{

Source/UI/Panorama/VisualsTab.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ class VisualsTab {
7979
template <typename ConfigVariable, TemplateParameterCstring kPanelId>
8080
void registerHueSliderUpdateHandler(auto&& guiPanel) const
8181
{
82-
hookContext.template make<HueSlider>(guiPanel.findChildInLayoutFile(kPanelId)).registerSliderValueChangedHandler(
83-
&GuiEntryPoints<HookContext, ConfigVariable, kPanelId>::hueSliderValueChanged
84-
);
82+
auto&& hueSlider = hookContext.template make<HueSlider>(guiPanel.findChildInLayoutFile(kPanelId));
83+
hueSlider.registerSliderValueChangedHandler(&GuiEntryPoints<HookContext, ConfigVariable, kPanelId>::hueSliderValueChanged);
84+
hueSlider.registerTextEntrySubmitHandler(&GuiEntryPoints<HookContext, ConfigVariable, kPanelId>::hueSliderTextEntrySubmit);
8585
}
8686

8787
void updatePlayerInfoInWorldTab(auto&& mainMenu) const noexcept

0 commit comments

Comments
 (0)