Przeglądaj źródła

Fixed undo/redo for copy and paste in 2d editor

Ivan Safrin 12 lat temu
rodzic
commit
a1889cacd8

+ 5 - 5
Core/Contents/Source/PolyScreenEntityInstance.cpp

@@ -303,13 +303,13 @@ ScreenEntity *ScreenEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry
 		entity->setHeight(_height);	
 	}
 
+	entity->color.r = (*entry)["colorR"]->NumberVal;
+	entity->color.g = (*entry)["colorG"]->NumberVal;
+	entity->color.b = (*entry)["colorB"]->NumberVal;
+	entity->color.a = (*entry)["colorA"]->NumberVal;
 
-	if(!targetEntity) {	
-		entity->color.r = (*entry)["colorR"]->NumberVal;
-		entity->color.g = (*entry)["colorG"]->NumberVal;
-		entity->color.b = (*entry)["colorB"]->NumberVal;
-		entity->color.a = (*entry)["colorA"]->NumberVal;
 
+	if(!targetEntity) {	
 		entity->blendingMode = (*entry)["blendMode"]->intVal;
 
 		entity->scale.x = (*entry)["scaleX"]->NumberVal;

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

@@ -59,7 +59,6 @@ class PolycodeScreenEditorActionDataEntry {
 		PolycodeScreenEditorActionDataEntry(Vector3 vec3);
 		PolycodeScreenEditorActionDataEntry(Number number);
 		PolycodeScreenEditorActionDataEntry(ScreenEntity *entity);
-		PolycodeScreenEditorActionDataEntry(ScreenEntity *entity, ScreenEntity *parentEntity);
 		Vector3 vec3;
 		Number number;
 		ScreenEntity *entity;

+ 29 - 1
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -873,6 +873,23 @@ void PolycodeScreenEditorMain::doAction(String actionName, PolycodeEditorActionD
 			}					
 			selectEntity(NULL, false);
 		}
+	} else if(actionName == "paste") {
+		if(screenData->reverse) {
+			for(int i=0; i < screenData->entries.size(); i++) {
+				deleteEntity(screenData->entries[i].entity);
+			}		
+		} else {
+			bool oldMultiSelect = multiSelect;
+			multiSelect = true;
+			for(int i=0; i < screenData->entries.size(); i++) {
+				screenData->entries[i].parentEntity->addChild(screenData->entries[i].entity);
+				selectEntity(screenData->entries[i].entity, false);
+			}
+			multiSelect = oldMultiSelect;			
+			if(treeView) {
+				treeView->Refresh();		
+			}			
+		}
 	}
 }
 
@@ -2465,6 +2482,11 @@ void PolycodeScreenEditorMain::Paste(void *data, String clipboardType) {
 		multiSelect = true;
 		ScreenEntityClipboardData *newData = (ScreenEntityClipboardData*) data;
 		if(currentLayer) {
+		
+			PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
+			PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
+			data->reverse = false;
+	
 			for(int i=0; i < newData->entities.size(); i++) {
 				ScreenEntity *entity = (ScreenEntity*) newData->entities[i]->Clone(true, true);
 				entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
@@ -2482,8 +2504,14 @@ void PolycodeScreenEditorMain::Paste(void *data, String clipboardType) {
 					currentLayer->addChild(entity);
 				}
 				applyEditorProperties(entity);
-				selectEntity(entity);
+				selectEntity(entity, false);
+
+				beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(entity));				
+				data->entries.push_back(PolycodeScreenEditorActionDataEntry(entity));
+				
 			}
+			
+			editor->didAction("paste", beforeData, data);			
 		}
 		multiSelect = false;
 	}