258 lines
6.1 KiB
JavaScript
258 lines
6.1 KiB
JavaScript
var mexui = {};
|
|
|
|
// data initialization
|
|
mexui.Entity = {};
|
|
mexui.Component = {};
|
|
mexui.Control = {};
|
|
mexui.Entry = {};
|
|
|
|
mexui.windows = [];
|
|
|
|
mexui.fonts = {};
|
|
mexui.images = {};
|
|
|
|
mexui.focusedControl = null;
|
|
mexui.hoveredComponent = null;
|
|
|
|
// initialization
|
|
mexui.init = function () {
|
|
mexui.native.loadImage('mexui/Images/down-arrow.png', 'downArrow');
|
|
mexui.bindEvents();
|
|
mexui.startTimers();
|
|
};
|
|
|
|
// events
|
|
mexui.bindEvents = function () {
|
|
addEventHandler('onMouseDown', function (event, mouse, button) {
|
|
var e = mexui.triggerEvent('onMouseDown', { button: button });
|
|
if (!e.clickedAControl) {
|
|
mexui.focusedControl = null;
|
|
}
|
|
});
|
|
|
|
addEventHandler('onMouseUp', function (event, mouse, button) {
|
|
mexui.triggerEvent('onMouseUp', { button: button });
|
|
});
|
|
|
|
addEventHandler('onMouseMove', function (event, mouse, isAbsolute, position) {
|
|
if (isAbsolute)
|
|
return;
|
|
|
|
mexui.triggerEvent('onMouseMove', new Vec2(position.x, position.y), true);
|
|
});
|
|
|
|
addEventHandler('onMouseWheel', function (event, mouse, offset, flipped) {
|
|
mexui.triggerEvent('onMouseWheel', offset);
|
|
});
|
|
|
|
addEventHandler('onKeyDown', function (event, key, pkey, mods) {
|
|
mexui.triggerEvent('onKeyDown', key, mods);
|
|
|
|
if (key == SDLK_TAB) {
|
|
mexui.cycleFocusedControl();
|
|
}
|
|
});
|
|
|
|
addEventHandler('onCharacter', function (event, character) {
|
|
mexui.triggerEvent('onCharacter', character);
|
|
|
|
if (character == 't' || character == 'T') {
|
|
var textInput = mexui.getFocusedTextInput();
|
|
if (textInput) {
|
|
//event.preventDefault();
|
|
}
|
|
}
|
|
});
|
|
|
|
{
|
|
var eventName = (game.game == VRR_GAME_GTA_SA || game.game == VRR_GAME_MAFIA_ONE) ? 'onDrawnHUD' : 'onBeforeDrawHUD';
|
|
addEventHandler(eventName, function (event) {
|
|
mexui.render();
|
|
});
|
|
}
|
|
};
|
|
|
|
mexui.unbindEvents = function () {
|
|
removeEventHandler('onMouseDown');
|
|
removeEventHandler('onMouseUp');
|
|
removeEventHandler('onMouseMove');
|
|
removeEventHandler('onMouseWheel');
|
|
removeEventHandler('onKeyDown');
|
|
removeEventHandler('onCharacter');
|
|
removeEventHandler('onBeforeDrawHUD');
|
|
};
|
|
|
|
// timers
|
|
mexui.startTimers = function () {
|
|
setInterval(mexui.toggleTextInputCaretShownForBlink, 400);
|
|
};
|
|
|
|
// render
|
|
mexui.render = function () {
|
|
for (var i in mexui.windows) {
|
|
if (mexui.windows[i].shown)
|
|
mexui.windows[i].render.call(mexui.windows[i]);
|
|
}
|
|
for (var i in mexui.windows) {
|
|
if (mexui.windows[i].shown)
|
|
mexui.windows[i].renderAfter.call(mexui.windows[i]);
|
|
}
|
|
};
|
|
|
|
// model
|
|
mexui.triggerEvent = function (eventName, data, callBaseMethodFirst) {
|
|
var e = new mexui.Component.Event();
|
|
|
|
if (data.button !== undefined)
|
|
e.button = data.button;
|
|
|
|
var windows = mexui.windows.slice(0, mexui.windows.length).reverse();
|
|
for (var i in windows) {
|
|
if (windows[i].shown) {
|
|
if (callBaseMethodFirst) {
|
|
if (mexui.Entity.Component.prototype[eventName]) {
|
|
mexui.Entity.Component.prototype[eventName].call(windows[i], e, data);
|
|
if (e.used)
|
|
break;
|
|
}
|
|
|
|
windows[i][eventName].call(windows[i], e, data);
|
|
if (e.used)
|
|
break;
|
|
}
|
|
else {
|
|
windows[i][eventName].call(windows[i], e, data);
|
|
if (e.used)
|
|
break;
|
|
|
|
if (mexui.Entity.Component.prototype[eventName]) {
|
|
mexui.Entity.Component.prototype[eventName].call(windows[i], e, data);
|
|
if (e.used)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return e;
|
|
};
|
|
|
|
mexui.getTopWindow = function () {
|
|
for (var i = mexui.windows.length - 1, j = 0; i >= j; i--) {
|
|
if (mexui.windows[i].shown)
|
|
return mexui.windows[i];
|
|
}
|
|
return null;
|
|
};
|
|
|
|
mexui.getShownWindows = function () {
|
|
var shownWindows = [];
|
|
for (var i = mexui.windows.length - 1, j = 0; i >= j; i--) {
|
|
if (mexui.windows[i].shown)
|
|
shownWindows.push(mexui.windows[i]);
|
|
}
|
|
return shownWindows;
|
|
};
|
|
|
|
mexui.getNextShownWindows = function (afterWindow) {
|
|
var shownWindows = mexui.getShownWindows();
|
|
|
|
var windowIndex = shownWindows.indexOf(afterWindow);
|
|
|
|
var windows2 = shownWindows.splice(0, windowIndex + 1);
|
|
var args = windows2;
|
|
args.unshift(0);
|
|
args.unshift(shownWindows.length);
|
|
shownWindows.splice.apply(shownWindows, args);
|
|
|
|
return shownWindows;
|
|
};
|
|
|
|
mexui.cycleFocusedControl = function () {
|
|
// no windows are created
|
|
if (mexui.windows.length == 0)
|
|
return;
|
|
|
|
// no control is focused
|
|
if (!mexui.focusedControl) {
|
|
var topWindow = mexui.getTopWindow();
|
|
if (!topWindow)
|
|
return;
|
|
|
|
mexui.focusedControl = topWindow.getFirstShownControl();
|
|
return;
|
|
}
|
|
|
|
// a control is focused
|
|
var focusedControlWindow = mexui.focusedControl.window;
|
|
var nextControl = focusedControlWindow.getNextShownControl(mexui.focusedControl);
|
|
if (nextControl) {
|
|
mexui.focusedControl = nextControl;
|
|
return;
|
|
}
|
|
|
|
// set focus to first control on next window that has a control shown
|
|
var shownWindows = mexui.getNextShownWindows(focusedControlWindow);
|
|
for (var i in shownWindows) {
|
|
var window = shownWindows[i];
|
|
var firstControl = window.getFirstShownControl();
|
|
if (firstControl) {
|
|
mexui.focusedControl = firstControl;
|
|
return;
|
|
}
|
|
}
|
|
};
|
|
|
|
mexui.getFocusedTextInput = function () {
|
|
if (!mexui.focusedControl)
|
|
return null;
|
|
|
|
if (!(mexui.focusedControl instanceof mexui.Control.TextInput))
|
|
return null;
|
|
|
|
return mexui.focusedControl;
|
|
};
|
|
|
|
mexui.toggleTextInputCaretShownForBlink = function () {
|
|
var textInput = mexui.getFocusedTextInput();
|
|
if (!textInput)
|
|
return;
|
|
|
|
textInput.caretShownForBlink = !textInput.caretShownForBlink;
|
|
};
|
|
|
|
mexui.setHoveredComponent = function (component) {
|
|
//component.hovered = true;
|
|
mexui.hoveredComponent = component;
|
|
};
|
|
|
|
mexui.clearHoveredComponent = function () {
|
|
//mexui.hoveredComponent.hovered = false;
|
|
mexui.hoveredComponent = null;
|
|
};
|
|
|
|
// api
|
|
mexui.window = function (x, y, w, h, title, styles) {
|
|
var window = new mexui.Component.Window(x, y, w, h, title, styles);
|
|
mexui.windows.push(window);
|
|
return window;
|
|
};
|
|
|
|
mexui.isAnyWindowShown = function () {
|
|
for (var i in mexui.windows) {
|
|
if (mexui.windows[i].shown)
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
mexui.setInput = function (showInput) {
|
|
gui.showCursor(showInput, !showInput);
|
|
|
|
if (localClient.player && game.game >= GAME_GTA_IV) {
|
|
if (showInput)
|
|
game.setCameraLookAtEntity(new Vec3(game.cameraMatrix.m41, game.cameraMatrix.m42, game.cameraMatrix.m43), localPlayer, false);
|
|
else
|
|
game.restoreCamera(false);
|
|
}
|
|
};
|