2
0
Эх сурвалжийг харах

ReferenceViewer: better UX for unreferenced and CDB references, add goto original

lviguier 2 сар өмнө
parent
commit
56464c30ac

+ 4 - 0
bin/style.css

@@ -5453,6 +5453,10 @@ fancy-closable * {
   background-color: #404248;
   border-radius: 10px;
   padding: 2px 8px 2px 8px;
+  cursor: pointer;
+}
+.ref-viewer > .header .title em:hover {
+  background-color: #585a63;
 }
 .ref-viewer > .header .infos {
   color: #c8c8ff;

+ 5 - 0
bin/style.less

@@ -6566,6 +6566,11 @@ fancy-closable {
 				background-color: #404248;
 				border-radius: 10px;
 				padding: 2px 8px 2px 8px;
+				cursor: pointer;
+
+				&:hover {
+					background-color: #585a63;
+				}
 			}
 		}
 

+ 2 - 2
hide/comp/cdb/Cell.hx

@@ -125,7 +125,7 @@ class Cell {
 				menu = [
 					{
 						label : "Show references",
-						click : () -> editor.showReferences(this.value),
+						click : () -> editor.showReferences(this.value, this),
 						keys : this.editor.config.get("key.cdb.showReferences"),
 					},
 					{
@@ -149,7 +149,7 @@ class Cell {
 					},
 					{
 						label : "Show references",
-						click : () -> editor.showReferences(this.value, editor.base.getSheet(sname)),
+						click : () -> editor.showReferences(this.value, this, editor.base.getSheet(sname)),
 						keys : this.editor.config.get("key.cdb.showReferences"),
 					},
 				];

+ 23 - 18
hide/comp/cdb/Editor.hx

@@ -129,7 +129,6 @@ class Editor extends Component {
 		keys.register("copy", onCopy);
 		keys.register("paste", onPaste);
 		keys.register("delete", onDelete);
-		keys.register("cdb.showReferences", () -> showReferences());
 		keys.register("undo", function() undo.undo());
 		keys.register("redo", function() undo.redo());
 		keys.register("cdb.moveBack", () -> cursor.jump(true));
@@ -1212,7 +1211,7 @@ class Editor extends Component {
 		return {pathNames: path, pathParts: coords};
 	}
 
-	public function getReferences(id: String, withCodePaths = true, returnAtFirstRef = false, sheet: cdb.Sheet, ?codeFileCache: Array<{path: String, data:String}>, ?prefabFileCache: Array<{path: String, data:String}>) : Array<{str:String, ?goto:Void->Void}> {
+	public function getReferences(id: String, withCodePaths = true, returnAtFirstRef = false, sheet: cdb.Sheet, ?codeFileCache: Array<{path: String, data:String}>, ?prefabFileCache: Array<{path: String, data:String}>) : Array<{str:String, ?goto:Void->Void, ?file: String}> {
 		#if hl
 		return [];
 		#else
@@ -1220,11 +1219,11 @@ class Editor extends Component {
 			return [];
 
 		var results = sheet.getReferencesFromId(id);
-		var message = new Array<{str:String, ?goto:Void->Void}>();
+		var message = new Array<{str:String, ?goto:Void->Void, ?file: String}>();
 		if( results != null ) {
 			for( rs in results ) {
 				var path = splitPath(rs);
-				message.push({str: rs.s[0].s.name+"."+path.pathNames.join("."), goto: () -> openReference2(rs.s[0].s, path.pathParts)});
+				message.push({str: rs.s[0].s.name+"."+path.pathNames.join("."), goto: () -> openReference2(rs.s[0].s, path.pathParts), file: @:privateAccess Ide.inst.databaseFile});
 				if (returnAtFirstRef) return message;
 			}
 		}
@@ -1313,7 +1312,7 @@ class Editor extends Component {
 									checkSetPos();
 								});
 							}
-							message.push({str: path+":"+(line+1), goto: fn});
+							message.push({str: path+":"+(line+1), goto: fn, file: fpath});
 							if (returnAtFirstRef) return message;
 						}
 					}
@@ -1364,7 +1363,7 @@ class Editor extends Component {
 									}, 1);
 								});
 							}
