|
@@ -94,7 +94,7 @@ public class ListView : View
|
|
private int _lastSelectedItem = -1;
|
|
private int _lastSelectedItem = -1;
|
|
private int _selected = -1;
|
|
private int _selected = -1;
|
|
private IListDataSource _source;
|
|
private IListDataSource _source;
|
|
- private int _top, _left;
|
|
|
|
|
|
+ //private int _top, _left;
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Initializes a new instance of <see cref="ListView"/>. Set the <see cref="Source"/> property to display
|
|
/// Initializes a new instance of <see cref="ListView"/>. Set the <see cref="Source"/> property to display
|
|
@@ -199,7 +199,7 @@ public class ListView : View
|
|
/// <value>The left position.</value>
|
|
/// <value>The left position.</value>
|
|
public int LeftItem
|
|
public int LeftItem
|
|
{
|
|
{
|
|
- get => _left;
|
|
|
|
|
|
+ get => Viewport.X;
|
|
set
|
|
set
|
|
{
|
|
{
|
|
if (_source is null)
|
|
if (_source is null)
|
|
@@ -212,7 +212,7 @@ public class ListView : View
|
|
throw new ArgumentException ("value");
|
|
throw new ArgumentException ("value");
|
|
}
|
|
}
|
|
|
|
|
|
- _left = value;
|
|
|
|
|
|
+ Viewport = Viewport with { X = value };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -251,8 +251,9 @@ public class ListView : View
|
|
set
|
|
set
|
|
{
|
|
{
|
|
_source = value;
|
|
_source = value;
|
|
|
|
+ ContentSize = new Size (Viewport.Width, _source.Count);
|
|
KeystrokeNavigator.Collection = _source?.ToList ();
|
|
KeystrokeNavigator.Collection = _source?.ToList ();
|
|
- _top = 0;
|
|
|
|
|
|
+ Viewport = Viewport with { Y = 0 };
|
|
_selected = -1;
|
|
_selected = -1;
|
|
_lastSelectedItem = -1;
|
|
_lastSelectedItem = -1;
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
@@ -263,7 +264,7 @@ public class ListView : View
|
|
/// <value>The top item.</value>
|
|
/// <value>The top item.</value>
|
|
public int TopItem
|
|
public int TopItem
|
|
{
|
|
{
|
|
- get => _top;
|
|
|
|
|
|
+ get => Viewport.Y;
|
|
set
|
|
set
|
|
{
|
|
{
|
|
if (_source is null)
|
|
if (_source is null)
|
|
@@ -276,7 +277,7 @@ public class ListView : View
|
|
throw new ArgumentException ("value");
|
|
throw new ArgumentException ("value");
|
|
}
|
|
}
|
|
|
|
|
|
- _top = Math.Max (value, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (value, 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -314,13 +315,13 @@ public class ListView : View
|
|
{
|
|
{
|
|
if (SuperView?.IsInitialized == true)
|
|
if (SuperView?.IsInitialized == true)
|
|
{
|
|
{
|
|
- if (_selected < _top)
|
|
|
|
|
|
+ if (_selected < Viewport.Y)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
}
|
|
}
|
|
- else if (Viewport.Height > 0 && _selected >= _top + Viewport.Height)
|
|
|
|
|
|
+ else if (Viewport.Height > 0 && _selected >= Viewport.Y + Viewport.Height)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected - Viewport.Height + 1, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected - Viewport.Height + 1, 0) };
|
|
}
|
|
}
|
|
|
|
|
|
LayoutStarted -= ListView_LayoutStarted;
|
|
LayoutStarted -= ListView_LayoutStarted;
|
|
@@ -347,7 +348,7 @@ public class ListView : View
|
|
}
|
|
}
|
|
|
|
|
|
/// <inheritdoc/>
|
|
/// <inheritdoc/>
|
|
- protected internal override bool OnMouseEvent (MouseEvent me)
|
|
|
|
|
|
+ protected internal override bool OnMouseEvent (MouseEvent me)
|
|
{
|
|
{
|
|
if (!me.Flags.HasFlag (MouseFlags.Button1Clicked)
|
|
if (!me.Flags.HasFlag (MouseFlags.Button1Clicked)
|
|
&& !me.Flags.HasFlag (MouseFlags.Button1DoubleClicked)
|
|
&& !me.Flags.HasFlag (MouseFlags.Button1DoubleClicked)
|
|
@@ -397,14 +398,14 @@ public class ListView : View
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- if (me.Y + _top >= _source.Count
|
|
|
|
- || me.Y + _top < 0
|
|
|
|
- || me.Y + _top > _top + Viewport.Height)
|
|
|
|
|
|
+ if (me.Y + Viewport.Y >= _source.Count
|
|
|
|
+ || me.Y + Viewport.Y < 0
|
|
|
|
+ || me.Y + Viewport.Y > Viewport.Y + Viewport.Height)
|
|
{
|
|
{
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- _selected = _top + me.Y;
|
|
|
|
|
|
+ _selected = Viewport.Y + me.Y;
|
|
|
|
|
|
if (AllowsAll ())
|
|
if (AllowsAll ())
|
|
{
|
|
{
|
|
@@ -449,13 +450,13 @@ public class ListView : View
|
|
//can move by down by one.
|
|
//can move by down by one.
|
|
_selected++;
|
|
_selected++;
|
|
|
|
|
|
- if (_selected >= _top + Viewport.Height)
|
|
|
|
|
|
+ if (_selected >= Viewport.Y + Viewport.Height)
|
|
{
|
|
{
|
|
- _top++;
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Viewport.Y + 1 };
|
|
}
|
|
}
|
|
- else if (_selected < _top)
|
|
|
|
|
|
+ else if (_selected < Viewport.Y)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
}
|
|
}
|
|
|
|
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
@@ -466,9 +467,9 @@ public class ListView : View
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
- else if (_selected >= _top + Viewport.Height)
|
|
|
|
|
|
+ else if (_selected >= Viewport.Y + Viewport.Height)
|
|
{
|
|
{
|
|
- _top = Math.Max (_source.Count - Viewport.Height, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_source.Count - Viewport.Height, 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -483,9 +484,9 @@ public class ListView : View
|
|
{
|
|
{
|
|
_selected = _source.Count - 1;
|
|
_selected = _source.Count - 1;
|
|
|
|
|
|
- if (_top + _selected > Viewport.Height - 1)
|
|
|
|
|
|
+ if (Viewport.Y + _selected > Viewport.Height - 1)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
}
|
|
}
|
|
|
|
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
@@ -502,7 +503,7 @@ public class ListView : View
|
|
if (_selected != 0)
|
|
if (_selected != 0)
|
|
{
|
|
{
|
|
_selected = 0;
|
|
_selected = 0;
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
@@ -535,11 +536,11 @@ public class ListView : View
|
|
|
|
|
|
if (_source.Count >= Viewport.Height)
|
|
if (_source.Count >= Viewport.Height)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- _top = 0;
|
|
|
|
|
|
+ Viewport = Viewport with { Y = 0 };
|
|
}
|
|
}
|
|
|
|
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
@@ -563,7 +564,7 @@ public class ListView : View
|
|
if (n != _selected)
|
|
if (n != _selected)
|
|
{
|
|
{
|
|
_selected = n;
|
|
_selected = n;
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
@@ -599,21 +600,21 @@ public class ListView : View
|
|
_selected = Source.Count - 1;
|
|
_selected = Source.Count - 1;
|
|
}
|
|
}
|
|
|
|
|
|
- if (_selected < _top)
|
|
|
|
|
|
+ if (_selected < Viewport.Y)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
}
|
|
}
|
|
- else if (_selected > _top + Viewport.Height)
|
|
|
|
|
|
+ else if (_selected > Viewport.Y + Viewport.Height)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected - Viewport.Height + 1, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected - Viewport.Height + 1, 0) };
|
|
}
|
|
}
|
|
|
|
|
|
OnSelectedChanged ();
|
|
OnSelectedChanged ();
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
- else if (_selected < _top)
|
|
|
|
|
|
+ else if (_selected < Viewport.Y)
|
|
{
|
|
{
|
|
- _top = Math.Max (_selected, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (_selected, 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -629,10 +630,10 @@ public class ListView : View
|
|
Driver.SetAttribute (current);
|
|
Driver.SetAttribute (current);
|
|
Move (0, 0);
|
|
Move (0, 0);
|
|
Rectangle f = Viewport;
|
|
Rectangle f = Viewport;
|
|
- int item = _top;
|
|
|
|
|
|
+ int item = Viewport.Y;
|
|
bool focused = HasFocus;
|
|
bool focused = HasFocus;
|
|
int col = _allowsMarking ? 2 : 0;
|
|
int col = _allowsMarking ? 2 : 0;
|
|
- int start = _left;
|
|
|
|
|
|
+ int start = Viewport.X;
|
|
|
|
|
|
for (var row = 0; row < f.Height; row++, item++)
|
|
for (var row = 0; row < f.Height; row++, item++)
|
|
{
|
|
{
|
|
@@ -769,11 +770,11 @@ public class ListView : View
|
|
{
|
|
{
|
|
if (_allowsMarking)
|
|
if (_allowsMarking)
|
|
{
|
|
{
|
|
- Move (0, _selected - _top);
|
|
|
|
|
|
+ Move (0, _selected - Viewport.Y);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- Move (Viewport.Width - 1, _selected - _top);
|
|
|
|
|
|
+ Move (Viewport.Width - 1, _selected - Viewport.Y);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -784,7 +785,7 @@ public class ListView : View
|
|
/// <param name="items">Number of items to scroll down.</param>
|
|
/// <param name="items">Number of items to scroll down.</param>
|
|
public virtual bool ScrollDown (int items)
|
|
public virtual bool ScrollDown (int items)
|
|
{
|
|
{
|
|
- _top = Math.Max (Math.Min (_top + items, _source.Count - 1), 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (Math.Min (Viewport.Y + items, _source.Count - 1), 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
|
|
|
|
return true;
|
|
return true;
|
|
@@ -794,7 +795,7 @@ public class ListView : View
|
|
/// <param name="cols">Number of columns to scroll left.</param>
|
|
/// <param name="cols">Number of columns to scroll left.</param>
|
|
public virtual bool ScrollLeft (int cols)
|
|
public virtual bool ScrollLeft (int cols)
|
|
{
|
|
{
|
|
- _left = Math.Max (_left - cols, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { X = Math.Max (Viewport.X - cols, 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
|
|
|
|
return true;
|
|
return true;
|
|
@@ -804,7 +805,7 @@ public class ListView : View
|
|
/// <param name="cols">Number of columns to scroll right.</param>
|
|
/// <param name="cols">Number of columns to scroll right.</param>
|
|
public virtual bool ScrollRight (int cols)
|
|
public virtual bool ScrollRight (int cols)
|
|
{
|
|
{
|
|
- _left = Math.Max (Math.Min (_left + cols, MaxLength - 1), 0);
|
|
|
|
|
|
+ Viewport = Viewport with { X = Math.Max (Math.Min (Viewport.X + cols, MaxLength - 1), 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
|
|
|
|
return true;
|
|
return true;
|
|
@@ -814,7 +815,7 @@ public class ListView : View
|
|
/// <param name="items">Number of items to scroll up.</param>
|
|
/// <param name="items">Number of items to scroll up.</param>
|
|
public virtual bool ScrollUp (int items)
|
|
public virtual bool ScrollUp (int items)
|
|
{
|
|
{
|
|
- _top = Math.Max (_top - items, 0);
|
|
|
|
|
|
+ Viewport = Viewport with { Y = Math.Max (Viewport.Y - items, 0) };
|
|
SetNeedsDisplay ();
|
|
SetNeedsDisplay ();
|
|
|
|
|
|
return true;
|
|
return true;
|