diff --git a/Terminal.Gui/View/Adornment/Border.cs b/Terminal.Gui/View/Adornment/Border.cs index 5024406c8..99fae34fb 100644 --- a/Terminal.Gui/View/Adornment/Border.cs +++ b/Terminal.Gui/View/Adornment/Border.cs @@ -464,8 +464,9 @@ public class Border : Adornment parentLoc.X - _startGrabPoint.X, parentLoc.Y - _startGrabPoint.Y, out int nx, - out int ny, - out _ + out int ny + //, + // out _ ); Parent.X = parentLoc.X - _startGrabPoint.X; diff --git a/Terminal.Gui/View/View.Layout.cs b/Terminal.Gui/View/View.Layout.cs index f8af513a5..2d8fdfeda 100644 --- a/Terminal.Gui/View/View.Layout.cs +++ b/Terminal.Gui/View/View.Layout.cs @@ -38,13 +38,14 @@ public partial class View // Layout APIs int targetX, int targetY, out int nx, - out int ny, - out StatusBar? statusBar + out int ny + //, + // out StatusBar? statusBar ) { int maxDimension; View? superView; - statusBar = null!; + //statusBar = null!; if (viewToMove is not Toplevel || viewToMove?.SuperView is null || viewToMove == Application.Top || viewToMove?.SuperView == Application.Top) { @@ -112,26 +113,26 @@ public partial class View // Layout APIs ny = Math.Max (targetY, maxDimension); - if (viewToMove?.SuperView is null || viewToMove == Application.Top || viewToMove?.SuperView == Application.Top) - { - statusVisible = Application.Top?.StatusBar?.Visible == true; - statusBar = Application.Top?.StatusBar!; - } - else - { - View? t = viewToMove!.SuperView; + //if (viewToMove?.SuperView is null || viewToMove == Application.Top || viewToMove?.SuperView == Application.Top) + //{ + // statusVisible = Application.Top?.StatusBar?.Visible == true; + // statusBar = Application.Top?.StatusBar!; + //} + //else + //{ + // View? t = viewToMove!.SuperView; - while (t is { } and not Toplevel) - { - t = t.SuperView; - } + // while (t is { } and not Toplevel) + // { + // t = t.SuperView; + // } - if (t is Toplevel topLevel) - { - statusVisible = topLevel.StatusBar?.Visible == true; - statusBar = topLevel.StatusBar!; - } - } + // if (t is Toplevel topLevel) + // { + // statusVisible = topLevel.StatusBar?.Visible == true; + // statusBar = topLevel.StatusBar!; + // } + //} if (viewToMove?.SuperView is null || viewToMove == Application.Top || viewToMove?.SuperView == Application.Top) { diff --git a/Terminal.Gui/Views/Toplevel.cs b/Terminal.Gui/Views/Toplevel.cs index e66bed680..cfcdcc14d 100644 --- a/Terminal.Gui/Views/Toplevel.cs +++ b/Terminal.Gui/Views/Toplevel.cs @@ -72,9 +72,9 @@ public partial class Toplevel : View /// Gets the latest added into this Toplevel. public MenuBar? MenuBar => (MenuBar?)Subviews?.LastOrDefault (s => s is MenuBar); - // TODO: Deprecate - Any view can host a statusbar in v2 - /// Gets the latest added into this Toplevel. - public StatusBar? StatusBar => (StatusBar?)Subviews?.LastOrDefault (s => s is StatusBar); + //// TODO: Deprecate - Any view can host a statusbar in v2 + ///// Gets the latest added into this Toplevel. + //public StatusBar? StatusBar => (StatusBar?)Subviews?.LastOrDefault (s => s is StatusBar); #endregion @@ -225,8 +225,9 @@ public partial class Toplevel : View top.Frame.X, top.Frame.Y, out int nx, - out int ny, - out StatusBar? sb + out int ny + //, + // out StatusBar? sb ); if (superView is null) @@ -260,16 +261,16 @@ public partial class Toplevel : View } } - // TODO: v2 - This is a hack to get the StatusBar to be positioned correctly. - if (sb != null - && !top!.Subviews.Contains (sb) - && ny + top.Frame.Height != superView.Frame.Height - (sb.Visible ? 1 : 0) - && top.Height is DimFill - && -top.Height.GetAnchor (0) < 1) - { - top.Height = Dim.Fill (sb.Visible ? 1 : 0); - layoutSubviews = true; - } + //// TODO: v2 - This is a hack to get the StatusBar to be positioned correctly. + //if (sb != null + // && !top!.Subviews.Contains (sb) + // && ny + top.Frame.Height != superView.Frame.Height - (sb.Visible ? 1 : 0) + // && top.Height is DimFill + // && -top.Height.GetAnchor (0) < 1) + //{ + // top.Height = Dim.Fill (sb.Visible ? 1 : 0); + // layoutSubviews = true; + //} if (superView.LayoutNeeded || layoutSubviews) { diff --git a/UICatalog/Scenarios/DynamicStatusBar.cs b/UICatalog/Scenarios/DynamicStatusBar.cs index a7d619e40..60b74151f 100644 --- a/UICatalog/Scenarios/DynamicStatusBar.cs +++ b/UICatalog/Scenarios/DynamicStatusBar.cs @@ -390,17 +390,17 @@ public class DynamicStatusBar : Scenario _btnAdd.Accepting += (s, e) => { - if (StatusBar == null) - { - MessageBox.ErrorQuery ( - "StatusBar Bar Error", - "Must add a StatusBar first!", - "Ok" - ); - _btnAddStatusBar.SetFocus (); + //if (StatusBar == null) + //{ + // MessageBox.ErrorQuery ( + // "StatusBar Bar Error", + // "Must add a StatusBar first!", + // "Ok" + // ); + // _btnAddStatusBar.SetFocus (); - return; - } + // return; + //} var frameDetails = new DynamicStatusBarDetails (); DynamicStatusItem item = frameDetails.EnterStatusItem (); diff --git a/UICatalog/Scenarios/LineViewExample.cs b/UICatalog/Scenarios/LineViewExample.cs index 9efeb30c9..d3a75902f 100644 --- a/UICatalog/Scenarios/LineViewExample.cs +++ b/UICatalog/Scenarios/LineViewExample.cs @@ -1,4 +1,5 @@ -using System.Text; +using System.Globalization; +using System.Text; using Terminal.Gui; namespace UICatalog.Scenarios; @@ -24,7 +25,11 @@ public class LineViewExample : Scenario }; top.Add (menu); - var appWindow = new Window (); + var appWindow = new Window () + { + Y = 1, + Height = Dim.Fill (1) // BUGBUG: what if StatusBar is taller than 1? + }; appWindow.Add (new Label { Y = 1, Text = "Regular Line" }); // creates a horizontal line @@ -79,8 +84,8 @@ public class LineViewExample : Scenario new (Application.QuitKey, "Quit", Quit) } ); - top.Add (statusBar); top.Add (appWindow); + top.Add (statusBar); // Run - Start the application. Application.Run (top); diff --git a/UICatalog/Scenarios/ListColumns.cs b/UICatalog/Scenarios/ListColumns.cs index 7648b1eb3..6bd6dd4be 100644 --- a/UICatalog/Scenarios/ListColumns.cs +++ b/UICatalog/Scenarios/ListColumns.cs @@ -211,8 +211,6 @@ public class ListColumns : Scenario ] }; - top.Add (menu); - var statusBar = new StatusBar ( new Shortcut [] { @@ -222,8 +220,6 @@ public class ListColumns : Scenario new (Application.QuitKey, "Quit", Quit) } ); - top.Add (statusBar); - appWindow.Add (_listColView); var selectedCellLabel = new Label @@ -256,7 +252,9 @@ public class ListColumns : Scenario _listColView.KeyBindings.ReplaceCommands (Key.Space, Command.Accept); - top.Add (appWindow); + top.Add (menu, appWindow, statusBar); + appWindow.Y = 1; + appWindow.Height = Dim.Fill(Dim.Func (() => statusBar.Frame.Height)); // Run - Start the application. Application.Run (top); diff --git a/UICatalog/Scenarios/SingleBackgroundWorker.cs b/UICatalog/Scenarios/SingleBackgroundWorker.cs index 122b30f04..e6226a2b2 100644 --- a/UICatalog/Scenarios/SingleBackgroundWorker.cs +++ b/UICatalog/Scenarios/SingleBackgroundWorker.cs @@ -57,16 +57,17 @@ public class SingleBackgroundWorker : Scenario ) ] }; - Add (menu); var statusBar = new StatusBar ( [ new (Application.QuitKey, "Quit", () => Application.RequestStop ()), new (Key.R.WithCtrl, "Run Worker", RunWorker) ]); - Add (statusBar); - var workerLogTop = new Toplevel { Title = "Worker Log Top" }; + var workerLogTop = new Toplevel + { + Title = "Worker Log Top", + }; workerLogTop.Add ( new Label { X = Pos.Center (), Y = 0, Text = "Worker Log" } @@ -81,7 +82,11 @@ public class SingleBackgroundWorker : Scenario Source = new ListWrapper (_log) }; workerLogTop.Add (_listLog); - Add (workerLogTop); + + workerLogTop.Y = 1; + workerLogTop.Height = Dim.Fill (Dim.Func (() => statusBar.Frame.Height)); + + Add (menu, workerLogTop, statusBar); Title = "MainApp"; } diff --git a/UnitTests/Views/StatusBarTests.cs b/UnitTests/Views/StatusBarTests.cs index 14866a154..2622d807f 100644 --- a/UnitTests/Views/StatusBarTests.cs +++ b/UnitTests/Views/StatusBarTests.cs @@ -139,55 +139,55 @@ public class StatusBarTests Assert.Equal (1, sb.Frame.Height); } - [Fact] - public void RemoveAndThenAddStatusBar_ShouldNotChangeWidth () - { - StatusBar statusBar; - StatusBar statusBar2; + //[Fact] + //public void RemoveAndThenAddStatusBar_ShouldNotChangeWidth () + //{ + // StatusBar statusBar; + // StatusBar statusBar2; - var w = new Window (); - statusBar2 = new StatusBar () { Id = "statusBar2" }; - statusBar = new StatusBar () { Id = "statusBar" }; - w.Width = Dim.Fill (0); - w.Height = Dim.Fill (0); - w.X = 0; - w.Y = 0; + // var w = new Window (); + // statusBar2 = new StatusBar () { Id = "statusBar2" }; + // statusBar = new StatusBar () { Id = "statusBar" }; + // w.Width = Dim.Fill (0); + // w.Height = Dim.Fill (0); + // w.X = 0; + // w.Y = 0; - w.Visible = true; - w.Modal = false; - w.Title = ""; - statusBar.Width = Dim.Fill (0); - statusBar.Height = 1; - statusBar.X = 0; - statusBar.Y = 0; - statusBar.Visible = true; - w.Add (statusBar); - Assert.Equal (w.StatusBar, statusBar); + // w.Visible = true; + // w.Modal = false; + // w.Title = ""; + // statusBar.Width = Dim.Fill (0); + // statusBar.Height = 1; + // statusBar.X = 0; + // statusBar.Y = 0; + // statusBar.Visible = true; + // w.Add (statusBar); + // Assert.Equal (w.StatusBar, statusBar); - statusBar2.Width = Dim.Fill (0); - statusBar2.Height = 1; - statusBar2.X = 0; - statusBar2.Y = 4; - statusBar2.Visible = true; - w.Add (statusBar2); - Assert.Equal (w.StatusBar, statusBar2); + // statusBar2.Width = Dim.Fill (0); + // statusBar2.Height = 1; + // statusBar2.X = 0; + // statusBar2.Y = 4; + // statusBar2.Visible = true; + // w.Add (statusBar2); + // Assert.Equal (w.StatusBar, statusBar2); - var menuBars = w.Subviews.OfType ().ToArray (); - Assert.Equal (2, menuBars.Length); + // var menuBars = w.Subviews.OfType ().ToArray (); + // Assert.Equal (2, menuBars.Length); - Assert.Equal (Dim.Fill (0), menuBars [0].Width); - Assert.Equal (Dim.Fill (0), menuBars [1].Width); + // Assert.Equal (Dim.Fill (0), menuBars [0].Width); + // Assert.Equal (Dim.Fill (0), menuBars [1].Width); - // Goes wrong here - w.Remove (statusBar); - w.Remove (statusBar2); + // // Goes wrong here + // w.Remove (statusBar); + // w.Remove (statusBar2); - w.Add (statusBar); - w.Add (statusBar2); + // w.Add (statusBar); + // w.Add (statusBar2); - // These assertions fail - Assert.Equal (Dim.Fill (0), menuBars [0].Width); - Assert.Equal (Dim.Fill (0), menuBars [1].Width); - } + // // These assertions fail + // Assert.Equal (Dim.Fill (0), menuBars [0].Width); + // Assert.Equal (Dim.Fill (0), menuBars [1].Width); + //} } diff --git a/UnitTests/Views/ToplevelTests.cs b/UnitTests/Views/ToplevelTests.cs index d491aeb9b..227bf6e94 100644 --- a/UnitTests/Views/ToplevelTests.cs +++ b/UnitTests/Views/ToplevelTests.cs @@ -15,7 +15,7 @@ public partial class ToplevelTests (ITestOutputHelper output) Assert.False (top.Running); Assert.False (top.Modal); Assert.Null (top.MenuBar); - Assert.Null (top.StatusBar); + //Assert.Null (top.StatusBar); } [Fact] @@ -45,55 +45,55 @@ public partial class ToplevelTests (ITestOutputHelper output) top.Add (new MenuBar ()); Assert.NotNull (top.MenuBar); - top.Add (new StatusBar ()); - Assert.NotNull (top.StatusBar); + //top.Add (new StatusBar ()); + //Assert.NotNull (top.StatusBar); var menuBar = top.MenuBar; top.Remove (top.MenuBar); Assert.Null (top.MenuBar); Assert.NotNull (menuBar); - var statusBar = top.StatusBar; - top.Remove (top.StatusBar); - Assert.Null (top.StatusBar); - Assert.NotNull (statusBar); + //var statusBar = top.StatusBar; + //top.Remove (top.StatusBar); + //Assert.Null (top.StatusBar); + //Assert.NotNull (statusBar); #if DEBUG_IDISPOSABLE Assert.False (menuBar.WasDisposed); - Assert.False (statusBar.WasDisposed); + //Assert.False (statusBar.WasDisposed); menuBar.Dispose (); - statusBar.Dispose (); + //statusBar.Dispose (); Assert.True (menuBar.WasDisposed); - Assert.True (statusBar.WasDisposed); + //Assert.True (statusBar.WasDisposed); #endif Application.Begin (top); Assert.Equal (top, Application.Top); // Application.Top without menu and status bar. - View supView = View.GetLocationEnsuringFullVisibility (top, 2, 2, out int nx, out int ny, out StatusBar sb); + View supView = View.GetLocationEnsuringFullVisibility (top, 2, 2, out int nx, out int ny/*, out StatusBar sb*/); Assert.Equal (Application.Top, supView); Assert.Equal (0, nx); Assert.Equal (0, ny); - Assert.Null (sb); + //Assert.Null (sb); top.Add (new MenuBar ()); Assert.NotNull (top.MenuBar); // Application.Top with a menu and without status bar. - View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); Assert.Equal (1, ny); - Assert.Null (sb); + //Assert.Null (sb); - top.Add (new StatusBar ()); - Assert.NotNull (top.StatusBar); + //top.Add (new StatusBar ()); + //Assert.NotNull (top.StatusBar); // Application.Top with a menu and status bar. - View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); // The available height is lower than the Application.Top height minus // the menu bar and status bar, then the top can go beyond the bottom Assert.Equal (2, ny); - Assert.NotNull (sb); + //Assert.NotNull (sb); menuBar = top.MenuBar; top.Remove (top.MenuBar); @@ -101,18 +101,18 @@ public partial class ToplevelTests (ITestOutputHelper output) Assert.NotNull (menuBar); // Application.Top without a menu and with a status bar. - View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (top, 2, 2, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); // The available height is lower than the Application.Top height minus // the status bar, then the top can go beyond the bottom Assert.Equal (2, ny); - Assert.NotNull (sb); + //Assert.NotNull (sb); - statusBar = top.StatusBar; - top.Remove (top.StatusBar); - Assert.Null (top.StatusBar); - Assert.NotNull (statusBar); + //statusBar = top.StatusBar; + //top.Remove (top.StatusBar); + //Assert.Null (top.StatusBar); + //Assert.NotNull (statusBar); Assert.Null (top.MenuBar); var win = new Window { Width = Dim.Fill (), Height = Dim.Fill () }; @@ -120,46 +120,46 @@ public partial class ToplevelTests (ITestOutputHelper output) top.LayoutSubviews (); // The SuperView is always the same regardless of the caller. - supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny, out sb); + supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny/*, out sb*/); Assert.Equal (Application.Top, supView); - supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny, out sb); + supView = View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny/*, out sb*/); Assert.Equal (Application.Top, supView); // Application.Top without menu and status bar. - View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); Assert.Equal (0, ny); - Assert.Null (sb); + //Assert.Null (sb); top.Add (new MenuBar ()); Assert.NotNull (top.MenuBar); // Application.Top with a menu and without status bar. - View.GetLocationEnsuringFullVisibility (win, 2, 2, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (win, 2, 2, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); Assert.Equal (1, ny); - Assert.Null (sb); + //Assert.Null (sb); top.Add (new StatusBar ()); - Assert.NotNull (top.StatusBar); + //Assert.NotNull (top.StatusBar); // Application.Top with a menu and status bar. - View.GetLocationEnsuringFullVisibility (win, 30, 20, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (win, 30, 20, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); // The available height is lower than the Application.Top height minus // the menu bar and status bar, then the top can go beyond the bottom Assert.Equal (20, ny); - Assert.NotNull (sb); + //Assert.NotNull (sb); menuBar = top.MenuBar; - statusBar = top.StatusBar; + //statusBar = top.StatusBar; top.Remove (top.MenuBar); Assert.Null (top.MenuBar); Assert.NotNull (menuBar); - top.Remove (top.StatusBar); - Assert.Null (top.StatusBar); - Assert.NotNull (statusBar); + //top.Remove (top.StatusBar); + //Assert.Null (top.StatusBar); + //Assert.NotNull (statusBar); top.Remove (win); @@ -167,28 +167,28 @@ public partial class ToplevelTests (ITestOutputHelper output) top.Add (win); // Application.Top without menu and status bar. - View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (win, 0, 0, out nx, out ny/*, out sb*/); Assert.Equal (0, nx); Assert.Equal (0, ny); - Assert.Null (sb); + //Assert.Null (sb); top.Add (new MenuBar ()); Assert.NotNull (top.MenuBar); // Application.Top with a menu and without status bar. - View.GetLocationEnsuringFullVisibility (win, 2, 2, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (win, 2, 2, out nx, out ny/*, out sb*/); Assert.Equal (2, nx); Assert.Equal (2, ny); - Assert.Null (sb); + //Assert.Null (sb); top.Add (new StatusBar ()); - Assert.NotNull (top.StatusBar); + //Assert.NotNull (top.StatusBar); // Application.Top with a menu and status bar. - View.GetLocationEnsuringFullVisibility (win, 30, 20, out nx, out ny, out sb); + View.GetLocationEnsuringFullVisibility (win, 30, 20, out nx, out ny/*, out sb*/); Assert.Equal (20, nx); // 20+60=80 Assert.Equal (9, ny); // 9+15+1(mb)=25 - Assert.NotNull (sb); + //Assert.NotNull (sb); //Assert.Null (Toplevel._dragPosition); win.NewMouseEvent (new () { Position = new (6, 0), Flags = MouseFlags.Button1Pressed }); @@ -204,18 +204,18 @@ public partial class ToplevelTests (ITestOutputHelper output) #if DEBUG_IDISPOSABLE Assert.False (top.MenuBar.WasDisposed); - Assert.False (top.StatusBar.WasDisposed); + //Assert.False (top.StatusBar.WasDisposed); #endif menuBar = top.MenuBar; - statusBar = top.StatusBar; + //statusBar = top.StatusBar; top.Dispose (); Assert.Null (top.MenuBar); - Assert.Null (top.StatusBar); + //Assert.Null (top.StatusBar); Assert.NotNull (menuBar); - Assert.NotNull (statusBar); + //Assert.NotNull (statusBar); #if DEBUG_IDISPOSABLE Assert.True (menuBar.WasDisposed); - Assert.True (statusBar.WasDisposed); + //Assert.True (statusBar.WasDisposed); #endif } @@ -1191,14 +1191,14 @@ public partial class ToplevelTests (ITestOutputHelper output) #endif tl.Add (mb, sb); Assert.NotNull (tl.MenuBar); - Assert.NotNull (tl.StatusBar); + //Assert.NotNull (tl.StatusBar); #if DEBUG Assert.False (mb.WasDisposed); Assert.False (sb.WasDisposed); #endif tl.RemoveAll (); Assert.Null (tl.MenuBar); - Assert.Null (tl.StatusBar); + //Assert.Null (tl.StatusBar); #if DEBUG Assert.False (mb.WasDisposed); Assert.False (sb.WasDisposed);