-							message.push({str: path+":"+(line+1), goto: fn});
+							message.push({str: path+":"+(line+1), goto: fn, file: fpath});
 						}
 					}
 				}
@@ -1404,7 +1403,7 @@ class Editor extends Component {
 										{
 											var res = splitPath({s: sheets, o: o});
 											res.pathParts.push(Script(line));
-											message.push({str: sheets[0].s.name+"."+res.pathNames.join(".") + "." + c.name + ":" + Std.string(line + 1), goto: () -> openReference2(sheets[0].s, res.pathParts)});
+											message.push({str: sheets[0].s.name+"."+res.pathNames.join(".") + "." + c.name + ":" + Std.string(line + 1), goto: () -> openReference2(sheets[0].s, res.pathParts), file:@:privateAccess Ide.inst.databaseFile});
 											if (returnAtFirstRef) return message;
 										}
 									}
@@ -1442,26 +1441,23 @@ class Editor extends Component {
 	public function findUnreferenced(col: cdb.Data.Column, table: Table) {
 		var sheet = table.getRealSheet();
 
-		var nonrefs: Array<hide.view.RefViewer.Reference> = [ { file: "data.cdb", path: Ide.inst.getPath("data.cdb"), results: [] } ];
 		var codeFileCache = [];
 		var prefabFileCache = [];
+		var nonrefs: Array<hide.view.RefViewer.Result> = [];
 		for (o in sheet.lines) {
 			var id = Reflect.getProperty(o, col.name);
 			var refs = getReferences(id, true, true, sheet, codeFileCache, prefabFileCache);
-			if (refs.length == 0) {
-				nonrefs[0].results.push({ text: id, goto: () -> openReference2(sheet, [Id(col.name, id)]) });
-			}
+			if (refs.length == 0)
+				nonrefs.push({ text: id, goto: () -> openReference2(sheet, [Id(col.name, id)]) });
 		}
-		trace("codeFileCache: ", codeFileCache.length);
-		trace("prefabFileCache: ", prefabFileCache.length);
 
 		ide.open("hide.view.RefViewer", null, function(view) {
 			var refViewer : hide.view.RefViewer = cast view;
-			refViewer.showRefs(nonrefs, "Number of unreferenced ids");
+			refViewer.showUnreferenced(nonrefs);
 		});
 	}
 
-	public function showReferences(?id: String, ?sheet: cdb.Sheet) {
+	public function showReferences(?id: String, ?cell : hide.comp.cdb.Cell, ?sheet: cdb.Sheet) {
 		if( cursor.table == null ) return;
 		if( sheet == null )
 			sheet = cursor.table.sheet;
@@ -1483,13 +1479,22 @@ class Editor extends Component {
 			return;
 		}
 
-		var references : Array<hide.view.RefViewer.Reference> = [{ file: "data.cdb", path:"", results: [] }];
+		var files = new Map<String, hide.view.RefViewer.Reference>();
 		for (r in refs) {
-			references[0].results.push({ text: r.str, goto: r.goto });
+			var ref = files.get(r.file);
+			if (ref == null) {
+				ref = { file : r.file.substr(r.file.lastIndexOf("/") + 1), path : r.file, results: [] };
+				files.set(r.file, ref);
+			}
+
+			ref.results.push({ text: r.str, goto: r.goto });
 		}
+
 		ide.open("hide.view.RefViewer", null, function(view) {
 			var refViewer : hide.view.RefViewer = cast view;
-			refViewer.showRefs(references, "Number of references", id);
+			refViewer.showRefs([for (f in files.keys()) files.get(f)], id, () -> {
+				openReference(cell.table.sheet, cell.line.index, cell.columnIndex);
+			});
 		});
 	}
 

+ 3 - 1
hide/view/FileTree.hx

@@ -305,7 +305,9 @@ class FileTree extends FileView {
 		var refs = ide.search(path, ["hx", "prefab", "fx", "cdb", "json", "props", "ddt"], ["bin"]);
 		ide.open("hide.view.RefViewer", null, null, function(view) {
 			var refViewer : hide.view.RefViewer = cast view;
-			refViewer.showRefs(refs, 'Number of references to "$path"', path);
+			refViewer.showRefs(refs, path, function() {
+				ide.openFile(path);
+			});
 		});
 	}
 

+ 3 - 1
hide/view/FileView.hx

@@ -228,7 +228,9 @@ class FileView extends hide.ui.View<{ path : String }> {
 					var refs = ide.search(state.path, ["hx", "prefab", "fx", "cdb", "json", "props", "ddt"], ["bin"]);
 					ide.open("hide.view.RefViewer", null, null, function(view) {
 						var refViewer : hide.view.RefViewer = cast view;
-						refViewer.showRefs(refs, 'Number of references to "${state.path}"', state.path);
+						refViewer.showRefs(refs, state.path, function() {
+							ide.openFile(state.path);
+						});
 					});
 				}},
 				{ label : null, isSeparator : true },

+ 36 - 4
hide/view/RefViewer.hx

@@ -3,9 +3,14 @@ package hide.view;
 typedef Reference = {
 	file : String,
 	path : String,
-	results : Array<{text: String, goto : () -> Void}>
+	results : Array<Result>
 };
 
+typedef Result =  {
+	text: String,
+	goto : () -> Void
+}
+
 class RefViewer extends hide.ui.View<{}> {
 	public function new(state: Dynamic) {
 		super(state);
@@ -18,7 +23,7 @@ class RefViewer extends hide.ui.View<{}> {
 		return "References Viewer";
 	}
 
-	public function showRefs(references: Array<Reference>, description: String = "Number of references", ?text: String) {
+	public function showRefs(references: Array<Reference>, original: String, gotoOriginal: Void -> Void) {
 		element.html("");
 		var div = new Element('<div class="ref-viewer hide-scroll">').appendTo(element);
 
@@ -27,10 +32,11 @@ class RefViewer extends hide.ui.View<{}> {
 			refCount += r.results.length;
 
 		var headerEl = new Element('<div class="header">
-			<span class="title" title="${text}">References to : <em>${text}</em></span>
+			<span class="title" title="${original}">References to : <em>${original}</em></span>
 			<span class="infos">${refCount} results in ${references.length} files</span>
 		</div>');
 		headerEl.appendTo(div);
+		headerEl.find(".title").on("click", (e) -> gotoOriginal());
 
 		for (r in references) {
 			var el = new Element('<div class="reference">
@@ -47,7 +53,7 @@ class RefViewer extends hide.ui.View<{}> {
 
 			for (result in r.results) {
 				var resultEl = new Element('<div class="result">
-					<span class="entry"><a>${text != null ? StringTools.replace(result.text, text, '<em>${text}</em>') : result.text}<a/></span>
+					<span class="entry"><a>${original != null ? StringTools.replace(result.text, original, '<em>${original}</em>') : result.text}<a/></span>
 				</div>');
 				resultEl.appendTo(el.find(".content"));
 				resultEl.on("click", function(e) {
@@ -70,6 +76,32 @@ class RefViewer extends hide.ui.View<{}> {
 		}
 	}
 
+	public function showUnreferenced(unreferenceds: Array<Result>) {
+		element.html("");
+		var div = new Element('<div class="ref-viewer hide-scroll">').appendTo(element);
+		var headerEl = new Element('<div class="header">
+			<span class="title">Unreferenced IDs :</span>
+			<span class="infos">${unreferenceds.length} results</span>
+		</div>');
+		headerEl.appendTo(div);
+
+		var content = new Element('<div class="reference">
+			<div class="content">
+			</div>
+		</div>');
+		content.appendTo(div);
+
+		for (u in unreferenceds) {
+			var resultEl = new Element('<div class="result">
+				<span class="entry"><a>${u.text}<a/></span>
+			</div>');
+			resultEl.appendTo(content.find(".content"));
+			resultEl.on("click", function(e) {
+				u.goto();
+			});
+		}
+	}
+
 
 	static var _ = hide.ui.View.register(RefViewer, {position: Left, width: 400});
 }

+ 1 - 1
hrt/prefab/Material.hx

@@ -514,7 +514,7 @@ class Material extends Prefab {
 
 			hide.Ide.inst.open("hide.view.RefViewer", null, null, function(view) {
 				var refViewer : hide.view.RefViewer = cast view;
-				refViewer.showRefs(refs, 'Number of references to "${this.name}"', this.name);
+				refViewer.showRefs(refs, this.name, () -> {});
 			});
 		});