Преглед изворни кода

More cleanup, got focus working

Ivan Safrin пре 12 година
родитељ
комит
7284783d0d

+ 1 - 3
Core/Contents/Include/PolyCoreServices.h

@@ -154,9 +154,7 @@ namespace Polycode {
 			Config *getConfig();
 			
 					
-			~CoreServices();
-		
-			void *focusedChild;
+			~CoreServices();		
 			
 		protected:
 		

+ 3 - 8
Core/Contents/Include/PolyEntity.h

@@ -167,24 +167,19 @@ namespace Polycode {
 			/** @name Hierarchy operations.
 			*  These methods add and remove entities to and from each other.
 			*/
-			//@{			
-			
-			/**
-			* @see addChild()
-			*/		
-			virtual void addEntity(Entity *newChild);
+			//@{
 
 			/**
 			* Adds another entity as a child. The children inherit the parent's transforms.
 			@param newChild The entity to be added.
 			*/					
-			void addChild(Entity *newChild);
+			virtual void addChild(Entity *newChild);
 			
 			/**
 			* Removes an entity from the entity's children.
 			@param entityToRemove Entity to be removed.
 			*/
-			void removeChild(Entity *entityToRemove);
+			virtual void removeChild(Entity *entityToRemove);
 
 			/**
 			* Manually sets the entity's parent. This method does not add the entity to the parent and should not be called manually.

+ 1 - 1
Core/Contents/Source/PolyBone.cpp

@@ -140,7 +140,7 @@ void Bone::enableBoneLabel(const String& fontLabel, Number size, Number scale, C
 	label->setColor(labelColor);
 	label->billboardMode = true;
 	label->depthTest = false;
-	addEntity(label);
+	addChild(label);
 }
 
 void Bone::Render() {

+ 0 - 37
Core/Contents/Source/PolyCoreServices.cpp

@@ -107,7 +107,6 @@ void CoreServices::installModule(PolycodeModule *module)  {
 	
 	switch(module->getType()) {
 		case PolycodeModule::TYPE_SHADER:
-//			renderer->addShaderModule((ShaderModule*)module);
 			resourceManager->addShaderModule((PolycodeShaderModule*) module);
 			materialManager->addShaderModule((PolycodeShaderModule*) module);
 			renderer->addShaderModule((PolycodeShaderModule*) module);
@@ -129,8 +128,6 @@ CoreServices::CoreServices() : EventDispatcher() {
 	tweenManager = new TweenManager();
 	soundManager = new SoundManager();
 	fontManager = new FontManager();
-	
-	focusedChild = NULL;
 }
 
 CoreServices::~CoreServices() {
@@ -148,43 +145,9 @@ CoreServices::~CoreServices() {
 
 void CoreServices::setCore(Core *core) {
 	this->core = core;
-	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEUP);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_DOWN);	
-	core->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_UP);		
-	core->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_KEYUP);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_TOUCHES_BEGAN);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_TOUCHES_ENDED);
-	core->getInput()->addEventListener(this, InputEvent::EVENT_TOUCHES_MOVED);		
 }
 
 void CoreServices::handleEvent(Event *event) {
-	if(event->getDispatcher() == core->getInput()) {
-		InputEvent *inputEvent = (InputEvent*)event;
-		switch(event->getEventCode()) {
-			case InputEvent::EVENT_KEYDOWN:
-			case InputEvent::EVENT_KEYUP:
-				dispatchEvent(new InputEvent(inputEvent->key, inputEvent->charCode, inputEvent->timestamp), inputEvent->getEventCode());			
-			break;
-			case InputEvent::EVENT_TOUCHES_BEGAN:
-			case InputEvent::EVENT_TOUCHES_ENDED:
-			case InputEvent::EVENT_TOUCHES_MOVED:						
-			{
-				InputEvent *event = new InputEvent();
-				event->touches = inputEvent->touches;
-				event->timestamp = inputEvent->timestamp;
-				dispatchEvent(event, inputEvent->getEventCode());
-			}
-			break;
-			default:
-				InputEvent *_inputEvent = new InputEvent(inputEvent->mousePosition, inputEvent->timestamp);
-				_inputEvent->mouseButton = inputEvent->mouseButton;
-				dispatchEvent(_inputEvent, inputEvent->getEventCode());			
-			break;
-		}
-	}
 }
 
 Core *CoreServices::getCore() {

+ 4 - 8
Core/Contents/Source/PolyEntity.cpp

@@ -243,7 +243,10 @@ Entity *Entity::getChildAtIndex(unsigned int index) {
 }
 
 void Entity::addChild(Entity *newChild) {
-	addEntity(newChild);
+	newChild->setRenderer(renderer);
+	newChild->setParentEntity(this);
+	newChild->setInverseY(getInverseY());
+	children.push_back(newChild);
 }
 
 void Entity::setColor(Color color) {
@@ -528,13 +531,6 @@ void Entity::setRenderer(Renderer *renderer) {
 	}
 }
 
-void Entity::addEntity(Entity *newChild) {
-	newChild->setRenderer(renderer);
-	newChild->setParentEntity(this);
-	newChild->setInverseY(getInverseY());
-	children.push_back(newChild);	
-}
-
 
 void Entity::renderChildren() {
 	for(int i=0;i<children.size();i++) {

+ 1 - 1
Core/Contents/Source/PolyParticleEmitter.cpp

@@ -59,7 +59,7 @@ void SceneParticleEmitter::respawnSceneParticles() {
 }
 
 void SceneParticleEmitter::addParticleBody(Entity *particleBody) {
-	addEntity((Entity*)particleBody);	
+	addChild((Entity*)particleBody);	
 	particleBody->editorOnly = true;
 }
 

+ 1 - 1
Core/Contents/Source/PolySceneLight.cpp

@@ -99,7 +99,7 @@ void SceneLight::enableShadows(bool val, Number resolution) {
 		if(!spotCamera) {
 			spotCamera = new Camera(parentScene);
 //			spotCamera->setPitch(-45.0f);
-			addEntity(spotCamera);	
+			addChild(spotCamera);	
 		}
 		shadowMapRes = resolution;
 		shadowsEnabled = true;

+ 1 - 2
Core/Contents/Source/PolySceneMesh.cpp

@@ -164,8 +164,7 @@ ShaderBinding *SceneMesh::getLocalShaderOptions() {
 
 void SceneMesh::loadSkeleton(const String& fileName) {
 	skeleton = new Skeleton(fileName);
-	addEntity(skeleton);
-	
+	addChild(skeleton);
 	setSkeleton(skeleton);
 }
 

+ 3 - 3
Core/Contents/Source/PolySkeleton.cpp

@@ -72,7 +72,7 @@ void Skeleton::enableBoneLabels(const String& labelFont, Number size, Number sca
 	label->setColor(labelColor);
 	label->billboardMode = true;
 	label->depthWrite = false;
-	addEntity(label);
+	addChild(label);
 	
 }
 
@@ -194,12 +194,12 @@ void Skeleton::loadSkeleton(const String& fileName) {
 			parentBone = bones[bones[i]->parentBoneId];
 			parentBone->addChildBone(bones[i]);
 			bones[i]->setParentBone(parentBone);
-			parentBone->addEntity(bones[i]);			
+			parentBone->addChild(bones[i]);			
 //			addEntity(bones[i]);										
 			
 			SceneLine *connector = new SceneLine(bones[i], parentBone);
 			connector->depthTest = false;
-			bonesEntity->addEntity(connector);				
+			bonesEntity->addChild(connector);				
 			connector->setColor(((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),1.0f);
 		} else {
 //			bProxy = new Entity();

+ 8 - 1
Modules/Contents/UI/Include/PolyUIElement.h

@@ -42,22 +42,29 @@ namespace Polycode {
 			bool hasFocus;
 			bool focusable;
 			
+			void addChild(Entity *child);
+			
 			void setDragLimits(Rectangle rect);
 			void clearDragLimits();
 			bool isDragged();
 			void startDrag(Number xOffset, Number yOffset);
 			void stopDrag();
 			
-			void focusChild(Entity *child) {}
+			void focusChild(UIElement *child);
 			void focusNextChild() {}
 			bool isFocusable();
 			
+			virtual void onLoseFocus() {}
+			virtual void onGainFocus() {}
+			
 			void addFocusChild(UIElement *element);			
 			void setFocusParent(UIElement *element);
 
 			MouseEventResult onMouseMove(const Ray &ray, int timestamp);
 
 			bool dragged;
+			
+			static UIElement *globalFocusedChild;
 
 		protected:
 		

+ 1 - 0
Modules/Contents/UI/Source/PolyUIComboBox.cpp

@@ -92,6 +92,7 @@ UIComboBox::UIComboBox(UIGlobalMenu *globalMenu, Number comboWidth) : UIElement(
 	selectedOffset = 0;
 
 	dropDownImage->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);	
+	dropDownImage->setAnchorPoint(-1.0, -1.0, 0.0);
 	dropDownImage->processInputEvents = true;	
 	bgBox->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);	
 	bgBox->processInputEvents = true;	

+ 26 - 0
Modules/Contents/UI/Source/PolyUIElement.cpp

@@ -24,6 +24,8 @@
 
 using namespace Polycode;
 
+UIElement *UIElement::globalFocusedChild = NULL;
+
 UIImage::UIImage(String imagePath) : UIElement() {
 	image = new SceneImage(imagePath);
 	image->setAnchorPoint(-1.0, -1.0, 0.0);
@@ -55,6 +57,7 @@ UIElement::UIElement(Number width, Number height) : Entity() {
 	setAnchorPoint(-1.0, -1.0, 0.0);
 	processInputEvents = true;
 	focusParent = NULL;
+	hasFocus = false;
 	hasDragLimits = false;	
 	dragged = false;	
 	depthTest = false;
@@ -63,6 +66,14 @@ UIElement::UIElement(Number width, Number height) : Entity() {
 	setHeight(height);
 }
 
+void UIElement::addChild(Entity *child) {
+	UIElement* uiChild = dynamic_cast<UIElement*>(child);
+	if(uiChild) {
+		addFocusChild(uiChild);
+	}
+	Entity::addChild(child);
+}
+
 void UIElement::setDragLimits(Rectangle rect) {
 	dragLimits.x = rect.x;
 	dragLimits.y = rect.y;
@@ -121,6 +132,21 @@ UIElement::~UIElement() {
 
 }
 
+void UIElement::focusChild(UIElement *child) {
+
+	if(UIElement::globalFocusedChild) {
+		UIElement::globalFocusedChild->onLoseFocus();
+		UIElement::globalFocusedChild->hasFocus = false;
+	}
+
+	UIElement::globalFocusedChild = child;
+	
+	if(child) {
+		UIElement::globalFocusedChild->onGainFocus();
+		UIElement::globalFocusedChild->hasFocus = true;
+	}	
+}
+
 void UIElement::addFocusChild(UIElement *element) {
 	element->setFocusParent(element);
 	focusChildren.push_back(element);

+ 10 - 0
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -214,6 +214,8 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	core->addEventListener(this, Core::EVENT_SELECT_ALL);
 	indentSpacing = 4;
 	indentType = INDENT_TAB;
+	
+	core->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
 }
 
 void UITextInput::checkBufferLines() {
@@ -2153,6 +2155,7 @@ void UITextInput::Update() {
 
 UITextInput::~UITextInput() {
 	core->removeAllHandlersForListener(this);
+	core->getInput()->removeAllHandlersForListener(this);
 	delete blinkTimer;
 
 	linesContainer->ownsChildren = true;
@@ -2451,6 +2454,13 @@ void UITextInput::readjustBuffer(int lineStart, int lineEnd) {
 
 void UITextInput::handleEvent(Event *event) {
 
+	if(event->getDispatcher() == core->getInput()) {
+		if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
+			InputEvent *inputEvent = (InputEvent*) event;
+			onKeyDown(inputEvent->key, inputEvent->charCode);
+		}
+	}
+
 	if(event->getDispatcher() == contextMenu) {
 		UIMenuItem *item = contextMenu->getSelectedItem();
 		if(item->_id == "copy") {