Browse Source

WIP: Linux port
- Ignore GUI input for windows under a modal window

BearishSun 8 years ago
parent
commit
cd1833098e

+ 17 - 0
Source/BansheeCore/Managers/BsRenderWindowManager.cpp

@@ -30,6 +30,9 @@ namespace bs
 			mWindows[renderWindow->mWindowId] = renderWindow.get();
 		}
 
+		if (renderWindow->getProperties().isModal)
+			mModalWindowStack.push_back(renderWindow.get());
+
 		renderWindow->initialize();
 		
 		return renderWindow;
@@ -52,6 +55,12 @@ namespace bs
 			mWindows.erase(window->mWindowId);
 			mDirtyProperties.erase(window);
 		}
+
+		{
+			auto iterFind = std::find(begin(mModalWindowStack), end(mModalWindowStack), window);
+			if(iterFind != mModalWindowStack.end())
+				mModalWindowStack.erase(iterFind);
+		}
 	}
 
 	void RenderWindowManager::notifyFocusReceived(ct::RenderWindow* coreWindow)
@@ -218,6 +227,14 @@ namespace bs
 		return windows;
 	}
 
+	RenderWindow* RenderWindowManager::getTopMostModal() const
+	{
+		if (mModalWindowStack.empty())
+			return nullptr;
+		
+		return mModalWindowStack.back();
+	}
+
 	RenderWindow* RenderWindowManager::getNonCore(const ct::RenderWindow* window) const
 	{
 		auto iterFind = mWindows.find(window->mWindowId);

+ 4 - 0
Source/BansheeCore/Managers/BsRenderWindowManager.h

@@ -61,6 +61,9 @@ namespace bs
 		/**	Returns a list of all open render windows. */
 		Vector<RenderWindow*> getRenderWindows() const;
 
+		/** Returns the window that is currently the top-most modal window. Returns null if no modal windows are active. */
+		RenderWindow* getTopMostModal() const;
+
 		/** Event that is triggered when a window gains focus. */
 		Event<void(RenderWindow&)> onFocusGained;
 
@@ -81,6 +84,7 @@ namespace bs
 	protected:
 		mutable Mutex mWindowMutex;
 		Map<UINT32, RenderWindow*> mWindows;
+		Vector<RenderWindow*> mModalWindowStack;
 
 		RenderWindow* mWindowInFocus;
 		RenderWindow* mNewWindowInFocus;

+ 5 - 2
Source/BansheeEngine/GUI/BsGUIManager.cpp

@@ -1254,11 +1254,15 @@ namespace bs
 			uniqueWindows.insert(window);
 		}
 
+		RenderWindow* topMostModal = RenderWindowManager::instance().getTopMostModal();
 		for(auto& window : uniqueWindows)
 		{
 			if(Platform::isPointOverWindow(*window, pointerScreenPos))
 			{
-				windowUnderPointer = window;
+				// If there's a top most modal window, it needs to be this one, otherwise we ignore input to that window
+				if(topMostModal == nullptr || window == topMostModal)
+					windowUnderPointer = window;
+
 				break;
 			}
 		}
@@ -1266,7 +1270,6 @@ namespace bs
 		if(windowUnderPointer != nullptr)
 		{
 			Vector2I windowPos = windowUnderPointer->screenToWindowPos(pointerScreenPos);
-			Vector4 vecWindowPos((float)windowPos.x, (float)windowPos.y, 0.0f, 1.0f);
 
 			UINT32 widgetIdx = 0;
 			for(auto& widgetInfo : mWidgets)