Browse Source

Fixes #844. The SelectionChanged action it's now working correctly.

BDisp 5 years ago
parent
commit
24f0c8e2a8
1 changed files with 40 additions and 22 deletions
  1. 40 22
      Terminal.Gui/Windows/FileDialog.cs

+ 40 - 22
Terminal.Gui/Windows/FileDialog.cs

@@ -117,10 +117,11 @@ namespace Terminal.Gui {
 			switch (me.Flags) {
 			switch (me.Flags) {
 			case MouseFlags.Button1Clicked:
 			case MouseFlags.Button1Clicked:
 				SetSelected (me);
 				SetSelected (me);
-				SelectionChanged ();
+				OnSelectionChanged ();
 				SetNeedsDisplay ();
 				SetNeedsDisplay ();
 				break;
 				break;
 			case MouseFlags.Button1DoubleClicked:
 			case MouseFlags.Button1DoubleClicked:
+				UnMarkAll ();
 				SetSelected (me);
 				SetSelected (me);
 				if (ExecuteSelection ()) {
 				if (ExecuteSelection ()) {
 					host.canceled = false;
 					host.canceled = false;
@@ -167,6 +168,17 @@ namespace Terminal.Gui {
 			return true;
 			return true;
 		}
 		}
 
 
+		private void UnMarkAll ()
+		{
+			if (allowsMultipleSelection && infos.Count > 0) {
+				for (int i = 0; i < infos.Count; i++) {
+					if (infos [i].Item3) {
+						infos [i] = (infos [i].Item1, infos [i].Item2, false);
+					}
+				}
+			}
+		}
+
 		void SetSelected (MouseEvent me)
 		void SetSelected (MouseEvent me)
 		{
 		{
 			lastSelected = selected;
 			lastSelected = selected;
@@ -238,15 +250,17 @@ namespace Terminal.Gui {
 		public Action<ustring> DirectoryChanged { get; set; }
 		public Action<ustring> DirectoryChanged { get; set; }
 		public Action<ustring> FileChanged { get; set; }
 		public Action<ustring> FileChanged { get; set; }
 
 
-		void SelectionChanged ()
+		void OnSelectionChanged ()
 		{
 		{
-			if (FilePaths.Count > 0)
-				FileChanged?.Invoke (string.Join (", ", GetFilesName (FilePaths)));
-			else
-				FileChanged?.Invoke (infos [selected].Item2 && !canChooseDirectories ? "" : Path.GetFileName (infos [selected].Item1));
-			if (SelectedChanged != null) {
+			if (allowsMultipleSelection) {
+				if (FilePaths.Count > 0) {
+					FileChanged?.Invoke (string.Join (", ", GetFilesName (FilePaths)));
+				} else {
+					FileChanged?.Invoke (infos [selected].Item2 && !canChooseDirectories ? "" : Path.GetFileName (infos [selected].Item1));
+				}
+			} else {
 				var sel = infos [selected];
 				var sel = infos [selected];
-				SelectedChanged ((sel.Item1, sel.Item2));
+				SelectedChanged?.Invoke ((sel.Item1, sel.Item2));
 			}
 			}
 		}
 		}
 
 
@@ -285,13 +299,14 @@ namespace Terminal.Gui {
 						top = selected;
 						top = selected;
 					else
 					else
 						top = 0;
 						top = 0;
-					SelectionChanged ();
+					OnSelectionChanged ();
 
 
 					SetNeedsDisplay ();
 					SetNeedsDisplay ();
 				}
 				}
 				return true;
 				return true;
 
 
 			case Key.Enter:
 			case Key.Enter:
+				UnMarkAll ();
 				if (ExecuteSelection ())
 				if (ExecuteSelection ())
 					return false;
 					return false;
 				else
 				else
@@ -304,7 +319,7 @@ namespace Terminal.Gui {
 				if (n != selected) {
 				if (n != selected) {
 					selected = n;
 					selected = n;
 					top = selected;
 					top = selected;
-					SelectionChanged ();
+					OnSelectionChanged ();
 					SetNeedsDisplay ();
 					SetNeedsDisplay ();
 				}
 				}
 				return true;
 				return true;
@@ -329,7 +344,7 @@ namespace Terminal.Gui {
 		{
 		{
 			selected = infos.Count - 1;
 			selected = infos.Count - 1;
 			top = infos.Count () - 1;
 			top = infos.Count () - 1;
-			SelectionChanged ();
+			OnSelectionChanged ();
 			SetNeedsDisplay ();
 			SetNeedsDisplay ();
 		}
 		}
 
 
@@ -337,7 +352,7 @@ namespace Terminal.Gui {
 		{
 		{
 			selected = 0;
 			selected = 0;
 			top = 0;
 			top = 0;
-			SelectionChanged ();
+			OnSelectionChanged ();
 			SetNeedsDisplay ();
 			SetNeedsDisplay ();
 		}
 		}
 
 
@@ -347,7 +362,7 @@ namespace Terminal.Gui {
 				selected++;
 				selected++;
 				if (selected >= top + Frame.Height)
 				if (selected >= top + Frame.Height)
 					top++;
 					top++;
-				SelectionChanged ();
+				OnSelectionChanged ();
 				SetNeedsDisplay ();
 				SetNeedsDisplay ();
 			}
 			}
 		}
 		}
@@ -358,7 +373,7 @@ namespace Terminal.Gui {
 				selected--;
 				selected--;
 				if (selected < top)
 				if (selected < top)
 					top = selected;
 					top = selected;
-				SelectionChanged ();
+				OnSelectionChanged ();
 				SetNeedsDisplay ();
 				SetNeedsDisplay ();
 			}
 			}
 		}
 		}
@@ -375,7 +390,7 @@ namespace Terminal.Gui {
 					Directory = Path.GetFullPath (Path.Combine (Path.GetFullPath (Directory.ToString ()), infos [selected].Item1));
 					Directory = Path.GetFullPath (Path.Combine (Path.GetFullPath (Directory.ToString ()), infos [selected].Item1));
 					DirectoryChanged?.Invoke (Directory);
 					DirectoryChanged?.Invoke (Directory);
 				}
 				}
-			} else {
+			} else if (!isPrompt) {
 				FileChanged?.Invoke (infos [selected].Item1);
 				FileChanged?.Invoke (infos [selected].Item1);
 				if (canChooseFiles) {
 				if (canChooseFiles) {
 					// Ensures that at least one file is selected.
 					// Ensures that at least one file is selected.
@@ -401,7 +416,7 @@ namespace Terminal.Gui {
 						infos [i] = (infos [i].Item1, infos [i].Item2, !infos [i].Item3);
 						infos [i] = (infos [i].Item1, infos [i].Item2, !infos [i].Item3);
 					}
 					}
 				}
 				}
-				SelectionChanged ();
+				OnSelectionChanged ();
 				SetNeedsDisplay ();
 				SetNeedsDisplay ();
 			}
 			}
 		}
 		}
