Ver Fonte

perform renaming on all prefabs data and CDB files

Nicolas Cannasse há 5 anos atrás
pai
commit
2c11a162d9
2 ficheiros alterados com 90 adições e 13 exclusões
  1. 1 0
      hide/Ide.hx
  2. 89 13
      hide/view/FileTree.hx

+ 1 - 0
hide/Ide.hx

@@ -855,6 +855,7 @@ class Ide {
 
 	function browseFiles( callb : String -> Void ) {
 		function browseRec(path) {
+			if( path == ".tmp" ) return;
 			for( p in sys.FileSystem.readDirectory(resourceDir + "/" + path) ) {
 				var p = path == "" ? p : path + "/" + p;
 				if( sys.FileSystem.isDirectory(resourceDir+"/"+p) ) {

+ 89 - 13
hide/view/FileTree.hx

@@ -170,30 +170,106 @@ class FileTree extends FileView {
 		}
 
 		var isDir = sys.FileSystem.isDirectory(ide.getPath(path));
-		if( isDir )
-			throw "TODO : rename directory";
-		ide.filterPrefabs(function(p:hrt.prefab.Prefab) {
-			var changed = false;
-			function filter(p:String) {
-				if( p == null )
-					return null;
-				if( p == path ) {
+		var wasRenamed = false;
+		if( sys.FileSystem.exists(ide.projectDir+"/.svn") ) {
+			if( Sys.command("svn",["--version"]) != 0 ) {
+				if( isDir && !ide.confirm("Renaming a SVN directory, but 'svn' system command was not found. Continue ?") )
+					return false;
+			} else {
+				var cwd = Sys.getCwd();
+				Sys.setCwd(ide.resourceDir);
+				var code = Sys.command("svn",["rename",path,newPath]);
+				Sys.setCwd(cwd);
+				if( code != 0 ) {
+					ide.error("SVN rename failure");
+					return false;
+				}
+				wasRenamed = true;
+			}
+		}
+		if( !wasRenamed )
+			sys.FileSystem.rename(ide.getPath(path), ide.getPath(newPath));
+
+		var changed = false;
+		function filter(p:String) {
+			if( p == null )
+				return null;
+			if( p == path ) {
+				changed = true;
+				return newPath;
+			}
+			if( p == "/"+path ) {
+				changed = true;
+				return "/"+newPath;
+			}
+			if( isDir ) {
+				if( StringTools.startsWith(p,path+"/") ) {
 					changed = true;
-					return newPath;
+					return newPath + p.substr(path.length);
 				}
-				if( isDir && StringTools.startsWith(p,path+"/") ) {
+				if( StringTools.startsWith(p,"/"+path+"/") ) {
 					changed = true;
-					return newPath + p.substr(path.length, p.length - path.length);
+					return "/"+newPath + p.substr(path.length+1);
 				}
-				return p;
 			}
+			return p;
+		}
+
+		ide.filterPrefabs(function(p:hrt.prefab.Prefab) {
+			changed = false;
 			p.source = filter(p.source);
 			var h = p.getHideProps();
 			if( h.onResourceRenamed != null )
 				h.onResourceRenamed(filter);
+			else {
+				var visited = new Array<Dynamic>();
+				function browseRec(obj:Dynamic) : Dynamic {
+					switch( Type.typeof(obj) ) {
+					case TObject:
+						if( visited.indexOf(obj) >= 0 ) return null;
+						visited.push(obj);
+						for( f in Reflect.fields(obj) ) {
+							var v : Dynamic = Reflect.field(obj, f);
+							v = browseRec(v);
+							if( v != null ) Reflect.setField(obj, f, v);
+						}
+					case TClass(Array):
+						if( visited.indexOf(obj) >= 0 ) return null;
+						visited.push(obj);
+						var arr : Array<Dynamic> = obj;
+						for( i in 0...arr.length ) {
+							var v : Dynamic = arr[i];
+							v = browseRec(v);
+							if( v != null ) arr[i] = v;
+						}
+					case TClass(String):
+						return filter(obj);
+					default:
+					}
+					return null;
+				}
+				browseRec(p);
+			}
 			return changed;
 		});
-		sys.FileSystem.rename(ide.getPath(path), ide.getPath(newPath));
+
+		changed = false;
+		for( sheet in ide.database.sheets ) {
+			for( c in sheet.columns ) {
+				switch( c.type ) {
+				case TFile:
+					for( o in sheet.getLines() ) {
+						var v : Dynamic = filter(Reflect.field(o, c.name));
+						if( v != null ) Reflect.setField(o, c.name, v);
+					}
+				default:
+				}
+			}
+		}
+		if( changed ) {
+			ide.saveDatabase();
+			hide.comp.cdb.Editor.refreshAll(true);
+		}
 		return true;
 	}