Browse Source

Backspace for deleting works
Fixed a bug with TextSprites

Marko Pintera 12 years ago
parent
commit
5e2e54e03a

+ 14 - 1
BansheeEngine/Source/BsGUIInputBox.cpp

@@ -233,7 +233,20 @@ namespace BansheeEngine
 
 
 	bool GUIInputBox::keyEvent(const GUIKeyEvent& ev)
 	bool GUIInputBox::keyEvent(const GUIKeyEvent& ev)
 	{
 	{
-		if(ev.getType() == GUIKeyEventType::TextInput)
+		if(ev.getType() == GUIKeyEventType::KeyDown)
+		{
+			if(ev.getKey() == KC_BACK)
+			{
+				if(mText.size() > 0)
+				{
+					mText.erase(mText.end() - 1);
+					markAsDirty();
+				}
+
+				return true;
+			}
+		}
+		else if(ev.getType() == GUIKeyEventType::TextInput)
 		{
 		{
 			// TODO - How are backspace, caps and enter handled?
 			// TODO - How are backspace, caps and enter handled?
 			mText += ev.getInputChar();
 			mText += ev.getInputChar();

+ 9 - 2
BansheeEngine/Source/BsGUIManager.cpp

@@ -413,8 +413,15 @@ namespace BansheeEngine
 		{
 		{
 			mKeyEvent = GUIKeyEvent();
 			mKeyEvent = GUIKeyEvent();
 
 
-			mKeyEvent.setTextInputData(event.textChar);
-			mKeyboardFocusWidget->_keyEvent(mKeyboardFocusElement, mKeyEvent);
+			mKeyEvent.setKeyDownData(event.keyCode);
+			bool keyDownHandled = mKeyboardFocusWidget->_keyEvent(mKeyboardFocusElement, mKeyEvent);
+
+			// If key down wasn't handled, send text input event if pressed character is textual
+			if(!keyDownHandled && event.textChar != 0)
+			{
+				mKeyEvent.setTextInputData(event.textChar);
+				mKeyboardFocusWidget->_keyEvent(mKeyboardFocusElement, mKeyEvent);
+			}
 		}
 		}
 		
 		
 		event.markAsUsed();
 		event.markAsUsed();

+ 28 - 2
BansheeEngine/Source/BsTextSprite.cpp

@@ -45,10 +45,36 @@ namespace BansheeEngine
 			break;
 			break;
 		}
 		}
 
 
-		// Actually generate a mesh
-		if(mCachedRenderElements.size() < quadsPerPage.size())
+		// Resize cached mesh array to needed size
+		if(mCachedRenderElements.size() > quadsPerPage.size())
+		{
+			for(UINT32 i = (UINT32)quadsPerPage.size(); i < (UINT32)mCachedRenderElements.size(); i++)
+			{
+				auto& renderElem = mCachedRenderElements[i];
+
+				UINT32 vertexCount = renderElem.numQuads * 4;
+				UINT32 indexCount = renderElem.numQuads * 6;
+
+				if(renderElem.vertices != nullptr)
+					cm_deleteN<ScratchAlloc>(renderElem.vertices, vertexCount);
+
+				if(renderElem.uvs != nullptr)
+					cm_deleteN<ScratchAlloc>(renderElem.uvs, vertexCount);
+
+				if(renderElem.indexes != nullptr)
+					cm_deleteN<ScratchAlloc>(renderElem.indexes, indexCount);
+
+				if(renderElem.material != nullptr)
+				{
+					GUIMaterialManager::instance().releaseMaterial(renderElem.material);
+				}
+			}
+		}
+
+		if(mCachedRenderElements.size() != quadsPerPage.size())
 			mCachedRenderElements.resize(quadsPerPage.size());
 			mCachedRenderElements.resize(quadsPerPage.size());
 
 
+		// Actually generate a mesh
 		const CM::vector<HTexture>::type& texturePages = textData->getTexturePages();
 		const CM::vector<HTexture>::type& texturePages = textData->getTexturePages();
 		UINT32 texPage = 0;
 		UINT32 texPage = 0;
 		for(auto& cachedElem : mCachedRenderElements)
 		for(auto& cachedElem : mCachedRenderElements)