]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/item/container.c
Merge branch 'master' into terencehill/music_player
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / item / container.c
index b29eea0b80ea70c8ed805682d6e38665cd580b8f..8bc925f1ca1d8594c768d75f719dd15eaf238e54 100644 (file)
@@ -9,12 +9,13 @@ 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))
        METHOD(Container, removeItem, void(entity, entity))
        METHOD(Container, setFocus, void(entity, entity))
+       METHOD(Container, saveFocus, void(entity))
        METHOD(Container, setAlphaOf, void(entity, entity, float))
        METHOD(Container, itemFromPoint, entity(entity, vector))
        METHOD(Container, showNotify, void(entity))
@@ -24,7 +25,12 @@ CLASS(Container) EXTENDS(Item)
        ATTRIB(Container, firstChild, entity, NULL)
        ATTRIB(Container, lastChild, entity, NULL)
        ATTRIB(Container, focusedChild, entity, NULL)
+       ATTRIB(Container, savedFocus, 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 +39,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;
@@ -50,7 +87,7 @@ void Container_showNotify(entity me)
 void Container_hideNotify(entity me)
 {
        entity e;
-       if not(me.shown)
+       if (!me.shown)
                return;
        me.shown = 0;
        for(e = me.firstChild; e; e = e.nextSibling)
@@ -73,7 +110,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 +119,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 +133,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 +144,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 +166,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,18 +175,13 @@ 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);
        }
-};
+
+       SUPER(Container).draw(me);
+}
 
 void Container_focusLeave(entity me)
 {
@@ -163,51 +191,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;
 }
 
@@ -242,8 +306,7 @@ void Container_addItem(entity me, entity other, vector theOrigin, vector theSize
        other.Container_size = theSize;
        me.setAlphaOf(me, other, theAlpha);
 
-       entity f, l;
-       f = me.firstChild;
+       entity l;
        l = me.lastChild;
 
        if(l)
@@ -254,8 +317,6 @@ void Container_addItem(entity me, entity other, vector theOrigin, vector theSize
        other.prevSibling = l;
        other.nextSibling = NULL;
        me.lastChild = other;
-
-       draw_NeedResizeNotify = 1;
 }
 
 void Container_removeItem(entity me, entity other)
@@ -268,9 +329,7 @@ void Container_removeItem(entity me, entity other)
 
        other.parent = NULL;
 
-       entity n, p, f, l;
-       f = me.firstChild;
-       l = me.lastChild;
+       entity n, p;
        n = other.nextSibling;
        p = other.prevSibling;
 
@@ -287,35 +346,56 @@ void Container_removeItem(entity me, entity other)
 
 void Container_setFocus(entity me, entity other)
 {
-       if(other)
-               if not(me.focused)
-                       error("Trying to set focus in a non-focused control!");
        if(me.focusedChild == other)
                return;
-       //print(etos(me), ": focus changes from ", etos(me.focusedChild), " to ", etos(other), "\n");
+
        if(me.focusedChild)
        {
                me.focusedChild.focused = 0;
                me.focusedChild.focusLeave(me.focusedChild);
+               me.focusedChild = NULL;
        }
+
        if(other)
        {
-               other.focused = 1;
-               other.focusEnter(other);
+               if(!me.focused)
+                       error("Trying to set focus in a non-focused control!");
+
+               if(me.savedFocus)
+               {
+                       me.focusedChild = me.savedFocus;
+                       me.savedFocus = NULL;
+                       me.focusedChild.focused = 1;
+                       me.focusedChild.focusEnter(me.focusedChild);
+
+                       if(me.focusedChild.instanceOfContainer)
+                               me.focusedChild.setFocus(me.focusedChild, me.focusedChild.savedFocus);
+               }
+               else
+               {
+                       me.focusedChild = other;
+                       me.focusedChild.focused = 1;
+                       me.focusedChild.focusEnter(me.focusedChild);
+               }
        }
-       me.focusedChild = other;
+}
+
+void Container_saveFocus(entity me)
+{
+       me.savedFocus = me.focusedChild;
+
+       if(me.focusedChild.instanceOfContainer)
+               me.focusedChild.saveFocus(me.focusedChild);
 }
 
 void Container_moveItemAfter(entity me, entity other, entity dest)
 {
        // first: remove other from the chain
-       entity n, p, f, l;
+       entity n, p;
 
        if(other.parent != me)
                error("Can't move in wrong container!");
 
-       f = me.firstChild;
-       l = me.lastChild;
        n = other.nextSibling;
        p = other.prevSibling;
 
@@ -328,7 +408,7 @@ void Container_moveItemAfter(entity me, entity other, entity dest)
                n.prevSibling = p;
        else
                me.lastChild = p;
-       
+
        // now other got removed. Insert it behind dest now.
        other.prevSibling = dest;
        if(dest)