diff --git a/Terminal.Gui/Terminal.Gui.csproj b/Terminal.Gui/Terminal.Gui.csproj
index 21bfa3b9e..8ef9dadbc 100644
--- a/Terminal.Gui/Terminal.Gui.csproj
+++ b/Terminal.Gui/Terminal.Gui.csproj
@@ -109,9 +109,6 @@
Strings.Designer.cs
-
-
-
diff --git a/Terminal.Gui/Views/Scroll/ScrollBar.cs b/Terminal.Gui/Views/Scroll/ScrollBar.cs
deleted file mode 100644
index a4e8942b6..000000000
--- a/Terminal.Gui/Views/Scroll/ScrollBar.cs
+++ /dev/null
@@ -1,344 +0,0 @@
-//#nullable enable
-
-//using System.ComponentModel;
-//using static Unix.Terminal.Delegates;
-
-//namespace Terminal.Gui;
-
-/////
-///// Provides a visual indicator that content can be scrolled. ScrollBars consist of two buttons, one each for scrolling
-///// forward or backwards, a that can be dragged
-///// to scroll continuously. ScrollBars can be oriented either horizontally or vertically and support the user dragging
-///// and clicking with the mouse to scroll.
-/////
-/////
-/////
-//public class ScrollBar : View, IOrientation, IDesignable
-//{
-// private readonly Scroll _scroll;
-// private readonly Button _decreaseButton;
-// private readonly Button _increaseButton;
-
-// ///
-// public ScrollBar ()
-// {
-// CanFocus = false;
-
-// _scroll = new ();
-// _scroll.SliderPositionChanged += ScrollOnSliderPositionChanged;
-// _scroll.ContentPositionChanging += OnScrollOnContentPositionChanging;
-// _scroll.ContentPositionChanged += OnScrollOnContentPositionChanged;
-// _scroll.Scrolled += ScrollOnScrolled;
-// _scroll.SizeChanged += OnScrollOnSizeChanged;
-
-// _decreaseButton = new ()
-// {
-// CanFocus = false,
-// NoDecorations = true,
-// NoPadding = true,
-// ShadowStyle = ShadowStyle.None,
-// WantContinuousButtonPressed = true
-// };
-// _decreaseButton.Accepting += OnDecreaseButtonOnAccept;
-
-// _increaseButton = new ()
-// {
-// CanFocus = false,
-// NoDecorations = true,
-// NoPadding = true,
-// ShadowStyle = ShadowStyle.None,
-// WantContinuousButtonPressed = true
-// };
-// _increaseButton.Accepting += OnIncreaseButtonOnAccept;
-// Add (_decreaseButton, _scroll, _increaseButton);
-
-// _orientationHelper = new (this); // Do not use object initializer!
-// _orientationHelper.Orientation = Orientation.Vertical;
-// _orientationHelper.OrientationChanging += (sender, e) => OrientationChanging?.Invoke (this, e);
-// _orientationHelper.OrientationChanged += (sender, e) => OrientationChanged?.Invoke (this, e);
-
-// // This sets the width/height etc...
-// OnOrientationChanged (Orientation);
-
-// return;
-
-// void OnDecreaseButtonOnAccept (object? s, CommandEventArgs e)
-// {
-// ContentPosition -= Increment;
-// e.Cancel = true;
-// }
-
-// void OnIncreaseButtonOnAccept (object? s, CommandEventArgs e)
-// {
-// ContentPosition += Increment;
-// e.Cancel = true;
-// }
-// }
-
-// #region IOrientation members
-
-// private readonly OrientationHelper _orientationHelper;
-
-// ///
-// public Orientation Orientation
-// {
-// get => _orientationHelper.Orientation;
-// set => _orientationHelper.Orientation = value;
-// }
-
-// ///
-// public event EventHandler>? OrientationChanging;
-
-// ///
-// public event EventHandler>? OrientationChanged;
-
-// ///
-// public void OnOrientationChanged (Orientation newOrientation)
-// {
-// TextDirection = Orientation == Orientation.Vertical ? TextDirection.TopBottom_LeftRight : TextDirection.LeftRight_TopBottom;
-// TextAlignment = Alignment.Center;
-// VerticalTextAlignment = Alignment.Center;
-
-// if (Orientation == Orientation.Vertical)
-// {
-// Width = 1;
-// Height = Dim.Fill ();
-// }
-// else
-// {
-// Width = Dim.Fill ();
-// Height = 1;
-// }
-
-// // Force a layout to ensure _scroll
-// Layout ();
-// _scroll.Orientation = newOrientation;
-// }
-
-// #endregion
-
-// private bool _autoHide = true;
-
-// ///
-// /// Gets or sets whether will be set to if the dimension of the
-// /// scroll bar is greater than or equal to .
-// ///
-// public bool AutoHide
-// {
-// get => _autoHide;
-// set
-// {
-// if (_autoHide != value)
-// {
-// _autoHide = value;
-
-// if (!AutoHide)
-// {
-// Visible = true;
-// }
-
-// SetNeedsLayout ();
-// }
-// }
-// }
-
-// ///
-// protected override void OnFrameChanged (in Rectangle frame)
-// {
-// ShowHide ();
-// if (!_viewportDimension.HasValue)
-// {
-// _scroll.ViewportDimension = (Orientation == Orientation.Vertical ? Frame.Height : Frame.Width) - 2;
-// }
-// }
-
-// private void ShowHide ()
-// {
-// if (!AutoHide || !IsInitialized)
-// {
-// return;
-// }
-
-// if (Orientation == Orientation.Vertical)
-// {
-// Visible = Frame.Height < Size;
-// }
-// else
-// {
-// Visible = Frame.Width < Size;
-// }
-// }
-
-// ///
-// /// Gets or sets whether the Scroll will show the percentage the slider
-// /// takes up within the .
-// ///
-// public bool ShowPercent
-// {
-// get => _scroll.ShowPercent;
-// set => _scroll.ShowPercent = value;
-// }
-
-
-// /// Get or sets if the view-port is kept in all visible area of this .
-// public bool KeepContentInAllViewport
-// {
-// //get => _scroll.KeepContentInAllViewport;
-// //set => _scroll.KeepContentInAllViewport = value;
-// get;
-// set;
-// }
-
-// /// Gets or sets the position of the slider within the ScrollBar's Viewport.
-// /// The position.
-// public int GetSliderPosition () => _scroll.GetSliderPosition ();
-
-// private void ScrollOnSliderPositionChanged (object? sender, EventArgs e) { SliderPositionChanged?.Invoke (this, e); }
-
-// /// Raised when the position of the slider has changed.
-// public event EventHandler>? SliderPositionChanged;
-
-// private void ScrollOnScrolled (object? sender, EventArgs e) { Scrolled?.Invoke (this, e); }
-
-// /// Raised when the position of the slider has changed.
-// public event EventHandler>? Scrolled;
-
-// ///
-// /// Gets or sets the size of the Scroll. This is the total size of the content that can be scrolled through.
-// ///
-// public int Size
-// {
-// get => _scroll.Size;
-// set => _scroll.Size = value;
-// }
-
-// private int? _viewportDimension;
-
-// ///
-// /// Gets or sets the size of the viewport into the content being scrolled, bounded by .
-// ///
-// ///
-// /// If not explicitly set, will be the appropriate dimension of the Scroll's Frame.
-// ///
-// public int ViewportDimension
-// {
-// get
-// {
-// if (_viewportDimension.HasValue)
-// {
-// return _viewportDimension.Value;
-// }
-// return Orientation == Orientation.Vertical ? Frame.Height : Frame.Width;
-
-// }
-// set
-// {
-// _scroll.ViewportDimension = value - 2;
-// _viewportDimension = value;
-// }
-// }
-
-// ///
-// /// Gets or sets the position of the ScrollSlider within the range of 0....
-// ///
-// public int ContentPosition
-// {
-// get => _scroll.ContentPosition;
-// set => _scroll.ContentPosition = value;
-// }
-
-// private void OnScrollOnContentPositionChanging (object? sender, CancelEventArgs e) { ContentPositionChanging?.Invoke (this, e); }
-// private void OnScrollOnContentPositionChanged (object? sender, EventArgs e) { ContentPositionChanged?.Invoke (this, e); }
-
-// ///
-// /// Raised when the is changing. Set to
-// /// to prevent the position from being changed.
-// ///
-// public event EventHandler>? ContentPositionChanging;
-
-// /// Raised when the has changed.
-// public event EventHandler>? ContentPositionChanged;
-
-// /// Raised when has changed.
-// public event EventHandler>? SizeChanged;
-
-// private void OnScrollOnSizeChanged (object? sender, EventArgs e)
-// {
-// ShowHide ();
-// SizeChanged?.Invoke (this, e);
-// }
-
-// ///
-// /// Gets or sets the amount each click of the increment/decrement buttons and each
-// /// mouse wheel event will incremenet/decrement the .
-// ///
-// ///
-// /// The default is 1.
-// ///
-// public int Increment { get => _scroll.Increment; set => _scroll.Increment = value; }
-
-// ///
-// protected override void OnSubviewLayout (LayoutEventArgs args) { PositionSubviews (); }
-
-// private void PositionSubviews ()
-// {
-// if (Orientation == Orientation.Vertical)
-// {
-// _decreaseButton.Y = 0;
-// _decreaseButton.X = 0;
-// _decreaseButton.Width = Dim.Fill ();
-// _decreaseButton.Height = 1;
-// _decreaseButton.Title = Glyphs.UpArrow.ToString ();
-// _increaseButton.Y = Pos.Bottom (_scroll);
-// _increaseButton.X = 0;
-// _increaseButton.Width = Dim.Fill ();
-// _increaseButton.Height = 1;
-// _increaseButton.Title = Glyphs.DownArrow.ToString ();
-// _scroll.X = 0;
-// _scroll.Y = Pos.Bottom (_decreaseButton);
-// _scroll.Height = Dim.Fill (1);
-// _scroll.Width = Dim.Fill ();
-// }
-// else
-// {
-// _decreaseButton.Y = 0;
-// _decreaseButton.X = 0;
-// _decreaseButton.Width = 1;
-// _decreaseButton.Height = Dim.Fill ();
-// _decreaseButton.Title = Glyphs.LeftArrow.ToString ();
-// _increaseButton.Y = 0;
-// _increaseButton.X = Pos.Right (_scroll);
-// _increaseButton.Width = 1;
-// _increaseButton.Height = Dim.Fill ();
-// _increaseButton.Title = Glyphs.RightArrow.ToString ();
-// _scroll.Y = 0;
-// _scroll.X = Pos.Right (_decreaseButton);
-// _scroll.Width = Dim.Fill (1);
-// _scroll.Height = Dim.Fill ();
-// }
-// }
-
-// ///
-// public bool EnableForDesign ()
-// {
-// OrientationChanged += (sender, args) =>
-// {
-// if (args.CurrentValue == Orientation.Vertical)
-// {
-// Width = 1;
-// Height = Dim.Fill ();
-// }
-// else
-// {
-// Width = Dim.Fill ();
-// Height = 1;
-// }
-// };
-
-// Width = 1;
-// Height = Dim.Fill ();
-// Size = 200;
-// //ShowPercent = true;
-// return true;
-// }
-//}
diff --git a/Terminal.Gui/Views/Scroll/Scroll.cs b/Terminal.Gui/Views/ScrollBar/ScrollBar.cs
similarity index 99%
rename from Terminal.Gui/Views/Scroll/Scroll.cs
rename to Terminal.Gui/Views/ScrollBar/ScrollBar.cs
index a1abb8c16..29736f134 100644
--- a/Terminal.Gui/Views/Scroll/Scroll.cs
+++ b/Terminal.Gui/Views/ScrollBar/ScrollBar.cs
@@ -121,7 +121,9 @@ public class ScrollBar : View, IOrientation, IDesignable
{
return 1;
}
- return (int)Math.Clamp (Math.Floor ((double)ViewportDimension / Size * (Viewport.Height - 2)), 1, ViewportDimension);
+
+ int viewport = Orientation == Orientation.Vertical ? Viewport.Height : Viewport.Width;
+ return (int)Math.Clamp (Math.Floor ((double)ViewportDimension / Size * (viewport - 2)), 1, ViewportDimension);
}
private void PositionSubviews ()
diff --git a/Terminal.Gui/Views/Scroll/ScrollSlider.cs b/Terminal.Gui/Views/ScrollBar/ScrollSlider.cs
similarity index 91%
rename from Terminal.Gui/Views/Scroll/ScrollSlider.cs
rename to Terminal.Gui/Views/ScrollBar/ScrollSlider.cs
index b83a02eb9..16aab2ee2 100644
--- a/Terminal.Gui/Views/Scroll/ScrollSlider.cs
+++ b/Terminal.Gui/Views/ScrollBar/ScrollSlider.cs
@@ -1,12 +1,12 @@
#nullable enable
using System.ComponentModel;
-using System.Diagnostics;
namespace Terminal.Gui;
///
-/// The ScrollSlider can be dragged with the mouse, constrained by the size of the Viewport of it's superview. The ScrollSlider can be
+/// The ScrollSlider can be dragged with the mouse, constrained by the size of the Viewport of it's superview. The
+/// ScrollSlider can be
/// oriented either vertically or horizontally.
///
///
@@ -16,7 +16,7 @@ namespace Terminal.Gui;
/// be show what percent the slider is to the Superview's Viewport size.
///
///
-/// Used to represent the proportion of the visible content to the Viewport in a .
+/// Used to represent the proportion of the visible content to the Viewport in a .
///
///
public class ScrollSlider : View, IOrientation, IDesignable
@@ -42,6 +42,7 @@ public class ScrollSlider : View, IOrientation, IDesignable
}
#region IOrientation members
+
private readonly OrientationHelper _orientationHelper;
///
@@ -109,13 +110,16 @@ public class ScrollSlider : View, IOrientation, IDesignable
}
///
- /// Gets or sets the size of the ScrollSlider. This is a helper that simply gets or sets the Width or Height depending on the
- /// . The size will be constrained such that the ScrollSlider will not go outside the Viewport of
+ /// Gets or sets the size of the ScrollSlider. This is a helper that simply gets or sets the Width or Height depending
+ /// on the
+ /// . The size will be constrained such that the ScrollSlider will not go outside the Viewport
+ /// of
/// the . The size will never be less than 1.
///
///
///
- /// The dimension of the ScrollSlider that is perpendicular to the will be set to
+ /// The dimension of the ScrollSlider that is perpendicular to the will be set to
+ ///
///
///
public int Size
@@ -126,10 +130,8 @@ public class ScrollSlider : View, IOrientation, IDesignable
{
return Viewport.Height - ShrinkBy / 2;
}
- else
- {
- return Viewport.Width - ShrinkBy / 2;
- }
+
+ return Viewport.Width - ShrinkBy / 2;
}
set
{
@@ -149,6 +151,7 @@ public class ScrollSlider : View, IOrientation, IDesignable
}
private int? _viewportDimension;
+
///
/// Gets the size of the viewport into the content being scrolled, bounded by .
///
@@ -163,6 +166,7 @@ public class ScrollSlider : View, IOrientation, IDesignable
{
return _viewportDimension.Value;
}
+
return Orientation == Orientation.Vertical ? SuperView?.Viewport.Height ?? 0 : SuperView?.Viewport.Width ?? 0;
}
set => _viewportDimension = value;
@@ -170,7 +174,6 @@ public class ScrollSlider : View, IOrientation, IDesignable
private void OnFrameChanged (object? sender, EventArgs e)
{
-
Position = (Orientation == Orientation.Vertical ? e.CurrentValue.Y : e.CurrentValue.X) - ShrinkBy / 2;
}
@@ -225,10 +228,8 @@ public class ScrollSlider : View, IOrientation, IDesignable
{
return Math.Clamp (newPosittion, 0, Math.Max (0, ViewportDimension - Viewport.Height));
}
- else
- {
- return Math.Clamp (newPosittion, 0, Math.Max (0, ViewportDimension - Viewport.Width));
- }
+
+ return Math.Clamp (newPosittion, 0, Math.Max (0, ViewportDimension - Viewport.Width));
}
private void RaisePositionChangeEvents (int newPosition)
@@ -255,7 +256,7 @@ public class ScrollSlider : View, IOrientation, IDesignable
OnScrolled (distance);
Scrolled?.Invoke (this, new (in distance));
- RaiseSelecting (new CommandContext (Command.Select, null, null, distance));
+ RaiseSelecting (new (Command.Select, null, null, distance));
}
///
@@ -275,7 +276,6 @@ public class ScrollSlider : View, IOrientation, IDesignable
/// Raised when the has changed.
public event EventHandler>? PositionChanged;
-
/// Called when has changed. Indicates how much to scroll.
protected virtual void OnScrolled (int distance) { }
@@ -349,10 +349,10 @@ public class ScrollSlider : View, IOrientation, IDesignable
if (Orientation == Orientation.Vertical)
{
Y = Frame.Y + offset < ShrinkBy / 2
- ? ShrinkBy / 2
- : Frame.Y + offset + Frame.Height > superViewDimension
- ? Math.Max (superViewDimension - Frame.Height + ShrinkBy, 1)
- : Frame.Y + offset;
+ ? ShrinkBy / 2
+ : Frame.Y + offset + Frame.Height > superViewDimension
+ ? Math.Max (superViewDimension - Frame.Height + ShrinkBy, 1)
+ : Frame.Y + offset;
}
else
{
@@ -372,13 +372,14 @@ public class ScrollSlider : View, IOrientation, IDesignable
Application.UngrabMouse ();
}
}
+
return true;
}
- return false;
+ return false;
}
- ///
+ ///
public bool EnableForDesign ()
{
OrientationChanged += (sender, args) =>
diff --git a/UICatalog/Scenarios/ScrollDemo.cs b/UICatalog/Scenarios/ScrollDemo.cs
deleted file mode 100644
index 3bff27837..000000000
--- a/UICatalog/Scenarios/ScrollDemo.cs
+++ /dev/null
@@ -1,369 +0,0 @@
-//using System;
-//using System.Collections.ObjectModel;
-//using System.Linq;
-//using Terminal.Gui;
-
-//namespace UICatalog.Scenarios;
-
-//[ScenarioMetadata ("Scroll Demo", "Demonstrates Scroll.")]
-//[ScenarioCategory ("Scrolling")]
-//public class ScrollDemo : Scenario
-//{
-// public override void Main ()
-// {
-// Application.Init ();
-
-// Window app = new ()
-// {
-// Title = $"{Application.QuitKey} to Quit - Scenario: {GetName ()}",
-// Arrangement = ViewArrangement.Fixed
-// };
-
-// var demoFrame = new FrameView ()
-// {
-// Title = "Demo View",
-// X = 0,
-// Width = 75,
-// Height = 25 + 4,
-// ColorScheme = Colors.ColorSchemes ["Base"],
-// Arrangement = ViewArrangement.Resizable
-// };
-// demoFrame.Padding.Thickness = new (1);
-// demoFrame.Padding.Diagnostics = ViewDiagnosticFlags.Ruler;
-
-// app.Add (demoFrame);
-
-// var scroll = new Scroll
-// {
-// X = Pos.AnchorEnd () - 5,
-// Size = 1000,
-// };
-// demoFrame.Add (scroll);
-
-// ListView controlledList = new ()
-// {
-// X = Pos.AnchorEnd (),
-// Width = 5,
-// Height = Dim.Fill (),
-// ColorScheme = Colors.ColorSchemes ["Error"],
-// };
-// demoFrame.Add (controlledList);
-
-// // populate the list box with Size items of the form "{n:00000}"
-// controlledList.SetSource (new ObservableCollection (Enumerable.Range (0, scroll.Size).Select (n => $"{n:00000}")));
-
-// int GetMaxLabelWidth (int groupId)
-// {
-// return demoFrame.Subviews.Max (
-// v =>
-// {
-// if (v.Y.Has (out var pos) && pos.GroupId == groupId)
-// {
-// return v.Text.GetColumns ();
-// }
-
-// return 0;
-// });
-// }
-
-// var lblWidthHeight = new Label
-// {
-// Text = "_Width/Height:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, AlignmentModes.StartToEnd, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-// };
-// demoFrame.Add (lblWidthHeight);
-
-// NumericUpDown scrollWidthHeight = new ()
-// {
-// Value = scroll.Frame.Width,
-// X = Pos.Right (lblWidthHeight) + 1,
-// Y = Pos.Top (lblWidthHeight)
-// };
-// demoFrame.Add (scrollWidthHeight);
-
-// scrollWidthHeight.ValueChanging += (s, e) =>
-// {
-// if (e.NewValue < 1
-// || (e.NewValue
-// > (scroll.Orientation == Orientation.Vertical
-// ? scroll.SuperView?.GetContentSize ().Width
-// : scroll.SuperView?.GetContentSize ().Height)))
-// {
-// // TODO: This must be handled in the ScrollSlider if Width and Height being virtual
-// e.Cancel = true;
-
-// return;
-// }
-
-// if (scroll.Orientation == Orientation.Vertical)
-// {
-// scroll.Width = e.NewValue;
-// }
-// else
-// {
-// scroll.Height = e.NewValue;
-// }
-// };
-
-
-// var lblOrientationabel = new Label
-// {
-// Text = "_Orientation:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-// };
-// demoFrame.Add (lblOrientationabel);
-
-// var rgOrientation = new RadioGroup
-// {
-// X = Pos.Right (lblOrientationabel) + 1,
-// Y = Pos.Top (lblOrientationabel),
-// RadioLabels = ["Vertical", "Horizontal"],
-// Orientation = Orientation.Horizontal
-// };
-// demoFrame.Add (rgOrientation);
-
-// rgOrientation.SelectedItemChanged += (s, e) =>
-// {
-// if (e.SelectedItem == e.PreviousSelectedItem)
-// {
-// return;
-// }
-
-// if (rgOrientation.SelectedItem == 0)
-// {
-// scroll.Orientation = Orientation.Vertical;
-// scroll.X = Pos.AnchorEnd ();
-// scroll.Y = 0;
-// scrollWidthHeight.Value = Math.Min (scrollWidthHeight.Value, scroll.SuperView.GetContentSize ().Width);
-// scroll.Width = scrollWidthHeight.Value;
-// controlledList.Visible = true;
-// }
-// else
-// {
-// scroll.Orientation = Orientation.Horizontal;
-// scroll.X = 0;
-// scroll.Y = Pos.AnchorEnd ();
-// scrollWidthHeight.Value = Math.Min (scrollWidthHeight.Value, scroll.SuperView.GetContentSize ().Height);
-// scroll.Height = scrollWidthHeight.Value;
-// controlledList.Visible = false;
-// }
-// };
-
-// var lblSize = new Label
-// {
-// Text = "_Size:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-// };
-// demoFrame.Add (lblSize);
-
-// NumericUpDown scrollSize = new ()
-// {
-// Value = scroll.Size,
-// X = Pos.Right (lblSize) + 1,
-// Y = Pos.Top (lblSize)
-// };
-// demoFrame.Add (scrollSize);
-
-// scrollSize.ValueChanging += (s, e) =>
-// {
-// if (e.NewValue < 0)
-// {
-// e.Cancel = true;
-
-// return;
-// }
-
-// if (scroll.Size != e.NewValue)
-// {
-// scroll.Size = e.NewValue;
-// }
-// };
-
-// var lblSliderPosition = new Label
-// {
-// Text = "_SliderPosition:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-
-// };
-// demoFrame.Add (lblSliderPosition);
-// Label scrollSliderPosition = new ()
-// {
-// X = Pos.Right (lblSliderPosition) + 1,
-// Y = Pos.Top (lblSliderPosition)
-// };
-// demoFrame.Add (scrollSliderPosition);
-
-// var lblScrolled = new Label
-// {
-// Text = "_Scrolled:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-
-// };
-// demoFrame.Add (lblScrolled);
-// Label scrolled = new ()
-// {
-// X = Pos.Right (lblScrolled) + 1,
-// Y = Pos.Top (lblScrolled)
-// };
-// demoFrame.Add (scrolled);
-
-// var lblContentPosition = new Label
-// {
-// Text = "_ContentPosition:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-
-// };
-// demoFrame.Add (lblContentPosition);
-
-// NumericUpDown scrollContentPosition = new ()
-// {
-// Value = scroll.GetSliderPosition (),
-// X = Pos.Right (lblContentPosition) + 1,
-// Y = Pos.Top (lblContentPosition)
-// };
-// demoFrame.Add (scrollContentPosition);
-
-// scrollContentPosition.ValueChanging += (s, e) =>
-// {
-// if (e.NewValue < 0)
-// {
-// e.Cancel = true;
-
-// return;
-// }
-
-// if (scroll.ContentPosition != e.NewValue)
-// {
-// scroll.ContentPosition = e.NewValue;
-// }
-
-// if (scroll.ContentPosition != e.NewValue)
-// {
-// e.Cancel = true;
-// }
-// };
-
-// var lblOptions = new Label
-// {
-// Text = "_Options:",
-// TextAlignment = Alignment.End,
-// Y = Pos.Align (Alignment.Start, groupId: 1),
-// Width = Dim.Func (() => GetMaxLabelWidth (1))
-// };
-// demoFrame.Add (lblOptions);
-
-// var ckbShowPercent = new CheckBox
-// {
-// Y = Pos.Top (lblOptions),
-// X = Pos.Right (lblOptions) + 1,
-// Text = "Sho_wPercent",
-// CheckedState = scroll.ShowPercent ? CheckState.Checked : CheckState.UnChecked
-// };
-// ckbShowPercent.CheckedStateChanging += (s, e) => scroll.ShowPercent = e.NewValue == CheckState.Checked;
-// demoFrame.Add (ckbShowPercent);
-
-// //var ckbKeepContentInAllViewport = new CheckBox
-// //{
-// // X = Pos.Right (ckbShowScrollIndicator) + 1, Y = Pos.Bottom (scrollPosition), Text = "KeepContentInAllViewport",
-// // CheckedState = Scroll.KeepContentInAllViewport ? CheckState.Checked : CheckState.UnChecked
-// //};
-// //ckbKeepContentInAllViewport.CheckedStateChanging += (s, e) => Scroll.KeepContentInAllViewport = e.NewValue == CheckState.Checked;
-// //view.Add (ckbKeepContentInAllViewport);
-
-// var lblScrollFrame = new Label
-// {
-// Y = Pos.Bottom (lblOptions) + 1
-// };
-// demoFrame.Add (lblScrollFrame);
-
-// var lblScrollViewport = new Label
-// {
-// Y = Pos.Bottom (lblScrollFrame)
-// };
-// demoFrame.Add (lblScrollViewport);
-
-// var lblScrollContentSize = new Label
-// {
-// Y = Pos.Bottom (lblScrollViewport)
-// };
-// demoFrame.Add (lblScrollContentSize);
-
-// scroll.SubviewsLaidOut += (s, e) =>
-// {
-// lblScrollFrame.Text = $"Scroll Frame: {scroll.Frame.ToString ()}";
-// lblScrollViewport.Text = $"Scroll Viewport: {scroll.Viewport.ToString ()}";
-// lblScrollContentSize.Text = $"Scroll ContentSize: {scroll.GetContentSize ().ToString ()}";
-// };
-
-// EventLog eventLog = new ()
-// {
-// X = Pos.AnchorEnd (),
-// Y = 0,
-// Height = Dim.Fill (),
-// BorderStyle = LineStyle.Single,
-// ViewToLog = scroll
-// };
-// app.Add (eventLog);
-
-// app.Initialized += AppOnInitialized;
-
-
-// void AppOnInitialized (object sender, EventArgs e)
-// {
-// scroll.SizeChanged += (s, e) =>
-// {
-// eventLog.Log ($"SizeChanged: {e.CurrentValue}");
-
-// if (scrollSize.Value != e.CurrentValue)
-// {
-// scrollSize.Value = e.CurrentValue;
-// }
-// };
-
-// scroll.SliderPositionChanged += (s, e) =>
-// {
-// eventLog.Log ($"SliderPositionChanged: {e.CurrentValue}");
-// eventLog.Log ($" ContentPosition: {scroll.ContentPosition}");
-// scrollSliderPosition.Text = e.CurrentValue.ToString ();
-// };
-
-// scroll.Scrolled += (s, e) =>
-// {
-// eventLog.Log ($"Scrolled: {e.CurrentValue}");
-// eventLog.Log ($" SliderPosition: {scroll.GetSliderPosition ()}");
-// scrolled.Text = e.CurrentValue.ToString ();
-// };
-
-// scroll.ContentPositionChanged += (s, e) =>
-// {
-// eventLog.Log ($"ContentPositionChanged: {e.CurrentValue}");
-// scrollContentPosition.Value = e.CurrentValue;
-// controlledList.Viewport = controlledList.Viewport with { Y = e.CurrentValue };
-// };
-
-
-// controlledList.ViewportChanged += (s, e) =>
-// {
-// eventLog.Log ($"ViewportChanged: {e.NewViewport.Y}");
-// scroll.ContentPosition = e.NewViewport.Y;
-// };
-
-// }
-
-// Application.Run (app);
-// app.Dispose ();
-// Application.Shutdown ();
-// }
-//}
diff --git a/UnitTests/Views/ScrollBarTests.cs b/UnitTests/Views/ScrollBarTests.cs
index 2ad07c284..eadb6780a 100644
--- a/UnitTests/Views/ScrollBarTests.cs
+++ b/UnitTests/Views/ScrollBarTests.cs
@@ -179,6 +179,31 @@ public class ScrollBarTests
[Theory]
[SetupFakeDriver]
+
+ #region Vertical
+
+ #region Super 10 - ScrollBar 8
+ [InlineData (
+ 10,
+ 1,
+ 10,
+ -1,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄████████►│
+└──────────┘")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ -1,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄████░░░░►│
+└──────────┘")]
[InlineData (
10,
1,
@@ -187,69 +212,462 @@ public class ScrollBarTests
Orientation.Horizontal,
@"
┌──────────┐
-│◄███░░░░░►│
+│◄████░░░░►│
└──────────┘")]
[InlineData (
10,
- 3,
+ 1,
20,
1,
Orientation.Horizontal,
@"
┌──────────┐
-│ ░███░░░░ │
-│◄░███░░░░►│
-│ ░███░░░░ │
+│◄████░░░░►│
└──────────┘")]
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 2,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░████░░░►│
+└──────────┘
+")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 3,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░████░░░►│
+└──────────┘
+")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 4,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░████░░►│
+└──────────┘
+")]
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 5,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░████░░►│
+└──────────┘
+")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 6,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░████░►│
+└──────────┘
+")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 7,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░████░►│
+└──────────┘
+")]
+
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 8,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░░████►│
+└──────────┘
+")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 9,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░░████►│
+└──────────┘
+")]
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 10,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░░████►│
+└──────────┘
+")]
+
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 19,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░░████►│
+└──────────┘
+")]
+
+
+ [InlineData (
+ 10,
+ 1,
+ 20,
+ 20,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│◄░░░░████►│
+└──────────┘
+")]
+ #endregion Super 10 - ScrollBar 8
+
+ #region Super 12 - ScrollBar 10
+ [InlineData (
+ 12,
+ 1,
+ 10,
+ -1,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄██████████►│
+└────────────┘")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ -1,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄██████░░░░►│
+└────────────┘")]
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 0,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄██████░░░░►│
+└────────────┘")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 1,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄██████░░░░►│
+└────────────┘")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 2,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░██████░░░►│
+└────────────┘
+")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 3,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░██████░░░►│
+└────────────┘
+")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 4,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░██████░░►│
+└────────────┘
+")]
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 5,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░██████░►│
+└────────────┘
+")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 6,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░██████░►│
+└────────────┘
+")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 7,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░░██████►│
+└────────────┘
+")]
+
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 8,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░░██████►│
+└────────────┘
+")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 9,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░░██████►│
+└────────────┘
+")]
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 10,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░░██████►│
+└────────────┘
+")]
+
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 19,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░░██████►│
+└────────────┘
+")]
+
+
+ [InlineData (
+ 12,
+ 1,
+ 20,
+ 20,
+ Orientation.Horizontal,
+ @"
+┌────────────┐
+│◄░░░░██████►│
+└────────────┘
+")]
+ #endregion Super 12 - ScrollBar 10
+ [InlineData (
+ 10,
+ 3,
+ 20,
+ 2,
+ Orientation.Horizontal,
+ @"
+┌──────────┐
+│ ░████░░░ │
+│◄░████░░░►│
+│ ░████░░░ │
+└──────────┘
+")]
+ #endregion Vertical
+
+ #region Horizontal
+
+ [InlineData (
+ 1,
+ 10,
+ 10,
+ -1,
+ Orientation.Vertical,
+ @"
+┌─┐
+│▲│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│▼│
+└─┘")]
+
+ [InlineData (
+ 1,
+ 10,
+ 10,
+ 5,
+ Orientation.Vertical,
+ @"
+┌─┐
+│▲│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│▼│
+└─┘")]
+
+ [InlineData (
+ 1,
+ 10,
+ 20,
+ 5,
+ Orientation.Vertical,
+ @"
+┌─┐
+│▲│
+│░│
+│░│
+│█│
+│█│
+│█│
+│█│
+│░│
+│░│
+│▼│
+└─┘")]
+
+ [InlineData (
+ 1,
+ 12,
+ 20,
+ 5,
+ Orientation.Vertical,
+ @"
+┌─┐
+│▲│
+│░│
+│░│
+│░│
+│█│
+│█│
+│█│
+│█│
+│█│
+│█│
+│░│
+│▼│
+└─┘")]
+
[InlineData (
3,
10,
20,
- 0,
+ 2,
Orientation.Vertical,
@"
┌───┐
│ ▲ │
-│███│
-│███│
-│███│
-│░░░│
│░░░│
+│███│
+│███│
+│███│
+│███│
│░░░│
│░░░│
│░░░│
│ ▼ │
-└───┘")]
- [InlineData (
- 6,
- 10,
- 20,
- 1,
- Orientation.Vertical,
- @"
-┌──────┐
-│ ▲ │
-│░░░░░░│
-│██████│
-│██████│
-│██████│
-│░░░░░░│
-│░░░░░░│
-│░░░░░░│
-│░░░░░░│
-│ ▼ │
-└──────┘")]
+└───┘
+")]
+ #endregion
- public void Draws_Correctly (int superViewportWidth, int superViewportHeight, int sliderSize, int sliderPosition, Orientation orientation, string expected)
+ public void Draws_Correctly (int superWidth, int superHeight, int contentSize, int contentPosition, Orientation orientation, string expected)
{
var super = new Window
{
Id = "super",
- Width = superViewportWidth + 2,
- Height = superViewportHeight + 2
+ Width = superWidth + 2,
+ Height = superHeight + 2
};
var scrollBar = new ScrollBar
@@ -267,9 +685,9 @@ public class ScrollBarTests
}
super.Add (scrollBar);
- scrollBar.Size = sliderSize;
+ scrollBar.Size = contentSize;
scrollBar.Layout ();
- scrollBar.ContentPosition = sliderPosition;
+ scrollBar.ContentPosition = contentPosition;
super.BeginInit ();
super.EndInit ();
@@ -374,4 +792,54 @@ public class ScrollBarTests
Application.ResetState (true);
}
+
+ [Theory]
+ [InlineData (1, 10, 0, 0)]
+ [InlineData (1, 10, 5, 0)]
+ [InlineData (1, 10, 10, 1)]
+ [InlineData (1, 20, 0, 0)]
+ [InlineData (1, 20, 10, 0)]
+ [InlineData (1, 20, 20, 1)]
+ [InlineData (2, 10, 0, 0)]
+ [InlineData (2, 10, 5, 1)]
+ [InlineData (2, 10, 10, 2)]
+ [InlineData (2, 20, 0, 0)]
+ [InlineData (2, 20, 10, 1)]
+ [InlineData (2, 20, 20, 2)]
+ [InlineData (3, 10, 0, 0)]
+ [InlineData (3, 10, 5, 1)]
+ [InlineData (3, 10, 10, 3)]
+ [InlineData (3, 20, 0, 0)]
+ [InlineData (3, 20, 10, 1)]
+ [InlineData (3, 20, 20, 3)]
+ [InlineData (4, 10, 0, 0)]
+ [InlineData (4, 10, 5, 2)]
+ [InlineData (4, 10, 10, 4)]
+ [InlineData (4, 20, 0, 0)]
+ [InlineData (4, 20, 10, 2)]
+ [InlineData (4, 20, 20, 4)]
+ [InlineData (5, 10, 0, 0)]
+ [InlineData (5, 10, 5, 2)]
+ [InlineData (5, 10, 10, 5)]
+ [InlineData (5, 20, 0, 0)]
+ [InlineData (5, 20, 10, 2)]
+ [InlineData (5, 20, 20, 5)]
+ public void ScrollBar_CombinatorialTests (int width, int size, int contentPosition, int expectedSliderPosition)
+ {
+ // Arrange
+ var scrollBar = new ScrollBar
+ {
+ Width = width,
+ Size = size,
+ ContentPosition = contentPosition
+ };
+ scrollBar.Layout ();
+
+ // Act
+ var sliderPosition = scrollBar.GetSliderPosition ();
+
+ // Assert
+ Assert.Equal (expectedSliderPosition, sliderPosition);
+ }
+
}
diff --git a/UnitTests/Views/ScrollTests.cs b/UnitTests/Views/ScrollTests.cs
deleted file mode 100644
index 5e1c1f8d2..000000000
--- a/UnitTests/Views/ScrollTests.cs
+++ /dev/null
@@ -1,597 +0,0 @@
-//using Microsoft.VisualStudio.TestPlatform.Utilities;
-//using Xunit.Abstractions;
-
-//namespace Terminal.Gui.ViewsTests;
-
-//public class ScrollTests
-//{
-// public ScrollTests (ITestOutputHelper output) { _output = output; }
-// private readonly ITestOutputHelper _output;
-
-
-// [Fact]
-// public void OnOrientationChanged_Keeps_Size ()
-// {
-// var scroll = new Scroll ();
-// scroll.Layout ();
-// scroll.Size = 1;
-
-// scroll.Orientation = Orientation.Horizontal;
-// Assert.Equal (1, scroll.Size);
-// }
-
-// [Fact]
-// public void OnOrientationChanged_Sets_ContentPosition_To_0 ()
-// {
-// View super = new View ()
-// {
-// Id = "super",
-// Width = 10,
-// Height = 10
-// };
-// var scroll = new Scroll ()
-// {
-// };
-// super.Add (scroll);
-// scroll.Layout ();
-// scroll.ContentPosition = 1;
-// scroll.Orientation = Orientation.Horizontal;
-
-// Assert.Equal (0, scroll.ContentPosition);
-// }
-
-
-// // [Theory]
-// // [AutoInitShutdown]
-// // [InlineData (
-// // 20,
-// // @"
-// //█
-// //█
-// //█
-// //█
-// //█
-// //░
-// //░
-// //░
-// //░
-// //░",
-// // @"
-// //░
-// //░
-// //█
-// //█
-// //█
-// //█
-// //█
-// //░
-// //░
-// //░",
-// // @"
-// //░
-// //░
-// //░
-// //░
-// //░
-// //█
-// //█
-// //█
-// //█
-// //█",
-// // @"
-// //░
-// //░
-// //█
-// //█
-// //█
-// //░
-// //░
-// //░
-// //░
-// //░",
-// // @"
-// //█████░░░░░",
-// // @"
-// //░░█████░░░",
-// // @"
-// //░░░░░█████",
-// // @"
-// //░░███░░░░░")]
-// // [InlineData (
-// // 40,
-// // @"
-// //█
-// //█
-// //█
-// //░
-// //░
-// //░
-// //░
-// //░
-// //░
-// //░",
-// // @"
-// //░
-// //█
-// //█
-// //█
-// //░
-// //░
-// //░
-// //░
-// //░
-// //░",
-// // @"
-// //░
-// //░
-// //█
-// //█
-// //█
-// //░
-// //░
-// //░
-// //░
-// //░",
-// // @"
-// //░
-// //█
-// //█
-// //░
-// //░
-// //░
-// //░
-// //░
-// //░
-// //░",
-// // @"
-// //███░░░░░░░",
-// // @"
-// //░███░░░░░░",
-// // @"
-// //░░███░░░░░",
-// // @"
-// //░██░░░░░░░")]
-// // public void Changing_Position_Size_Orientation_Draws_Correctly_KeepContentInAllViewport_True (
-// // int size,
-// // string firstVertExpected,
-// // string middleVertExpected,
-// // string endVertExpected,
-// // string sizeVertExpected,
-// // string firstHoriExpected,
-// // string middleHoriExpected,
-// // string endHoriExpected,
-// // string sizeHoriExpected
-// // )
-// // {
-// // var scroll = new Scroll
-// // {
-// // Orientation = Orientation.Vertical,
-// // Size = size,
-// // Height = 10,
-// // KeepContentInAllViewport = true
-// // };
-// // var top = new Toplevel ();
-// // top.Add (scroll);
-// // RunState rs = Application.Begin (top);
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (firstVertExpected, _output);
-
-// // scroll.Position = 4;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (middleVertExpected, _output);
-
-// // scroll.Position = 10;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (endVertExpected, _output);
-
-// // scroll.Size = size * 2;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (sizeVertExpected, _output);
-
-// // scroll.Orientation = Orientation.Horizontal;
-// // scroll.Width = 10;
-// // scroll.Height = 1;
-// // scroll.Position = 0;
-// // scroll.Size = size;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (firstHoriExpected, _output);
-
-// // scroll.Position = 4;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (middleHoriExpected, _output);
-
-// // scroll.Position = 10;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (endHoriExpected, _output);
-
-// // scroll.Size = size * 2;
-// // Application.RunIteration (ref rs);
-
-// // _ = TestHelpers.AssertDriverContentsWithFrameAre (sizeHoriExpected, _output);
-// // }
-
-// [Fact]
-// public void Constructor_Defaults ()
-// {
-// var scroll = new Scroll ();
-// Assert.False (scroll.CanFocus);
-// Assert.Equal (Orientation.Vertical, scroll.Orientation);
-// Assert.Equal (0, scroll.Size);
-// Assert.Equal (0, scroll.GetSliderPosition ());
-// }
-
-// //[Fact]
-// //[AutoInitShutdown]
-// //public void KeepContentInAllViewport_True_False_KeepContentInAllViewport_True ()
-// //{
-// // var view = new View { Width = Dim.Fill (), Height = Dim.Fill () };
-// // view.Padding.Thickness = new (0, 0, 2, 0);
-// // view.SetContentSize (new (view.Viewport.Width, 30));
-// // var scroll = new Scroll { Width = 2, Height = Dim.Fill (), Size = view.GetContentSize ().Height, KeepContentInAllViewport = true };
-// // scroll.PositionChanged += (_, e) => view.Viewport = view.Viewport with { Y = e.CurrentValue };
-// // view.Padding.Add (scroll);
-// // var top = new Toplevel ();
-// // top.Add (view);
-// // Application.Begin (top);
-
-// // Assert.True (scroll.KeepContentInAllViewport);
-// // Assert.Equal (80, view.Padding.Viewport.Width);
-// // Assert.Equal (25, view.Padding.Viewport.Height);
-// // Assert.Equal (2, scroll.Viewport.Width);
-// // Assert.Equal (25, scroll.Viewport.Height);
-// // Assert.Equal (30, scroll.Size);
-
-// // scroll.KeepContentInAllViewport = false;
-// // scroll.Position = 50;
-// // Assert.Equal (scroll.Position, scroll.Size - 1);
-// // Assert.Equal (scroll.Position, view.Viewport.Y);
-// // Assert.Equal (29, scroll.Position);
-// // Assert.Equal (29, view.Viewport.Y);
-
-// // top.Dispose ();
-// //}
-
-
-// //[Theory]
-// //[AutoInitShutdown]
-// //[InlineData (Orientation.Vertical)]
-// //[InlineData (Orientation.Horizontal)]
-// //public void Moving_Mouse_Outside_Host_Ensures_Correct_Location_KeepContentInAllViewport_True (Orientation orientation)
-// //{
-// // var scroll = new Scroll
-// // {
-// // X = 10, Y = 10, Width = orientation == Orientation.Vertical ? 1 : 10, Height = orientation == Orientation.Vertical ? 10 : 1, Size = 20,
-// // SliderPosition = 5, Orientation = orientation
-// // };
-// // var top = new Toplevel ();
-// // top.Add (scroll);
-// // RunState rs = Application.Begin (top);
-
-// // Rectangle scrollSliderFrame = scroll.Subviews.FirstOrDefault (x => x.Id == "scrollSlider")!.Frame;
-// // Assert.Equal (scrollSliderFrame, orientation == Orientation.Vertical ? new (0, 2, 1, 5) : new (2, 0, 5, 1));
-
-// // Application.RaiseMouseEvent (new () { ScreenPosition = orientation == Orientation.Vertical ? new (10, 12) : new (12, 10), Flags = MouseFlags.Button1Pressed });
-// // Application.RunIteration (ref rs);
-
-// // Application.RaiseMouseEvent (
-// // new ()
-// // {
-// // ScreenPosition = orientation == Orientation.Vertical ? new (10, 0) : new (0, 10),
-// // Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
-// // });
-// // Application.RunIteration (ref rs);
-// // Assert.Equal (new (0, 0), scroll.Subviews.FirstOrDefault (x => x.Id == "scrollSlider")!.Frame.Location);
-
-// // Application.RaiseMouseEvent (
-// // new ()
-// // {
-// // ScreenPosition = orientation == Orientation.Vertical ? new (0, 25) : new (80, 0),
-// // Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
-// // });
-// // Application.RunIteration (ref rs);
-
-// // Assert.Equal (
-// // orientation == Orientation.Vertical ? new (0, 5) : new (5, 0),
-// // scroll.Subviews.FirstOrDefault (x => x.Id == "scrollSlider")!.Frame.Location);
-// //}
-
-// [Theory]
-// [CombinatorialData]
-// [AutoInitShutdown]
-// public void Mouse_Wheel_Increments_Position ([CombinatorialRange (1, 3, 1)] int increment, Orientation orientation)
-// {
-// var top = new Toplevel ()
-// {
-// Id = "top",
-// Width = 10,
-// Height = 10
-// };
-// var scroll = new Scroll
-// {
-// Id = "scroll",
-// Orientation = orientation,
-// Size = 20,
-// Increment = increment
-// };
-
-// top.Add (scroll);
-// RunState rs = Application.Begin (top);
-
-// Assert.Equal (0, scroll.GetSliderPosition ());
-// Assert.Equal (0, scroll.ContentPosition);
-
-// Application.RaiseMouseEvent (new ()
-// {
-// ScreenPosition = new (0, 0),
-// Flags = orientation == Orientation.Vertical ? MouseFlags.WheeledDown : MouseFlags.WheeledRight
-// });
-// Application.RunIteration (ref rs);
-
-// Assert.Equal (increment, scroll.ContentPosition);
-
-// Application.RaiseMouseEvent (new ()
-// {
-// ScreenPosition = new (0, 0),
-// Flags = orientation == Orientation.Vertical ? MouseFlags.WheeledDown : MouseFlags.WheeledRight
-// });
-// Application.RunIteration (ref rs);
-
-// Assert.Equal (increment * 2, scroll.ContentPosition);
-
-// Application.RaiseMouseEvent (new ()
-// {
-// ScreenPosition = new (0, 0),
-// Flags = orientation == Orientation.Vertical ? MouseFlags.WheeledUp : MouseFlags.WheeledLeft
-// });
-// Application.RunIteration (ref rs);
-
-// Assert.Equal (increment, scroll.ContentPosition);
-
-// Application.ResetState (true);
-// }
-
-// [Theory]
-// [CombinatorialData]
-// [AutoInitShutdown]
-// public void Mouse_Click_Outside_Slider_Moves (Orientation orientation)
-// {
-// var top = new Toplevel ()
-// {
-// Id = "top",
-// Width = 10,
-// Height = 10
-// };
-// var scroll = new Scroll
-// {
-// Id = "scroll",
-// Orientation = orientation,
-// Size = 20,
-// };
-
-// top.Add (scroll);
-// RunState rs = Application.Begin (top);
-// scroll.ContentPosition = 5;
-// Application.RunIteration (ref rs);
-
-// Assert.Equal (5, scroll.GetSliderPosition ());
-// Assert.Equal (10, scroll.ContentPosition);
-
-// Application.RaiseMouseEvent (new ()
-// {
-// ScreenPosition = new (0, 0),
-// Flags = MouseFlags.Button1Clicked
-// });
-// Application.RunIteration (ref rs);
-
-// Assert.Equal (0, scroll.GetSliderPosition ());
-// Assert.Equal (0, scroll.ContentPosition);
-
-// Application.ResetState (true);
-// }
-
-// [Theory]
-// [CombinatorialData]
-// public void Position_Clamps_To_Size (
-// [CombinatorialRange (1, 6, 1)] int scrollSize,
-// [CombinatorialRange (-1, 6, 1)] int scrollPosition,
-// Orientation orientation
-// )
-// {
-// var super = new View
-// {
-// Id = "super",
-// Width = 5,
-// Height = 5
-// };
-
-// var scroll = new Scroll
-// {
-// Orientation = orientation,
-// Width = Dim.Fill (),
-// Height = Dim.Fill ()
-// };
-// super.Add (scroll);
-// scroll.Size = scrollSize;
-// super.Layout ();
-
-// scroll.ContentPosition = scrollPosition;
-// super.Layout ();
-
-// Assert.True (scroll.GetSliderPosition () <= scrollSize);
-// }
-
-// [Fact]
-// public void PositionChanging_PositionChanged_Events_Only_Raises_Once_If_Position_Was_Really_Changed ()
-// {
-// var changing = 0;
-// var cancel = false;
-// var changed = 0;
-// var scroll = new Scroll { Height = 10, Size = 20 };
-// scroll.SliderPositionChanged += Scroll_PositionChanged;
-
-// Assert.Equal (Orientation.Vertical, scroll.Orientation);
-// scroll.Layout ();
-// Assert.Equal (new (0, 0, 1, 10), scroll.Viewport);
-// Assert.Equal (0, scroll.GetSliderPosition ());
-// Assert.Equal (0, changing);
-// Assert.Equal (0, changed);
-
-// scroll.ContentPosition = 0;
-// Assert.Equal (0, scroll.GetSliderPosition ());
-// Assert.Equal (0, changing);
-// Assert.Equal (0, changed);
-
-// scroll.ContentPosition = 1;
-// Assert.Equal (1, scroll.GetSliderPosition ());
-// Assert.Equal (1, changing);
-// Assert.Equal (1, changed);
-
-// Reset ();
-// cancel = true;
-// scroll.ContentPosition = 2;
-// Assert.Equal (1, scroll.GetSliderPosition ());
-// Assert.Equal (1, changing);
-// Assert.Equal (0, changed);
-
-// Reset ();
-// scroll.ContentPosition = 10;
-// Assert.Equal (5, scroll.GetSliderPosition ());
-// Assert.Equal (1, changing);
-// Assert.Equal (1, changed);
-
-// Reset ();
-// scroll.ContentPosition = 11;
-// Assert.Equal (5, scroll.GetSliderPosition ());
-// Assert.Equal (1, changing);
-// Assert.Equal (1, changed);
-
-// Reset ();
-// scroll.ContentPosition = 0;
-// Assert.Equal (0, scroll.GetSliderPosition ());
-// Assert.Equal (1, changing);
-// Assert.Equal (1, changed);
-
-// scroll.SliderPositionChanged -= Scroll_PositionChanged;
-
-// void Scroll_PositionChanged (object sender, EventArgs e) { changed++; }
-
-// void Reset ()
-// {
-// changing = 0;
-// cancel = false;
-// changed = 0;
-// }
-// }
-
-// [Fact]
-// public void Size_Cannot_Be_Negative ()
-// {
-// var scroll = new Scroll { Height = 10, Size = -1 };
-// Assert.Equal (0, scroll.Size);
-// scroll.Size = -10;
-// Assert.Equal (0, scroll.Size);
-// }
-
-// [Fact]
-// public void SizeChanged_Event ()
-// {
-// var count = 0;
-// var scroll = new Scroll ();
-// scroll.Layout ();
-// scroll.SizeChanged += (s, e) => count++;
-
-// scroll.Size = 10;
-// Assert.Equal (10, scroll.Size);
-// Assert.Equal (1, count);
-// }
-
-// [Theory]
-// [SetupFakeDriver]
-// [InlineData (
-// 10,
-// 1,
-// 20,
-// 0,
-// Orientation.Horizontal,
-// @"
-//┌──────────┐
-//│█████░░░░░│
-//└──────────┘")]
-
-// [InlineData (
-// 10,
-// 3,
-// 20,
-// 1,
-// Orientation.Horizontal,
-// @"
-//┌──────────┐
-//│░█████░░░░│
-//│░█████░░░░│
-//│░█████░░░░│
-//└──────────┘")]
-
-// [InlineData (
-// 3,
-// 10,
-// 20,
-// 0,
-// Orientation.Vertical,
-// @"
-//┌───┐
-//│███│
-//│███│
-//│███│
-//│███│
-//│███│
-//│░░░│
-//│░░░│
-//│░░░│
-//│░░░│
-//│░░░│
-//└───┘")]
-
-
-// public void Draws_Correctly (int superViewportWidth, int superViewportHeight, int sliderSize, int sliderPosition, Orientation orientation, string expected)
-// {
-// var super = new Window
-// {
-// Id = "super",
-// Width = superViewportWidth + 2,
-// Height = superViewportHeight + 2
-// };
-
-// var scroll = new Scroll
-// {
-// Orientation = orientation,
-// };
-
-// if (orientation == Orientation.Vertical)
-// {
-// scroll.Width = Dim.Fill ();
-// }
-// else
-// {
-// scroll.Height = Dim.Fill ();
-// }
-// super.Add (scroll);
-
-// scroll.Size = sliderSize;
-// scroll.Layout ();
-// scroll.ContentPosition = sliderPosition;
-
-// super.BeginInit ();
-// super.EndInit ();
-// super.Layout ();
-// super.Draw ();
-
-// _ = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
-// }
-//}