Arsenal - Add Sorting Algorithms (#7719)

* support per tab sorting, and external algorithms

* improved sub sorting

* improve alphabetical search

* update mod sorting

* sort by accuracy

* sort right panel

* more sorts

* sort right tab

* fix empty

* stringtables

* Apply suggestions from code review

Co-authored-by: mharis001 <34453221+mharis001@users.noreply.github.com>

* more suggestions

* suggestions

* remember last sort

* Fix missing throw and put names

* bad copy paste in stringtable

* Update addons/arsenal/functions/fnc_sortPanel.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

Co-authored-by: mharis001 <34453221+mharis001@users.noreply.github.com>
Co-authored-by: PabstMirror <pabstmirror@gmail.com>
This commit is contained in:
Brett 2020-08-18 11:43:35 -06:00 committed by GitHub
parent 4d769e4b8f
commit d72555ab0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 644 additions and 115 deletions

View File

@ -0,0 +1,64 @@
class GVAR(sorts) {
class sortBase {
scope = 1;
displayName = "";
tabs[] = {{}, {}};
statement = "";
};
class ACE_alphabetically: sortBase {
scope = 2;
displayName = "$STR_a3_rscdisplayarsenal_sort_alphabet";
tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, {0,1,2,3,4,5,6,7}};
statement = QUOTE({});
};
class ACE_mod: sortBase {
scope = 2;
displayName = "$STR_a3_rscdisplayarsenal_sort_mod";
tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, {0,1,2,3,4,5,6,7}};
statement = QUOTE(_this call FUNC(sortStatement_mod));
};
class ACE_mass: sortBase {
scope = 2;
displayName = CSTRING(sortByWeightText);
tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, {0,1,2,3,4,5,6,7}};
statement = QUOTE(_this call FUNC(sortStatement_mass));
};
class ACE_load: sortBase {
scope = 2;
displayName = CSTRING(sortByLoadText);
tabs[] = {{3,4,5}, {}};
statement = QUOTE(getContainerMaxLoad configName _this);
};
class ACE_accuracy: sortBase {
scope = 2;
displayName = CSTRING(sortByAccuracyText);
tabs[] = {{0,1,2}, {}};
statement = QUOTE(_this call FUNC(sortStatement_accuracy));
};
class ACE_rateOfFire: sortBase {
scope = 2;
displayName = CSTRING(sortByRateOfFireText);
tabs[] = {{0,1,2}, {}};
statement = QUOTE(_this call FUNC(sortStatement_rateOfFire));
};
class ACE_scopeMag: sortBase {
scope = 2;
displayName = CSTRING(sortByMagnificationText);
tabs[] = {{}, {0}};
statement = QUOTE(_this call FUNC(sortStatement_scopeMag));
};
class ACE_magCount: sortBase {
scope = 2;
displayName = CSTRING(sortByMagCountText);
tabs[] = {{}, {4}};
statement = QUOTE(_this call FUNC(sortStatement_magCount));
};
};

View File

@ -1,5 +1,6 @@
PREP(addDefaultLoadout);
PREP(addListBoxItem);
PREP(addSort);
PREP(addRightPanelButton);
PREP(addStat);
PREP(addVirtualItems);
@ -27,10 +28,12 @@ PREP(buttonLoadoutsShare);
PREP(buttonStats);
PREP(buttonStatsPage);
PREP(clearSearchbar);
PREP(compileSorts);
PREP(compileStats);
PREP(fillLeftPanel);
PREP(fillLoadoutsList);
PREP(fillRightPanel);
PREP(fillSort);
PREP(handleLoadoutsSearchbar);
PREP(handleMouse);
PREP(handleScrollWheel);
@ -60,6 +63,12 @@ PREP(removeVirtualItems);
PREP(scanConfig);
PREP(showItem);
PREP(sortPanel);
PREP(sortStatement_accuracy);
PREP(sortStatement_magCount);
PREP(sortStatement_mass);
PREP(sortStatement_mod);
PREP(sortStatement_rateOfFire);
PREP(sortStatement_scopeMag);
PREP(statBarStatement_accuracy);
PREP(statBarStatement_default);
PREP(statBarStatement_impact);

