Merge pull request #1534 from Areloch/EscapeMenuActionmapFixes

Fix escape menu keybind not working
This commit is contained in:
Brian Roberts 2025-08-11 09:19:24 -05:00 committed by GitHub
commit 0404b743f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 77 additions and 4 deletions

View file

@ -161,6 +161,9 @@ void GuiCrossHairHud::onRender(Point2I offset, const RectI &updateRect)
{
if (mFrameTime->getElapsedMs() > 32)
{
if (GuiOffscreenCanvas::sActiveOffscreenCanvas)
GuiOffscreenCanvas::sActiveOffscreenCanvas->setActive(false);
GuiOffscreenCanvas::sActiveOffscreenCanvas = NULL;
mFrameTime->reset();
@ -197,6 +200,7 @@ void GuiCrossHairHud::onRender(Point2I offset, const RectI &updateRect)
canvas->setCursorPos(newCursorPos);
canvas->markDirty();
GuiOffscreenCanvas::sActiveOffscreenCanvas = canvas;
GuiOffscreenCanvas::sActiveOffscreenCanvas->setActive(true);
break;
}
}

View file

@ -393,6 +393,7 @@ void GuiCanvas::setWindowTitle(const char *newTitle)
}
CanvasSizeChangeSignal GuiCanvas::smCanvasSizeChangeSignal;
CanvasSetActiveSignal GuiCanvas::smCanvasSetActiveSignal;
void GuiCanvas::handleResize( WindowId did, S32 width, S32 height )
{
@ -2202,6 +2203,13 @@ StringTableEntry GuiCanvas::getLastInputDeviceType()
return StringTable->EmptyString();
}
void GuiCanvas::setActive(bool value)
{
Parent::setActive(value);
GuiCanvas::getCanvasSetActiveSignal().trigger(this, value);
}
DefineEngineMethod( GuiCanvas, getContent, S32, (),,
"@brief Get the GuiControl which is being used as the content.\n\n"
@ -3027,3 +3035,11 @@ DefineEngineMethod(GuiCanvas, getLastInputDevice, const char*, (), , "Returns th
{
return object->getLastInputDeviceType();
}
DefineEngineMethod(GuiCanvas, getActiveOffscreenCanvas, S32, (), , "Returns the SimID of the active offscreen canvas, if one exists. If not, returns 0")
{
if (GuiOffscreenCanvas::sActiveOffscreenCanvas && GuiOffscreenCanvas::sActiveOffscreenCanvas->isActive())
return GuiOffscreenCanvas::sActiveOffscreenCanvas->getId();
return 0;
}

View file

@ -86,6 +86,8 @@
class guiCanvas;
class Point2I;
typedef Signal<void(GuiCanvas* canvas)> CanvasSizeChangeSignal;
typedef Signal<void(GuiCanvas* canvas, bool isActive)> CanvasSetActiveSignal;
class GuiCanvas : public GuiControl, public IProcessInput
{
@ -210,10 +212,13 @@ protected:
void checkLockMouseMove( const GuiEvent& event );
//Signal used to let others know this canvas has changed size.
static CanvasSizeChangeSignal smCanvasSizeChangeSignal;
static CanvasSetActiveSignal smCanvasSetActiveSignal;
GuiControl *mMenuBarCtrl;
GuiControl* mMenuBackground;
bool mConstrainMouse;
typedef Signal< void(SetModification modification, SimSet* set, SimObject* object) > SetModificationSignal;
public:
DECLARE_CONOBJECT(GuiCanvas);
DECLARE_CATEGORY( "Gui Core" );
@ -230,6 +235,7 @@ public:
static void initPersistFields();
static CanvasSizeChangeSignal& getCanvasSizeChangeSignal() { return smCanvasSizeChangeSignal; }
static CanvasSetActiveSignal& getCanvasSetActiveSignal() { return smCanvasSetActiveSignal; }
/// @name Rendering methods
///
@ -477,16 +483,18 @@ public:
private:
static const U32 MAX_GAMEPADS = 4; ///< The maximum number of supported gamepads
protected:
protected:
bool mConsumeLastInputEvent;
S32 mLastInputDeviceType;
public:
public:
void clearMouseRightButtonDown(void) { mMouseRightButtonDown = false; }
void clearMouseButtonDown(void) { mMouseButtonDown = false; }
void setConsumeLastInputEvent(bool flag) { mConsumeLastInputEvent = flag; }
bool getLastCursorPoint(Point2I& pt) const { pt = mLastCursorPt; return mLastCursorEnabled; }
StringTableEntry getLastInputDeviceType();
void setActive(bool value) override;
};
typedef GuiCanvas::KeyTranslationMode KeyboardTranslationMode;
DefineEnumType(KeyboardTranslationMode);

View file

@ -23,6 +23,7 @@
#include "gui/utility/guiInputCtrl.h"
#include "sim/actionMap.h"
#include "console/engineAPI.h"
#include "gui/core/guiCanvas.h"
IMPLEMENT_CONOBJECT(GuiInputCtrl);
@ -88,6 +89,22 @@ void GuiInputCtrl::initPersistFields()
}
//------------------------------------------------------------------------------
bool GuiInputCtrl::onAdd()
{
if (!Parent::onAdd())
return false;
GuiCanvas::getCanvasSetActiveSignal().notify(this, &GuiInputCtrl::handleCanvasSetActive);
return true;
}
void GuiInputCtrl::onRemove()
{
GuiCanvas::getCanvasSetActiveSignal().remove(this, &GuiInputCtrl::handleCanvasSetActive);
Parent::onRemove();
}
bool GuiInputCtrl::onWake()
{
@ -108,8 +125,11 @@ bool GuiInputCtrl::onWake()
if(mActionmap != nullptr)
{
SimSet* actionMapSet = Sim::getActiveActionMapSet();
actionMapSet->pushObject(mActionmap);
if (getRoot()->isActive())
{
SimSet* actionMapSet = Sim::getActiveActionMapSet();
actionMapSet->pushObject(mActionmap);
}
}
setFirstResponder();
@ -152,6 +172,25 @@ void GuiInputCtrl::setActive(bool value)
}
void GuiInputCtrl::handleCanvasSetActive(GuiCanvas* canvas, bool isActive)
{
if (mActionmap == nullptr)
return;
if (getRoot() == canvas)
{
if (isActive)
{
SimSet* actionMapSet = Sim::getActiveActionMapSet();
actionMapSet->pushObject(mActionmap);
}
else
{
SimSet* actionMapSet = Sim::getActiveActionMapSet();
actionMapSet->removeObject(mActionmap);
}
}
}
//------------------------------------------------------------------------------
static bool isModifierKey( U16 keyCode )

View file

@ -47,6 +47,9 @@ public:
GuiInputCtrl();
bool onAdd() override;
void onRemove() override;
// GuiControl.
bool onWake() override;
void onSleep() override;
@ -57,6 +60,8 @@ public:
static void initPersistFields();
void handleCanvasSetActive(GuiCanvas* canvas, bool isActive);
DECLARE_CONOBJECT(GuiInputCtrl);
DECLARE_CATEGORY( "Gui Other Script" );
DECLARE_DESCRIPTION( "A control that locks the mouse and reports all input events to script." );

View file

@ -50,6 +50,7 @@ function Prototyping::onCreateClientConnection(%this)
dynamicTarget = false;
canInteract = true;
maxInteractDistance = "3";
active = false;
};
}