Corrects the position of the StatusBar so that it is always at the bottom of the screen. Works perfectly with curses.

This commit is contained in:
BDisp
2020-05-14 18:30:08 +01:00
parent e6c5b2599a
commit 22475fad2f
2 changed files with 31 additions and 20 deletions

View File

@@ -1522,12 +1522,12 @@ namespace Terminal.Gui {
/// <summary>
/// Check id current toplevel has menu bar
/// </summary>
public bool HasMenuBar { get; set; }
public MenuBar MenuBar { get; set; }
/// <summary>
/// Check id current toplevel has status bar
/// </summary>
public bool HasStatusBar { get; set; }
public StatusBar StatusBar { get; set; }
public override bool ProcessKey (KeyEvent keyEvent)
{
@@ -1584,9 +1584,9 @@ namespace Terminal.Gui {
{
if (this == Application.Top) {
if (view is MenuBar)
HasMenuBar = true;
MenuBar = view as MenuBar;
if (view is StatusBar)
HasStatusBar = true;
StatusBar = view as StatusBar;
}
base.Add (view);
}
@@ -1595,9 +1595,9 @@ namespace Terminal.Gui {
{
if (this == Application.Top) {
if (view is MenuBar)
HasMenuBar = true;
MenuBar = null;
if (view is StatusBar)
HasStatusBar = true;
StatusBar = null;
}
base.Remove (view);
}
@@ -1605,8 +1605,8 @@ namespace Terminal.Gui {
public override void RemoveAll ()
{
if (this == Application.Top) {
HasMenuBar = false;
HasStatusBar = false;
MenuBar = null;
StatusBar = null;
}
base.RemoveAll ();
}
@@ -1617,15 +1617,15 @@ namespace Terminal.Gui {
nx = nx + top.Frame.Width > Driver.Cols ? Math.Max(Driver.Cols - top.Frame.Width, 0) : nx;
bool m, s;
if (SuperView == null)
m = Application.Top.HasMenuBar;
m = Application.Top.MenuBar != null;
else
m = ((Toplevel)SuperView).HasMenuBar;
m = ((Toplevel)SuperView).MenuBar != null;
int l = m ? 1 : 0;
ny = Math.Max (y, l);
if (SuperView == null)
s = Application.Top.HasStatusBar;
s = Application.Top.StatusBar != null;
else
s = ((Toplevel)SuperView).HasStatusBar;
s = ((Toplevel)SuperView).StatusBar != null;
l = s ? Driver.Rows - 1 : Driver.Rows;
ny = Math.Min (ny, l);
ny = ny + top.Frame.Height > l ? Math.Max(l - top.Frame.Height, m ? 1 : 0) : ny;
@@ -1647,9 +1647,15 @@ namespace Terminal.Gui {
top.X = nx;
top.Y = ny;
}
if (HasStatusBar && ny + top.Frame.Height > Driver.Rows - 1) {
if (top.Height is Dim.DimFill)
top.Height = Dim.Fill () - 1;
if (StatusBar != null) {
if (ny + top.Frame.Height > Driver.Rows - 1) {
if (top.Height is Dim.DimFill)
top.Height = Dim.Fill () - 1;
}
if (StatusBar.Frame.Y != Driver.Rows - 1) {
StatusBar.Y = Driver.Rows - 1;
SetNeedsDisplay ();
}
}
}
}

View File

@@ -101,7 +101,12 @@ namespace Terminal.Gui {
Items = items;
CanFocus = false;
ColorScheme = Colors.Menu;
X = 0;
Y = Driver.Rows - 1;
Width = Dim.Fill ();
Height = 1;
// This is never called if it is invoked later on another place.
Application.OnLoad += () => {
X = 0;
Height = 1;
@@ -134,11 +139,11 @@ namespace Terminal.Gui {
public override void Redraw (Rect region)
{
if (Frame.Y != Driver.Rows - 1) {
Frame = new Rect (Frame.X, Driver.Rows - 1, Frame.Width, Frame.Height);
Y = Driver.Rows - 1;
SetNeedsDisplay ();
}
//if (Frame.Y != Driver.Rows - 1) {
// Frame = new Rect (Frame.X, Driver.Rows - 1, Frame.Width, Frame.Height);
// Y = Driver.Rows - 1;
// SetNeedsDisplay ();
//}
Move (0, 0);
Driver.SetAttribute (ColorScheme.Normal);