Files
GTA4RP/third-party/mexui/Core/Component/Control.js
2020-12-27 23:58:17 -06:00

135 lines
3.4 KiB
JavaScript

mexui.Component.Control = function(window, x, y, w, h, styles, callback)
{
mexui.Entity.Component.call(this, false);
mexui.Entity.StyleableEntity.call(this, this.linkComponentStyles('Control', styles));
this.window = window;
this.position = new Vec2(x, y);
this.size = new Vec2(w, h);
this.callback = callback;
this.boundTo = null;
};
mexui.util.extend(mexui.Component.Control, mexui.Entity.Component);
// default styles
//mexui.Component.Control.defaultStyles = {};
//mexui.Component.Control.defaultStyles.__proto__ = mexui.Entity.StyleableEntity.defaultStyles;
mexui.Component.Control.defaultStyles = mexui.util.linkStyles(mexui.Entity.StyleableEntity.defaultStyles, {});
// input
mexui.Component.Control.prototype.onMouseDown = function(e)
{
if(e.button == 0)
{
var hit = this.isCursorOverControl();
if(hit)
{
e.used = true;
e.clickedAControl = true;
mexui.focusedControl = this;
}
}
};
mexui.Component.Control.prototype.onMouseUp = function(e)
{
};
mexui.Component.Control.prototype.onMouseMove = function(e, offset)
{
if(this.isCursorOverControl())
{
if(!this.isHovered())
{
mexui.setHoveredComponent(this);
this.onMouseEnter();
}
e.used = true;
}
else if(e.wasHovered)
{
mexui.clearHoveredComponent();
this.onMouseExit();
}
};
mexui.Component.Control.prototype.onMouseWheel = function(e, data)
{
};
mexui.Component.Control.prototype.onKeyDown = function(e, key, mods)
{
};
mexui.Component.Control.prototype.onCharacter = function(e, character)
{
};
// render
mexui.Component.Control.prototype.render = function()
{
};
mexui.Component.Control.prototype.renderAfter = function()
{
};
// model
mexui.Component.Control.prototype.checkToCallCallback = function()
{
if(this.callback)
this.callback.call(this);
};
mexui.Component.Control.prototype.getScreenPosition = function()
{
var pos = mexui.util.addVec2(this.window.position, this.position);
if(this.boundTo)
pos = mexui.util.addVec2(pos, new Vec2(-this.boundTo.axis.x.getScrolledOffsetFixedStart(), -this.boundTo.axis.y.getScrolledOffsetFixedStart()));
return pos;
};
mexui.Component.Control.prototype.isCursorOverControl = function()
{
return mexui.util.isCursorInRectangle(this.getScreenPosition(), this.getSizeForInput ? this.getSizeForInput() : this.size);
};
mexui.Component.Control.prototype.isCursorOverItem = function()
{
return this.isCursorOverControl();
};
mexui.Component.Control.prototype.isInsideBoundControl = function()
{
if(this.boundTo instanceof mexui.Entity.ControlWithEntries)
return this.isInsideBoundControlEntries();
else
return mexui.util.isRectangleInsideRectangle(this.getScreenPosition(), this.size, this.boundTo.getScreenPosition(), this.boundTo.size);
};
mexui.Component.Control.prototype.isInsideBoundControlEntries = function()
{
var boundToControlPosition = mexui.util.addVec2(this.boundTo.getScreenPosition(), this.boundTo.entriesPositionOffset);
var boundToControlSize = new Vec2(this.boundTo.size.x, this.boundTo.axis.y.getDisplayedEntriesLength());
return mexui.util.isRectangleInsideRectangle(this.getScreenPosition(), this.size, boundToControlPosition, boundToControlSize);
};
// api
mexui.Component.Control.prototype.remove = function()
{
this.window.controls.splice(this.window.controls.indexOf(this), 1);
};
mexui.Component.Control.prototype.bindTo = function(control)
{
this.boundTo = control;
};
mexui.Component.Control.prototype.unbind = function()
{
this.boundTo = null;
};