Pārlūkot izejas kodu

Added GetAllSelectedObjects

tznind 4 gadi atpakaļ
vecāks
revīzija
c3253e965d
1 mainītis faili ar 36 papildinājumiem un 3 dzēšanām
  1. 36 3
      Terminal.Gui/Views/TreeView.cs

+ 36 - 3
Terminal.Gui/Views/TreeView.cs

@@ -683,7 +683,7 @@ namespace Terminal.Gui {
 				return true;
 			}
 
-			if(me.Flags == MouseFlags.Button1Clicked) {
+			if(me.Flags.HasFlag(MouseFlags.Button1Clicked)) {
 
 				var map = BuildLineMap();
 				
@@ -717,8 +717,22 @@ namespace Terminal.Gui {
 					}
 				}
 				else {
-					// It is a first click somewhere in the current line that doesn't look like an expansion/collapse attempt
-					SelectedObject = clickedBranch.Model;
+
+
+					// The previously selected object
+					var oldBranch = SelectedObject == null ? null : ObjectToBranch(SelectedObject);
+					var oldIdx = oldBranch == null ? -1 : Array.IndexOf(map,oldBranch);
+
+					if(me.Flags.HasFlag(MouseFlags.ButtonShift))
+					{
+						// Expand current selection
+						AdjustSelection(1,true);
+					}
+					else{
+						// It is a first click somewhere in the current line that doesn't look like an expansion/collapse attempt
+						SelectedObject = clickedBranch.Model;
+						_multiSelectedRegions.Clear();
+					}
 				}
 
 				SetNeedsDisplay();
@@ -924,6 +938,25 @@ namespace Terminal.Gui {
 			return SelectedObject == model ||
 				(MultiSelect && _multiSelectedRegions.Any(s=>s.Contains(model)));
 		}
+
+		/// <summary>
+		/// Returns <see cref="SelectedObject"/> (if not null) and all multi selected objects if <see cref="MultiSelect"/> is true
+		/// </summary>
+		/// <returns></returns>
+		public IEnumerable<T> GetAllSelectedObjects()
+		{
+			if(SelectedObject != null)
+				yield return SelectedObject;
+
+			// To determine multi selected objects, start with the line map, that avoids yielding hidden nodes that were selected then the parent collapsed e.g. programmatically or with mouse click
+			if(MultiSelect){
+				foreach(var m in BuildLineMap().Select(b=>b.Model).Where(IsSelected)){
+					if(m != SelectedObject){
+						yield return m;
+					}
+				}	
+			}
+		}
 	}
 
 	class TreeSelection<T> where T : class {