From 4a0f4e3730f7991195283952523bf5e30d085646 Mon Sep 17 00:00:00 2001 From: BDisp Date: Sun, 29 Mar 2020 21:59:13 +0100 Subject: [PATCH] Added StatusBar from pr #201 with a little change. --- Terminal.Gui/Views/StatusBar.cs | 126 ++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 Terminal.Gui/Views/StatusBar.cs diff --git a/Terminal.Gui/Views/StatusBar.cs b/Terminal.Gui/Views/StatusBar.cs new file mode 100644 index 000000000..adb619c28 --- /dev/null +++ b/Terminal.Gui/Views/StatusBar.cs @@ -0,0 +1,126 @@ +// +// StatusBar.cs: a statusbar for an application +// +// Authors: +// Miguel de Icaza (miguel@gnome.org) +// +// TODO: +// Add mouse support +// Uses internals of Application +using System; +using NStack; + +namespace Terminal.Gui +{ + /// + /// A statusbar item has a title, a shortcut aka hotkey, and an action to execute on activation. + /// Such an item is ment to be as part of the global hotkeys of the application, which are available in the current context of the screen. + /// The colour of the text will be changed after each ~. Having an statusbar item with a text of `~F1~ Help` will draw *F1* as shortcut and + /// *Help* as standard text. + /// + public class StatusItem + { + /// + /// Initializes a new . + /// + /// Shortcut to activate the item. + /// Title for the statusbar item. + /// Action to invoke when the staturbar item is activated. + public StatusItem(Key shortcut, ustring title, Action action) + { + Title = title ?? ""; + Shortcut = shortcut; + Action = action; + } + + /// + /// This is the global setting that can be used as a global shortcut to invoke the action on the menu. + /// + public Key Shortcut { get; } + + /// + /// Gets or sets the title. + /// + /// The title. + public ustring Title { get; } + + /// + /// Gets or sets the action to be invoked when the statusbar item is triggered + /// + /// Method to invoke. + public Action Action { get; } + }; + + /// + /// A statusbar for your application. + /// The statusbar should be context sensitive. This means, if the main menu and an open text editor are visible, the items probably shown will + /// be ~F1~ Help ~F2~ Save ~F3~ Load. While a dialog to ask a file to load is executed, the remaining commands will probably be ~F1~ Help. + /// So for each context must be a new instance of a statusbar. + /// + public class StatusBar : View + { + public StatusItem [] Items { get; set; } + + /// + /// Initializes a new instance of the class with the specified set of statusbar items. + /// It will be drawn in the lowest column of the terminal. + /// + /// A list of statusbar items. + public StatusBar(StatusItem [] items) : base() + { + X = 0; + Y = Application.Driver.Rows - 1; // TODO: using internals of Application + Width = Dim.Fill (); + Height = 1; + Items = items; + CanFocus = false; + ColorScheme = Colors.Menu; + } + + Attribute ToggleScheme(Attribute scheme) + { + var result = scheme==ColorScheme.Normal ? ColorScheme.HotNormal : ColorScheme.Normal; + Driver.SetAttribute(result); + return result; + } + + 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 (); + } + + Move (0, 0); + Driver.SetAttribute (ColorScheme.Normal); + for (int i = 0; i < Frame.Width; i++) + Driver.AddRune (' '); + + Move (1, 0); + var scheme = ColorScheme.Normal; + Driver.SetAttribute(scheme); + for(int i=0; i