@@ -433,12 +448,15 @@ namespace Terminal.Gui {
 						return null;
 						return null;
 					}
 					}
 					if (infos [selected].Item2) {
 					if (infos [selected].Item2) {
-						if (canChooseDirectories)
-							return new List<string> () { MakePath (infos [selected].Item1) };
+						if (canChooseDirectories) {
+							var sel = infos [selected].Item1;
+							return sel == ".." ? new List<string> () : new List<string> () { MakePath (infos [selected].Item1) };
+						}
 						return Array.Empty<string> ();
 						return Array.Empty<string> ();
 					} else {
 					} else {
-						if (canChooseFiles)
+						if (canChooseFiles) {
 							return new List<string> () { MakePath (infos [selected].Item1) };
 							return new List<string> () { MakePath (infos [selected].Item1) };
+						}
 						return Array.Empty<string> ();
 						return Array.Empty<string> ();
 					}
 					}
 				}
 				}
@@ -510,9 +528,9 @@ namespace Terminal.Gui {
 			};
 			};
 			DirectoryPath = Path.GetFullPath (Environment.CurrentDirectory);
 			DirectoryPath = Path.GetFullPath (Environment.CurrentDirectory);
 			Add (dirListView);
 			Add (dirListView);
-			dirListView.DirectoryChanged = (dir) => dirEntry.Text = dir;
-			dirListView.FileChanged = (file) => nameEntry.Text = file;
-
+			dirListView.DirectoryChanged = (dir) => { nameEntry.Text = ustring.Empty; dirEntry.Text = dir; };
+			dirListView.FileChanged = (file) => nameEntry.Text = file == ".." ? "" : file;
+			dirListView.SelectedChanged = (file) => nameEntry.Text = file.Item1 == ".." ? "" : file.Item1;
 			this.cancel = new Button ("Cancel");
 			this.cancel = new Button ("Cancel");
 			this.cancel.Clicked += () => {
 			this.cancel.Clicked += () => {
 				canceled = true;
 				canceled = true;