View File

@ -5,6 +5,8 @@ GVAR(EH_ID) = 0;
GVAR(lastSearchTextLeft) = "";
GVAR(lastSearchTextRight) = "";
GVAR(lastSearchTextLoadouts) = "";
GVAR(lastSortLeft) = "";
GVAR(lastSortRight) = "";
[QGVAR(initBox), {_this call FUNC(initBox)}] call CBA_fnc_addEventHandler;
[QGVAR(removeBox), {_this call FUNC(removeBox)}] call CBA_fnc_addEventHandler;

View File

@ -8,8 +8,6 @@ PREP_RECOMPILE_START;
PREP_RECOMPILE_END;
// Arsenal
GVAR(modList) = ["", "curator", "kart", "heli", "mark", "expansion", "expansionpremium"];
[QGVAR(camInverted), "CHECKBOX", localize LSTRING(invertCameraSetting), localize LSTRING(settingCategory), false] call CBA_Settings_fnc_init;
[QGVAR(enableModIcons), "CHECKBOX", [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], localize LSTRING(settingCategory), true] call CBA_Settings_fnc_init;
[QGVAR(fontHeight), "SLIDER", [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], localize LSTRING(settingCategory), [1, 10, 4.5, 1]] call CBA_Settings_fnc_init;
@ -58,6 +56,7 @@ GVAR(modList) = ["", "curator", "kart", "heli", "mark", "expansion", "expansionp
}] call CBA_fnc_addEventHandler;
call FUNC(compileStats);
call FUNC(compileSorts);
[QUOTE(ADDON), {!isNil QGVAR(camera)}] call CBA_fnc_registerFeatureCamera;

View File

