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

Drag and Drop for UITrees, started on Screen editor in IDE

Ivan Safrin 14 лет назад
Родитель
Сommit
467369d432
28 измененных файлов с 568 добавлено и 10 удалено
  1. 13 0
      Core/Contents/Include/PolyEntity.h
  2. 11 0
      Core/Contents/Source/PolyEntity.cpp
  3. 75 1
      IDE/Build/Mac OS X/English.lproj/MainMenu.xib
  4. 6 0
      IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj
  5. 1 0
      IDE/Build/Mac OS X/PolycodeAppDelegate.h
  6. 4 0
      IDE/Build/Mac OS X/PolycodeAppDelegate.m
  7. 12 1
      IDE/Contents/Include/NewFileWindow.h
  8. 3 0
      IDE/Contents/Include/PolycodeEditor.h
  9. 4 0
      IDE/Contents/Include/PolycodeFrame.h
  10. 3 0
      IDE/Contents/Include/PolycodeIDEApp.h
  11. 2 1
      IDE/Contents/Include/PolycodeProjectBrowser.h
  12. 2 0
      IDE/Contents/Include/PolycodeProjectManager.h
  13. 67 0
      IDE/Contents/Include/PolycodeScreenEditor.h
  14. BIN
      IDE/Contents/Resources/Images/editorGrid.png
  15. BIN
      IDE/Contents/Resources/Images/screenCenter.png
  16. BIN
      IDE/Contents/Resources/Images/screenTransform.png
  17. 62 2
      IDE/Contents/Source/NewFileWindow.cpp
  18. 1 1
      IDE/Contents/Source/NewProjectWindow.cpp
  19. 52 0
      IDE/Contents/Source/PolycodeFrame.cpp
  20. 19 0
      IDE/Contents/Source/PolycodeIDEApp.cpp
  21. 9 0
      IDE/Contents/Source/PolycodeProjectManager.cpp
  22. 185 0
      IDE/Contents/Source/PolycodeScreenEditor.cpp
  23. 1 1
      Modules/Contents/Networking/Include/PolySocket.h
  24. 1 1
      Modules/Contents/UI/Include/PolyUIEvent.h
  25. 4 0
      Modules/Contents/UI/Include/PolyUITree.h
  26. 1 0
      Modules/Contents/UI/Include/PolyUITreeEvent.h
  27. 1 0
      Modules/Contents/UI/Source/PolyUIColorBox.cpp
  28. 29 2
      Modules/Contents/UI/Source/PolyUITree.cpp

+ 13 - 0
Core/Contents/Include/PolyEntity.h

@@ -157,6 +157,19 @@ namespace Polycode {
 			@return Parent entity of this entity.
 			*/
 			Entity *getParentEntity() const;
+			
+			/**
+			* Returns the number of child entities belonging to this entity.
+			* @return Number of child entities.
+			*/
+			unsigned int getNumChildren();
+			
+			/**
+			* Returns the child entity at specified index.
+			* @param index Index to return entity at.
+			* @return Child entity at specified index or NULL of index out of range.
+			*/			
+			Entity *getChildAtIndex(unsigned int index);
 				
 			//@}
 			// ----------------------------------------------------------------------------------------------------------------

+ 11 - 0
Core/Contents/Source/PolyEntity.cpp

@@ -115,6 +115,17 @@ void Entity::removeChild(Entity *entityToRemove) {
 	}	
 }
 
+unsigned int Entity::getNumChildren() {
+	return children.size();
+}
+
+Entity *Entity::getChildAtIndex(unsigned int index) {
+	if(index < children.size()) {
+		return children[index];
+	}
+	return NULL;
+}
+
 void Entity::addChild(Entity *newChild) {
 	addEntity(newChild);
 }

+ 75 - 1
IDE/Build/Mac OS X/English.lproj/MainMenu.xib

@@ -297,6 +297,25 @@
 									<reference key="NSOnImage" ref="35465992"/>
 									<reference key="NSMixedImage" ref="502551668"/>
 								</object>
+								<object class="NSMenuItem" id="317190896">
+									<reference key="NSMenu" ref="720053764"/>
+									<string key="NSTitle">Refresh Project</string>
+									<string key="NSKeyEquiv">F</string>
+									<int key="NSKeyEquivModMask">1048576</int>
+									<int key="NSMnemonicLoc">2147483647</int>
+									<reference key="NSOnImage" ref="35465992"/>
+									<reference key="NSMixedImage" ref="502551668"/>
+								</object>
+								<object class="NSMenuItem" id="533574374">
+									<reference key="NSMenu" ref="720053764"/>
+									<bool key="NSIsDisabled">YES</bool>
+									<bool key="NSIsSeparator">YES</bool>
+									<string key="NSTitle"/>
+									<string key="NSKeyEquiv"/>
+									<int key="NSMnemonicLoc">2147483647</int>
+									<reference key="NSOnImage" ref="35465992"/>
+									<reference key="NSMixedImage" ref="502551668"/>
+								</object>
 								<object class="NSMenuItem" id="1023925487">
 									<reference key="NSMenu" ref="720053764"/>
 									<string key="NSTitle">Save File</string>
