forge/arma/client/addons/common/functions/fnc_initWebUIBridge.sqf
2026-05-23 09:23:12 -05:00

210 lines
6.1 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", []];
}],
["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)]];
}],
["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)]
]