]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/item/container.c
Merge commit 'origin/master' into diabolik/nexmodel
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / item / container.c
index b29eea0b80ea70c8ed805682d6e38665cd580b8f..d10e6a486d99d981083a26725e8f57237c2ead7e 100644 (file)
@@ -9,7 +9,7 @@ CLASS(Container) EXTENDS(Item)
        METHOD(Container, mouseRelease, float(entity, vector))
        METHOD(Container, focusLeave, void(entity))
        METHOD(Container, resizeNotify, void(entity, vector, vector, vector, vector))
-       METHOD(Container, resizeNotifyLie, void(entity, vector, vector, vector, vector, .vector, .vector))
+       METHOD(Container, resizeNotifyLie, void(entity, vector, vector, vector, vector, .vector, .vector, .vector))
        METHOD(Container, addItem, void(entity, entity, vector, vector, float))
        METHOD(Container, addItemCentered, void(entity, entity, vector, float))
        METHOD(Container, moveItemAfter, void(entity, entity, entity))
@@ -25,6 +25,10 @@ CLASS(Container) EXTENDS(Item)
        ATTRIB(Container, lastChild, entity, NULL)
        ATTRIB(Container, focusedChild, entity, NULL)
        ATTRIB(Container, shown, float, 0)
+
+       METHOD(Container, enterSubitem, void(entity, entity))
+       METHOD(Container, enterLieSubitem, void(entity, vector, vector, vector, float))
+       METHOD(Container, leaveSubitem, void(entity))
 ENDCLASS(Container)
 .entity nextSibling;
 .entity prevSibling;
@@ -33,9 +37,40 @@ ENDCLASS(Container)
 .vector Container_size;
 .vector Container_fontscale;
 .float Container_alpha;
+.vector Container_save_shift;
+.vector Container_save_scale;
+.vector Container_save_fontscale;
+.float Container_save_alpha;
 #endif
 
 #ifdef IMPLEMENTATION
+void Container_enterSubitem(entity me, entity sub)
+{
+       me.enterLieSubitem(me, sub.Container_origin, sub.Container_size, sub.Container_fontscale, sub.Container_alpha);
+}
+
+void Container_enterLieSubitem(entity me, vector o, vector s, vector f, float a)
+{
+       me.Container_save_shift = draw_shift;
+       me.Container_save_scale = draw_scale;
+       me.Container_save_alpha = draw_alpha;
+       me.Container_save_fontscale = draw_fontscale;
+
+       draw_shift = boxToGlobal(o, draw_shift, draw_scale);
+       draw_scale = boxToGlobalSize(s, draw_scale);
+       if(f != '0 0 0')
+               draw_fontscale = boxToGlobalSize(f, draw_fontscale);
+       draw_alpha *= a;
+}
+
+void Container_leaveSubitem(entity me)
+{
+       draw_shift = me.Container_save_shift;
+       draw_scale = me.Container_save_scale;
+       draw_alpha = me.Container_save_alpha;
+       draw_fontscale = me.Container_save_fontscale;
+}
+
 void Container_showNotify(entity me)
 {
        entity e;
@@ -73,7 +108,7 @@ void Container_setAlphaOf(entity me, entity other, float theAlpha)
        other.Container_alpha = theAlpha;
 }
 