@@ -715,6 +734,14 @@
 						<reference key="NSOnImage" ref="35465992"/>
 						<reference key="NSMixedImage" ref="502551668"/>
 					</object>
+					<object class="NSMenuItem" id="556423302">
+						<reference key="NSMenu" ref="1048220208"/>
+						<string key="NSTitle">Refresh</string>
+						<string key="NSKeyEquiv"/>
+						<int key="NSMnemonicLoc">2147483647</int>
+						<reference key="NSOnImage" ref="35465992"/>
+						<reference key="NSMixedImage" ref="502551668"/>
+					</object>
 					<object class="NSMenuItem" id="49210983">
 						<reference key="NSMenu" ref="1048220208"/>
 						<string key="NSTitle">Rename</string>
@@ -1075,6 +1102,22 @@
 					</object>
 					<int key="connectionID">584</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBActionConnection" key="connection">
+						<string key="label">refreshProject:</string>
+						<reference key="source" ref="976324537"/>
+						<reference key="destination" ref="556423302"/>
+					</object>
+					<int key="connectionID">586</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBActionConnection" key="connection">
+						<string key="label">refreshProject:</string>
+						<reference key="source" ref="976324537"/>
+						<reference key="destination" ref="317190896"/>
+					</object>
+					<int key="connectionID">589</int>
+				</object>
 			</object>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<object class="NSArray" key="orderedObjects">
@@ -1175,6 +1218,8 @@
 							<reference ref="1071799412"/>
 							<reference ref="93992569"/>
 							<reference ref="355684970"/>
+							<reference ref="533574374"/>
+							<reference ref="317190896"/>
 						</object>
 						<reference key="parent" ref="379814623"/>
 					</object>
@@ -1567,6 +1612,7 @@
 							<reference ref="46500047"/>
 							<reference ref="49210983"/>
 							<reference ref="954168611"/>
+							<reference ref="556423302"/>
 						</object>
 						<reference key="parent" ref="0"/>
 					</object>
@@ -1625,6 +1671,21 @@
 						<reference key="object" ref="954168611"/>
 						<reference key="parent" ref="1048220208"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">585</int>
+						<reference key="object" ref="556423302"/>
+						<reference key="parent" ref="1048220208"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">587</int>
+						<reference key="object" ref="533574374"/>
+						<reference key="parent" ref="720053764"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">588</int>
+						<reference key="object" ref="317190896"/>
+						<reference key="parent" ref="720053764"/>
+					</object>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
@@ -1707,6 +1768,9 @@
 					<string>580.IBPluginDependency</string>
 					<string>582.IBPluginDependency</string>
 					<string>583.IBPluginDependency</string>
+					<string>585.IBPluginDependency</string>
+					<string>587.IBPluginDependency</string>
+					<string>588.IBPluginDependency</string>
 					<string>72.IBPluginDependency</string>
 					<string>73.IBPluginDependency</string>
 					<string>75.IBPluginDependency</string>
@@ -1802,6 +1866,9 @@
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
@@ -1816,7 +1883,7 @@
 				<reference key="dict.values" ref="0"/>
 			</object>
 			<nil key="sourceID"/>
-			<int key="maxID">584</int>
+			<int key="maxID">589</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1901,6 +1968,7 @@
 							<string>newGroup:</string>
 							<string>newProject:</string>
 							<string>openProject:</string>
+							<string>refreshProject:</string>
 							<string>removeFile:</string>
 							<string>renameFile:</string>
 							<string>runProject:</string>
@@ -1918,6 +1986,7 @@
 							<string>id</string>
 							<string>id</string>
 							<string>id</string>
+							<string>id</string>
 						</object>
 					</object>
 					<object class="NSMutableDictionary" key="actionInfosByName">
@@ -1930,6 +1999,7 @@
 							<string>newGroup:</string>
 							<string>newProject:</string>
 							<string>openProject:</string>
+							<string>refreshProject:</string>
 							<string>removeFile:</string>
 							<string>renameFile:</string>
 							<string>runProject:</string>
@@ -1961,6 +2031,10 @@
 								<string key="name">openProject:</string>
 								<string key="candidateClassName">id</string>
 							</object>
+							<object class="IBActionInfo">
+								<string key="name">refreshProject:</string>
+								<string key="candidateClassName">id</string>
+							</object>
 							<object class="IBActionInfo">
 								<string key="name">removeFile:</string>
 								<string key="candidateClassName">id</string>

+ 6 - 0
IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj

@@ -14,6 +14,7 @@
 		6D2AC99B14B8500400BB63DA /* PolycodeProjectEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AC99A14B8500400BB63DA /* PolycodeProjectEditor.cpp */; };
 		6D34143412B816BC0034FA9B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D34143312B816BC0034FA9B /* IOKit.framework */; };
 		6D3B6C5B14B820A900727F17 /* ToolWindows.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D3B6C5A14B820A900727F17 /* ToolWindows.cpp */; };
