]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/item/slider.qc
Merge branch 'TimePath/cleanup'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / item / slider.qc
index 2c74f6131c8f06e40e4a530bcb3720e2e2612613..3bde6565a6b6f16d1b436336479d5e32a091d510 100644 (file)
@@ -1,27 +1,32 @@
 // Note:
 //   to use this, you FIRST call configureSliderVisuals, then configureSliderValues
-#ifdef INTERFACE
-CLASS(Slider) EXTENDS(Label)
-       METHOD(Slider, resizeNotify, void(entity, vector, vector, vector, vector))
-       METHOD(Slider, configureSliderVisuals, void(entity, float, float, float, string))
-       METHOD(Slider, configureSliderValues, void(entity, float, float, float, float, float, float))
-       METHOD(Slider, draw, void(entity))
-       METHOD(Slider, keyDown, float(entity, float, float, float))
-       METHOD(Slider, keyUp, float(entity, float, float, float))
-       METHOD(Slider, mousePress, float(entity, vector))
-       METHOD(Slider, mouseDrag, float(entity, vector))
-       METHOD(Slider, mouseRelease, float(entity, vector))
-       METHOD(Slider, valueToText, string(entity, float))
-       METHOD(Slider, toString, string(entity))
-       METHOD(Slider, setValue, void(entity, float))
-       METHOD(Slider, setSliderValue, void(entity, float))
-       METHOD(Slider, showNotify, void(entity))
+#ifndef ITEM_SLIDER_H
+#define ITEM_SLIDER_H
+#include "label.qc"
+CLASS(Slider, Label)
+       METHOD(Slider, resizeNotify, void(entity, vector, vector, vector, vector));
+       METHOD(Slider, configureSliderVisuals, void(entity, float, float, float, string));
+       METHOD(Slider, configureSliderValues, void(entity, float, float, float, float, float, float));
+       METHOD(Slider, draw, void(entity));
+       METHOD(Slider, keyDown, float(entity, float, float, float));
+       METHOD(Slider, keyUp, float(entity, float, float, float));
+       METHOD(Slider, mousePress, float(entity, vector));
+       METHOD(Slider, mouseDrag, float(entity, vector));
+       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));
        ATTRIB(Slider, src, string, string_null)
        ATTRIB(Slider, focusable, float, 1)
        ATTRIB(Slider, allowFocusSound, float, 1)
        ATTRIB(Slider, value, float, 0)
        ATTRIB(Slider, animated, float, 1)
        ATTRIB(Slider, sliderValue, float, 0)
+       ATTRIB(Slider, sliderAnim, entity, NULL)
        ATTRIB(Slider, valueMin, float, 0)
        ATTRIB(Slider, valueMax, float, 0)
        ATTRIB(Slider, valueStep, float, 0)
@@ -46,16 +51,27 @@ 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.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;
@@ -67,7 +83,7 @@ string Slider_toString(entity me)
 void Slider_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
        SUPER(Slider).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
-       me.controlWidth = absSize.y / absSize.x;
+       me.controlWidth = absSize.x == 0 ? 0 : (absSize.y / absSize.x);
 }
 string Slider_valueToText(entity me, float val)
 {
@@ -175,14 +191,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;
@@ -192,17 +204,18 @@ 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;
-                       me.setValue(me, v);
+                       me.setValue_noAnim(me, v);
                }
                else
                        me.setValue(me, me.previousValue);
        }
 
-       me.animated = animed;
-
        return 1;
 }
 float Slider_mousePress(entity me, vector pos)
@@ -293,6 +306,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 = NULL;
+       }
+
        me.setText(me, me.valueToText(me, me.value));
        draw_alpha = save;
        SUPER(Slider).draw(me);