Просмотр исходного кода

Fixed almost all UI and IDE issues

Ivan Safrin 12 лет назад
Родитель
Сommit
35ddb611e7
36 измененных файлов с 118 добавлено и 57 удалено
  1. 1 0
      Core/Contents/Include/PolySceneLabel.h
  2. 14 8
      Core/Contents/Source/PolyEntity.cpp
  3. 4 3
      Core/Contents/Source/PolySceneLabel.cpp
  4. 3 3
      Core/Contents/Source/PolySceneLine.cpp
  5. 4 4
      Core/Contents/Source/PolySceneSprite.cpp
  6. 1 1
      IDE/Contents/Source/PolycodeFrame.cpp
  7. 2 2
      IDE/Contents/Source/PolycodeIDEApp.cpp
  8. 1 0
      IDE/Contents/Source/PolycodeImageEditor.cpp
  9. 1 1
      Modules/Contents/UI/Include/PolyUIBox.h
  10. 1 1
      Modules/Contents/UI/Include/PolyUIButton.h
  11. 1 1
      Modules/Contents/UI/Include/PolyUICheckBox.h
  12. 1 1
      Modules/Contents/UI/Include/PolyUIColorBox.h
  13. 1 1
      Modules/Contents/UI/Include/PolyUIComboBox.h
  14. 2 2
      Modules/Contents/UI/Include/PolyUIElement.h
  15. 1 1
      Modules/Contents/UI/Include/PolyUIEvent.h
  16. 1 1
      Modules/Contents/UI/Include/PolyUIFileDialog.h
  17. 1 1
      Modules/Contents/UI/Include/PolyUIHScrollBar.h
  18. 1 1
      Modules/Contents/UI/Include/PolyUIHSizer.h
  19. 1 1
      Modules/Contents/UI/Include/PolyUIHSlider.h
  20. 1 1
      Modules/Contents/UI/Include/PolyUIImageButton.h
  21. 1 1
      Modules/Contents/UI/Include/PolyUIMenu.h
  22. 2 2
      Modules/Contents/UI/Include/PolyUIMenuBar.h
  23. 1 1
      Modules/Contents/UI/Include/PolyUIScrollContainer.h
  24. 1 1
      Modules/Contents/UI/Include/PolyUITextInput.h
  25. 1 1
      Modules/Contents/UI/Include/PolyUITree.h
  26. 1 1
      Modules/Contents/UI/Include/PolyUITreeContainer.h
  27. 1 1
      Modules/Contents/UI/Include/PolyUITreeEvent.h
  28. 1 1
      Modules/Contents/UI/Include/PolyUIVScrollBar.h
  29. 1 1
      Modules/Contents/UI/Include/PolyUIVSizer.h
  30. 1 1
      Modules/Contents/UI/Source/PolyUIButton.cpp
  31. 4 4
      Modules/Contents/UI/Source/PolyUIColorBox.cpp
  32. 31 1
      Modules/Contents/UI/Source/PolyUIElement.cpp
  33. 2 2
      Modules/Contents/UI/Source/PolyUIHSlider.cpp
  34. 6 5
      Modules/Contents/UI/Source/PolyUITextInput.cpp
  35. 9 0
      Modules/Contents/UI/Source/PolyUITreeContainer.cpp
  36. 12 0
      Modules/Contents/UI/Source/PolyUIWindow.cpp

+ 1 - 0
Core/Contents/Include/PolySceneLabel.h

