From b41b1b47e0f20ed2d30358311ba111d82da56f54 Mon Sep 17 00:00:00 2001
From: terencehill <piuntn@gmail.com>
Date: Sat, 5 Sep 2015 00:30:33 +0200
Subject: [PATCH] Don't play any animation when loading the initial value of a
 slider since the animation can't be seen anyway (the menu takes 2-3 seconds
 to load); also the high number (200) of animations played at once on menu
 start caused a bug where slider's handles couldn't be moved for a while (up
 to 12 seconds with 30 fps)

---
 qcsrc/menu/item/slider.qc               | 14 ++++++++++++--
 qcsrc/menu/item/textslider.qc           | 18 ++++++++++++++----
 qcsrc/menu/xonotic/slider.qc            |  2 +-
 qcsrc/menu/xonotic/slider_decibels.qc   |  4 ++--
 qcsrc/menu/xonotic/slider_particles.qc  |  2 +-
 qcsrc/menu/xonotic/slider_resolution.qc |  2 +-
 qcsrc/menu/xonotic/slider_sbfadetime.qc |  2 +-
 qcsrc/menu/xonotic/textslider.qc        |  4 ++--
 8 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/qcsrc/menu/item/slider.qc b/qcsrc/menu/item/slider.qc
index cdc8e2b954..daad34a168 100644
--- a/qcsrc/menu/item/slider.qc
+++ b/qcsrc/menu/item/slider.qc
@@ -15,6 +15,8 @@ CLASS(Slider, Label)
 	METHOD(Slider, mouseRelease, float(entity, vector));
 	METHOD(Slider, valueToText, string(entity, float));
 	METHOD(Slider, toString, string(entity));
+	METHOD(Slider, setValue_allowAnim, void(entity, float, bool));
+	METHOD(Slider, setValue_noAnim, void(entity, float));
 	METHOD(Slider, setValue, void(entity, float));
 	METHOD(Slider, setSliderValue, void(entity, float));
 	METHOD(Slider, showNotify, void(entity));
@@ -49,9 +51,9 @@ ENDCLASS(Slider)
 #endif
 
 #ifdef IMPLEMENTATION
