Skip to content

Commit

Permalink
Arsenal Actions - Add support for multiline text & updating on cargo …
Browse files Browse the repository at this point in the history
…event (#9771)

Co-authored-by: johnb432 <[email protected]>
  • Loading branch information
LinkIsGrim and johnb432 authored Feb 6, 2024
1 parent 8de0740 commit e69ffb6
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 14 deletions.
9 changes: 9 additions & 0 deletions addons/arsenal/XEH_preInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ call FUNC(compileStats);
EGVAR(common,blockItemReplacement) = false;
}] call CBA_fnc_addEventHandler;

[QGVAR(cargoChanged), {
params ["_display"];
// Only update actions if necessary, this can get performance-intensive using the arrow keys
if (!GVAR(updateActionsOnCargoChange)) exitWith {};
private _actionInfo = [_display];
_actionInfo append GVAR(actionInfo);
[QGVAR(displayActions), _actionInfo] call CBA_fnc_localEvent;
}] call CBA_fnc_addEventHandler;

// Setup Tools tab
[keys (uiNamespace getVariable [QGVAR(configItemsTools), createHashMap]), LLSTRING(toolsTab), TOOLS_TAB_ICON, -1, true] call FUNC(addRightPanelButton);

Expand Down
2 changes: 2 additions & 0 deletions addons/arsenal/defines.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,8 @@
#define IDC_statsNextPage 53
#define IDC_statsCurrentPage 54
#define IDC_actionsBox 90
#define IDC_actionsBackground1 90010
#define IDC_actionsBackground2 90011
#define IDC_actionsText1 9001
#define IDC_actionsButton1 9002
#define IDC_actionsText2 9003
Expand Down
8 changes: 7 additions & 1 deletion addons/arsenal/functions/fnc_addAction.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* 3: Actions <ARRAY of ARRAYS>
* 4: Condition <CODE> (default: {true})
* 5: Scope editor <NUMBER> (default: 2)
* 6: Update when cargo content changes <BOOL> (default: false)
*
* Return Value:
* 0: Array of IDs <ARRAY of STRINGS>
Expand All @@ -30,7 +31,8 @@ params [
["_title", "", [""]],
["_actions", [], [[]]],
["_rootCondition", {true}, [{}]],
["_scopeEditor", 2, [0]]
["_scopeEditor", 2, [0]],
["_updateOnCargoChange", false, [false]]
];

// Compile actions from config (in case this is called before preInit)
Expand Down Expand Up @@ -119,4 +121,8 @@ private _group = [];
};
} forEach _tabs;

if (_updateOnCargoChange) then {
GVAR(updateActionsOnCargoChange) = true;
};

