ACE3/addons/arsenal/functions/fnc_handleSearchbar.sqf
johnb432 c8404f496e
Arsenal - Add/Fix/Improve/Change numerous aspects (#9040)
* Arsenal update

* Fixes

* Update fnc_onSelChangedLeft.sqf

* Update fnc_updateUniqueItemsList.sqf

* Header fixes

* Fix for defines.hpp

Co-authored-by: Dystopian <sddex@ya.ru>

* Moved fnc_baseWeapon, filtered invalid items

* Update addons/arsenal/functions/fnc_scanConfig.sqf

Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>

* Fixes and tweaks

- Sorting is guaranteed to give a fixed order
- Dog tags no longer throw errors when reloading the ACE arsenal mission when you had some saved in your loadout before quitting the last time you played.

* Cleanup, bug fixes and additions

- Added the ability to add items from "CfgMagazines" into the "Misc. items" or custom tabs.
- Added "baseWeapon" class support for weapon attachments. If a weapon attachment has the config property "baseWeapon" defined, it will take that item and show that in the arsenal.
- Added stronger filtering on item scopes (scope > 0 at least for every item)
- Added "descending" (default, as it is now) and "ascending" sort order as a drop down menu,
- Unique backpacks in containers can now be removed with either the "-" or "clear all items" button.
- When sorting by a number, 2 decimal points have been added, so that when you sort by weight it returns the correct order.

* More fixes and tweaks

- Converted the arsenal to partially work with hashmaps instead of arrays (for configItems and virtualItems, currentItems is still an array).
- Because of the above, performance of FUNC(addVirtualItems) and FUNC(removeVirtualItems) has improved immensely.
- Sorting now caches results, reducing repeated sorting times drastically.
- CBA disposable launchers are handled differently now: Within the arsenal, you can change weapon attachments on disposable launchers, but you can't change their magazines (primary or secondary). Item info on the right and the stats show correct information.
- FUNC(addSort) now checks if the new sorting method already exists and doesn't add it if it does.
- FUNC(removeSort) now exists. You can't remove the default sort type (alphabetically) to avoid problems with the arsenal.
- Both FUNC(addStat) and FUNC(compileStats) actually taken priority into account now. Because of that priority on several stats needed to be tweaked.
- FUNC(removeStat) ensures that there are no gaps within the stat array (so if there is an empty spot in the stats page, it's because there is a stat, but the condition for it being shown hasn't been met).

* Update fnc_replaceUniqueItemsLoadout.sqf

* Update fnc_onSelChangedLeft.sqf

* Update fnc_scanConfig.sqf

* Update docs/wiki/framework/arsenal-framework.md

Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>

* Minor cleanup

* Baseweapon filtering

* Improvements + better unique items support

* Update fnc_fillRightPanel.sqf

* Update fnc_onSelChangedLeft.sqf

Fixed: Switching between weapons with incompatible primary magazines while a compatible secondary magazine is loaded doesn't equip the new weapon's primary magazine.

* Update addons/common/functions/fnc_uniqueUnitItems.sqf

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

* undefined variable

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

* fix undefined loadout var

* Update fnc_fillLoadoutsList.sqf

---------

Co-authored-by: Dystopian <sddex@ya.ru>
Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>
Co-authored-by: PabstMirror <pabstmirror@gmail.com>
2023-07-21 21:25:25 +03:00

178 lines
6.5 KiB
Plaintext

#include "script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, johnb43
* Handles keyboard inputs inside the searchbars text boxes.
*
* Arguments:
* 0: Arsenal display <DISPLAY>
* 1: Searchbar control <CONTROL>
*
* Return Value:
* None
*
* Public: No
*/
params ["_display", "_control"];
private _searchString = ctrlText _control;
// Right panel search bar
if ((ctrlIDC _control) == IDC_rightSearchbar) then {
// Don't refill if there is no need
if (GVAR(lastSearchTextRight) != "" && {(_searchString find GVAR(lastSearchTextRight)) != 0}) then {
[_display, _display displayCtrl GVAR(currentRightPanel)] call FUNC(fillRightPanel);
};
GVAR(lastSearchTextRight) = _searchString;
// If nothing searched, quit here
if (_searchString == "") exitWith {};
private _rightPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon, IDC_buttonBinoculars];
private _rightPanelCtrl = [_display displayCtrl IDC_rightTabContentListnBox, _display displayCtrl IDC_rightTabContent] select _rightPanelState;
_searchString = toLower _searchString;
// If right panel selection is weapons or binoculars
if (_rightPanelState) then {
// Get the currently selected item in panel
private _selectedItemIndex = lbCurSel _rightPanelCtrl;
private _selectedItem = "";
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _rightPanelCtrl lbText _selectedItemIndex;
};
private _currentDisplayName = "";
private _currentClassname = "";
// Go through all items in panel and see if they need to be deleted or not
for "_lbIndex" from (lbSize _rightPanelCtrl) - 1 to 0 step -1 do {
_currentDisplayName = toLower (_rightPanelCtrl lbText _lbIndex);
_currentClassname = toLower (_rightPanelCtrl lbData _lbIndex);
// Remove item in panel if it doesn't match search, skip otherwise
if ((_currentDisplayName == "") || {!(_searchString in _currentDisplayName) && {!(_searchString in _currentClassname)}}) then {
_rightPanelCtrl lbDelete _lbIndex;
};
};
// Try to select previously selected item again, otherwise select nothing
if (_selectedItemIndex != -1) then {
private _index = -1;
// Try to find previously selected item in panel
for "_lbIndex" from 0 to (lbSize _rightPanelCtrl) - 1 do {
if ((_rightPanelCtrl lbText _lbIndex) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
// Select old item if found, otherwise don't select anything
_rightPanelCtrl lbSetCurSel _index;
} else {
_rightPanelCtrl lbSetCurSel -1;
};
} else {
// Get the currently selected item in panel
private _selectedItemIndex = lnbCurSelRow _rightPanelCtrl;
private _selectedItem = "";
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _rightPanelCtrl lnbText [_selectedItemIndex, 1];
};
private _currentDisplayName = "";
private _currentClassname = "";
// Go through all items in panel and see if they need to be deleted or not
for "_lbIndex" from (lnbSize _rightPanelCtrl select 0) - 1 to 0 step -1 do {
_currentDisplayName = toLower (_rightPanelCtrl lnbText [_lbIndex, 1]);
_currentClassname = toLower (_rightPanelCtrl lnbData [_lbIndex, 0]);
// Remove item in panel if it doesn't match search, skip otherwise
if ((_currentDisplayName == "") || {!(_searchString in _currentDisplayName) && {!(_searchString in _currentClassname)}}) then {
_rightPanelCtrl lnbDeleteRow _lbIndex;
};
};
// Try to select previously selected item again, otherwise select nothing
if (_selectedItemIndex != -1) then {
private _index = -1;
// Try to find previously selected item in panel
for "_lbIndex" from 0 to (lnbSize _rightPanelCtrl select 0) - 1 do {
if ((_rightPanelCtrl lnbText [_lbIndex, 1]) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
// Select old item if found, otherwise don't select anything
_rightPanelCtrl lnbSetCurSelRow _index;
} else {
_rightPanelCtrl lnbSetCurSelRow -1;
};
};
[_display, nil, nil, configNull] call FUNC(itemInfo);
} else {
// Left panel search bar
// Don't refill if there is no need
if (GVAR(lastSearchTextLeft) != "" && {(_searchString find GVAR(lastSearchTextLeft)) != 0}) then {
[_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel);
};
GVAR(lastSearchTextLeft) = _searchString;
// If nothing searched, quit here
if (_searchString == "") exitWith {};
private _leftPanelCtrl = _display displayCtrl IDC_leftTabContent;
_searchString = toLower _searchString;
// Get the currently selected item in panel
private _selectedItemIndex = lbCurSel _leftPanelCtrl;
private _selectedItem = "";
// If something is selected, save it
if (_selectedItemIndex != -1) then {
_selectedItem = _leftPanelCtrl lbText _selectedItemIndex;
};
private _currentDisplayName = "";
private _currentClassname = "";
// Go through all items in panel and see if they need to be deleted or not
for "_lbIndex" from (lbSize _leftPanelCtrl) - 1 to 0 step -1 do {
_currentDisplayName = toLower (_leftPanelCtrl lbText _lbIndex);
_currentClassname = toLower (_leftPanelCtrl lbData _lbIndex);
// Remove item in panel if it doesn't match search, skip otherwise
if ((_currentDisplayName == "") || {!(_searchString in _currentDisplayName) && {!(_searchString in _currentClassname)}}) then {
_leftPanelCtrl lbDelete _lbIndex;
};
};
// Try to select previously selected item again, otherwise select nothing
if (_selectedItemIndex != -1) then {
private _index = -1;
for "_lbIndex" from 0 to (lbSize _leftPanelCtrl) - 1 do {
if ((_leftPanelCtrl lbText _lbIndex) == _selectedItem) exitWith {
_index = _lbIndex;
};
};
_leftPanelCtrl lbSetCurSel _index;
} else {
_leftPanelCtrl lbSetCurSel -1;
};
[_display, nil, nil, configNull] call FUNC(itemInfo);
};