diff --git a/Terminal.Gui/Views/Scroll.cs b/Terminal.Gui/Views/Scroll.cs
index 09dd4925b..a00f61c4b 100644
--- a/Terminal.Gui/Views/Scroll.cs
+++ b/Terminal.Gui/Views/Scroll.cs
@@ -17,12 +17,18 @@ public class Scroll : View
public Scroll ()
{
WantContinuousButtonPressed = true;
- ClearOnVisibleFalse = false;
+ //ClearOnVisibleFalse = false;
CanFocus = false;
Orientation = Orientation.Vertical;
- Width = 1;
+ Width = Dim.Auto (DimAutoStyle.Content, 1);
+ Height = Dim.Auto (DimAutoStyle.Content, 1);
- _slider = new () { Id = "slider" };
+ _slider = new ()
+ {
+ Id = "slider",
+ Width = Dim.Auto (DimAutoStyle.Content),
+ Height = Dim.Auto (DimAutoStyle.Content)
+ };
Add (_slider);
Added += Scroll_Added;
@@ -35,14 +41,12 @@ public class Scroll : View
}
private readonly View _slider;
- private int _lastLocation = -1;
- private Orientation _orientation;
- private int _size;
- private int _position;
+ private int _lastLocation = -1;
private bool _wasSliderMouse;
+ private Orientation _orientation;
///
/// Determines the Orientation of the scroll.
///
@@ -52,10 +56,11 @@ public class Scroll : View
set
{
_orientation = value;
- SetWidthHeight ();
+ AdjustSlider();
}
}
+ private int _position;
///
/// The position, relative to , to set the scrollbar at.
///
@@ -64,7 +69,7 @@ public class Scroll : View
get => _position;
set
{
- int barSize = Orientation == Orientation.Vertical ? Frame.Height : Frame.Width;
+ int barSize = Orientation == Orientation.Vertical ? ContentSize.Height : ContentSize.Width;
if (value < 0 || (value > 0 && value + barSize > Size))
{
@@ -84,7 +89,7 @@ public class Scroll : View
if (!_wasSliderMouse)
{
- SetWidthHeight ();
+ AdjustSlider ();
}
}
}
@@ -95,6 +100,7 @@ public class Scroll : View
/// This event is raised when the position on the scrollbar is changing.
public event EventHandler> PositionChanging;
+ private int _size;
///
/// The size of content the scroll represents.
///
@@ -106,7 +112,7 @@ public class Scroll : View
int oldSize = _size;
_size = value;
OnSizeChanged (oldSize);
- SetWidthHeight ();
+ AdjustSlider ();
}
}
@@ -143,24 +149,24 @@ public class Scroll : View
private int GetPositionFromSliderLocation (int location)
{
- if (Frame.Height == 0 || Frame.Width == 0)
+ if (ContentSize.Height == 0 || ContentSize.Width == 0)
{
return 0;
}
- int barSize = Orientation == Orientation.Vertical ? Frame.Height : Frame.Width;
+ int barSize = Orientation == Orientation.Vertical ? ContentSize.Height : ContentSize.Width;
return Math.Min (location * Size / barSize, Size - barSize);
}
private (int Location, int Dimension) GetSliderLocationDimensionFromPosition ()
{
- if (Frame.Height == 0 || Frame.Width == 0)
+ if (ContentSize.Height == 0 || ContentSize.Width == 0)
{
return new (0, 0);
}
- int barSize = Orientation == Orientation.Vertical ? Frame.Height : Frame.Width;
+ int barSize = Orientation == Orientation.Vertical ? ContentSize.Height : ContentSize.Width;
int location;
int dimension;
@@ -194,7 +200,7 @@ public class Scroll : View
{
if (!_wasSliderMouse)
{
- SetWidthHeight ();
+ AdjustSlider ();
}
else
{
@@ -217,13 +223,16 @@ public class Scroll : View
private void Scroll_DrawContent (object sender, DrawEventArgs e) { SetColorSchemeWithSuperview (sender as View); }
- private void Scroll_Initialized (object sender, EventArgs e) { SetWidthHeight (); }
+ private void Scroll_Initialized (object sender, EventArgs e)
+ {
+ AdjustSlider ();
+ }
private void Scroll_MouseEvent (object sender, MouseEventEventArgs e)
{
MouseEvent me = e.MouseEvent;
int location = Orientation == Orientation.Vertical ? me.Position.Y : me.Position.X;
- int barSize = Orientation == Orientation.Vertical ? Frame.Height : Frame.Width;
+ int barSize = Orientation == Orientation.Vertical ? ContentSize.Height : ContentSize.Width;
(int topLeft, int bottomRight) sliderPos = _orientation == Orientation.Vertical
? new (_slider.Frame.Y, _slider.Frame.Bottom - 1)
@@ -251,6 +260,7 @@ public class Scroll : View
}
}
+ // TODO: Just override GetNormalColor instead of having this method
private static void SetColorSchemeWithSuperview (View view)
{
if (view.SuperView is { })
@@ -275,16 +285,16 @@ public class Scroll : View
Text = string.Concat (
Enumerable.Repeat (
Glyphs.Stipple.ToString (),
- Frame.Width * Frame.Height));
+ ContentSize.Width * ContentSize.Height));
_slider.TextDirection = Orientation == Orientation.Vertical ? TextDirection.TopBottom_LeftRight : TextDirection.LeftRight_TopBottom;
_slider.Text = string.Concat (
Enumerable.Repeat (
Glyphs.ContinuousMeterSegment.ToString (),
- _slider.Frame.Width * _slider.Frame.Height));
+ _slider.ContentSize.Width * _slider.ContentSize.Height));
}
- private void SetWidthHeight ()
+ private void AdjustSlider ()
{
if (!IsInitialized)
{
@@ -294,8 +304,12 @@ public class Scroll : View
(int Location, int Dimension) slider = GetSliderLocationDimensionFromPosition ();
_slider.X = Orientation == Orientation.Vertical ? 0 : slider.Location;
_slider.Y = Orientation == Orientation.Vertical ? slider.Location : 0;
- _slider.Width = Orientation == Orientation.Vertical ? Dim.Fill () : slider.Dimension;
- _slider.Height = Orientation == Orientation.Vertical ? slider.Dimension : Dim.Fill ();
+
+ _slider.SetContentSize (
+ new (
+ Orientation == Orientation.Vertical ? ContentSize.Width : slider.Dimension,
+ Orientation == Orientation.Vertical ? slider.Dimension : ContentSize.Height
+ ));
SetSliderText ();
}
@@ -304,7 +318,7 @@ public class Scroll : View
{
MouseEvent me = e.MouseEvent;
int location = Orientation == Orientation.Vertical ? me.Position.Y : me.Position.X;
- int barSize = Orientation == Orientation.Vertical ? Frame.Height : Frame.Width;
+ int barSize = Orientation == Orientation.Vertical ? ContentSize.Height : ContentSize.Width;
int offset = _lastLocation > -1 ? location - _lastLocation : 0;
if (me.Flags == MouseFlags.Button1Pressed)
diff --git a/UICatalog/Scenarios/ScrollDemo.cs b/UICatalog/Scenarios/ScrollDemo.cs
index 77fbd7b75..584861477 100644
--- a/UICatalog/Scenarios/ScrollDemo.cs
+++ b/UICatalog/Scenarios/ScrollDemo.cs
@@ -36,8 +36,7 @@ public class ScrollDemo : Scenario
var scroll = new Scroll
{
X = Pos.AnchorEnd (),
- Width = 1,
- Height = Dim.Fill ()
+ Height = Dim.Fill (),
};
view.Add (scroll);
@@ -47,7 +46,7 @@ public class ScrollDemo : Scenario
};
view.Add (lblWidthHeight);
- Buttons.NumericUpDown scrollWidthHeight = new()
+ Buttons.NumericUpDown scrollWidthHeight = new ()
{
Value = scroll.Frame.Width,
X = Pos.Right (lblWidthHeight) + 1,
@@ -93,6 +92,7 @@ public class ScrollDemo : Scenario
{
scroll.Orientation = Orientation.Vertical;
scroll.X = Pos.AnchorEnd ();
+ scroll.Y = 0;
scroll.Width = scrollWidthHeight.Value;
scroll.Height = Dim.Fill ();
scroll.Size /= 3;
@@ -100,6 +100,7 @@ public class ScrollDemo : Scenario
else
{
scroll.Orientation = Orientation.Horizontal;
+ scroll.X = 0;
scroll.Y = Pos.AnchorEnd ();
scroll.Width = Dim.Fill ();
scroll.Height = scrollWidthHeight.Value;
@@ -114,7 +115,7 @@ public class ScrollDemo : Scenario
};
view.Add (lblSize);
- Buttons.NumericUpDown scrollSize = new()
+ Buttons.NumericUpDown scrollSize = new ()
{
Value = scroll.Size,
X = Pos.Right (lblSize) + 1,
@@ -144,7 +145,7 @@ public class ScrollDemo : Scenario
};
view.Add (lblPosition);
- Buttons.NumericUpDown scrollPosition = new()
+ Buttons.NumericUpDown scrollPosition = new ()
{
Value = scroll.Position,
X = Pos.Right (lblPosition) + 1,
@@ -218,8 +219,8 @@ public class ScrollDemo : Scenario
editor.Initialized += (s, e) =>
{
- scroll.Size = 40;
- editor.ViewToEdit = view;
+ scroll.Size = int.Max (app.ContentSize.Height * 2, app.ContentSize.Width * 2);
+ editor.ViewToEdit = scroll;
};
app.Closed += (s, e) => View.Diagnostics = _diagnosticFlags;