212 lines
6.2 KiB
Plaintext
212 lines
6.2 KiB
Plaintext
#include "..\script_component.hpp"
|
|
|
|
/*
|
|
* File: fnc_initWebUIBridge.sqf
|
|
* Author: IDSolutions
|
|
* Date: 2026-03-13
|
|
* Last Update: 2026-03-13
|
|
* Public: No
|
|
*
|
|
* Description:
|
|
* Initializes the shared web UI bridge and screen declarations used by
|
|
* CT_WEBBROWSER feature bridges.
|
|
*
|
|
* Arguments:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* Web UI bridge declarations [HASHMAP]
|
|
*
|
|
* Example:
|
|
* call forge_client_common_fnc_initWebUIBridge
|
|
*/
|
|
|
|
if !(isNil QGVAR(WebUIScreenDeclaration) || { isNil QGVAR(WebUIBridgeDeclaration) }) exitWith {
|
|
createHashMapFromArray [
|
|
["bridgeDeclaration", GVAR(WebUIBridgeDeclaration)],
|
|
["screenDeclaration", GVAR(WebUIScreenDeclaration)]
|
|
]
|
|
};
|
|
|
|
#pragma hemtt ignore_variables ["_self"]
|
|
GVAR(WebUIScreenDeclaration) = compileFinal createHashMapFromArray [
|
|
["#type", "IWebUIScreen"],
|
|
["#create", compileFinal {
|
|
params [["_control", controlNull, [controlNull]]];
|
|
|
|
_self set ["control", _control];
|
|
_self set ["readyState", false];
|
|
_self set ["pendingEvents", []];
|
|
true
|
|
}],
|
|
["dispose", compileFinal {
|
|
_self set ["control", controlNull];
|
|
_self set ["readyState", false];
|
|
_self set ["pendingEvents", []];
|
|
|
|
true
|
|
}],
|
|
["getControl", compileFinal {
|
|
_self getOrDefault ["control", controlNull]
|
|
}],
|
|
["consumePendingEvents", compileFinal {
|
|
private _pendingEvents = +(_self getOrDefault ["pendingEvents", []]);
|
|
_self set ["pendingEvents", []];
|
|
|
|
_pendingEvents
|
|
}],
|
|
["isReady", compileFinal {
|
|
_self getOrDefault ["readyState", false]
|
|
}],
|
|
["markReady", compileFinal {
|
|
params [["_isReady", true, [false]]];
|
|
|
|
_self set ["readyState", _isReady];
|
|
_isReady
|
|
}],
|
|
["queueEvent", compileFinal {
|
|
params [["_payload", createHashMap, [createHashMap]]];
|
|
|
|
private _pendingEvents = +(_self getOrDefault ["pendingEvents", []]);
|
|
_pendingEvents pushBack _payload;
|
|
_self set ["pendingEvents", _pendingEvents];
|
|
|
|
count _pendingEvents
|
|
}],
|
|
["setControl", compileFinal {
|
|
params [["_control", controlNull, [controlNull]]];
|
|
|
|
_self set ["control", _control];
|
|
_control
|
|
}],
|
|
["#delete", compileFinal {
|
|
_self call ["dispose", []];
|
|
}]
|
|
];
|
|
|
|
GVAR(WebUIBridgeDeclaration) = compileFinal createHashMapFromArray [
|
|
["#type", "IWebUIBridge"],
|
|
["#create", compileFinal {
|
|
_self set ["screen", createHashMapObject [GVAR(WebUIScreenDeclaration), []]];
|
|
true
|
|
}],
|
|
["deliverPayload", compileFinal {
|
|
params [["_control", controlNull, [controlNull]], ["_payload", createHashMap, [createHashMap]]];
|
|
|
|
if (isNull _control) exitWith { false };
|
|
|
|
private _json = toJSON _payload;
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["ForgeBridge.receive(%1)", _json]];
|
|
|
|
true
|
|
}],
|
|
["execJS", compileFinal {
|
|
params [["_control", controlNull, [controlNull]], ["_statement", "", [""]]];
|
|
|
|
if (isNull _control || { _statement isEqualTo "" }) exitWith { false };
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", _statement];
|
|
true
|
|
}],
|
|
["flushPendingEvents", compileFinal {
|
|
private _screen = _self call ["getScreen", []];
|
|
private _control = _self call ["getActiveBrowserControl", []];
|
|
if (isNull _control) exitWith { 0 };
|
|
|
|
private _pendingEvents = _screen call ["consumePendingEvents", []];
|
|
|
|
{
|
|
_self call ["deliverPayload", [_control, _x]];
|
|
} forEach _pendingEvents;
|
|
|
|
count _pendingEvents
|
|
}],
|
|
["getActiveBrowserControl", compileFinal {
|
|
private _screen = _self call ["getScreen", []];
|
|
_screen call ["getControl", []]
|
|
}],
|
|
["getScreen", compileFinal {
|
|
private _hasScreen = "screen" in _self;
|
|
private _screen = if (_hasScreen) then {
|
|
_self get "screen"
|
|
} else {
|
|
createHashMap
|
|
};
|
|
|
|
if (!_hasScreen) then {
|
|
_screen = createHashMapObject [GVAR(WebUIScreenDeclaration), []];
|
|
_self set ["screen", _screen];
|
|
};
|
|
|
|
_screen
|
|
}],
|
|
["handleClose", compileFinal {
|
|
private _screen = _self call ["getScreen", []];
|
|
_screen call ["dispose", []]
|
|
}],
|
|
["handleReady", compileFinal {
|
|
params [["_control", controlNull, [controlNull]], ["_data", createHashMap, [createHashMap]]];
|
|
|
|
private _screen = _self call ["getScreen", []];
|
|
_screen call ["setControl", [_control]];
|
|
_screen call ["markReady", [true]];
|
|
|
|
_self call ["flushPendingEvents", []];
|
|
true
|
|
}],
|
|
["queueEvent", compileFinal {
|
|
params [["_payload", createHashMap, [createHashMap]]];
|
|
|
|
private _screen = _self call ["getScreen", []];
|
|
_screen call ["queueEvent", [_payload]]
|
|
}],
|
|
["sendEvent", compileFinal {
|
|
params [
|
|
["_event", "", [""]],
|
|
["_data", createHashMap, [createHashMap]],
|
|
["_control", controlNull, [controlNull]]
|
|
];
|
|
|
|
if (_event isEqualTo "") exitWith { false };
|
|
|
|
private _payload = createHashMapFromArray [
|
|
["event", _event],
|
|
["data", _data]
|
|
];
|
|
private _screen = _self call ["getScreen", []];
|
|
private _targetControl = _control;
|
|
|
|
if (isNull _targetControl) then {
|
|
_targetControl = _self call ["getActiveBrowserControl", []];
|
|
};
|
|
|
|
if (isNull _targetControl) exitWith {
|
|
_self call ["queueEvent", [_payload]];
|
|
false
|
|
};
|
|
|
|
_screen call ["setControl", [_targetControl]];
|
|
|
|
if !(_screen call ["isReady", []]) exitWith {
|
|
_self call ["queueEvent", [_payload]];
|
|
false
|
|
};
|
|
|
|
_self call ["deliverPayload", [_targetControl, _payload]]
|
|
}],
|
|
["setActiveBrowserControl", compileFinal {
|
|
params [["_control", controlNull, [controlNull]]];
|
|
|
|
private _screen = _self call ["getScreen", []];
|
|
_screen call ["setControl", [_control]]
|
|
}],
|
|
["#delete", compileFinal {
|
|
_self call ["handleClose", []];
|
|
}]
|
|
];
|
|
|
|
createHashMapFromArray [
|
|
["bridgeDeclaration", GVAR(WebUIBridgeDeclaration)],
|
|
["screenDeclaration", GVAR(WebUIScreenDeclaration)]
|
|
]
|