1 #include "inputcontainer.qh"
2 #ifndef ITEM_INPUTCONTAINER_H
3 #define ITEM_INPUTCONTAINER_H
4 #include "container.qc"
5 CLASS(InputContainer, Container)
6 METHOD(InputContainer, keyDown, float(entity, float, float, float));
7 METHOD(InputContainer, mouseMove, float(entity, vector));
8 METHOD(InputContainer, mousePress, float(entity, vector));
9 METHOD(InputContainer, mouseRelease, float(entity, vector));
10 METHOD(InputContainer, mouseDrag, float(entity, vector));
11 METHOD(InputContainer, focusLeave, void(entity));
12 METHOD(InputContainer, resizeNotify, void(entity, vector, vector, vector, vector));
14 METHOD(InputContainer, _changeFocusXY, bool(entity this, vector pos));
15 ATTRIB(InputContainer, mouseFocusedChild, entity, NULL)
16 ATTRIB(InputContainer, isTabRoot, float, 0)
17 ENDCLASS(InputContainer)
21 void InputContainer_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
23 SUPER(InputContainer).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
25 if(me.parent.instanceOfInputContainer)
32 void InputContainer_focusLeave(entity me)
34 SUPER(InputContainer).focusLeave(me);
35 me.mouseFocusedChild = NULL;
38 float InputContainer_keyDown(entity me, float scan, float ascii, float shift)
41 if (SUPER(InputContainer).keyDown(me, scan, ascii, shift)) return 1;
47 me.setFocus(me, NULL);
59 for (ff = f.prevSibling; ff; ff = ff.prevSibling)
61 if (!ff.focusable) continue;
66 if (!f || me.isTabRoot)
68 for (ff = me.lastChild; ff; ff = ff.prevSibling)
70 if (!ff.focusable) continue;
74 return 0; // AIIIIEEEEE!
81 for (ff = f.nextSibling; ff; ff = ff.nextSibling)
83 if (!ff.focusable) continue;
88 if (!f || me.isTabRoot)
90 for (ff = me.firstChild; ff; ff = ff.nextSibling)
92 if (!ff.focusable) continue;
96 return 0; // AIIIIEEEEE!
103 bool InputContainer__changeFocusXY(entity this, vector pos)
105 entity e = this.itemFromPoint(this, pos);
106 if (e && !e.focusable) e = NULL;
107 entity prev = this.mouseFocusedChild;
108 this.mouseFocusedChild = e;
109 if (!e) return false; // keep focus when hovering over non-focusable elements
112 this.setFocus(this, e);
113 if (e.instanceOfInputContainer)
115 e.focusedChild = NULL;
116 e._changeFocusXY(e, globalToBox(pos, e.Container_origin, e.Container_size));
119 return true; // have focus
122 float InputContainer_mouseDrag(entity me, vector pos)
124 if (SUPER(InputContainer).mouseDrag(me, pos)) return 1;
125 if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return 1;
128 float InputContainer_mouseMove(entity me, vector pos)
130 if (me.mouseFocusedChild != me.focusedChild) // if the keyboard moved the focus away
131 me.mouseFocusedChild = NULL; // force focusing
132 if (me._changeFocusXY(me, pos))
133 if (SUPER(InputContainer).mouseMove(me, pos)) return 1;
134 if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return 1;
137 float InputContainer_mousePress(entity me, vector pos)
139 me.mouseFocusedChild = NULL; // force focusing
140 if (me._changeFocusXY(me, pos))
141 if (SUPER(InputContainer).mousePress(me, pos)) return 1;
142 if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return 1;
145 float InputContainer_mouseRelease(entity me, vector pos)
147 SUPER(InputContainer).mouseRelease(me, pos); // return value?
148 if (me.focused) // am I still eligible for this? (UGLY HACK, but a mouse event could have changed focus away)
149 if (me._changeFocusXY(me, pos)) return 1;
150 if (pos.x >= 0 && pos.y >= 0 && pos.x < 1 && pos.y < 1) return 1;