_return
6 changes: 6 additions & 0 deletions addons/arsenal/functions/fnc_compileActions.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ private _actionList = [

private _configGroupEntries = "true" configClasses (configFile >> QGVAR(actions));

GVAR(updateActionsOnCargoChange) = false;

{
private _scopeEditor = getNumber (_x >> "scopeEditor");

Expand All @@ -48,6 +50,10 @@ private _configGroupEntries = "true" configClasses (configFile >> QGVAR(actions)
private _rootDisplayName = getText (_x >> "displayName");
private _rootCondition = getText (_x >> "condition");
private _rootTabs = getArray (_x >> "tabs");
private _updateOnCargoChanged = getNumber (_x >> "updateOnCargoChanged");
if (_updateOnCargoChanged > 0) then {
GVAR(updateActionsOnCargoChange) = true;
};

if (_rootCondition != "") then {
_rootCondition = compile _rootCondition;
Expand Down
44 changes: 35 additions & 9 deletions addons/arsenal/functions/fnc_handleActions.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*
* Public: No
*/

params ["_display", "_control", "_curSel", "_itemCfg"];

GVAR(actionsInfo) = [_control, _curSel, _itemCfg];
Expand Down Expand Up @@ -46,13 +45,12 @@ private _groups = (GVAR(actionList) select _panel) select {
};

private _show = _groups isNotEqualTo [];
private _ctrl = _display displayCtrl IDC_actionsBox;
_ctrl ctrlShow _show;
_ctrl ctrlCommit 0.15;
private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox;
_actionsBoxCtrl ctrlShow _show;
_actionsBoxCtrl ctrlCommit 0.15;

if (!_show) exitWith {};

private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox;
private _actionsCurrentPageCtrl = _display displayCtrl IDC_actionsCurrentPage;

private _currentPage = GVAR(currentActionPage);
Expand Down Expand Up @@ -83,10 +81,11 @@ _actionsCurrentPageCtrl ctrlSetFade 0;
_actionsCurrentPageCtrl ctrlShow true;
_actionsCurrentPageCtrl ctrlCommit 0;

private _activeCtrls = [];
{
_x params ["", "_type", "_label", "_statement"];

private _idc = 9001 + _forEachIndex * 2;
private _idc = IDC_actionsText1 + _forEachIndex * 2;
private _actionTextCtrl = _display displayCtrl _idc;
private _actionButtonCtrl = _display displayCtrl (_idc + 1);

Expand All @@ -99,27 +98,49 @@ _actionsCurrentPageCtrl ctrlCommit 0;
[true] call FUNC(refresh);
}] call CBA_fnc_execNextFrame;
}];

if (_activeCtrls isNotEqualTo []) then {
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
_actionButtonCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
} else {
_actionButtonCtrl ctrlSetPositionY (6 * GRID_H);
};

_actionButtonCtrl ctrlAddEventHandler ["ButtonClick", _statement];
_actionButtonCtrl ctrlSetText _label;
_actionButtonCtrl ctrlSetFade 0;
_actionButtonCtrl ctrlEnable true;
_actionButtonCtrl ctrlCommit 0;
_actionTextCtrl ctrlSetFade 1;
_actionTextCtrl ctrlEnable false;
_actionTextCtrl ctrlCommit 0;
_activeCtrls pushBack _actionButtonCtrl;
};
case ACTION_TYPE_TEXT: {
private _text = call _statement;

if (isNil "_text") then {
_text = "";
};
if (_text isEqualType []) then {
_text = _text joinString endl;
};
if (_activeCtrls isNotEqualTo []) then {
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
_actionTextCtrl ctrlSetPositionY (_lastPosY + _lastPosH + GRID_H);
} else {
_actionTextCtrl ctrlSetPositionY (5 * GRID_H);
};

_actionTextCtrl ctrlSetText _text;
_actionTextCtrl ctrlSetPositionH (ctrlTextHeight _actionTextCtrl);
_actionTextCtrl ctrlSetFade 0;
_actionTextCtrl ctrlEnable false;
_actionTextCtrl ctrlCommit 0;
_actionButtonCtrl ctrlSetFade 1;
_actionButtonCtrl ctrlEnable false;
_actionButtonCtrl ctrlCommit 0;
_activeCtrls pushBack _actionTextCtrl;
};
default {
_actionTextCtrl ctrlSetFade 1;
Expand All @@ -134,7 +155,7 @@ _actionsCurrentPageCtrl ctrlCommit 0;
private _actionCount = count _items;

{
private _idc = 9001 + _x * 2;
private _idc = IDC_actionsText1 + _x * 2;
private _actionTextCtrl = _display displayCtrl _idc;
private _actionButtonCtrl = _display displayCtrl (_idc + 1);

Expand All @@ -145,6 +166,11 @@ private _actionCount = count _items;
} forEach ([0, 1, 2, 3, 4] select [_actionCount, 5]);

private _pos = ctrlPosition _actionsBoxCtrl;
_pos set [3, ([11, (5 * _actionCount) + 6] select (_actionCount > 0)) * GRID_H];
_actionsBoxCtrl ctrlSetPosition _pos;
(ctrlPosition (_activeCtrls select -1)) params ["", "_lastPosY", "", "_lastPosH"];
private _actionsBoxHeight = _lastPosY + _lastPosH + GRID_H;
_actionsBoxCtrl ctrlSetPositionH _actionsBoxHeight;
_actionsBoxCtrl ctrlCommit 0;

private _background = _display displayCtrl IDC_actionsBackground1;
_background ctrlSetPositionH _actionsBoxHeight;
_background ctrlCommit 0;
9 changes: 5 additions & 4 deletions addons/arsenal/ui/RscAttributes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -450,22 +450,22 @@ class GVAR(display) {
h = QUOTE(55 * GRID_H);
class controls {
class actionsStaticBackground1: ctrlStaticBackground {
idc = -1;
idc = IDC_actionsBackground1;
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(47 * GRID_W);
h = QUOTE(56 * GRID_H);
h = QUOTE(55 * GRID_H);
colorBackground[]={0.1,0.1,0.1,0.5};
};
class actionsStaticBackground2: ctrlStaticBackground {
idc = -1;
idc = IDC_actionsBackground2;
x = QUOTE(0);
y = QUOTE(0);
w = QUOTE(47 * GRID_W);
h = QUOTE(5 * GRID_H);
colorBackground[]={0.1,0.1,0.1,0.8};
};
class actionsText1: RscText {
class actionsText1: RscTextMulti {
idc = IDC_actionsText1;
fade = 1;
x = QUOTE(0 * GRID_W);
Expand All @@ -479,6 +479,7 @@ class GVAR(display) {
};
class actionsButton1: ctrlButton {
idc = IDC_actionsButton1;
onMouseEnter = QUOTE(ctrlSetFocus (_this select 0));
fade = 1;
text = "";
x = QUOTE(1 * GRID_W);
Expand Down
5 changes: 5 additions & 0 deletions docs/wiki/framework/arsenal-framework.md
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,8 @@ For actions involving frame delays or timers, a second call of the `ace_arsenal_

Since CBA frame functions are deactivated during preInit as of Oct 24th 2023, the refresh function is executed immediatelly after the action code is executed. Take note of this information and the comment below if you'd like your actions to be usable in 3DEN.

By default actions are updated whenever the arsenal is refreshed (`ace_arsenal_fnc_refresh`) and whenever item info (the bottom right GUI element that shows item name and author) is updated. If any action with the `updateOnCargoChanged` property is added, then actions will also be updated on container inventory changes.

### 7.1 Adding actions via config

```cpp
Expand All @@ -410,13 +412,15 @@ class ace_arsenal_actions {
displayName = "My Actions";
condition = QUOTE(true);
scopeEditor = 2; // Only actions with scopeEditor = 2 are shown in 3DEN. Actions working with variables should take object variables being reset between editor view and mission start into account.
updateOnCargoChanged = 1; // See comment above.
tabs[] = {0,5};
class text {
// A simple text label
text = "My text";
};
class statement {
// Statement output as text
// Return can be string or array of strings: for array each entry is automatically displayed on a separate line
textStatement = QUOTE([_this select 0] call tag_fnc_myTextStatement);
};
class button {
Expand All @@ -441,6 +445,7 @@ The focused unit object is passed to the condition and statement functions.
3 | Actions | Array of arrays | Required
4 | Condition | Code | Optional (default: `{true}`)
5 | Scope editor | Number | Optional (default: `2`)
6 | Update on cargo change | Boolean | Optional (default: `false`)
Return Value:
- Array of action IDs
Expand Down

0 comments on commit e69ffb6

Please sign in to comment.