diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 478b5b578d..2b5150a0ea 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -9,6 +9,7 @@ PREP(compileMenuSelfAction); PREP(collectActiveActionTree); PREP(createAction); PREP(findActionNode); +PREP(isSubPath); PREP(keyDown); PREP(keyDownSelfAction); PREP(keyUp); diff --git a/addons/interact_menu/functions/fnc_isSubPath.sqf b/addons/interact_menu/functions/fnc_isSubPath.sqf new file mode 100644 index 0000000000..e90aa12300 --- /dev/null +++ b/addons/interact_menu/functions/fnc_isSubPath.sqf @@ -0,0 +1,29 @@ +/* + * Author: CAA-Picard + * Check if the first path is a subpath of the other + * + * Argument: + * 0: LongPath + * 1: ShortPath + * + * Return value: + * Bool + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_2_PVT(_this,_longPath,_shortPath); + +private ["_isSubPath","_i"]; +_isSubPath = true; + +if (count _shortPath > count _longPath) exitWith {false}; + +for [{_i = 0},{_i < (count _shortPath) - 1},{_i = _i + 1}] do { + if !((_longPath select _i) isEqualTo (_shortPath select _i)) exitWith { + _isSubPath = false; + }; +}; + +_isSubPath diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 922027e2a0..df97b232de 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -159,14 +159,18 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { } forEach GVAR(lastPath); }; - if(_misMatch) then { - GVAR(lastPath) = _hoverPath; + if(_misMatch && {diag_tickTime-GVAR(expandedTime) > 0.25}) then { GVAR(startHoverTime) = diag_tickTime; + GVAR(lastPath) = _hoverPath; GVAR(expanded) = false; } else { if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { GVAR(expanded) = true; - GVAR(expandedTime) = diag_tickTime; + + // Start the expanding menu animation only if the user is not going up the menu + if !([GVAR(menuDepthPath),GVAR(lastPath)] call FUNC(isSubPath)) then { + GVAR(expandedTime) = diag_tickTime; + }; GVAR(menuDepthPath) = +GVAR(lastPath); // Execute the current action if it's run on hover diff --git a/addons/interact_menu/functions/fnc_splitPath.sqf b/addons/interact_menu/functions/fnc_splitPath.sqf index 0bbe643adf..87140d0482 100644 --- a/addons/interact_menu/functions/fnc_splitPath.sqf +++ b/addons/interact_menu/functions/fnc_splitPath.sqf @@ -15,9 +15,13 @@ private ["_parentPath","_actionName"]; _parentPath = []; -for "_i" from 0 to (count _this) - 1 do { +for [{_i = 0},{_i < (count _this) - 1},{_i = _i + 1}] do { _parentPath pushBack (_this select _i); }; -_actionName = _this select ((count _this) - 1); +_actionName = if (count _this > 0) then { + _this select ((count _this) - 1); +} else { + "" +}; [_parentPath, _actionName]