-#ifdef INTERFACE
-CLASS(InputContainer) EXTENDS(Container)
- METHOD(InputContainer, keyDown, float(entity, float, float, float))
- METHOD(InputContainer, mouseMove, float(entity, vector))
- METHOD(InputContainer, mousePress, float(entity, vector))
- METHOD(InputContainer, mouseRelease, float(entity, vector))
- METHOD(InputContainer, mouseDrag, float(entity, vector))
- METHOD(InputContainer, focusLeave, void(entity))
- METHOD(InputContainer, resizeNotify, void(entity, vector, vector, vector, vector))
+#ifndef ITEM_INPUTCONTAINER_H
+#define ITEM_INPUTCONTAINER_H
+#include "container.qc"
+CLASS(InputContainer, Container)
+ METHOD(InputContainer, keyDown, float(entity, float, float, float));
+ METHOD(InputContainer, mouseMove, float(entity, vector));
+ METHOD(InputContainer, mousePress, float(entity, vector));
+ METHOD(InputContainer, mouseRelease, float(entity, vector));
+ METHOD(InputContainer, mouseDrag, float(entity, vector));
+ METHOD(InputContainer, focusLeave, void(entity));
+ METHOD(InputContainer, resizeNotify, void(entity, vector, vector, vector, vector));
- METHOD(InputContainer, _changeFocusXY, float(entity, vector))
+ METHOD(InputContainer, _changeFocusXY, bool(entity this, vector pos));
ATTRIB(InputContainer, mouseFocusedChild, entity, NULL)
ATTRIB(InputContainer, isTabRoot, float, 0)
ENDCLASS(InputContainer)
return 0;
}
-float InputContainer__changeFocusXY(entity me, vector pos)
+bool InputContainer__changeFocusXY(entity this, vector pos)
{
- entity e, ne;
- e = me.mouseFocusedChild;
- ne = me.itemFromPoint(me, pos);
- if(ne)
- if (!ne.focusable)
- ne = NULL;
- me.mouseFocusedChild = ne;
- if(ne)
- if(ne != e)
- {
- me.setFocus(me, ne);
- if(ne.instanceOfInputContainer)
- {
- ne.focusedChild = NULL;
- ne._changeFocusXY(e, globalToBox(pos, ne.Container_origin, ne.Container_size));
- }
+ entity e = this.itemFromPoint(this, pos);
+ if (e && !e.focusable) e = NULL;
+ entity prev = this.mouseFocusedChild;
+ this.mouseFocusedChild = e;
+ if (!e) return false; // keep focus when hovering over non-focusable elements
+ if (e != prev) {
+ this.setFocus(this, e);
+ if (e.instanceOfInputContainer) {
+ e.focusedChild = NULL;
+ e._changeFocusXY(e, globalToBox(pos, e.Container_origin, e.Container_size));
}
- return (ne != NULL);
+ }
+ return true; // have focus
}
float InputContainer_mouseDrag(entity me, vector pos)