-void Container_resizeNotifyLie(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize, .vector originField, .vector sizeField)
+void Container_resizeNotifyLie(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize, .vector originField, .vector sizeField, .vector fontScaleField)
 {
        entity e;
        vector o, s;
@@ -82,7 +117,9 @@ void Container_resizeNotifyLie(entity me, vector relOrigin, vector relSize, vect
        {
                o = e.originField;
                s = e.sizeField;
+               me.enterLieSubitem(me, o, s, e.fontScaleField, e.Container_alpha);
                e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
+               me.leaveSubitem(me);
        }
        do
        {
@@ -94,7 +131,9 @@ void Container_resizeNotifyLie(entity me, vector relOrigin, vector relSize, vect
                                d = 1;
                                o = e.originField;
                                s = e.sizeField;
+                               me.enterLieSubitem(me, o, s, e.fontScaleField, e.Container_alpha);
                                e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
+                               me.leaveSubitem(me);
                        }
        }
        while(d);
@@ -103,7 +142,7 @@ void Container_resizeNotifyLie(entity me, vector relOrigin, vector relSize, vect
 
 void Container_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-       me.resizeNotifyLie(me, relOrigin, relSize, absOrigin, absSize, Container_origin, Container_size);
+       me.resizeNotifyLie(me, relOrigin, relSize, absOrigin, absSize, Container_origin, Container_size, Container_fontscale);
 }
 
 entity Container_itemFromPoint(entity me, vector pos)
@@ -125,16 +164,8 @@ entity Container_itemFromPoint(entity me, vector pos)
 
 void Container_draw(entity me)
 {
-       vector oldshift;
-       vector oldscale;
-       float oldalpha;
-       vector oldfontscale;
        entity e;
 
-       oldshift = draw_shift;
-       oldscale = draw_scale;
-       oldalpha = draw_alpha;
-       oldfontscale = draw_fontscale;
        me.focusable = 0;
        for(e = me.firstChild; e; e = e.nextSibling)
        {
@@ -142,16 +173,9 @@ void Container_draw(entity me)
                        me.focusable += 1;
                if(e.Container_alpha < 0.003) // can't change color values anyway
                        continue;
-               draw_shift = boxToGlobal(e.Container_origin, oldshift, oldscale);
-               draw_scale = boxToGlobalSize(e.Container_size, oldscale);
-               if(e.Container_fontscale != '0 0 0')
-                       draw_fontscale = boxToGlobalSize(e.Container_fontscale, oldfontscale);
-               draw_alpha *= e.Container_alpha;
+               me.enterSubitem(me, e);
                e.draw(e);
-               draw_shift = oldshift;
-               draw_scale = oldscale;
-               draw_fontscale = oldfontscale;
-               draw_alpha = oldalpha;
+               me.leaveSubitem(me);
        }
 };
 
@@ -163,51 +187,87 @@ void Container_focusLeave(entity me)
 float Container_keyUp(entity me, float scan, float ascii, float shift)
 {
        entity f;
+       float r;
        f = me.focusedChild;
        if(f)
-               return f.keyUp(f, scan, ascii, shift);
+       {
+               me.enterSubitem(me, f);
+               r = f.keyUp(f, scan, ascii, shift);
+               me.leaveSubitem(me);
+               return r;
+       }
        return 0;
 }
 
 float Container_keyDown(entity me, float scan, float ascii, float shift)
 {
        entity f;
+       float r;
        f = me.focusedChild;
        if(f)
-               return f.keyDown(f, scan, ascii, shift);
+       {
+               me.enterSubitem(me, f);
+               r = f.keyDown(f, scan, ascii, shift);
+               me.leaveSubitem(me);
+               return r;
+       }
        return 0;
 }
 
 float Container_mouseMove(entity me, vector pos)
 {
        entity f;
+       float r;
        f = me.focusedChild;
        if(f)
-               return f.mouseMove(f, globalToBox(pos, f.Container_origin, f.Container_size));
+       {
+               me.enterSubitem(me, f);
+               r = f.mouseMove(f, globalToBox(pos, f.Container_origin, f.Container_size));
+               me.leaveSubitem(me);
+               return r;
+       }
        return 0;
 }
 float Container_mousePress(entity me, vector pos)
 {
        entity f;
+       float r;
        f = me.focusedChild;
        if(f)
-               return f.mousePress(f, globalToBox(pos, f.Container_origin, f.Container_size));
+       {
+               me.enterSubitem(me, f);
+               r = f.mousePress(f, globalToBox(pos, f.Container_origin, f.Container_size));
+               me.leaveSubitem(me);
+               return r;
+       }
        return 0;
 }
 float Container_mouseDrag(entity me, vector pos)
 {
        entity f;
+       float r;
        f = me.focusedChild;
        if(f)
-               return f.mouseDrag(f, globalToBox(pos, f.Container_origin, f.Container_size));
+       {
+               me.enterSubitem(me, f);
+               r = f.mouseDrag(f, globalToBox(pos, f.Container_origin, f.Container_size));
+               me.leaveSubitem(me);
+               return r;
+       }
        return 0;
 }
 float Container_mouseRelease(entity me, vector pos)
 {
        entity f;
+       float r;
        f = me.focusedChild;
        if(f)
-               return f.mouseRelease(f, globalToBox(pos, f.Container_origin, f.Container_size));
+       {
+               me.enterSubitem(me, f);
+               r = f.mouseRelease(f, globalToBox(pos, f.Container_origin, f.Container_size));
+               me.leaveSubitem(me);
+               return r;
+       }
        return 0;
 }