@@ -67,6 +67,7 @@ namespace Polycode {
 			bool positionAtBaseline;
 			
 			static Vector3 defaultAnchor;
+			static bool defaultPositionAtBaseline;
 			
 		protected:
 			

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

@@ -21,6 +21,7 @@
 */
 #include "PolyEntity.h"
 #include "PolyRenderer.h"
+#include "PolyCoreServices.h"
 #include "PolyInputEvent.h"
 
 using namespace Polycode;
@@ -415,12 +416,12 @@ Matrix4 Entity::getConcatenatedRollMatrix() const {
 }
 
 Vector2 Entity::getScreenPosition(Matrix4 projectionMatrix, Matrix4 cameraMatrix) {
-	Vector2 pos = renderer->Project(cameraMatrix, projectionMatrix, getConcatenatedMatrix().getPosition());
+	Vector2 pos = CoreServices::getInstance()->getRenderer()->Project(cameraMatrix, projectionMatrix, getConcatenatedMatrix().getPosition());
 	return pos;
 }
 
 Vector2 Entity::getScreenPositionForMainCamera() {
-	return getScreenPosition(renderer->getProjectionMatrix(), renderer->getCameraMatrix());
+	return getScreenPosition(CoreServices::getInstance()->getRenderer()->getProjectionMatrix(), CoreServices::getInstance()->getRenderer()->getCameraMatrix());
 }
 
 void Entity::transformAndRender() {
@@ -866,7 +867,9 @@ MouseEventResult Entity::onMouseDown(const Ray &ray, int mouseButton, int timest
 			Matrix4 inverse = getConcatenatedMatrix().Inverse();
 			localCoordinate = inverse * localCoordinate;			
 			
-			dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEDOWN);
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x, localCoordinate.y*yAdjust), timestamp);
+			inputEvent->mouseButton = mouseButton;
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEDOWN);
 						
 			if(blockMouseInput) {
 				ret.blocked = true;
@@ -898,15 +901,18 @@ MouseEventResult Entity::onMouseUp(const Ray &ray, int mouseButton, int timestam
 		Matrix4 inverse = getConcatenatedMatrix().Inverse();
 		localCoordinate = inverse * localCoordinate;			
 	
+		InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x, localCoordinate.y*yAdjust), timestamp);
+		inputEvent->mouseButton = mouseButton;			
 	
 		if(ray.boxIntersect(bBox, getAnchorAdjustedMatrix())) {
-			ret.hit = true;			
-			dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEUP);
+			ret.hit = true;
+			
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEUP);
 			if(blockMouseInput) {
 				ret.blocked = true;
 			}
 		} else {
-			dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEUP_OUTSIDE);
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEUP_OUTSIDE);
 		}
 		
 		for(int i=children.size()-1; i>=0; i--) {
@@ -936,10 +942,10 @@ MouseEventResult Entity::onMouseMove(const Ray &ray, int timestamp) {
 		if(ray.boxIntersect(bBox, getAnchorAdjustedMatrix())) {	
 			//setColor(1.0, 0.0, 0.0, 1.0);
 			ret.hit = true;			
-			dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEMOVE);
+			dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y*yAdjust), timestamp), InputEvent::EVENT_MOUSEMOVE);
 			
 			if(!mouseOver) {
-				dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEOVER);
+				dispatchEvent(new InputEvent(Vector2(localCoordinate.x, localCoordinate.y*yAdjust), timestamp), InputEvent::EVENT_MOUSEOVER);
 				mouseOver = true;
 			}			
 			

+ 4 - 3
Core/Contents/Source/PolySceneLabel.cpp

@@ -32,11 +32,12 @@
 using namespace Polycode;
 
 Vector3 SceneLabel::defaultAnchor = Vector3();
+bool SceneLabel::defaultPositionAtBaseline = false;
 
 SceneLabel::SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1) {
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
 	this->labelScale = scale;
-	positionAtBaseline = false;
+	positionAtBaseline = SceneLabel::defaultPositionAtBaseline;
 	setAnchorPoint(SceneLabel::defaultAnchor);
 	updateFromLabel();
 }
@@ -45,7 +46,7 @@ SceneLabel::SceneLabel(const String& text, int size, const String& fontName, int
 
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
 	this->labelScale = 1.0;
-	positionAtBaseline = false;
+	positionAtBaseline = SceneLabel::defaultPositionAtBaseline;
 	setAnchorPoint(SceneLabel::defaultAnchor);	
 	updateFromLabel();
 }