-void Slider_setValue(entity me, float val)
+void Slider_setValue_allowAnim(entity me, float val, bool allowAnim)
 {
-	if (me.animated) {
+	if(allowAnim && me.animated) {
 		float t = 0.5;
 		if(me.pressed == 2)
 			t = 0.3; // slightly more responsive while dragging the handle
@@ -64,6 +66,14 @@ void Slider_setValue(entity me, float val)
 	}
 	me.value = val;
 }
+void Slider_setValue_noAnim(entity me, float val)
+{
+	Slider_setValue_allowAnim(me, val, false);
+}
+void Slider_setValue(entity me, float val)
+{
+	Slider_setValue_allowAnim(me, val, true);
+}
 void Slider_setSliderValue(entity me, float val)
 {
 	me.sliderValue = val;
diff --git a/qcsrc/menu/item/textslider.qc b/qcsrc/menu/item/textslider.qc
index 733b1d6125..30b80c196d 100644
--- a/qcsrc/menu/item/textslider.qc
+++ b/qcsrc/menu/item/textslider.qc
@@ -6,6 +6,8 @@
 CLASS(TextSlider, Slider)
 	METHOD(TextSlider, valueToText, string(entity, float));
 	METHOD(TextSlider, valueToIdentifier, string(entity, float));
+	METHOD(TextSlider, setValueFromIdentifier_allowAnim, void(entity, string, bool));
+	METHOD(TextSlider, setValueFromIdentifier_noAnim, void(entity, string));
 	METHOD(TextSlider, setValueFromIdentifier, void(entity, string));
 	METHOD(TextSlider, getIdentifier, string(entity));
 	METHOD(TextSlider, clearValues, void(entity));
@@ -35,16 +37,24 @@ string TextSlider_valueToText(entity me, int val)
 		return _("Custom");
 	return me.(valueStrings[val]);
 }
-void TextSlider_setValueFromIdentifier(entity me, string id)
+void TextSlider_setValueFromIdentifier_allowAnim(entity me, string id, bool allowAnim)
 {
 	int i;
 	for(i = 0; i < me.nValues; ++i)
 		if(me.valueToIdentifier(me, i) == id)
 		{
-			SUPER(TextSlider).setValue( me, i );
+			SUPER(TextSlider).setValue_allowAnim(me, i, allowAnim);
 			return;
 		}
-	SUPER(TextSlider).setValue( me, -1 );
+	SUPER(TextSlider).setValue_allowAnim(me, -1, allowAnim);
+}
+void TextSlider_setValueFromIdentifier_noAnim(entity me, string id)
+{
+	TextSlider_setValueFromIdentifier_allowAnim(me, id, false);
+}
+void TextSlider_setValueFromIdentifier(entity me, string id)
+{
+	TextSlider_setValueFromIdentifier_allowAnim(me, id, true);
 }
 string TextSlider_getIdentifier(entity me)
 {
@@ -75,6 +85,6 @@ void TextSlider_insertValue(entity me, int pos, string theString, string theIden
 void TextSlider_configureTextSliderValues(entity me, string theDefault)
 {
 	me.configureSliderValues(me, 0, 0, me.nValues - 1, 1, 1, 1);
-	me.setValueFromIdentifier(me, theDefault);
+	me.setValueFromIdentifier_noAnim(me, theDefault);
 }
 #endif
diff --git a/qcsrc/menu/xonotic/slider.qc b/qcsrc/menu/xonotic/slider.qc
index 46379d5a35..d1e4f7e078 100644
--- a/qcsrc/menu/xonotic/slider.qc
+++ b/qcsrc/menu/xonotic/slider.qc
@@ -68,7 +68,7 @@ void XonoticSlider_loadCvars(entity me)
 	if (!me.cvarName)
 		return;
 
-	me.setValue( me, cvar(me.cvarName) );
+	me.setValue_noAnim(me, cvar(me.cvarName));
 }
 void XonoticSlider_saveCvars(entity me)
 {
diff --git a/qcsrc/menu/xonotic/slider_decibels.qc b/qcsrc/menu/xonotic/slider_decibels.qc
index eabbaf16d5..2878b50568 100644
--- a/qcsrc/menu/xonotic/slider_decibels.qc
+++ b/qcsrc/menu/xonotic/slider_decibels.qc
@@ -57,9 +57,9 @@ void XonoticDecibelsSlider_loadCvars(entity me)
 
 	// snapping
 	if(v > fromDecibelOfSquare(me.valueMax - 0.5 * me.valueStep, me.valueMin))
-		Slider_setValue(me, me.valueMax);
+		Slider_setValue_noAnim(me, me.valueMax);
 	else
-		Slider_setValue(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep) );
+		Slider_setValue_noAnim(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v, me.valueMin) / me.valueStep));
 }
 void XonoticDecibelsSlider_saveCvars(entity me)
 {
diff --git a/qcsrc/menu/xonotic/slider_particles.qc b/qcsrc/menu/xonotic/slider_particles.qc
index f7acdfeca3..a0d5225c54 100644
--- a/qcsrc/menu/xonotic/slider_particles.qc
+++ b/qcsrc/menu/xonotic/slider_particles.qc
@@ -31,7 +31,7 @@ void XonoticParticlesSlider_configureXonoticParticlesSlider(entity me)
 }
 void XonoticParticlesSlider_loadCvars(entity me)
 {
-	me.setValueFromIdentifier(me, sprintf("%s %s %s",
+	me.setValueFromIdentifier_noAnim(me, sprintf("%s %s %s",
 		cvar_string("cl_particles_quality"),
 		cvar_string("r_drawparticles_drawdistance"),
 		cvar_string("cl_damageeffect")
diff --git a/qcsrc/menu/xonotic/slider_resolution.qc b/qcsrc/menu/xonotic/slider_resolution.qc
index 93291ea1d3..954d975322 100644
--- a/qcsrc/menu/xonotic/slider_resolution.qc
+++ b/qcsrc/menu/xonotic/slider_resolution.qc
@@ -211,7 +211,7 @@ void XonoticResolutionSlider_loadResolutions(entity me, float fullscreen)
 }
 void XonoticResolutionSlider_loadCvars(entity me)
 {
-	me.setValueFromIdentifier(me, strcat(cvar_string("_menu_vid_width"), " ", cvar_string("_menu_vid_height"), " ", cvar_string("_menu_vid_pixelheight")));
+	me.setValueFromIdentifier_noAnim(me, strcat(cvar_string("_menu_vid_width"), " ", cvar_string("_menu_vid_height"), " ", cvar_string("_menu_vid_pixelheight")));
 }
 void XonoticResolutionSlider_saveCvars(entity me)
 {
diff --git a/qcsrc/menu/xonotic/slider_sbfadetime.qc b/qcsrc/menu/xonotic/slider_sbfadetime.qc
index d64a990d23..a66d2d1453 100644
--- a/qcsrc/menu/xonotic/slider_sbfadetime.qc
+++ b/qcsrc/menu/xonotic/slider_sbfadetime.qc
@@ -28,7 +28,7 @@ void XonoticScoreboardFadeTimeSlider_configureXonoticScoreboardFadeTimeSlider(en
 }
 void XonoticScoreboardFadeTimeSlider_loadCvars(entity me)
 {
-	me.setValueFromIdentifier(me, sprintf("%s %s",
+	me.setValueFromIdentifier_noAnim(me, sprintf("%s %s",
 		cvar_string("scoreboard_fadeinspeed"),
 		cvar_string("scoreboard_fadeoutspeed")
 	));
diff --git a/qcsrc/menu/xonotic/textslider.qc b/qcsrc/menu/xonotic/textslider.qc
index 8864654040..1b1968751c 100644
--- a/qcsrc/menu/xonotic/textslider.qc
+++ b/qcsrc/menu/xonotic/textslider.qc
@@ -63,7 +63,7 @@ void XonoticTextSlider_loadCvars(entity me)
 	float i;
 	for(i = 1; i < n; ++i)
 		s = strcat(s, " ", cvar_string(argv(i)));
-	me.setValueFromIdentifier(me, s);
+	me.setValueFromIdentifier_noAnim(me, s);
 	if(me.value < 0 && n > 1)
 	{
 		// if it failed: check if all cvars have the same value
@@ -72,7 +72,7 @@ void XonoticTextSlider_loadCvars(entity me)
 			if(cvar_string(argv(i)) != cvar_string(argv(i-1)))
 				break;
 		if(i >= n)
-			me.setValueFromIdentifier(me, cvar_string(argv(0)));
+			me.setValueFromIdentifier_noAnim(me, cvar_string(argv(0)));
 	}
 }
 void XonoticTextSlider_saveCvars(entity me)
-- 
2.39.5