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))
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;
.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;
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;
{
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
{
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);
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)
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)
{
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);
}
-};
+}
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;
}