@@ -92,7 +93,7 @@ void SceneLabel::updateFromLabel() {
 
 void SceneLabel::Render() {
 	if(positionAtBaseline) {
-		CoreServices::getInstance()->getRenderer()->translate2D(0.0, -label->getBaselineAdjust() + label->getSize() + (getHeight()/2.0));
+		CoreServices::getInstance()->getRenderer()->translate2D(0.0, (((Number)label->getSize()) * -1.0) + ((Number)label->getBaselineAdjust()));
 	}
 	ScenePrimitive::Render();
 }

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

@@ -32,7 +32,7 @@ SceneLine::SceneLine(Vector3 start, Vector3 end) : SceneMesh(Mesh::LINE_MESH) {
 	this->start = start;
 	this->end = end;	
 	initLine();
-	ignoreParentMatrix = true;
+	ignoreParentMatrix = false;
 }
 
 SceneLine::SceneLine(Entity *ent1, Entity *ent2) : SceneMesh(Mesh::LINE_MESH) {
@@ -79,7 +79,7 @@ void SceneLine::Update(){
 		v2 = end;
 	}
 	
-	mesh->getPolygon(0)->getVertex(0)->set(v1.x,v1.y,v1.z);
-	mesh->getPolygon(0)->getVertex(1)->set(v2.x,v2.y,v2.z);
+	mesh->getPolygon(0)->getVertex(0)->set(v1.x,v1.y*yAdjust,v1.z);
+	mesh->getPolygon(0)->getVertex(1)->set(v2.x,v2.y*yAdjust,v2.z);
 	mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;	
 }

+ 4 - 4
Core/Contents/Source/PolySceneSprite.cpp

@@ -378,10 +378,10 @@ void SceneSprite::updateSprite() {
 	
 	Polygon *imagePolygon = mesh->getPolygon(0);
 		
-	imagePolygon->getVertex(0)->setTexCoord(xOffset, yOffset+spriteUVHeight);	
-	imagePolygon->getVertex(1)->setTexCoord(xOffset+spriteUVWidth, yOffset+spriteUVHeight);
-	imagePolygon->getVertex(2)->setTexCoord(xOffset+spriteUVWidth, yOffset);
-	imagePolygon->getVertex(3)->setTexCoord(xOffset, yOffset);	
+	imagePolygon->getVertex(0)->setTexCoord(xOffset, yOffset);	
+	imagePolygon->getVertex(1)->setTexCoord(xOffset+spriteUVWidth, yOffset);
+	imagePolygon->getVertex(2)->setTexCoord(xOffset+spriteUVWidth, yOffset+spriteUVHeight);
+	imagePolygon->getVertex(3)->setTexCoord(xOffset, yOffset+spriteUVHeight);	
 		
 	mesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
 

+ 1 - 1
IDE/Contents/Source/PolycodeFrame.cpp

@@ -489,7 +489,7 @@ EditorHolder::~EditorHolder() {
 		
 void EditorHolder::Resize(Number width, Number height) {
 	if(currentEditor) {
-		currentEditor->Resize(getWidth(), getHeight());
+		currentEditor->Resize(width, height);
 	}
 }
 

+ 2 - 2
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -72,11 +72,11 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	willRunProject = false;
 
 	SceneLabel::defaultAnchor = Vector3(-1.0, -1.0, 0.0);
-
+	SceneLabel::defaultPositionAtBaseline = true;
+	
 	globalMenu	= new UIGlobalMenu();
 	UITextInput::setMenuSingleton(globalMenu);
 			
-	printf("creating font editor\n"); 
 	
 	Scene *screen = new Scene(Scene::SCENE_2D_TOPLEFT);	
 	screen->rootEntity.processInputEvents = true;

+ 1 - 0
IDE/Contents/Source/PolycodeImageEditor.cpp

@@ -85,6 +85,7 @@ bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 }
 
 void PolycodeImageEditor::Resize(int x, int y) {
+
 	editorImage->setPosition(x/2, y/2);
 	grid->getImage()->setImageCoordinates(0,0,x,y);	
 	

+ 1 - 1
Modules/Contents/UI/Include/PolyUIBox.h

@@ -30,7 +30,7 @@ namespace Polycode {
 	class _PolyExport UIBox : public UIElement {
 	public:
 		UIBox(String imageFile, Number t, Number r, Number b, Number l, Number boxWidth, Number boxHeight);
-		~UIBox();
+		virtual ~UIBox();
 		
 		void resizeBox(Number newWidth, Number newHeight);		
 		

+ 1 - 1
Modules/Contents/UI/Include/PolyUIButton.h

@@ -35,7 +35,7 @@ namespace Polycode {
 	class _PolyExport UIButton : public UIElement {
 		public:
 			UIButton(String text, Number width, Number height = 23);
-			~UIButton();
+			virtual ~UIButton();
 			void Resize(Number width, Number height);		
 			void handleEvent(Event *event);
 			

+ 1 - 1
Modules/Contents/UI/Include/PolyUICheckBox.h

@@ -35,7 +35,7 @@ namespace Polycode {
 	class _PolyExport UICheckBox : public UIElement {
 		public:
 			UICheckBox(String caption, bool checked);
-			~UICheckBox();
+			virtual ~UICheckBox();
 		
 			void setChecked(bool val);
 			void changeCheck();

+ 1 - 1
Modules/Contents/UI/Include/PolyUIColorBox.h

@@ -40,7 +40,7 @@ namespace Polycode {
 	class _PolyExport UIColorPicker : public UIWindow {
 		public:
 			UIColorPicker();
-			~UIColorPicker();
+			virtual ~UIColorPicker();
 			
 			void updateSelectedColor(bool updateTextFields=true, bool updateHue = true, bool updateSV=true);
 			void setHue(Number hueNum);			

+ 1 - 1
Modules/Contents/UI/Include/PolyUIComboBox.h

@@ -37,7 +37,7 @@ namespace Polycode {
 	class _PolyExport UIComboBoxItem {
 		public:
 			UIComboBoxItem(String label, void *data);
-			~UIComboBoxItem();
+			virtual ~UIComboBoxItem();
 			
 			void *data;
 			String label;

+ 2 - 2
Modules/Contents/UI/Include/PolyUIElement.h

@@ -35,7 +35,7 @@ namespace Polycode {
 		public:
 			UIElement();
 			UIElement(Number width, Number height);
-			~UIElement();
+			virtual ~UIElement();
 			
 			virtual void Resize(Number width, Number height);
 						
@@ -51,7 +51,7 @@ namespace Polycode {
 			void stopDrag();
 			
 			void focusChild(UIElement *child);
-			void focusNextChild() {}
+			void focusNextChild();
 			bool isFocusable();
 			
 			virtual void onLoseFocus() {}

+ 1 - 1
Modules/Contents/UI/Include/PolyUIEvent.h

@@ -29,7 +29,7 @@ namespace Polycode {
 	class _PolyExport UIEvent : public Event {
 		public:
 			UIEvent();
-			~UIEvent();
+			virtual ~UIEvent();
 		
 			static const int EVENTBASE_UIEVENT = 0xA00;
 			static const int CLICK_EVENT = EVENTBASE_UIEVENT+0;

+ 1 - 1
Modules/Contents/UI/Include/PolyUIFileDialog.h

@@ -35,7 +35,7 @@ namespace Polycode {
 	class CreateFolderWindow : public UIWindow {
 		public:
 			CreateFolderWindow();
-			~CreateFolderWindow();
+			virtual ~CreateFolderWindow();
 
 			UIButton *okButton;
 			UIButton *cancelButton;

+ 1 - 1
Modules/Contents/UI/Include/PolyUIHScrollBar.h

@@ -30,7 +30,7 @@ namespace Polycode {
 	class _PolyExport UIHScrollBar : public UIElement {
 	public:
 		UIHScrollBar(Number width, Number height, Number initialRatio);
-		~UIHScrollBar();
+		virtual ~UIHScrollBar();
 		
 		void Update();
 		Number getScrollValue();

+ 1 - 1
Modules/Contents/UI/Include/PolyUIHSizer.h

@@ -32,7 +32,7 @@ namespace Polycode {
 	class _PolyExport UIHSizer : public UIElement {
 		public:
 			UIHSizer(Number width, Number height, Number mainWidth, bool leftSizer);
-			~UIHSizer();
+			virtual ~UIHSizer();
 			
 			void handleEvent(Event *event);
 			

+ 1 - 1
Modules/Contents/UI/Include/PolyUIHSlider.h

@@ -36,7 +36,7 @@ namespace Polycode {
 	class _PolyExport UIHSlider : public UIElement {
 		public:
 			UIHSlider(Number start, Number end, Number width);
-			~UIHSlider();		
+			virtual ~UIHSlider();		
 			void handleEvent(Event *event);
 			void Update();
 			

+ 1 - 1
Modules/Contents/UI/Include/PolyUIImageButton.h

@@ -33,7 +33,7 @@ namespace Polycode {
 	class _PolyExport UIImageButton : public UIElement {
 		public:
 			UIImageButton(String imageName);
-			~UIImageButton();
+			virtual ~UIImageButton();
 		
 			void handleEvent(Event *event);
 				

+ 1 - 1
Modules/Contents/UI/Include/PolyUIMenu.h

@@ -34,7 +34,7 @@ namespace Polycode {
 	class _PolyExport UIMenuItem : public UIElement {
 		public:
 			UIMenuItem(String label, String _id, void *data, Number comboWidth, Number comboHeight);
-			~UIMenuItem();
+			virtual ~UIMenuItem();
 
 			virtual bool isSelectable();
 			

+ 2 - 2
Modules/Contents/UI/Include/PolyUIMenuBar.h

@@ -49,7 +49,7 @@ namespace Polycode {
 	class _PolyExport UIMenuBarEntry : public UIElement {
 		public:
 			UIMenuBarEntry(String name);
-			~UIMenuBarEntry();		
+			virtual ~UIMenuBarEntry();		
 			void addItem(String name, String code, PolyKEY shortCut1 = KEY_UNKNOWN, PolyKEY shortCut2 = KEY_UNKNOWN);
 
 			void Select();
@@ -65,7 +65,7 @@ namespace Polycode {
 	class _PolyExport UIMenuBar : public UIElement {
 		public:
 			UIMenuBar(int width, UIGlobalMenu *globalMenu);
-			~UIMenuBar();
+			virtual ~UIMenuBar();
 
 			void handleEvent(Event *event);	
 

+ 1 - 1
Modules/Contents/UI/Include/PolyUIScrollContainer.h

@@ -45,7 +45,7 @@ namespace Polycode {
         * @param height The height of the scroll container.
         */
 		UIScrollContainer(Entity *scrolledEntity, bool hScroll, bool vScroll, Number width, Number height);
-		~UIScrollContainer();
+		virtual ~UIScrollContainer();
 
         /**
         * Update what size the content child is expected to have.

+ 1 - 1
Modules/Contents/UI/Include/PolyUITextInput.h

@@ -147,7 +147,7 @@ namespace Polycode {
 			 * @param height The height of the element.
 			 */
 			UITextInput(bool multiLine, Number width, Number height);
-			~UITextInput();
+			virtual ~UITextInput();
 		
 			void handleEvent(Event *event);
 			void Update();

+ 1 - 1
Modules/Contents/UI/Include/PolyUITree.h

@@ -41,7 +41,7 @@ namespace Polycode {
 			using UIElement::Resize;
 
 			UITree(String icon, String text, Number treeWidth, Number treeOffset=0);
-			~UITree();
+			virtual ~UITree();
 			
 			
 			void handleEvent(Event *event);

+ 1 - 1
Modules/Contents/UI/Include/PolyUITreeContainer.h

@@ -33,7 +33,7 @@ namespace Polycode {
 	class _PolyExport UITreeContainer : public UIElement {
 	public:
 		UITreeContainer(String icon, String text, Number treeWidth, Number treeHeight);
-		~UITreeContainer();
+		virtual ~UITreeContainer();
 		
 		void handleEvent(Event *event);
 		void Resize(Number width, Number height);

+ 1 - 1
Modules/Contents/UI/Include/PolyUITreeEvent.h

@@ -32,7 +32,7 @@ namespace Polycode {
 		public:
 			UITreeEvent(UITree *selection);
 			UITreeEvent();
-			~UITreeEvent();
+			virtual ~UITreeEvent();
 		
 			static const int EVENTBASE_UITREEEVENT = 0xB00;
 			static const int NEED_REFRESH_EVENT = EVENTBASE_UITREEEVENT+0;

+ 1 - 1
Modules/Contents/UI/Include/PolyUIVScrollBar.h

@@ -32,7 +32,7 @@ namespace Polycode {
 		using UIElement::Resize;
 
 		UIVScrollBar(Number width, Number height, Number initialRatio);
-		~UIVScrollBar();
+		virtual ~UIVScrollBar();
 		
 		void Update();
 		Number getScrollValue();

+ 1 - 1
Modules/Contents/UI/Include/PolyUIVSizer.h

@@ -32,7 +32,7 @@ namespace Polycode {
 	class _PolyExport UIVSizer : public UIElement {
 		public:
 			UIVSizer(Number width, Number height, Number mainHeight, bool topSizer);
-			~UIVSizer();
+			virtual ~UIVSizer();
 			
 			void handleEvent(Event *event);
 			

+ 1 - 1
Modules/Contents/UI/Source/PolyUIButton.cpp

@@ -74,7 +74,7 @@ UIButton::UIButton(String text, Number width, Number height) : UIElement() {
 	buttonLabel->color.setColorHexFromString(conf->getStringValue("Polycode", "uiButtonFontColor"));
 	addChild(buttonLabel);
 	labelXPos = floor((width-buttonLabel->getWidth())/2.0f) + labelOffsetX;
-	labelYPos = floor(height/2.0) + labelOffsetY;
+	labelYPos = labelOffsetY;
 	buttonLabel->setPosition(labelXPos,labelYPos);
 	buttonLabel->positionAtBaseline = true;
 	buttonLabel->setAnchorPoint(-1.0, -1.0, 0.0);

+ 4 - 4
Modules/Contents/UI/Source/PolyUIColorBox.cpp

@@ -32,7 +32,7 @@ using namespace Polycode;
 UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	closeOnEscape = true;
 	
-	continuous = false;
+	continuous = true;
 		
 //	topPadding
 	Config *conf = CoreServices::getInstance()->getConfig();	
@@ -61,7 +61,7 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	
 	mainColorRect = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, mainFrame->getWidth(), mainFrame->getHeight());
 	mainColorRect->setAnchorPoint(-1.0, -1.0, 0.0);
-	mainColorRect->setPosition(padding+1, topPadding+padding+1);
+	mainColorRect->setPosition(padding, topPadding+padding);
 	addChild(mainColorRect);
 	addChild(mainFrame);
 
@@ -70,14 +70,14 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	addChild(hueFrame);
 	
 	hueSelector = new UIImage(hueSelectorImage);
-	hueSelector->setAnchorPoint(0.0, 0.0, 0.0);
+	hueSelector->getImage()->setAnchorPoint(0.0, 0.0, 0.0);
 	hueSelector->setPosition(hueFrame->getPosition().x + (hueFrame->getWidth()/2.0), hueFrame->getPosition().y);
 	addChild(hueSelector);	
 
 	hueSelector->setDragLimits(Polycode::Rectangle(hueSelector->getPosition().x,hueSelector->getPosition().y,0,hueFrame->getHeight()));
 				
 	mainSelector = new UIImage(mainSelectorImage);
-	mainSelector->setAnchorPoint(0.0, 0.0, 0.0);
+	mainSelector->getImage()->setAnchorPoint(0.0, 0.0, 0.0);
 	mainSelector->setPosition(mainFrame->getPosition());
 	addChild(mainSelector);	
 	

+ 31 - 1
Modules/Contents/UI/Source/PolyUIElement.cpp

@@ -112,7 +112,7 @@ MouseEventResult UIElement::onMouseMove(const Ray &ray, int timestamp) {
 			Matrix4 inverse = parentEntity->getConcatenatedMatrix().Inverse();
 			localCoordinate = inverse * localCoordinate;		
 		}
-		setPosition(localCoordinate.x-dragOffsetX,-localCoordinate.y+dragOffsetY);
+		setPosition(localCoordinate.x-dragOffsetX,-localCoordinate.y-dragOffsetY);
 		if(hasDragLimits) {
 			if(position.x < dragLimits.x)
 				position.x = dragLimits.x;
@@ -129,7 +129,37 @@ MouseEventResult UIElement::onMouseMove(const Ray &ray, int timestamp) {
 }
 
 UIElement::~UIElement() {
+	if(UIElement::globalFocusedChild == this) {
+		UIElement::globalFocusedChild = NULL;
+	}
+}
+
+void UIElement::focusNextChild() {
 
+	int j = 0;
+	bool hasFocusedChild = false;
+	if(UIElement::globalFocusedChild) {
+		for(int i=0; i < focusChildren.size(); i++) {
+			if(focusChildren[i] == UIElement::globalFocusedChild) {
+				j = i;
+				hasFocusedChild = true;
+			}
+		}
+	}
+
+	if(!hasFocusedChild)
+		return;
+
+	for(int i=0; i < focusChildren.size(); i++) {
+		if(focusChildren[j]->isFocusable() && focusChildren[j] != UIElement::globalFocusedChild) {
+			focusChild(focusChildren[j]);
+			return;
+		}
+
+		j++;
+		if(j == focusChildren.size())
+			j = 0;
+	}
 }
 
 void UIElement::focusChild(UIElement *child) {

+ 2 - 2
Modules/Contents/UI/Source/PolyUIHSlider.cpp

@@ -29,7 +29,7 @@ using namespace Polycode;
 
 UIHSlider::UIHSlider(Number start, Number end, Number width) : UIElement() {
 
-	continuous = false;
+	continuous = true;
 	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	
@@ -53,7 +53,7 @@ UIHSlider::UIHSlider(Number start, Number end, Number width) : UIElement() {
 	endValue = end;
 		
 	gripRect = new UIImage(gripImage);
-	gripRect->setAnchorPoint(0.0, 0.0, 0.0);
+	gripRect->getImage()->setAnchorPoint(0.0, 0.0, 0.0);
 	gripRect->setPosition(0, floor(bgHeight/2.0));
 
 	bgHitBox = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, width, gripRect->getHeight());

+ 6 - 5
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -148,19 +148,19 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	selectionColor = Color(181.0f/255.0f, 213.0f/255.0f, 255.0f/255.0f, 1.0f);
 	
 	selectorRectTop = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1,1);
-	selectorRectTop->setAnchorPoint(-1.0, -1.0, 0.0);
+//	selectorRectTop->setAnchorPoint(-1.0, -1.0, 0.0);
 	selectorRectTop->setColor(181.0f/255.0f, 213.0f/255.0f, 255.0f/255.0f, 1);
 	selectorRectTop->visible = false;
 	textContainer->addChild(selectorRectTop);
 
 	selectorRectMiddle = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1,1);
-	selectorRectMiddle->setAnchorPoint(-1.0, -1.0, 0.0);	
+//	selectorRectMiddle->setAnchorPoint(-1.0, -1.0, 0.0);	
 	selectorRectMiddle->setColor(181.0f/255.0f, 213.0f/255.0f, 255.0f/255.0f, 1);
 	selectorRectMiddle->visible = false;
 	textContainer->addChild(selectorRectMiddle);
 
 	selectorRectBottom = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1,1);
-	selectorRectBottom->setAnchorPoint(-1.0, -1.0, 0.0);	
+//	selectorRectBottom->setAnchorPoint(-1.0, -1.0, 0.0);	
 	selectorRectBottom->setColor(181.0f/255.0f, 213.0f/255.0f, 255.0f/255.0f, 1);
 	selectorRectBottom->visible = false;
 	textContainer->addChild(selectorRectBottom);
@@ -232,6 +232,7 @@ void UITextInput::checkBufferLines() {
 		if(multiLine) {
 			SceneLabel *newNumberLine = new SceneLabel(L"", fontSize, fontName, aaMode);
 			newNumberLine->color = lineNumberColor;
+			newNumberLine->positionAtBaseline = true;
 			lineNumberAnchor->addChild(newNumberLine);
 			numberLines.push_back(newNumberLine);		
 			
@@ -241,6 +242,7 @@ void UITextInput::checkBufferLines() {
 		}
 	
 		SceneLabel *newLine = new SceneLabel(L"", fontSize, fontName, aaMode);
+		newLine->positionAtBaseline = true;
 		newLine->color = textColor;
 		lineHeight = newLine->getHeight();
 		textContainer->addChild(newLine);
@@ -348,7 +350,6 @@ void UITextInput::updateSelectionRects() {
 	
 	selectorRectTop->visible = true;
 	
-
 	topSize = bufferLines[0]->getLabel()->getTextWidthForString(topLine.substr(colStart,fColEnd-colStart)) ; 
 	topHeight = lineHeight+lineSpacing;
 	if(colStart >= 0) {
@@ -2395,7 +2396,7 @@ void UITextInput::readjustBuffer(int lineStart, int lineEnd) {
 	}
 
 	int bufferOffset = -linesContainer->position.y/ ( lineHeight+lineSpacing);	
-	Number bufferLineOffset = bufferOffset * ( lineHeight+lineSpacing);		
+	Number bufferLineOffset = bufferOffset * ( lineHeight+lineSpacing);	
 
 	for(int i=0; i < bufferLines.size(); i++) {
 		if(bufferOffset + i < wordWrapLines.size()) {	

+ 9 - 0
Modules/Contents/UI/Source/PolyUITreeContainer.cpp

@@ -87,6 +87,14 @@ void UITreeContainer::Resize(Number width, Number height) {
 }
 
 void UITreeContainer::handleEvent(Event *event) {
+
+	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
+		InputEvent *inputEvent = (InputEvent*) event;
+		if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
+			onKeyDown(inputEvent->key, inputEvent->charCode);
+		}
+	}
+
 	if(event->getDispatcher() == rootNode) {
 		if(event->getEventCode() == UITreeEvent::NEED_REFRESH_EVENT) {
 			mainContainer->setContentSize(rootNode->getWidth(), rootNode->getHeight());
@@ -122,6 +130,7 @@ UITreeContainer::~UITreeContainer() {
 		delete rootNode;
 		delete mainContainer;
 	}
+	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);	
 }
 
 void UITreeContainer::onGainFocus() {

+ 12 - 0
Modules/Contents/UI/Source/PolyUIWindow.cpp

@@ -25,6 +25,7 @@
 #include "PolyConfig.h"
 #include "PolyInputEvent.h"
 #include "PolyLabel.h"
+#include "PolyCore.h"
 #include "PolyCoreServices.h"
 
 using namespace Polycode;
@@ -87,6 +88,8 @@ UIWindow::UIWindow(String windowName, Number width, Number height) : UIElement()
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	closeBtn->addEventListener(this, UIEvent::CLICK_EVENT);
 	
+	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
+	
 	setWidth(width);
 	setHeight(height);
 	setHitbox(width, height);
@@ -120,6 +123,7 @@ UIWindow::~UIWindow() {
 		delete titleLabel;
 		delete closeBtn;
 	}
+	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
 }
 
 void UIWindow::onKeyDown(PolyKEY key, wchar_t charCode) {
@@ -175,6 +179,14 @@ void UIWindow::hideWindow() {
 }
 
 void UIWindow::handleEvent(Event *event) {
+
+	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
+		InputEvent *inputEvent = (InputEvent*)event;
+		if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
+			onKeyDown(inputEvent->key, inputEvent->charCode);
+		}
+	}
+
 	if(event->getDispatcher() == titlebarRect) {
 		InputEvent *inputEvent = (InputEvent*)event;
 		switch(event->getEventCode()) {