فهرست منبع

[filebrowser] QOL

- Keyboard letters to quickliy jump to files starting with that letter in the tree
- Default icon for unknown extensions
- Open file with enter
- Doubleclick now open dirs
Clément Espeute 2 ماه پیش
والد
کامیت
9955f7531b
2فایلهای تغییر یافته به همراه49 افزوده شده و 6 حذف شده
  1. 41 4
      hide/comp/FancyTree.hx
  2. 8 2
      hide/view/FileBrowser.hx

+ 41 - 4
hide/comp/FancyTree.hx

@@ -40,6 +40,10 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 	var currentItem(default, set) : TreeItemData<TreeItem>;
 	var currentVisible(default, set) : Bool = false;
 
+	var gotoFileLastTime : Float = 0.0;
+	var gotoFileCurrentMatch = "";
+
+	static final gotoFileKeyMaxDelay = 0.5;
 	static final overDragOpenDelaySec = 0.5;
 
 	function set_currentVisible(v) {
@@ -145,7 +149,7 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 	/**
 		Called when the selected items in the tree changed
 	**/
-	public dynamic function onSelectionChanged() {
+	public dynamic function onSelectionChanged(enterKey:Bool) {
 	}
 
 	/**
@@ -372,6 +376,31 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 			}
 		}
 
+		if (e.key.length == 1) {
+			var time = haxe.Timer.stamp();
+			if (time - gotoFileLastTime > gotoFileKeyMaxDelay) {
+				gotoFileCurrentMatch = "";
+			}
+
+			gotoFileLastTime = time;
+
+			var lower = e.key.toLowerCase();
+			if (lower != gotoFileCurrentMatch) {
+				gotoFileCurrentMatch += lower;
+			}
+
+			var start = currentItem != null ? flatData.indexOf(currentItem) : 0;
+			if (start < 0)
+				start = 0;
+			for (i in 0 ... flatData.length) {
+				var item = flatData[(start + i + 1) % flatData.length];
+				if (StringTools.startsWith(item.name.toLowerCase(), gotoFileCurrentMatch)) {
+					selectItem(item.item);
+					break;
+				}
+			}
+		}
+
 		var delta = 0;
 		switch (e.key) {
 			case "ArrowUp":
@@ -432,7 +461,7 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 			if (currentItem != null) {
 				setSelection(currentItem, true);
 			}
-			onSelectionChanged();
+			onSelectionChanged(true);
 			return;
 		}
 	}
@@ -625,7 +654,7 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 
 			element.onclick = dataClickHandler.bind(data);
 			element.oncontextmenu = contextMenuHandler.bind(data.item);
-			element.ondblclick = onDoubleClick.bind(data.item);
+			element.ondblclick = doubleClickHander.bind(data);
 
 			data.element = element;
 
@@ -793,6 +822,14 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 		}
 	}
 
+	function doubleClickHander(data: TreeItemData<TreeItem>, event: js.html.MouseEvent) : Void {
+		if (hasChildren(data.item)) {
+			toggleDataOpen(data);
+		} else {
+			onDoubleClick(data.item);
+		}
+	}
+
 	function dataClickHandler(data: TreeItemData<TreeItem>, event: js.html.MouseEvent) : Void {
 		if (!event.ctrlKey) {
 			clearSelection();
@@ -814,7 +851,7 @@ class FancyTree<TreeItem> extends hide.comp.Component {
 
 		if (!(event.shiftKey && !event.ctrlKey) || currentItem == null)
 			currentItem = data;
-		onSelectionChanged();
+		onSelectionChanged(false);
 
 		queueRefresh();
 	}

+ 8 - 2
hide/view/FileBrowser.hx

@@ -404,7 +404,7 @@ class FileBrowser extends hide.ui.View<FileBrowserState> {
 					return '<div class="ico ico-${ext.options.icon}" title="${ext.options.name ?? "Unknown"}"></div>';
 				}
 			}
-			return null;
+			return '<div class="ico ico-file" title="Unknown"></div>';
 		}
 
 		fancyTree.onNameChange = renameHandler;
@@ -574,7 +574,7 @@ class FileBrowser extends hide.ui.View<FileBrowserState> {
 		openDir(root, false);
 
 
-		fancyTree.onSelectionChanged = () -> {
+		fancyTree.onSelectionChanged = (enterKey) -> {
 			var selection = fancyTree.getSelectedItems();
 
 			// Sinc folder view with other filebrowser in SingleMiniature mode
@@ -589,6 +589,12 @@ class FileBrowser extends hide.ui.View<FileBrowserState> {
 					}
 				}
 			}
+
+			if (enterKey) {
+				if (selection[0].kind == File) {
+					ide.openFile(selection[0].getPath());
+				}
+			}
 		}
 
 		generateFilters();