浏览代码

Merge pull request #1534 from Areloch/EscapeMenuActionmapFixes

Fix escape menu keybind not working
Brian Roberts 1 月之前
父节点
当前提交
0404b743f6

+ 4 - 0
Engine/source/T3D/fps/guiCrossHairHud.cpp

@@ -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;
                         }
                      }

+ 16 - 0
Engine/source/gui/core/guiCanvas.cpp

@@ -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;
+}

+ 10 - 2
Engine/source/gui/core/guiCanvas.h

@@ -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);

+ 41 - 2
Engine/source/gui/utility/guiInputCtrl.cpp

@@ -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 )

+ 5 - 0
Engine/source/gui/utility/guiInputCtrl.h

@@ -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." );

+ 1 - 0
Templates/BaseGame/game/data/Prototyping/Prototyping.tscript

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