@ -8,7 +8,7 @@ class CfgPatches {
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author = ECSTRING(common,ACETeam);
authors[] = {"alganthe", "mharis001"};
authors[] = {"alganthe", "mharis001", "SynixeBrett"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
@ -20,4 +20,5 @@ class CfgPatches {
#include "Cfg3DEN.hpp"
#include "CfgEventHandlers.hpp"
#include "RscDisplayMain.hpp"
#include "ACE_Arsenal_Sorts.hpp"
#include "ACE_Arsenal_Stats.hpp"

View File

@ -198,9 +198,6 @@
private _dlcName = _this call GETDLC;\
if (_dlcName != "") then {\
_ctrlPanel lbsetpictureright [_lbAdd,(modParams [_dlcName,["logo"]]) param [0,""]];\
_modID = GVAR(modList) find _dlcName;\
if (_modID < 0) then {_modID = GVAR(modList) pushback _dlcName;};\
_ctrlPanel lbsetvalue [_lbAdd,_modID];\
};\
};

View File

@ -20,7 +20,7 @@ private _cacheNamespace = _ctrlPanel; //For better readability.
private _cachedItemInfo = _cacheNamespace getVariable [_configCategory+_className, []];
//_cachedItemInfo == [_displayName, _itemPicture, _modPicture, _modID]
//_cachedItemInfo == [_displayName, _itemPicture, _modPicture]
if (_cachedItemInfo isEqualTo []) then {//Not in cache. So get info and put into cache.
private _configPath = configFile >> _configCategory >> _className;
@ -41,9 +41,6 @@ if (_cachedItemInfo isEqualTo []) then {//Not in cache. So get info and put into
if (_dlcName != "") then {
_cachedItemInfo set [2, (modParams [_dlcName,["logo"]]) param [0,""]];//mod picture
_modID = GVAR(modList) find _dlcName;
if (_modID < 0) then {_modID = GVAR(modList) pushback _dlcName;};//We keep a ordered list of all mods for sorting later.
_cachedItemInfo set [3, _modID];//mod ID
} else {
_cachedItemInfo set [2, ""];//mod picture
_cachedItemInfo set [3, 0];//mod ID
@ -51,12 +48,11 @@ if (_cachedItemInfo isEqualTo []) then {//Not in cache. So get info and put into
_cacheNamespace setVariable [_configCategory+_className, _cachedItemInfo];
};
_cachedItemInfo params ["_displayName", "_itemPicture", "_modPicture", "_modID"];
_cachedItemInfo params ["_displayName", "_itemPicture", "_modPicture"];
private _lbAdd = _ctrlPanel lbAdd _displayName;
_ctrlPanel lbSetData [_lbAdd, _className];
_ctrlPanel lbSetPicture [_lbAdd, _itemPicture];
_ctrlPanel lbSetPictureRight [_lbAdd,["",_modPicture] select (GVAR(enableModIcons))];
_ctrlPanel lbSetValue [_lbAdd,_modID];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];

View File

@ -0,0 +1,70 @@
#include "script_component.hpp"
/*
* Author: SynixeBrett
* Add a custom sorting method.
*
* Arguments:
* 0: Tabs to add stat to <ARRAY>
* 0: Left Tab Indexes <ARRAY>
* 1: Right Tab Indexes <ARRAY>
* 1: Sort Class (a unique string for each algorithm) <STRING>
* 2: Display Name <STRING>
* 3: Algorithm <CODE>
*
* Return Value:
* 0: Array of IDs (ARRAY of STRINGS)
*
* Example:
* [[[0, 1]], "fireRateSort", "Sort by fire rate", {
* params ["_itemCfg"];
* private _fireModes = getArray (_itemCfg >> "modes");
* private _fireRate = [];
*
* {
* _fireRate pushBackUnique (getNumber (_itemCfg >> _x >> "reloadTime"));
* } foreach _fireModes;
*
* _fireRate sort true;
* _fireRate param [0, 0]
* }] call ACE_arsenal_fnc_addSort;
*
* Public: Yes
*/
params [
["_tabs", [[], []], [[]], 2],
["_class", "", [""]],
["_displayName", "", [""]],
["_statement", {}, [{}]]
];
_tabs params [
["_leftTabs", [], [[]]],
["_rightTabs", [], [[]]]
];
call FUNC(compileSorts);
private _returnArray = [];
private _fnc_addToTabs = {
params ["_tabsList", "_tabsToAddTo", "_sideString"];
{
private _arrayToSave = +_finalArray;
_arrayToSave set [0, [_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""];
_returnArray pushBack (_arrayToSave select 0);
(_tabsList select _x) pushBack _arrayToSave;
} forEach _tabsToAddTo;
};
_finalArray = ["", _displayName, _statement];
if !(_leftTabs isEqualTo []) then {
[GVAR(sortListLeftPanel), _leftTabs, "L", 0] call _fnc_addToTabs;
};
if !(_rightTabs isEqualTo []) then {
[GVAR(sortListRightPanel), _rightTabs, "R", 1] call _fnc_addToTabs;
};
_returnArray

View File

@ -5,7 +5,7 @@
*
* Arguments:
* 0: Tabs to add the stat to (ARRAY of ARRAYS)
* 0.1: Left tab indexes (ARRAY of NUMBERS)
* 0.1 Left tab indexes (ARRAY of NUMBERS)
* 0.2 Right tab indexes (ARRAY of NUMBERS)
* 1: Stat class (STRING) (A unique string for each stat)
* 2: Config entries to pass (ARRAY of STRINGS)
@ -14,7 +14,7 @@
* 4.1 Show bar (BOOL)
* 4.2 Show text (BOOL)
* 5: Array of statements (ARRAY of ARRAYS)
* 5.1: Bar code (CODE)
* 5.1 Bar code (CODE)
* 5.2 Text code (CODE)
* 5.3 Condition code (CODE)
* 6: Priority (NUMBER) (Optional)

View File

@ -0,0 +1,82 @@
#include "script_component.hpp"
/*
* Author: SynixeBrett
* Create the internal stats arrays when needed for the first time
*
* Arguments:
* None
*
* Return Value:
* None
*
* Public: No
*/
if (!isNil QGVAR(sortListLeftPanel)) exitWith {};
private _fnc_addToTabs = {
params ["_tabsList", "_tabsToAddTo", "_sideString"];
{
private _arrayToSave = +_finalArray;
_arrayToSave set [0, [_class, _sideString, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""];
(_tabsList select _x) pushBack _arrayToSave;
} forEach _tabsToAddTo;
};
private _sortListLeftPanel = [
[], // Primary 0
[], // Handgun 1
[], // Launcher 2
[], // Uniform 3
[], // Vests 4
[], // Backpacks 5
[], // Headgear 6
[], // Goggles 7
[], // NVGs 8
[], // Binoculars 9
[], // Map 10
[], // GPS 11
[], // Radio 12
[], // Compass 13
[] // Watch 14
];
private _sortListRightPanel = [
[], // Optics 0
[], // Side accs 1
[], // Muzzle 2
[], // Bipod 3
[], // Mag 4
[], // Throw 5
[], // Put 6
[] // Misc 7
];
//------------------------- Config handling
private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (configFile >> QGVAR(sorts));
{
private _finalArray = [];
private _class = configName _x;
private _displayName = getText (_x >> "displayName");
private _statement = getText (_x >> "statement");
(getArray (_x >> "tabs")) params ["_leftTabsList", "_rightTabsList"];
if (_statement != "") then {
_statement = compile _statement;
};
_finalArray = ["", _displayName, _statement];
if !(_leftTabsList isEqualTo []) then {
[_sortListLeftPanel, _leftTabsList, "L"] call _fnc_addToTabs;
};
if !(_rightTabsList isEqualTo []) then {
[_sortListRightPanel, _rightTabsList, "R"] call _fnc_addToTabs;
};
} foreach _configEntries;
missionNamespace setVariable [QGVAR(sortListLeftPanel), _sortListLeftPanel];
missionNamespace setVariable [QGVAR(sortListRightPanel), _sortListRightPanel];

View File

@ -37,6 +37,10 @@ _ctrlPanel ctrlCommit FADE_DELAY;
_ctrlPanel lbSetCurSel -1;
// Fill sort options
private _sortLeftCtrl = _display displayCtrl IDC_sortLeftTab;
[_display, _control, _sortLeftCtrl] call FUNC(fillSort);
// Handle icons and filling
switch true do {
case (_ctrlIDC in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon]) : {
@ -187,8 +191,7 @@ GVAR(currentLeftPanel) = _ctrlIDC;
[QGVAR(leftPanelFilled), [_display, _ctrlIDC, GVAR(currentRightPanel)]] call CBA_fnc_localEvent;
// Sort
private _sortLeftCtrl = _display displayCtrl IDC_sortLeftTab;
[_sortLeftCtrl, _sortLeftCtrl lbValue (lbCurSel _sortLeftCtrl)] call FUNC(sortPanel);
[_sortLeftCtrl] call FUNC(sortPanel);
//Select current item
private _itemsToCheck = ((GVAR(currentItems) select [0,15]) + [GVAR(currentFace), GVAR(currentVoice), GVAR(currentInsignia)]) apply {tolower _x};

View File

@ -351,30 +351,9 @@ if (GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBack
// Sorting
private _sortRightCtrl = _display displayCtrl IDC_sortRightTab;
private _sortRightCurSel = lbCurSel _sortRightCtrl;
[_display, _control, _sortRightCtrl] call FUNC(fillSort);
if (lbSize _sortRightCtrl == 3) then {
_sortRightCtrl lbDelete 2;
};
if (_leftPanelState) then {
_sortRightCtrl lbDelete 1;
_sortRightCtrl lbAdd (localize "STR_a3_rscdisplayarsenal_sort_mod");
_sortRightCtrl lbSetValue [1, 1];
_sortRightCtrl lbSetCurSel ([0, _sortRightCurSel] select (_sortRightCurSel != 2));
} else {
_sortRightCtrl lbDelete 1;
_sortRightCtrl lbAdd localize LSTRING(sortByWeightText);
_sortRightCtrl lbSetValue [1, 1];
_sortRightCtrl lbAdd localize LSTRING(sortByAmountText);
_sortRightCtrl lbSetValue [2, 2];
_sortRightCtrl lbSetCurSel _sortRightCurSel;
};
[_sortRightCtrl, _sortRightCtrl lbValue (lbCurSel _sortRightCtrl)] call FUNC(sortPanel);
[_sortRightCtrl] call FUNC(sortPanel);
// Select current data if not in a container
if !(_itemsToCheck isEqualTo []) then {

View File

@ -0,0 +1,99 @@
#include "script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, SynixeBrett
* Fill right panel.
*
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Tab control <CONTROL>
* 2: Sort control <CONTROL>
*
* Return Value:
* None
*
* Public: No
*/
params ["_display", "_control", "_sortCtrl"];
lbClear _sortCtrl;
private _right = false;
private _rightSort = ctrlIDC _sortCtrl == 17;
private _sorts = if (_rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform ,IDC_buttonVest, IDC_buttonBackpack]}) then {
_right = true;
GVAR(sortListRightPanel) select (
switch (GVAR(currentRightPanel)) do {
case IDC_buttonOptic: { 0 };
case IDC_buttonItemAcc: { 1 };
case IDC_buttonMuzzle: { 2 };
case IDC_buttonBipod: { 3 };
case IDC_buttonCurrentMag;
case IDC_buttonCurrentMag2;
case IDC_buttonMag;
case IDC_buttonMagALL: { 4 };
case IDC_buttonThrow: { 5 };
case IDC_buttonPut: { 6 };
case IDC_buttonMisc: { 7 };
}
)
} else {
private _sidc = ctrlIDC _sortCtrl;
private _idc = ctrlIDC _control;
switch true do {
case (_sidc == 17): { // Right panel weapon attachment
GVAR(sortListRightPanel) select (
switch (_idc) do {
case IDC_buttonOptic: { 0 };
case IDC_buttonItemAcc: { 1 };
case IDC_buttonMuzzle: { 2 };
case IDC_buttonBipod: { 3 };
case IDC_buttonCurrentMag;
case IDC_buttonCurrentMag2;
case IDC_buttonMag;
case IDC_buttonMagALL: { 4 };
case IDC_buttonThrow: { 5 };
case IDC_buttonPut: { 6 };
case IDC_buttonMisc: { 7 };
}
)
};
case ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsigna] find _idc > -1): {
[]
};
default {
GVAR(sortListLeftPanel) select ([
IDC_buttonPrimaryWeapon,
IDC_buttonHandgun,
IDC_buttonSecondaryWeapon,
IDC_buttonUniform,
IDC_buttonVest,
IDC_buttonBackpack,
IDC_buttonHeadgear,
IDC_buttonGoggles,
IDC_buttonNVG,
IDC_buttonBinoculars,
IDC_buttonMap,
IDC_buttonGPS,
IDC_buttonRadio,
IDC_buttonCompass,
IDC_buttonWatch
] find _idc)
};
}
};
private _lastSort = [GVAR(lastSortLeft), GVAR(lastSortRight)] select _rightSort;
private _sortIndex = 0;
{
if (_x isEqualTo []) exitWith {};
_sortCtrl lbAdd (_x select 1);
if ((_x select 1) isEqualTo _lastSort) then {
_sortIndex = _forEachIndex;
};
} forEach _sorts;
_sortCtrl lbSetCurSel _sortIndex;

View File

@ -1,12 +1,11 @@
#include "script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, Dedmen
* Author: Alganthe, Dedmen, SynixeBrett
* Sort arsenal panel.
*
* Arguments:
* 0: Panel's control to sort <CONTROL>
* 1: Sorting mode <SCALAR>
* 0: Sort control <CONTROL>
*
* Return Value:
* None
@ -14,60 +13,137 @@
* Public: No
*/
params ["_control", "_mode"];
params ["_sortControl"];
private _display = ctrlParent _control;
private ["_panel", "_curSel", "_selected"];
private _display = ctrlParent _sortControl;
// Right panel
if (ctrlIDC _control == 17 && {GVAR(currentLeftPanel) in [IDC_buttonUniform ,IDC_buttonVest, IDC_buttonBackpack]}) then {
_panel = _display displayCtrl IDC_rightTabContentListnBox;
_curSel = lnbCurSelRow _panel;
_selected = _panel lnbData [_curSel, 0];
private _rightSort = ctrlIDC _sortControl == 17;
private _right = _rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]};
switch (_mode) do {
case 0: {
_panel lnbSort [1, false];
};
case 1: {
_panel lnbSortByValue [0, false];
};
case 2: {
for "_i" from 0 to (((lnbsize _panel) select 0) - 1) do {
_panel lnbSetText [[_i, 2], str (parseNumber (_panel lnbText [_i, 2]) / 1000)];
};
_panel lnbSort [2, true];
for "_i" from 0 to (((lnbsize _panel) select 0) - 1) do {
_panel lnbSetText [[_i, 2], str (parseNumber (_panel lnbText [_i, 2]) * 1000)];
};
};
};
if (_cursel >= 0) then {
for '_i' from 0 to (((lnbsize _panel) select 0) - 1) do {
if ((_panel lnbdata [_i, 0]) == _selected) exitwith {_panel lnbSetCurSelRow _i};
};
};
// Left panel
} else {
_panel = _display displayCtrl ([IDC_leftTabContent, IDC_rightTabContent] select (ctrlIDC _control == 17));
_curSel = lbCurSel _panel;
_selected = _panel lbData _curSel;
if (_mode > 0) then {
lbSortByValue _panel;
if (_rightSort) then {
[
if (_right) then {
_display displayCtrl IDC_rightTabContentListnBox
} else {
lbsort _panel;
};
_display displayCtrl IDC_rightTabContent
},
switch (GVAR(currentRightPanel)) do {
case IDC_buttonCurrentMag;
case IDC_buttonCurrentMag2;
case IDC_buttonThrow;
case IDC_buttonPut;
case IDC_buttonMag;
case IDC_buttonMagALL: { "CfgMagazines" };
default { "CfgWeapons" };
},
GVAR(sortListRightPanel) select (
switch (GVAR(currentRightPanel)) do {
case IDC_buttonOptic: { 0 };
case IDC_buttonItemAcc: { 1 };
case IDC_buttonMuzzle: { 2 };
case IDC_buttonBipod: { 3 };
case IDC_buttonCurrentMag;
case IDC_buttonCurrentMag2;
case IDC_buttonMag;
case IDC_buttonMagALL: { 4 };
case IDC_buttonThrow: { 5 };
case IDC_buttonPut: { 6 };
case IDC_buttonMisc: { 7 };
}
)
]
} else {
[
_display displayCtrl IDC_leftTabContent,
switch (GVAR(currentLeftPanel)) do {
case IDC_buttonBackpack: { "CfgVehicles" };
case IDC_buttonGoggles: { "CfgGlasses" };
default { "CfgWeapons" };
},
(GVAR(sortListLeftPanel) select ([
IDC_buttonPrimaryWeapon,
IDC_buttonHandgun,
IDC_buttonSecondaryWeapon,
IDC_buttonUniform,
IDC_buttonVest,
IDC_buttonBackpack,
IDC_buttonHeadgear,
IDC_buttonGoggles,
IDC_buttonNVG,
IDC_buttonBinoculars,
IDC_buttonMap,
IDC_buttonGPS,
IDC_buttonRadio,
IDC_buttonCompass,
IDC_buttonWatch
] find GVAR(currentLeftPanel)))
]
} params ["_panel", "_cfgClass", "_sorts"];
if (_cursel >= 0) then {
for '_i' from 0 to (lbsize _panel - 1) do {
if ((_panel lbdata _i) == _selected) exitwith {_panel lbSetCurSel _i};
private _curSel = if (_right) then {
lnbCurSelRow _panel
} else {
lbCurSel _panel
};
private _selected = if (_right) then {
_panel lnbData [_curSel, 0];
} else {
_panel lbData _curSel
};
private _mode = 0 max lbCurSel _sortControl;
private _statement = _sorts select _mode select 2;
missionNamespace setVariable [
[QGVAR(lastSortLeft), QGVAR(lastSortRight)] select _rightSort,
_sorts select _mode select 1
];
private _for = if (_right) then {
for '_i' from 0 to ((lnbSize _panel select 0) - 1)
} else {
for '_i' from 1 to (lbSize _panel - 1)
};
_for do {
private _item = if (_right) then {
_panel lnbData [_i, 0]
} else {
_panel lbData _i
};
private _itemCfg = configFile >> _cfgClass >> _item;
private _value = _itemCfg call _statement;
if (_value isEqualType 0) then {
_value = [_value, 8] call CBA_fnc_formatNumber;
};
if (_value isEqualTo "") then {
_value = "_";
};
if (_right) then {
_panel lnbSetText [[_i, 1], format ["%1%2", _value, _panel lnbText [_i, 1]]];
} else {
_panel lbSetText [_i, format ["%1%2", _value, _panel lbText _i]];
};
};
if (_right) then {
_panel lnbSort [1, false];
_for do {
private _data = _panel lnbData [_i, 0];
if (_cursel >= 0) then {
if (_data == _selected) then {_panel lnbSetCurSelRow _i};
};
_panel lnbSetText [[_i, 1], getText (configFile >> _cfgClass >> _data >> "displayName")];
};
} else {
lbSort [_panel, "ASC"];
_for do {
private _data = _panel lbData _i;
if (_cursel >= 0) then {
if (_data == _selected) then {_panel lbSetCurSel _i};
};
_panel lbSetText [_i, getText (configFile >> _cfgClass >> _data >> "displayName")];
};
};

View File

@ -0,0 +1,34 @@
#include "script_component.hpp"
/*
* Author: Alganthe, SynixeBrett
* Statement to sort weapons by their accuracy.
*
* Arguments:
* 0: Item Config <CONFIG>
*
* Return Value:
* Sorting Value <NUMBER>
*
* Public: No
*/
params ["_config"];
private _fireModes = getArray (_config >> "modes");
private _dispersion = [];
{
if (getNumber (_config >> _x >> "showToPlayer") != 0) then {
private _n = log getNumber (_config >> _x >> "dispersion");
if (!finite _n) then {
_n = 0;
};
_dispersion pushBackUnique _n;
};
} foreach _fireModes;
_dispersion sort true;
10000000 - round ((_dispersion param [0, 0]) * 100000)

View File

@ -0,0 +1,17 @@
#include "script_component.hpp"
/*
* Author: SynixeBrett
* Statement to sort magazines by their ammo count.
*
* Arguments:
* 0: Item Config <CONFIG>
*
* Return Value:
* Sorting Value <NUMBER>
*
* Public: No
*/
params ["_config"];
getNumber (_config >> "count")

View File

@ -0,0 +1,27 @@
#include "script_component.hpp"
/*
* Author: Alganthe, SynixeBrett
* Statement to sort items by their mass.
*
* Arguments:
* 0: Item Config <CONFIG>
*
* Return Value:
* Sorting Value <NUMBER>
*
* Public: No
*/
params ["_config"];
private _mass = getNumber (_config >> "mass");
if (_mass == 0 && {isClass (_config >> "itemInfo")}) then {
_mass = getNumber (_config >> "itemInfo" >> "mass");
};
if (_mass == 0 && {isClass (_config >> "WeaponSlotsInfo")}) then {
_mass = getNumber (_config >> "WeaponSlotsInfo" >> "mass");
};
_mass

View File

@ -0,0 +1,26 @@
#include "script_component.hpp"
/*
* Author: SynixeBrett
* Statement to sort items by the mod they belong to.
*
* Arguments:
* 0: Item Config <CONFIG>
*
* Return Value:
* Mod Name to Sort By <STRING>
*
* Public: No
*/
params ["_config"];
private _dlc = "";
private _addons = configSourceAddonList _config;
if !(_addons isEqualTo []) then {
private _mods = configSourceModList (configfile >> "CfgPatches" >> _addons select 0);
if !(_mods isEqualTo []) then {
_dlc = _mods select 0;
};
};
modParams [_dlc, ["name"]] param [0, ""]

View File

@ -0,0 +1,26 @@
#include "script_component.hpp"
/*
* Author: Alganthe, SynixeBrett
* Statement to sort weapons by their rate of fire.
*
* Arguments:
* 0: Item Config <CONFIG>
*
* Return Value:
* Sorting Value <NUMBER>
*
* Public: No
*/
params ["_config"];
private _fireModes = getArray (_config >> "modes");
private _fireRate = [];
{
_fireRate pushBackUnique getNumber (_config >> _x >> "reloadTime");
} foreach _fireModes;
_fireRate sort true;
round (60 / (_fireRate param [0, 0]))

View File

@ -0,0 +1,24 @@
#include "script_component.hpp"
/*
* Author: Alganthe, SynixeBrett
* Statement to sort optics by their magnification.
*
* Arguments:
* 0: Item Config <CONFIG>
*
* Return Value:
* Sorting Value <NUMBER|STRING>
*
* Public: No
*/
params ["_config"];
private _minZoom = 999; // FOV, so smaller is more zoomed in
{
_minZoom = _minZoom min getNumber (_x >> "opticsZoomMin");
} forEach configProperties [_config >> "ItemInfo" >> "OpticsModes", "isClass _x"];
if (_minZoom in [0, 999]) exitWith {"?"};
round ((0.25 / _minZoom) * 10)

View File

@ -380,6 +380,26 @@
<Czech>Seřadit podle množství</Czech>
<Turkish>Miktara göre sırala</Turkish>
</Key>
<Key ID="STR_ACE_Arsenal_sortByLoadText">
<English>Sort by load</English>
<German>Nach Tragelast sortieren</German>
</Key>
<Key ID="STR_ACE_Arsenal_sortByAccuracyText">
<English>Sort by accuracy</English>
<German>Nach Genauigkeit sortieren</German>
</Key>
<Key ID="STR_ACE_Arsenal_sortByRateOfFireText">
<English>Sort by rate of fire</English>
<German>Nach Schussrate sortieren</German>
</Key>
<Key ID="STR_ACE_Arsenal_sortByMagnificationText">
<English>Sort by magnification</English>
<German>Nach Vergrößerung sortieren</German>
</Key>
<Key ID="STR_ACE_Arsenal_sortByMagCountText">
<English>Sort by ammo count</English>
<German>Nach Munitionszahl sortieren</German>
</Key>
<Key ID="STR_ACE_Arsenal_buttonShareTooltip">
<English>Share or stop sharing the selected loadout</English>
<Spanish>Compartir o dejar de compartir el equipamiento seleccionado</Spanish>

View File

@ -523,32 +523,10 @@ class GVAR(display) {
h = QUOTE(6 * GRID_H);
onLBSelChanged = QUOTE(_this call FUNC(sortPanel));
sizeEx = QUOTE(5 * GRID_H);
class Items {
class Alphabet {
text="$STR_a3_rscdisplayarsenal_sort_alphabet";
default=1;
value= 0;
};
class Mod {
text="$STR_a3_rscdisplayarsenal_sort_mod";
value= 1;
};
};
};
class sortRightTab: sortLeftTab {
idc = IDC_sortRightTab;
x = QUOTE(safezoneX + safezoneW - 93 * GRID_W);
class Items {
class Alphabet {
text="$STR_a3_rscdisplayarsenal_sort_alphabet";
default=1;
value= 0;
};
class Weight {
text="$STR_a3_rscdisplayarsenal_sort_mod";
value= 1;
};
};
};
class leftSearchbar: ctrlEdit {
idc = IDC_leftSearchbar;