// // 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