Merge branch 'master' into terencehill/slider_anim_improvements
authorterencehill <piuntn@gmail.com>
Sat, 5 Sep 2015 10:42:06 +0000 (12:42 +0200)
committerterencehill <piuntn@gmail.com>
Sat, 5 Sep 2015 10:42:06 +0000 (12:42 +0200)
qcsrc/menu/anim/animation.qc
qcsrc/menu/item/slider.qc
qcsrc/menu/item/textslider.qc
qcsrc/menu/xonotic/slider.qc
qcsrc/menu/xonotic/slider_decibels.qc
qcsrc/menu/xonotic/slider_particles.qc
qcsrc/menu/xonotic/slider_resolution.qc
qcsrc/menu/xonotic/slider_sbfadetime.qc
qcsrc/menu/xonotic/textslider.qc

index d52ae4f..5563b96 100644 (file)
@@ -4,6 +4,7 @@
 void setterDummy(entity, float);
 CLASS(Animation, Object)
        METHOD(Animation, configureAnimation, void(entity, entity, void(entity, float), float, float, float, float));
+       METHOD(Animation, update, void(entity, float, float, float));
        METHOD(Animation, setTimeStartEnd, void(entity, float, float));
        METHOD(Animation, setTimeStartDuration, void(entity, float, float));
        METHOD(Animation, setValueStartEnd, void(entity, float, float));
@@ -36,6 +37,12 @@ void Animation_configureAnimation(entity me, entity obj, void(entity, float) obj
        me.setValueStartEnd(me, animStartValue, animEndValue);
 }
 
+void Animation_update(entity me, float animDuration, float animStartValue, float animEndValue)
+{
+       me.setTimeStartDuration(me, time, animDuration);
+       me.setValueStartEnd(me, animStartValue, animEndValue);
+}
+
 void Animation_setTimeStartEnd(entity me, float s, float e)
 {
        me.startTime = s;
index 4654425..daad34a 100644 (file)
@@ -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));
@@ -24,6 +26,7 @@ CLASS(Slider, Label)
        ATTRIB(Slider, value, float, 0)
        ATTRIB(Slider, animated, float, 1)
        ATTRIB(Slider, sliderValue, float, 0)
+       ATTRIB(Slider, sliderAnim, entity, world)
        ATTRIB(Slider, valueMin, float, 0)
        ATTRIB(Slider, valueMax, float, 0)
        ATTRIB(Slider, valueStep, float, 0)
@@ -48,16 +51,29 @@ 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) {
-               anim.removeObjAnim(anim, me);
-               makeHostedEasing(me, Slider_setSliderValue, easingQuadInOut, 1, me.sliderValue, val);
+       if(allowAnim && me.animated) {
+               float t = 0.5;
+               if(me.pressed == 2)
+                       t = 0.3; // slightly more responsive while dragging the handle
+               if(!me.sliderAnim)
+                       me.sliderAnim = makeHostedEasing(me, Slider_setSliderValue, easingQuadOut, t, me.sliderValue, val);
+               else
+                       me.sliderAnim.update(me.sliderAnim, t, me.sliderValue, val);
        } else {
                me.setSliderValue(me, 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;
@@ -177,14 +193,10 @@ float Slider_keyUp(entity me, float key, float ascii, float shift)
 float Slider_mouseDrag(entity me, vector pos)
 {
        float hit;
-       float v, animed;
+       float v;
        if(me.disabled)
                return 0;
 
-       anim.removeObjAnim(anim, me);
-       animed = me.animated;
-       me.animated = false;
-
        if(me.pressed)
        {
                hit = 1;
@@ -194,6 +206,9 @@ float Slider_mouseDrag(entity me, vector pos)
                if(pos.y >= 1 + me.tolerance.y) hit = 0;
                if(hit)
                {
+                       // handle dragging
+                       me.pressed = 2;
+
                        v = median(0, (pos.x - me.pressOffset - 0.5 * me.controlWidth) / (1 - me.textSpace - me.controlWidth), 1) * (me.valueMax - me.valueMin) + me.valueMin;
                        if(me.valueStep)
                                v = floor(0.5 + v / me.valueStep) * me.valueStep;
@@ -203,8 +218,6 @@ float Slider_mouseDrag(entity me, vector pos)
                        me.setValue(me, me.previousValue);
        }
 
-       me.animated = animed;
-
        return 1;
 }
 float Slider_mousePress(entity me, vector pos)
@@ -295,6 +308,14 @@ void Slider_draw(entity me)
                else
                        draw_Picture(eX * controlLeft, strcat(me.src, "_n"), eX * me.controlWidth + eY, me.color, 1);
        }
+
+       if(me.sliderAnim)
+       if(me.sliderAnim.isFinished(me.sliderAnim))
+       {
+               anim.removeObjAnim(anim, me);
+               me.sliderAnim = world;
+       }
+
        me.setText(me, me.valueToText(me, me.value));
        draw_alpha = save;
        SUPER(Slider).draw(me);
index 733b1d6..30b80c1 100644 (file)
@@ -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
index 46379d5..d1e4f7e 100644 (file)
@@ -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)
 {
index eabbaf1..2878b50 100644 (file)
@@ -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)
 {
index f7acdfe..a0d5225 100644 (file)
@@ -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")
index 93291ea..954d975 100644 (file)
@@ -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)
 {
index d64a990..a66d2d1 100644 (file)
@@ -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")
        ));
index 8864654..1b19687 100644 (file)
@@ -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)