mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Pageupdown (#138)
* feat(text view pageup/down): Added code to process `PageUp` and `PageDown` keys in the `TextView`. * fix(text view pageup/down): Corrected the functionality of the `PageUp` so that it can go till row 1
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
//
|
||||
//
|
||||
// TODO:
|
||||
// PageUp/PageDown
|
||||
// In ReadOnly mode backspace/space behave like pageup/pagedown
|
||||
// Attributed text on spans
|
||||
// Replace insertion with Insert method
|
||||
@@ -113,8 +112,9 @@ namespace Terminal.Gui {
|
||||
public override string ToString ()
|
||||
{
|
||||
var sb = new StringBuilder ();
|
||||
foreach (var line in lines) {
|
||||
sb.Append (ustring.Make (line).ToString ());
|
||||
foreach (var line in lines)
|
||||
{
|
||||
sb.Append (ustring.Make(line));
|
||||
sb.AppendLine ();
|
||||
}
|
||||
return sb.ToString ();
|
||||
@@ -130,7 +130,7 @@ namespace Terminal.Gui {
|
||||
/// </summary>
|
||||
/// <returns>The line.</returns>
|
||||
/// <param name="line">Line number to retrieve.</param>
|
||||
public List<Rune> GetLine (int line) => lines [line];
|
||||
public List<Rune> GetLine (int line) => line < Count ? lines [line]: lines[Count-1];
|
||||
|
||||
/// <summary>
|
||||
/// Adds a line to the model at the specified position.
|
||||
@@ -392,7 +392,12 @@ namespace Terminal.Gui {
|
||||
Driver.SetAttribute (ColorScheme.Normal);
|
||||
}
|
||||
|
||||
bool isReadOnly;
|
||||
bool isReadOnly = false;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates readonly attribute of TextView
|
||||
/// </summary>
|
||||
/// <value>Boolean value(Default false)</value>
|
||||
public bool ReadOnly {
|
||||
get => isReadOnly;
|
||||
set {
|
||||
@@ -494,22 +499,26 @@ namespace Terminal.Gui {
|
||||
|
||||
int bottom = region.Bottom;
|
||||
int right = region.Right;
|
||||
for (int row = region.Top; row < bottom; row++) {
|
||||
for (int row = region.Top; row < bottom; row++)
|
||||
{
|
||||
int textLine = topRow + row;
|
||||
if (textLine >= model.Count) {
|
||||
if (textLine >= model.Count)
|
||||
{
|
||||
ColorNormal ();
|
||||
ClearRegion (region.Left, row, region.Right, row + 1);
|
||||
continue;
|
||||
}
|
||||
var line = model.GetLine (textLine);
|
||||
int lineRuneCount = line.Count;
|
||||
if (line.Count < region.Left){
|
||||
if (line.Count < region.Left)
|
||||
{
|
||||
ClearRegion (region.Left, row, region.Right, row + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
Move (region.Left, row);
|
||||
for (int col = region.Left; col < right; col++) {
|
||||
for (int col = region.Left; col < right; col++)
|
||||
{
|
||||
var lineCol = leftColumn + col;
|
||||
var rune = lineCol >= lineRuneCount ? ' ' : line [lineCol];
|
||||
if (selecting && PointInSelection (col, row))
|
||||
@@ -682,6 +691,38 @@ namespace Terminal.Gui {
|
||||
|
||||
// Dispatch the command.
|
||||
switch (kb.Key) {
|
||||
case Key.PageDown:
|
||||
case Key.ControlV:
|
||||
int nPageDnShift = Frame.Height - 1;
|
||||
if (currentRow < model.Count) {
|
||||
if (columnTrack == -1)
|
||||
columnTrack = currentColumn;
|
||||
currentRow = (currentRow + nPageDnShift) > model.Count ? model.Count : currentRow + nPageDnShift;
|
||||
if (topRow < currentRow - nPageDnShift) {
|
||||
topRow = currentRow >= model.Count ? currentRow - nPageDnShift : topRow + nPageDnShift;
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
TrackColumn ();
|
||||
PositionCursor ();
|
||||
}
|
||||
break;
|
||||
|
||||
case Key.PageUp:
|
||||
case ((int)'v' + Key.AltMask):
|
||||
int nPageUpShift = Frame.Height - 1;
|
||||
if (currentRow > 0) {
|
||||
if (columnTrack == -1)
|
||||
columnTrack = currentColumn;
|
||||
currentRow = currentRow - nPageUpShift < 0 ? 0 : currentRow - nPageUpShift;
|
||||
if (currentRow < topRow) {
|
||||
topRow = topRow - nPageUpShift < 0 ? 0 : topRow - nPageUpShift;
|
||||
SetNeedsDisplay ();
|
||||
}
|
||||
TrackColumn ();
|
||||
PositionCursor ();
|
||||
}
|
||||
break;
|
||||
|
||||
case Key.ControlN:
|
||||
case Key.CursorDown:
|
||||
if (currentRow + 1 < model.Count) {
|
||||
@@ -938,11 +979,12 @@ namespace Terminal.Gui {
|
||||
break;
|
||||
|
||||
default:
|
||||
if (isReadOnly)
|
||||
return true;
|
||||
// Ignore control characters and other special keys
|
||||
if (kb.Key < Key.Space || kb.Key > Key.CharMask)
|
||||
return false;
|
||||
//So that special keys like tab can be processed
|
||||
if (isReadOnly)
|
||||
return true;
|
||||
Insert ((uint)kb.Key);
|
||||
currentColumn++;
|
||||
if (currentColumn >= leftColumn + Frame.Width) {
|
||||
@@ -1109,5 +1151,4 @@ namespace Terminal.Gui {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user