From: Severin Meyer Date: Fri, 14 Nov 2014 01:05:46 +0000 (+0100) Subject: Enable the Container class to save and restore the focus chain X-Git-Tag: xonotic-v0.8.0~148^2~3 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=febd2205e534be3ff5310e0f546b871f5a0c383b;p=xonotic%2Fxonotic-data.pk3dir.git Enable the Container class to save and restore the focus chain --- diff --git a/qcsrc/menu/item/container.c b/qcsrc/menu/item/container.c index f14a4ceb7..091891a67 100644 --- a/qcsrc/menu/item/container.c +++ b/qcsrc/menu/item/container.c @@ -15,6 +15,7 @@ CLASS(Container) EXTENDS(Item) 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,6 +25,7 @@ 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)) @@ -346,23 +348,46 @@ void Container_removeItem(entity me, entity other) void Container_setFocus(entity me, entity other) { - if(other) - if (!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) diff --git a/qcsrc/menu/item/modalcontroller.c b/qcsrc/menu/item/modalcontroller.c index 5a5541dc7..6aab958e6 100644 --- a/qcsrc/menu/item/modalcontroller.c +++ b/qcsrc/menu/item/modalcontroller.c @@ -87,6 +87,8 @@ void DialogOpenButton_Click_withCoords(entity button, entity tab, vector theOrig return; if(button) button.forcePressed = 1; + if(tab.parent.focusedChild) + tab.parent.focusedChild.saveFocus(tab.parent.focusedChild); tab.ModalController_controllingButton = button; tab.parent.showChild(tab.parent, tab, theOrigin, theSize, 0); }