+		6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */; };
 		6D6D3FA614B446A600219173 /* PolycodeToolLauncher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D6D3FA514B446A600219173 /* PolycodeToolLauncher.cpp */; };
 		6D70AB2A12B29BF200EB6D94 /* NewFileWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D70AB2912B29BF200EB6D94 /* NewFileWindow.cpp */; };
 		6D80E91E12AB53FB0037A708 /* PolycodeFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91912AB53FB0037A708 /* PolycodeFrame.cpp */; };
@@ -75,6 +76,8 @@
 		6D34143312B816BC0034FA9B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
 		6D3B6C5A14B820A900727F17 /* ToolWindows.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ToolWindows.cpp; sourceTree = "<group>"; };
 		6D3B6C5C14B820B000727F17 /* ToolWindows.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ToolWindows.h; sourceTree = "<group>"; };
+		6D56156514C542FB00FC8BD4 /* PolycodeScreenEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeScreenEditor.h; sourceTree = "<group>"; };
+		6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolycodeScreenEditor.cpp; sourceTree = "<group>"; };
 		6D6D3FA514B446A600219173 /* PolycodeToolLauncher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolycodeToolLauncher.cpp; sourceTree = "<group>"; };
 		6D6D3FA814B446AF00219173 /* PolycodeToolLauncher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeToolLauncher.h; sourceTree = "<group>"; };
 		6D70AB2812B29BEC00EB6D94 /* NewFileWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewFileWindow.h; sourceTree = "<group>"; };
@@ -241,6 +244,7 @@
 		6D80E91212AB53FB0037A708 /* Include */ = {
 			isa = PBXGroup;
 			children = (
+				6D56156514C542FB00FC8BD4 /* PolycodeScreenEditor.h */,
 				6D2AC99D14B8500A00BB63DA /* PolycodeProjectEditor.h */,
 				6D3B6C5C14B820B000727F17 /* ToolWindows.h */,
 				6DCAFD4614B51A2D00039F34 /* ExampleBrowserWindow.h */,
@@ -266,6 +270,7 @@
 		6D80E91812AB53FB0037A708 /* Source */ = {
 			isa = PBXGroup;
 			children = (
+				6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */,
 				6D2AC99A14B8500400BB63DA /* PolycodeProjectEditor.cpp */,
 				6D3B6C5A14B820A900727F17 /* ToolWindows.cpp */,
 				6DCAFD4214B519C900039F34 /* ExampleBrowserWindow.cpp */,
@@ -388,6 +393,7 @@
 				6DCAFD4314B519C900039F34 /* ExampleBrowserWindow.cpp in Sources */,
 				6D3B6C5B14B820A900727F17 /* ToolWindows.cpp in Sources */,
 				6D2AC99B14B8500400BB63DA /* PolycodeProjectEditor.cpp in Sources */,
+				6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 1 - 0
IDE/Build/Mac OS X/PolycodeAppDelegate.h

@@ -52,6 +52,7 @@ public:
 
 // Menu accessors
 
+-(IBAction) refreshProject: (id) sender;
 -(IBAction) renameFile: (id) sender;
 -(IBAction) removeFile: (id) sender;
 -(IBAction) newGroup: (id) sender;

+ 4 - 0
IDE/Build/Mac OS X/PolycodeAppDelegate.m

@@ -71,6 +71,10 @@
 	return YES;
 }
 
+-(IBAction) refreshProject: (id) sender {
+	app->refreshProject();
+}	
+
 -(IBAction) renameFile: (id) sender {
 	app->renameFile();
 }

+ 12 - 1
IDE/Contents/Include/NewFileWindow.h

@@ -31,7 +31,7 @@ using namespace Polycode;
 
 class FileTemplateUserData  {
 public:
-	String templateFolder;
+	String templatePath;
 	int type;
 };
 
@@ -43,9 +43,20 @@ class NewFileWindow : public UIWindow {
 		void resetForm();
 		void parseTemplatesIntoTree(UITree *tree, OSFileEntry folder);
 
+		String getTemplatePath();
+		String getFileName();
+		
+		void handleEvent(Event *event);
 	
 	protected:
 	
+		UITextInput *fileNameInput;
+	
+		UIButton *cancelButton;
+		UIButton *okButton;
+		
+		String templatePath;
+			
 		UITreeContainer *templateContainer;	
 		UITree *defaultTemplateTree;
 };

+ 3 - 0
IDE/Contents/Include/PolycodeEditor.h

@@ -23,6 +23,7 @@
 #pragma once
 
 #include "Polycode.h"
+#include "OSBasics.h"
 
 using namespace Polycode;
 
@@ -36,6 +37,8 @@ public:
 	
 	virtual void saveFile(){};
 	
+	virtual void handleDroppedFile(OSFileEntry file, Number x, Number y) {};
+	
 	void setFilePath(String newPath);
 	String getFilePath() { return filePath; }
 	

+ 4 - 0
IDE/Contents/Include/PolycodeFrame.h

@@ -69,6 +69,10 @@ private:
 	ScreenImage *logo;	
 	ScreenImage *resizer;	
 
+	OSFileEntry draggedFile;
+	ScreenEntity *dragEntity;
+	ScreenLabel *dragLabel;
+	bool isDragging;
 	
 	ScreenImage *welcomeImage;	
 	

+ 3 - 0
IDE/Contents/Include/PolycodeIDEApp.h

@@ -31,6 +31,7 @@
 #include "PolycodeFrame.h"
 
 #include "PolycodeImageEditor.h"
+#include "PolycodeScreenEditor.h"
 #include "PolycodeFontEditor.h"
 #include "PolycodeTextEditor.h"
 #include "PolycodeProjectEditor.h"
@@ -61,6 +62,8 @@ public:
 	void closeProject();	
 	void saveFile();
 	
+	void refreshProject();
+	
 	void runProject();
 	
 	const static int EVENT_SHOW_MENU = 1;

+ 2 - 1
IDE/Contents/Include/PolycodeProjectBrowser.h

@@ -70,8 +70,9 @@ public:
 	
 	BrowserUserData *getSelectedData() { return selectedData; }
 	
+	UITreeContainer *treeContainer;
+			
 protected:
 	
 		BrowserUserData *selectedData;
-		UITreeContainer *treeContainer;
 };	

+ 2 - 0
IDE/Contents/Include/PolycodeProjectManager.h

@@ -33,6 +33,8 @@ class PolycodeProjectManager {
 	public:
 		PolycodeProjectManager();
 		~PolycodeProjectManager();
+		
+	void createNewFile(String templatePath, String newFileName);
 	
 	void createNewProject(String templateFolder, String projectName, String projectLocation);
 	PolycodeProject* openProject(String path);

+ 67 - 0
IDE/Contents/Include/PolycodeScreenEditor.h

@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2012 by Ivan Safrin
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+ 
+#pragma once
+
+#include "PolycodeEditor.h"
+#include <Polycode.h>
+#include <PolycodeUI.h>
+
+using namespace Polycode;
+
+class PolycodeScreenEditor : public PolycodeEditor {
+	public:
+	PolycodeScreenEditor();
+	virtual ~PolycodeScreenEditor();
+	
+	bool openFile(String filePath);
+	void Resize(int x, int y);
+	
+	void syncTransformToSelected();
+	
+	void handleEvent(Event *event);
+	
+	void handleDroppedFile(OSFileEntry file, Number x, Number y);
+	
+	protected:
+		
+		UIColorBox *entityColorBox;
+		UIWindow *entityInfoWindow;
+		
+		Vector2 dragOffset;
+		bool isDraggingEntity;
+		bool isScalingEntity;
+		
+		ScreenEntity *selectedEntity;
+		ScreenEntity *baseEntity;
+		
+		UIBox *screenTransform;
+	
+		ScreenImage *centerImage;
+		ScreenImage *grid;	
+};
+
+class PolycodeScreenEditorFactory : public PolycodeEditorFactory {
+	public:
+		PolycodeScreenEditorFactory() : PolycodeEditorFactory() { extensions.push_back("screen"); }
+		PolycodeEditor *createEditor() { return new PolycodeScreenEditor(); }
+};

BIN
IDE/Contents/Resources/Images/editorGrid.png


BIN
IDE/Contents/Resources/Images/screenCenter.png


BIN
IDE/Contents/Resources/Images/screenTransform.png


+ 62 - 2
IDE/Contents/Source/NewFileWindow.cpp

@@ -22,9 +22,15 @@
  
 #include "NewFileWindow.h"
 
-NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 500, 300) {
+NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 480, 280) {
 	defaultTemplateTree = NULL;
 	
+	Config *conf = CoreServices::getInstance()->getConfig();	
+	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
+	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");
+	
+	closeOnEscape = true;	
+	
 	templateContainer = new UITreeContainer("boxIcon.png", L"File Templates", 200, 300-topPadding-padding-padding);	
 	
 	FileTemplateUserData *data = new FileTemplateUserData();
@@ -50,16 +56,70 @@ NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 500, 300) {
 			parseTemplatesIntoTree(newChild, entry);
 		}
 	}	
+	
+	ScreenLabel *label2 = new ScreenLabel(L"New File Name (without extension)", fontSize, fontName, Label::ANTIALIAS_FULL);
+	addChild(label2);
+	label2->setPosition(padding+220, templateContainer->getPosition().y);			
+	
+	fileNameInput = new UITextInput(false, 500-padding-220-padding-padding, 12);	
+	addChild(fileNameInput);
+	fileNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight()+2);
+	
+	
+	cancelButton = new UIButton(L"Cancel", 100);
+	cancelButton->addEventListener(this, UIEvent::CLICK_EVENT);
+	addChild(cancelButton);
+	cancelButton->setPosition(500-100-padding-100-10, 265);
+			
+	okButton = new UIButton(L"Create File", 100);
+	okButton->addEventListener(this, UIEvent::CLICK_EVENT);
+	addChild(okButton);
+	okButton->setPosition(500-100-padding, 265);	
 }
 
 NewFileWindow::~NewFileWindow() {
 	
 }
 
+String NewFileWindow::getFileName() {
+	return fileNameInput->getText();
+}
+
+String NewFileWindow::getTemplatePath() {
+	return templatePath;
+}
+
 void NewFileWindow::resetForm() {
 	defaultTemplateTree->setSelected();
+	fileNameInput->setText("Untitled");
 }
 
+void NewFileWindow::handleEvent(Event *event) {
+	if(event->getEventType() == "UIEvent") {
+		if(event->getEventCode() == UIEvent::CLICK_EVENT) {
+			if(event->getDispatcher() == okButton) {
+				dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);						
+			}
+			
+			if(event->getDispatcher() == cancelButton) {
+				dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);				
+			}									
+		}
+	}
+	
+	if(event->getEventType() == "UITreeEvent" && event->getEventCode() == UITreeEvent::SELECTED_EVENT) {
+		if(event->getDispatcher() == templateContainer->getRootNode()) {
+			UITreeEvent *treeEvent = (UITreeEvent*) event;
+			FileTemplateUserData *data = (FileTemplateUserData *)treeEvent->selection->getUserData();
+			if(data->type == 1)
+				templatePath = data->templatePath;
+		}
+	}
+	
+	UIWindow::handleEvent(event);	
+}
+
+
 void NewFileWindow::parseTemplatesIntoTree(UITree *tree, OSFileEntry folder) {
 	vector<OSFileEntry> templates = OSBasics::parseFolder(folder.fullPath, false);
 	for(int i=0; i < templates.size(); i++) {
@@ -68,7 +128,7 @@ void NewFileWindow::parseTemplatesIntoTree(UITree *tree, OSFileEntry folder) {
 			UITree *newChild = tree->addTreeChild("templateIcon.png", entry.nameWithoutExtension, NULL);
 			FileTemplateUserData *data = new FileTemplateUserData();
 			data->type = 1;
-			data->templateFolder = entry.fullPath;
+			data->templatePath = entry.fullPath;
 			newChild->setUserData(data);
 			if(entry.name == "LUA Source File.lua") {
 				defaultTemplateTree = newChild;

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

@@ -22,7 +22,7 @@
 
 #include "NewProjectWindow.h"
 
-NewProjectWindow::NewProjectWindow() : UIWindow(L"Create New Project", 500, 300){
+NewProjectWindow::NewProjectWindow() : UIWindow(L"Create New Project", 480, 280){
 	
 	templateFolder = "";
 	

+ 52 - 0
IDE/Contents/Source/PolycodeFrame.cpp

@@ -49,6 +49,8 @@ PolycodeFrame::PolycodeFrame() : ScreenEntity() {
 	
 	projectBrowser = new PolycodeProjectBrowser();
 	addChild(projectBrowser);
+	
+	projectBrowser->treeContainer->getRootNode()->addEventListener(this, UITreeEvent::DRAG_START_EVENT);
 		
 	topBarBg = new ScreenShape(ScreenShape::SHAPE_RECT, 2,2);
 	topBarBg->setColor(0,0,0,1);
@@ -88,6 +90,17 @@ PolycodeFrame::PolycodeFrame() : ScreenEntity() {
 	
 	currentEditor = NULL;
 	
+	isDragging  = false;
+	dragLabel = new ScreenLabel("NONE", 11, "sans");
+	dragLabel->setPosition(0,-15);
+	
+	dragEntity = new ScreenEntity();
+	dragEntity->addChild(dragLabel);
+	addChild(dragEntity);
+	dragEntity->visible = false;	
+	
+	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEUP);
+	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
 }
 
 void PolycodeFrame::showModal(UIWindow *modalChild) {
@@ -133,6 +146,45 @@ void PolycodeFrame::hideModal() {
 }
 
 void PolycodeFrame::handleEvent(Event *event) {
+	
+	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
+		switch(event->getEventCode()) {
+			case InputEvent::EVENT_MOUSEUP:
+				if(isDragging) {
+					if(currentEditor) {
+						InputEvent *inputEvent = (InputEvent*) event;						
+						Number posX = inputEvent->mousePosition.x - editorHolder->getPosition2D().x;
+						Number posY = inputEvent->mousePosition.y - editorHolder->getPosition2D().y;						
+						currentEditor->handleDroppedFile(draggedFile, posX, posY);
+					}
+				}
+				isDragging = false;
+				dragEntity->visible = false;
+			break;
+			case InputEvent::EVENT_MOUSEMOVE:
+				if(isDragging) {
+					dragEntity->setPosition(((InputEvent*)event)->mousePosition);
+				}
+			break;	
+		}
+	}
+
+	if(event->getDispatcher() == projectBrowser->treeContainer->getRootNode()) {
+		switch (event->getEventCode()) {
+			case UITreeEvent::DRAG_START_EVENT:
+			{
+				UITreeEvent *treeEvent = (UITreeEvent*) event;
+				BrowserUserData *data = (BrowserUserData*)treeEvent->selection->getUserData();
+				draggedFile = data->fileEntry;
+				dragLabel->setText(data->fileEntry.name);
+				dragEntity->visible = true;
+				isDragging = true;
+//				printf("START DRAG: %s\n", data->fileEntry.name.c_str());
+			}
+			break;
+		}
+	}
+
 	if(event->getDispatcher() == modalChild) {
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLOSE_EVENT) {
 			hideModal();

+ 19 - 0
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -48,6 +48,7 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	editorManager = new PolycodeEditorManager();
 	
 	editorManager->registerEditorFactory(new PolycodeImageEditorFactory());
+	editorManager->registerEditorFactory(new PolycodeScreenEditorFactory());	
 	editorManager->registerEditorFactory(new PolycodeFontEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeTextEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeProjectEditorFactory());
@@ -57,6 +58,7 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 
 	frame->textInputPopup->addEventListener(this, UIEvent::OK_EVENT);	
 	frame->newProjectWindow->addEventListener(this, UIEvent::OK_EVENT);
+	frame->newFileWindow->addEventListener(this, UIEvent::OK_EVENT);	
 	frame->exampleBrowserWindow->addEventListener(this, UIEvent::OK_EVENT);
 	
 	frame->playButton->addEventListener(this, UIEvent::CLICK_EVENT);
@@ -110,6 +112,12 @@ void PolycodeIDEApp::newFile() {
 	}
 }
 
+void PolycodeIDEApp::refreshProject() {
+	if(projectManager->getActiveProject()) {
+		frame->getProjectBrowser()->refreshProject(projectManager->getActiveProject());
+	}
+}
+
 void PolycodeIDEApp::closeProject() {
 	if(projectManager->getActiveProject()) {
 		frame->getProjectBrowser()->removeProject(projectManager->getActiveProject());
@@ -262,6 +270,17 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 			frame->hideModal();			
 		}
 	}
+
+	if(event->getDispatcher() == frame->newFileWindow) {
+		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::OK_EVENT) {
+			projectManager->createNewFile(frame->newFileWindow->getTemplatePath(), frame->newFileWindow->getFileName());
+			frame->hideModal();			
+			
+			if(projectManager->getActiveProject()) {
+				frame->projectBrowser->refreshProject(projectManager->getActiveProject());
+			}			
+		}
+	}
 	
 	if(event->getDispatcher() == frame->exampleBrowserWindow) {
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::OK_EVENT) {

+ 9 - 0
IDE/Contents/Source/PolycodeProjectManager.cpp

@@ -76,6 +76,15 @@ int PolycodeProjectManager::removeProject(PolycodeProject *project) {
 	return 1;
 }
 
+void PolycodeProjectManager::createNewFile(String templatePath, String newFileName) {
+	if(activeFolder == "")
+		return;
+	
+	std::vector<String> bits = templatePath.split(".");
+	String extension = bits[bits.size()-1];
+	
+	CoreServices::getInstance()->getCore()->copyDiskItem(templatePath, activeFolder+"/"+newFileName+"."+extension);	
+}
 
 void PolycodeProjectManager::createNewProject(String templateFolder, String projectName, String projectLocation) {	
 

+ 185 - 0
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -0,0 +1,185 @@
+/*
+ Copyright (C) 2012 by Ivan Safrin
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+ 
+#include "PolycodeScreenEditor.h"
+
+PolycodeScreenEditor::PolycodeScreenEditor() : PolycodeEditor(true){
+
+	Config *conf = CoreServices::getInstance()->getConfig();	
+	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
+	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");	
+	Number padding = conf->getNumericValue("Polycode", "uiWindowSkinPadding");	
+
+	isScalingEntity = false;
+	
+	selectedEntity = NULL;
+	isDraggingEntity = false; 
+	
+	grid = new ScreenImage("editorGrid.png");
+	
+	addChild(grid);
+	grid->snapToPixels = true;
+	
+	baseEntity = new ScreenEntity();
+	addChild(baseEntity);
+	
+	grid->getTexture()->clamp = false;
+	grid->getTexture()->recreateFromImageData();	
+		
+	baseEntity->setPositionMode(ScreenEntity::POSITION_CENTER);	
+
+	centerImage = new ScreenImage("screenCenter.png");
+	centerImage->setPositionMode(ScreenEntity::POSITION_CENTER);
+	addChild(centerImage);
+	
+	baseEntity->setPosition(256,256);
+	baseEntity->setWidth(20000);
+	baseEntity->setHeight(20000);
+		
+	centerImage->setPosition(256, 256);
+				
+	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEUP);
+	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
+	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
+					
+	screenTransform = new UIBox("screenTransform.png", 16,16,16,16, 100,100);
+	screenTransform->visible = false;
+	addChild(screenTransform);
+		
+	entityInfoWindow = new UIWindow("Selected entity", 140, 100);
+	addChild(entityInfoWindow);	
+	entityInfoWindow->setPosition(15,15);
+	
+	ScreenLabel *label2 = new ScreenLabel(L"Entity color:", fontSize, fontName, Label::ANTIALIAS_FULL);
+	entityInfoWindow->addChild(label2);
+	label2->setPosition(padding, entityInfoWindow->topPadding+20);
+
+	entityColorBox = new UIColorBox(Color(1.0, 1.0, 1.0, 0.0), 30,30);
+	entityColorBox->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight());
+	entityInfoWindow->addChild(entityColorBox);		
+	entityColorBox->addEventListener(this, UIEvent::CHANGE_EVENT);
+	
+}
+
+PolycodeScreenEditor::~PolycodeScreenEditor() {
+	
+}
+
+bool PolycodeScreenEditor::openFile(String filePath) {
+	
+	PolycodeEditor::openFile(filePath);	
+	return true;
+}
+
+void PolycodeScreenEditor::handleDroppedFile(OSFileEntry file, Number x, Number y) {
+	ScreenEntity *newEntity = NULL;
+	if(file.extension == "png") {
+		ScreenImage *newImage = new ScreenImage(file.fullPath);
+		newImage->setPositionMode(ScreenEntity::POSITION_CENTER);
+		baseEntity->addChild(newImage);
+		newImage->setPosition(x-baseEntity->getPosition2D().x,y-baseEntity->getPosition2D().y);
+		newEntity = newImage;
+	}
+	
+	if(newEntity) {
+		newEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
+		newEntity->blockMouseInput = true;
+	}
+}
+
+void PolycodeScreenEditor::syncTransformToSelected() {
+	if(!selectedEntity)
+		return;
+		
+	screenTransform->resizeBox((selectedEntity->getWidth() * selectedEntity->getScale().x) + 5, (selectedEntity->getHeight() * selectedEntity->getScale().y) + 5);		
+	screenTransform->setPosition(selectedEntity->getPosition2D().x+baseEntity->getPosition2D().x-screenTransform->getWidth()/2.0,  selectedEntity->getPosition2D().y+baseEntity->getPosition2D().y-screenTransform->getHeight()/2.0);			
+}
+
+void PolycodeScreenEditor::handleEvent(Event *event) {
+	InputEvent *inputEvent = (InputEvent*) event;
+	
+	if(event->getDispatcher() == entityColorBox  && event->getEventType() == "UIEvent") {
+		switch (event->getEventCode()) {
+			case UIEvent::CHANGE_EVENT:
+				if(selectedEntity) {
+					selectedEntity->setColor(entityColorBox->getSelectedColor());
+				}
+			break;
+		}
+		return;
+	}
+	
+	if(event->getDispatcher() == baseEntity) {
+		switch (event->getEventCode()) {
+			case InputEvent::EVENT_MOUSEUP:
+			case InputEvent::EVENT_MOUSEUP_OUTSIDE:			
+				isDraggingEntity = false;	
+				isScalingEntity = false;		
+			break;
+			case InputEvent::EVENT_MOUSEMOVE:
+			{
+				if(isDraggingEntity) {
+					selectedEntity->setPosition(inputEvent->mousePosition.x-baseEntity->getPosition2D().x - dragOffset.x, inputEvent->mousePosition.y-baseEntity->getPosition2D().y  - dragOffset.y);
+					syncTransformToSelected();
+				} else if(isScalingEntity) {
+//					Number newScale = Vector2(selectedEntity->getPosition2D().x + baseEntity->getPosition2D().x + dragOffset.x, selectedEntity->getPosition2D().y + baseEntity->getPosition2D().y + dragOffset.y).distance(inputEvent->mousePosition);
+
+					Vector2 scaleVector = Vector2(selectedEntity->getPosition2D().x + baseEntity->getPosition2D().x, selectedEntity->getPosition2D().y + baseEntity->getPosition2D().y) - inputEvent->mousePosition;
+					
+					scaleVector.x =	scaleVector.x / selectedEntity->getWidth() * 2.0;
+					scaleVector.y =	scaleVector.y / selectedEntity->getHeight() * 2.0;					
+					selectedEntity->setScale(scaleVector.x, scaleVector.y, 0);
+					syncTransformToSelected();
+				}
+			}
+			break;			
+		}
+		return;
+	}
+
+	for(int i=0; i < baseEntity->getNumChildren(); i++) {
+		ScreenEntity* childEntity = (ScreenEntity*) baseEntity->getChildAtIndex(i);
+		if(event->getDispatcher() == childEntity) {		
+			screenTransform->visible = true;
+			dragOffset.x = inputEvent->getMousePosition().x - childEntity->getPosition2D().x;
+			dragOffset.y = inputEvent->getMousePosition().y - childEntity->getPosition2D().y;						
+			
+			selectedEntity = childEntity;
+			entityColorBox->setBoxColor(selectedEntity->color);
+			syncTransformToSelected();
+			
+			Number cornerSize = 12;
+			if(dragOffset.x < -(selectedEntity->getWidth()/2.0) + cornerSize && dragOffset.y <  -(selectedEntity->getHeight()/2.0) +  cornerSize) {
+				isScalingEntity = true;
+			} else {
+				isDraggingEntity = true;						
+			}
+			
+			
+		}
+	}
+}
+
+void PolycodeScreenEditor::Resize(int x, int y) {
+	grid->setImageCoordinates(0,0,x,y);	
+}
+

+ 1 - 1
Modules/Contents/Networking/Include/PolySocket.h

@@ -27,7 +27,7 @@ THE SOFTWARE.
 #include "stdio.h"
 
 
-#define MAX_PACKET_SIZE 1400
+#define MAX_PACKET_SIZE 400
 
 // if set to 1, will create a thread for each network socket
 #define USE_THREADED_SOCKETS 0

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

@@ -36,7 +36,7 @@ namespace Polycode {
 			static const int OK_EVENT = 2;
 			static const int CANCEL_EVENT = 3;
 			static const int CHANGE_EVENT = 4;
-			
+						
 		protected:
 		
 			

+ 4 - 0
Modules/Contents/UI/Include/PolyUITree.h

@@ -40,6 +40,7 @@ namespace Polycode {
 			UITree(String icon, String text, Number treeWidth, Number treeOffset=0);
 			~UITree();
 			
+			
 			void handleEvent(Event *event);
 			void toggleCollapsed();
 			UITree *addTreeChild(String icon, String text, void *userData = NULL);
@@ -65,6 +66,9 @@ namespace Polycode {
 		
 		private:
 		
+			bool willDrag;
+			bool isDragging;
+		
 			String labelText;
 			void *userData;
 			Number treeWidth;

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

@@ -37,6 +37,7 @@ namespace Polycode {
 			static const int NEED_REFRESH_EVENT = 2000;
 			static const int SELECTED_EVENT = 2001;
 			static const int EXECUTED_EVENT = 2002;
+			static const int DRAG_START_EVENT = 2003;
 			
 			UITree *selection;
 

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

@@ -434,6 +434,7 @@ void UIColorBox::handleEvent(Event *event) {
 		switch(event->getEventCode()) {
 			case Event::CHANGE_EVENT:
 				colorShape->color = colorPicker->getSelectedColor();
+				dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
 			break;
 		}		
 	}

+ 29 - 2
Modules/Contents/UI/Source/PolyUITree.cpp

@@ -31,6 +31,10 @@ using namespace Polycode;
 
 UITree::UITree(String icon, String text, Number treeWidth, Number treeOffset) : ScreenEntity() {
 		
+		
+	willDrag = false;
+	isDragging = false;
+	
 	labelText = text;
 	Config *conf = CoreServices::getInstance()->getConfig();
 	
@@ -101,7 +105,10 @@ UITree::UITree(String icon, String text, Number treeWidth, Number treeOffset) :
 	parent = NULL;
 	selectedNode = NULL;
 	arrowIconImage->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	bgBox->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
+	bgBox->addEventListener(this, InputEvent::EVENT_MOUSEUP);
+	bgBox->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);	
+	bgBox->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);		
+	bgBox->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);	
 	bgBox->addEventListener(this, InputEvent::EVENT_DOUBLECLICK);	
 	
 	setPositionMode(ScreenEntity::POSITION_CENTER);
@@ -120,6 +127,7 @@ void UITree::removeTreeChild(UITree *child) {
 			child->removeEventListener(this, UITreeEvent::NEED_REFRESH_EVENT);
 			child->removeEventListener(this, UITreeEvent::SELECTED_EVENT);
 			child->removeEventListener(this, UITreeEvent::EXECUTED_EVENT);
+			child->removeEventListener(this, UITreeEvent::DRAG_START_EVENT);			
 			treeChildren.erase(treeChildren.begin()+i);			
 			delete child;
 			refreshTree();			
@@ -143,9 +151,24 @@ void UITree::handleEvent(Event *event) {
 		toggleCollapsed();
 	} else if(event->getDispatcher() == bgBox) {
 		switch(event->getEventCode()) {
-			case InputEvent::EVENT_MOUSEDOWN:
+			case InputEvent::EVENT_MOUSEUP:
 				setSelected();
+				willDrag = false;				
+				isDragging = false;				
 			break;
+			case InputEvent::EVENT_MOUSEUP_OUTSIDE:
+				willDrag = false;	
+				isDragging = false;			
+			break;			
+			case InputEvent::EVENT_MOUSEDOWN:	
+				willDrag = true;
+			break;			
+			case InputEvent::EVENT_MOUSEMOVE:
+				if(willDrag && !isDragging) {
+					isDragging = true;
+					dispatchEvent(new UITreeEvent(this), UITreeEvent::DRAG_START_EVENT);
+				}
+			break;						
 			case InputEvent::EVENT_DOUBLECLICK:
 				dispatchEvent(new UITreeEvent(this), UITreeEvent::EXECUTED_EVENT);				
 			break;
@@ -174,6 +197,9 @@ void UITree::handleEvent(Event *event) {
 			case UITreeEvent::EXECUTED_EVENT:
 					dispatchEvent(new UITreeEvent(uiTreeEvent->selection), UITreeEvent::EXECUTED_EVENT);
 			break;
+			case UITreeEvent::DRAG_START_EVENT:
+					dispatchEvent(new UITreeEvent(uiTreeEvent->selection), UITreeEvent::DRAG_START_EVENT);
+			break;			
 			case UITreeEvent::NEED_REFRESH_EVENT:
 				refreshTree();
 			break;
@@ -287,6 +313,7 @@ UITree *UITree::addTreeChild(String icon, String text, void *userData) {
 	newTree->addEventListener(this, UITreeEvent::NEED_REFRESH_EVENT);
 	newTree->addEventListener(this, UITreeEvent::SELECTED_EVENT);
 	newTree->addEventListener(this, UITreeEvent::EXECUTED_EVENT);
+	newTree->addEventListener(this, UITreeEvent::DRAG_START_EVENT);	
 	treeChildren.push_back(newTree);
 	refreshTree();
 	return newTree;