diff --git a/Terminal.Gui/Views/Bar.cs b/Terminal.Gui/Views/Bar.cs index 2b1c11c26..f69579417 100644 --- a/Terminal.Gui/Views/Bar.cs +++ b/Terminal.Gui/Views/Bar.cs @@ -12,7 +12,10 @@ namespace Terminal.Gui; public class Bar : View { /// - public Bar () + public Bar () : this ([]) { } + + /// + public Bar (IEnumerable shortcuts) { CanFocus = true; @@ -23,12 +26,16 @@ public class Bar : View Initialized += Bar_Initialized; + foreach (Shortcut shortcut in shortcuts) + { + Add (shortcut); + } } private void Bar_Initialized (object sender, EventArgs e) { ColorScheme = Colors.ColorSchemes ["Menu"]; - AdjustSubviewBorders(); + AdjustSubviewBorders (); } /// @@ -44,7 +51,10 @@ public class Bar : View /// public Orientation Orientation { get; set; } = Orientation.Horizontal; - + /// + /// Gets or sets the for this . The default is . + /// + public AlignmentModes AlignmentModes { get; set; } = AlignmentModes.StartToEnd; public bool StatusBarStyle { get; set; } = true; @@ -52,7 +62,6 @@ public class Bar : View { base.Add (view); AdjustSubviewBorders (); - } /// @@ -62,6 +71,49 @@ public class Bar : View AdjustSubviewBorders (); } + + /// Inserts a in the specified index of . + /// The zero-based index at which item should be inserted. + /// The item to insert. + public void AddShortcutAt (int index, Shortcut item) + { + List savedSubViewList = Subviews.ToList (); + int count = savedSubViewList.Count; + RemoveAll (); + for (int i = 0; i < count; i++) + { + if (i == index) + { + Add (item); + } + Add (savedSubViewList [i]); + } + SetNeedsDisplay (); + } + + /// Removes a at specified index of . + /// The zero-based index of the item to remove. + /// The removed. + public Shortcut RemoveShortcut (int index) + { + View toRemove = null; + for (int i = 0; i < Subviews.Count; i++) + { + if (i == index) + { + toRemove = Subviews [i]; + } + } + + if (toRemove is { }) + { + Remove (toRemove); + SetNeedsDisplay (); + } + + return toRemove as Shortcut; + } + private void AdjustSubviewBorders () { for (var index = 0; index < Subviews.Count; index++) @@ -72,7 +124,6 @@ public class Bar : View barItem.SuperViewRendersLineCanvas = true; barItem.ColorScheme = ColorScheme; - if (!barItem.Visible) { continue; @@ -80,18 +131,20 @@ public class Bar : View if (StatusBarStyle) { - if (index == 0) - { - barItem.Border.Thickness = new Thickness (0, 0, 1, 0); - } + barItem.BorderStyle = LineStyle.Dashed; if (index == Subviews.Count - 1) { barItem.Border.Thickness = new Thickness (0, 0, 0, 0); } + else + { + barItem.Border.Thickness = new Thickness (0, 0, 1, 0); + } } else { + barItem.BorderStyle = LineStyle.None; if (index == 0) { barItem.Border.Thickness = new Thickness (1, 1, 1, 0); @@ -121,25 +174,33 @@ public class Bar : View continue; } - if (StatusBarStyle) + //if (StatusBarStyle) + //{ + // barItem.BorderStyle = LineStyle.Dashed; + //} + //else + //{ + // barItem.BorderStyle = LineStyle.None; + //} + + //if (index == Subviews.Count - 1) + //{ + // barItem.Border.Thickness = new Thickness (0, 0, 0, 0); + //} + //else + //{ + // barItem.Border.Thickness = new Thickness (0, 0, 1, 0); + //} + + if (barItem is Shortcut shortcut) { - barItem.BorderStyle = LineStyle.Dashed; + shortcut.X = Pos.Align (Alignment.Start, AlignmentModes); } else { - barItem.BorderStyle = LineStyle.None; + barItem.X = Pos.Align (Alignment.Start, AlignmentModes); } - - if (index == Subviews.Count - 1) - { - barItem.Border.Thickness = new Thickness (0, 0, 0, 0); - } - else - { - barItem.Border.Thickness = new Thickness (0, 0, 1, 0); - } - - barItem.X = Pos.Align (Alignment.Start, StatusBarStyle ? AlignmentModes.IgnoreFirstOrLast : 0); + barItem.Y = Pos.Center (); prevBarItem = barItem; } @@ -189,7 +250,7 @@ public class Bar : View else { // Align the view to the bottom of the previous view - barItem.Y = Pos.Bottom(prevBarItem); + barItem.Y = Pos.Bottom (prevBarItem); } prevBarItem = barItem; diff --git a/Terminal.Gui/Views/Shortcut.cs b/Terminal.Gui/Views/Shortcut.cs index 4b4c24d79..348a21029 100644 --- a/Terminal.Gui/Views/Shortcut.cs +++ b/Terminal.Gui/Views/Shortcut.cs @@ -53,14 +53,18 @@ public enum ShortcutStyles /// public class Shortcut : View { + /// - /// Creates a new instance of . + /// Creates a new instance of ; /// - public Shortcut () + /// + /// + /// + public Shortcut (Key key, string commandText, Action action, string helpText = null) { Id = "_shortcut"; - //HighlightStyle = HighlightStyle.Pressed; - //Highlight += Shortcut_Highlight; + HighlightStyle = HighlightStyle.Pressed; + Highlight += Shortcut_Highlight; CanFocus = true; Width = GetWidthDimAuto (); Height = Dim.Auto (DimAutoStyle.Content, 1); @@ -80,23 +84,24 @@ public class Shortcut : View HelpView.Id = "_helpView"; HelpView.CanFocus = false; - SetHelpViewDefaultLayout (); + HelpView.Text = helpText; Add (HelpView); KeyView.Id = "_keyView"; KeyView.CanFocus = false; - SetKeyViewDefaultLayout (); Add (KeyView); // If the user clicks anywhere on the Shortcut, other than the CommandView, invoke the Command MouseClick += Shortcut_MouseClick; HelpView.MouseClick += Shortcut_MouseClick; KeyView.MouseClick += Shortcut_MouseClick; - LayoutStarted += OnLayoutStarted; - Initialized += OnInitialized; + Key = key; + Title = commandText; + Action = action; + return; void OnInitialized (object sender, EventArgs e) @@ -112,17 +117,26 @@ public class Shortcut : View _minimumDimAutoWidth = Frame.Width; Width = savedDim; - //SetColorScheme (); + SetCommandViewDefaultLayout (); + SetHelpViewDefaultLayout (); + SetKeyViewDefaultLayout (); + + SetColorScheme (); } // Helper to set Width consistently Dim GetWidthDimAuto () { // TODO: PosAlign.CalculateMinDimension is a hack. Need to figure out a better way of doing this. - return Dim.Auto (DimAutoStyle.Content, maximumContentDim: Dim.Func (() => PosAlign.CalculateMinDimension (0, Subviews, Dimension.Width))); + return Dim.Auto (DimAutoStyle.Content, minimumContentDim: Dim.Func (() => PosAlign.CalculateMinDimension (0, Subviews, Dimension.Width)), maximumContentDim: Dim.Func (() => PosAlign.CalculateMinDimension (0, Subviews, Dimension.Width))); } } + /// + /// Creates a new instance of . + /// + public Shortcut () : this (Gui.Key.Empty, string.Empty, null) { } + /// /// Gets or sets the for this . The default is /// , which is ideal for status bars and toolbars. If set to , @@ -130,6 +144,23 @@ public class Shortcut : View /// public Orientation Orientation { get; set; } = Orientation.Horizontal; + private AlignmentModes _alignmentModes = AlignmentModes.StartToEnd | AlignmentModes.IgnoreFirstOrLast; + + /// + /// Gets or sets the for this . The default is . + /// + public AlignmentModes AlignmentModes + { + get => _alignmentModes; + set + { + _alignmentModes = value; + SetCommandViewDefaultLayout (); + SetHelpViewDefaultLayout (); + SetKeyViewDefaultLayout (); + } + } + public ShortcutStyles ShortcutStyle { get; set; } = ShortcutStyles.None; // When one of the subviews is "empty" we don't want to show it. So we @@ -211,7 +242,7 @@ public class Shortcut : View if (maxHelpWidth > 0) { - HelpView.X = Pos.Align (Alignment.End, AlignmentModes.IgnoreFirstOrLast); + HelpView.X = Pos.Align (Alignment.End, AlignmentModes); // Leverage Dim.Auto's max: HelpView.Width = Dim.Auto (DimAutoStyle.Text, maximumContentDim: maxHelpWidth); @@ -221,7 +252,9 @@ public class Shortcut : View else { // Reset to default + //SetCommandViewDefaultLayout(); SetHelpViewDefaultLayout (); + //SetKeyViewDefaultLayout (); } } } @@ -246,23 +279,23 @@ public class Shortcut : View { if (!_savedForeColor.HasValue) { - _savedForeColor = ColorScheme.Normal.Foreground; + _savedForeColor = base.ColorScheme.Normal.Foreground; } - var cs = new ColorScheme (ColorScheme) + var cs = new ColorScheme (base.ColorScheme) { - Normal = new (ColorScheme.Normal.Foreground.GetHighlightColor (), ColorScheme.Normal.Background) + Normal = new (ColorScheme.Normal.Foreground.GetHighlightColor (), base.ColorScheme.Normal.Background) }; - ColorScheme = cs; + base.ColorScheme = cs; } if (e.HighlightStyle == HighlightStyle.None && _savedForeColor.HasValue) { - var cs = new ColorScheme (ColorScheme) + var cs = new ColorScheme (base.ColorScheme) { - Normal = new (_savedForeColor.Value, ColorScheme.Normal.Background) + Normal = new (_savedForeColor.Value, base.ColorScheme.Normal.Background) }; - ColorScheme = cs; + base.ColorScheme = cs; } SuperView?.SetNeedsDisplay (); @@ -365,29 +398,8 @@ public class Shortcut : View _commandView = value; _commandView.Id = "_commandView"; - // TODO: Determine if it makes sense to allow the CommandView to be focusable. - // Right now, we don't set CanFocus to false here. - //_commandView.CanFocus = true; - - //// Bar will set the width of all CommandViews to the width of the widest CommandViews. - ////if (_commandView.Width == Dim.Absolute(0)) - //{ - // _commandView.Width = Dim.Auto (); - //} - - ////if (_commandView.Height == Dim.Absolute (0)) - //{ - // _commandView.Height = Dim.Auto (); - //} - - _commandView.X = Pos.Align (Alignment.End, AlignmentModes.IgnoreFirstOrLast); - _commandView.Y = 0; //Pos.Center (); - _commandView.MouseClick += Shortcut_MouseClick; _commandView.Accept += CommandViewAccept; - - _commandView.Margin.Thickness = GetMarginThickness (); - _commandView.HotKeyChanged += (s, e) => { if (e.NewKey != Key.Empty) @@ -401,6 +413,7 @@ public class Shortcut : View Title = _commandView.Text; + SetCommandViewDefaultLayout (); SetHelpViewDefaultLayout (); SetKeyViewDefaultLayout (); ShowHide (); @@ -431,6 +444,14 @@ public class Shortcut : View } } + private void SetCommandViewDefaultLayout () + { + CommandView.Margin.Thickness = GetMarginThickness (); + CommandView.X = Pos.Align (Alignment.End, AlignmentModes); + CommandView.Y = 0; //Pos.Center (), + } + + private void Shortcut_TitleChanged (object sender, StateEventArgs e) { // If the Title changes, update the CommandView text. @@ -451,7 +472,7 @@ public class Shortcut : View private void SetHelpViewDefaultLayout () { HelpView.Margin.Thickness = GetMarginThickness (); - HelpView.X = Pos.Align (Alignment.End, AlignmentModes.IgnoreFirstOrLast); + HelpView.X = Pos.Align (Alignment.End, AlignmentModes); HelpView.Y = 0; //Pos.Center (), HelpView.Width = Dim.Auto (DimAutoStyle.Text); HelpView.Height = CommandView?.IsAdded == true ? Dim.Height (CommandView) : 1; @@ -546,6 +567,7 @@ public class Shortcut : View private int _minimumKeyViewSize; + /// /// public int MinimumKeyViewSize @@ -572,7 +594,7 @@ public class Shortcut : View private void SetKeyViewDefaultLayout () { KeyView.Margin.Thickness = GetMarginThickness (); - KeyView.X = Pos.Align (Alignment.End, AlignmentModes.IgnoreFirstOrLast); + KeyView.X = Pos.Align (Alignment.End, AlignmentModes); //KeyView.Y = Pos.Center (); KeyView.Width = Dim.Auto (DimAutoStyle.Text, Dim.Func (GetMinimumKeyViewSize)); KeyView.Height = CommandView?.IsAdded == true ? Dim.Height (CommandView) : 1; @@ -631,25 +653,31 @@ public class Shortcut : View break; } - if (AcceptAction is null) - { - AcceptAction = () => - { - var args = new HandledEventArgs (); - Accept?.Invoke (this, args); - }; - } if (handled == false) { - AcceptAction.Invoke(); + var args = new HandledEventArgs (); + Accept?.Invoke (this, args); + + if (args.Handled is false) + { + Action?.Invoke (); + } + + args.Handled = true; } return true; } + /// + /// Gets or sets the action to be invoked when the shortcut key is pressed or the shortcut is clicked on with the mouse. + /// + /// + /// Note, the event is fired first, and if cancelled, will not be invoked. + /// [CanBeNull] - public Action AcceptAction { get; set; } + public Action Action { get; set; } #endregion Accept Handling @@ -673,7 +701,7 @@ public class Shortcut : View if (HasFocus) { - // When we have focus, we invert the SuperView's colors + // When we have focus, we invert the colors base.ColorScheme = new (base.ColorScheme) { Normal = base.ColorScheme.Focus, @@ -687,34 +715,16 @@ public class Shortcut : View base.ColorScheme = SuperView?.ColorScheme; } - //// If the command view is focusable, invert the focus colors - if (CommandView.CanFocus) + // Set KeyView's colors to show "hot" + if (IsInitialized) { - ColorScheme commandViewCS = new (base.ColorScheme) + var cs = new ColorScheme (base.ColorScheme) { - Normal = base.ColorScheme.Focus, - HotNormal = base.ColorScheme.HotFocus, - HotFocus = base.ColorScheme.HotNormal, - Focus = base.ColorScheme.Normal + Normal = base.ColorScheme.HotNormal, + HotNormal = base.ColorScheme.Normal }; - CommandView.ColorScheme = commandViewCS; + KeyView.ColorScheme = cs; } - else - { - CommandView.ColorScheme = base.ColorScheme; - } - - //HelpView.ColorScheme = base.ColorScheme; - - //// Set KeyView's colors to show "hot" - //var cs = new ColorScheme (ColorScheme) - //{ - // Normal = base.ColorScheme.HotNormal, - // HotNormal = base.ColorScheme.Normal - //}; - - //KeyView.ColorScheme = cs; - } /// @@ -727,8 +737,6 @@ public class Shortcut : View /// public override bool OnLeave (View view) { - // Reset the color scheme (to SuperView). - //ColorScheme = null; SetColorScheme (); return base.OnLeave (view); } diff --git a/Terminal.Gui/Views/StatusBar.cs b/Terminal.Gui/Views/StatusBar.cs index ba7f64fad..e5c26baff 100644 --- a/Terminal.Gui/Views/StatusBar.cs +++ b/Terminal.Gui/Views/StatusBar.cs @@ -9,60 +9,28 @@ namespace Terminal.Gui; /// public class StatusBar : Bar { + /// + public StatusBar () : this ([]) { } - public StatusBar () + /// + public StatusBar (IEnumerable shortcuts) : base (shortcuts) { Orientation = Orientation.Horizontal; Y = Pos.AnchorEnd (); Width = Dim.Fill (); + StatusBarStyle = true; } /// public override void Add (View view) { view.CanFocus = false; + if (view is Shortcut shortcut) + { + shortcut.KeyBindingScope = KeyBindingScope.Application; + shortcut.AlignmentModes = AlignmentModes.EndToStart | AlignmentModes.IgnoreFirstOrLast; + } base.Add (view); } - /// Inserts a in the specified index of . - /// The zero-based index at which item should be inserted. - /// The item to insert. - public void AddShortcutAt (int index, Shortcut item) - { - List savedSubViewList = Subviews.ToList (); - int count = savedSubViewList.Count; - RemoveAll (); - for (int i = 0; i < count; i++) - { - if (i == index) - { - Add (item); - } - Add (savedSubViewList [i]); - } - SetNeedsDisplay (); - } - - /// Removes a at specified index of . - /// The zero-based index of the item to remove. - /// The removed. - public Shortcut RemoveItem (int index) - { - View toRemove = null; - for (int i = 0; i < Subviews.Count; i++) - { - if (i == index) - { - toRemove = Subviews [i]; - } - } - - if (toRemove is { }) - { - Remove (toRemove); - SetNeedsDisplay (); - } - - return toRemove as Shortcut; - } } diff --git a/UICatalog/Scenarios/Bars.cs b/UICatalog/Scenarios/Bars.cs index c0449572a..9c310dfa2 100644 --- a/UICatalog/Scenarios/Bars.cs +++ b/UICatalog/Scenarios/Bars.cs @@ -135,7 +135,7 @@ public class Bars : Scenario // SetupMenuBar (); //SetupContentMenu (); - // SetupStatusBar (); + SetupStatusBar (); foreach (Bar barView in Application.Top.Subviews.Where (b => b is Bar)!) { diff --git a/UICatalog/Scenarios/ConfigurationEditor.cs b/UICatalog/Scenarios/ConfigurationEditor.cs index 99b664bd9..1e095a527 100644 --- a/UICatalog/Scenarios/ConfigurationEditor.cs +++ b/UICatalog/Scenarios/ConfigurationEditor.cs @@ -41,6 +41,7 @@ public class ConfigurationEditor : Scenario Application.Init (); Toplevel top = new (); + _tileView = new TileView (0) { Width = Dim.Fill (), Height = Dim.Fill (1), Orientation = Orientation.Vertical, LineStyle = LineStyle.Single @@ -57,25 +58,24 @@ public class ConfigurationEditor : Scenario { Key = Application.QuitKey, Title = $"{Application.QuitKey} Quit", - AcceptAction = Quit + Action = Quit }; var reloadShortcut = new Shortcut () { - Key = KeyCode.F5, + Key = Key.F5.WithShift, Title = "Reload", - AcceptAction = Reload }; + reloadShortcut.Accept += (s, e) => { Reload (); }; + var saveShortcut = new Shortcut () { - Key = Key.S.WithCtrl, + Key = Key.F4, Title = "Save", - AcceptAction = Save + Action = Save }; - - var statusBar = new StatusBar (); - statusBar.Add (quitShortcut, reloadShortcut, saveShortcut, _lenShortcut); + var statusBar = new StatusBar ([quitShortcut, reloadShortcut, saveShortcut, _lenShortcut]); top.Add (statusBar); diff --git a/UICatalog/Scenarios/CsvEditor.cs b/UICatalog/Scenarios/CsvEditor.cs index c230f5259..fe56cc658 100644 --- a/UICatalog/Scenarios/CsvEditor.cs +++ b/UICatalog/Scenarios/CsvEditor.cs @@ -1,11 +1,11 @@ using System; -using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using System.Linq; using System.Text.RegularExpressions; using CsvHelper; +using SixLabors.ImageSharp.ColorSpaces; using Terminal.Gui; namespace UICatalog.Scenarios; @@ -26,16 +26,23 @@ public class CsvEditor : Scenario private MenuItem _miCentered; private MenuItem _miLeft; private MenuItem _miRight; - private TextField _selectedCellLabel; + private TextField _selectedCellTextField; private TableView _tableView; - public override void Setup () + public override void Main () { - Win.Title = GetName (); - Win.Y = 1; // menu - Win.Height = Dim.Fill (1); // status bar + // Init + Application.Init (); - _tableView = new TableView { X = 0, Y = 0, Width = Dim.Fill (), Height = Dim.Fill (1) }; + // Setup - Create a top-level application window and configure it. + Toplevel appWindow = new () + { + Title = $"{GetName ()}" + }; + + //appWindow.Height = Dim.Fill (1); // status bar + + _tableView = new () { X = 0, Y = 1, Width = Dim.Fill (), Height = Dim.Fill (2) }; var fileMenu = new MenuBarItem ( "_File", @@ -53,99 +60,96 @@ public class CsvEditor : Scenario Menus = [ fileMenu, - new MenuBarItem ( - "_Edit", - new MenuItem [] - { - new ("_New Column", "", () => AddColumn ()), - new ("_New Row", "", () => AddRow ()), - new ( - "_Rename Column", - "", - () => RenameColumn () - ), - new ("_Delete Column", "", () => DeleteColum ()), - new ("_Move Column", "", () => MoveColumn ()), - new ("_Move Row", "", () => MoveRow ()), - new ("_Sort Asc", "", () => Sort (true)), - new ("_Sort Desc", "", () => Sort (false)) - } - ), - new MenuBarItem ( - "_View", - new [] - { - _miLeft = new MenuItem ( - "_Align Left", - "", - () => Align (Alignment.Start) - ), - _miRight = new MenuItem ( - "_Align Right", - "", - () => Align (Alignment.End) - ), - _miCentered = new MenuItem ( - "_Align Centered", - "", - () => Align (Alignment.Center) - ), + new ( + "_Edit", + new MenuItem [] + { + new ("_New Column", "", () => AddColumn ()), + new ("_New Row", "", () => AddRow ()), + new ( + "_Rename Column", + "", + () => RenameColumn () + ), + new ("_Delete Column", "", () => DeleteColum ()), + new ("_Move Column", "", () => MoveColumn ()), + new ("_Move Row", "", () => MoveRow ()), + new ("_Sort Asc", "", () => Sort (true)), + new ("_Sort Desc", "", () => Sort (false)) + } + ), + new ( + "_View", + new [] + { + _miLeft = new ( + "_Align Left", + "", + () => Align (Alignment.Start) + ), + _miRight = new ( + "_Align Right", + "", + () => Align (Alignment.End) + ), + _miCentered = new ( + "_Align Centered", + "", + () => Align (Alignment.Center) + ), - // Format requires hard typed data table, when we read a CSV everything is untyped (string) so this only works for new columns in this demo - _miCentered = new MenuItem ( - "_Set Format Pattern", - "", - () => SetFormat () - ) - } - ) + // Format requires hard typed data table, when we read a CSV everything is untyped (string) so this only works for new columns in this demo + _miCentered = new ( + "_Set Format Pattern", + "", + () => SetFormat () + ) + } + ) ] }; - Top.Add (menu); + appWindow.Add (menu); -#if V2_STATUSBAR - var statusBar = new StatusBar ( - new StatusItem [] - { - new ( - KeyCode.CtrlMask | KeyCode.O, - "~^O~ Open", - () => Open () - ), - new ( - KeyCode.CtrlMask | KeyCode.S, - "~^S~ Save", - () => Save () - ), - new ( - Application.QuitKey, - $"{Application.QuitKey} to Quit", - () => Quit () - ) - } - ); - Top.Add (statusBar); -#endif - - Win.Add (_tableView); - - _selectedCellLabel = new TextField + _selectedCellTextField = new () { - X = 0, - Y = Pos.Bottom (_tableView), Text = "0,0", - Width = Dim.Fill (), - TextAlignment = Alignment.End + Width = 10, + Height = 1, }; - _selectedCellLabel.TextChanged += SelectedCellLabel_TextChanged; + _selectedCellTextField.TextChanged += SelectedCellLabel_TextChanged; - Win.Add (_selectedCellLabel); + var statusBar = new StatusBar ( + [ + new (Application.QuitKey, "Quit", Quit, "Quit!"), + new (Key.O.WithCtrl, "Open", Open, "Open a file."), + new (Key.S.WithCtrl, "Save", Save, "Save current."), + new () + { + HelpText = "Cell:", + CommandView = _selectedCellTextField, + AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.IgnoreFirstOrLast, + Enabled = false + } + ]) + { + AlignmentModes = AlignmentModes.IgnoreFirstOrLast + }; + appWindow.Add (statusBar); + + appWindow.Add (_tableView); _tableView.SelectedCellChanged += OnSelectedCellChanged; _tableView.CellActivated += EditCurrentCell; _tableView.KeyDown += TableViewKeyPress; SetupScrollBar (); + + // Run - Start the application. + Application.Run (appWindow); + appWindow.Dispose (); + + // Shutdown - Calling Application.Shutdown is required. + Application.Shutdown (); } private void AddColumn () @@ -302,10 +306,10 @@ public class CsvEditor : Scenario var ok = new Button { Text = "Ok", IsDefault = true }; ok.Accept += (s, e) => - { - okPressed = true; - Application.RequestStop (); - }; + { + okPressed = true; + Application.RequestStop (); + }; var cancel = new Button { Text = "Cancel" }; cancel.Accept += (s, e) => { Application.RequestStop (); }; var d = new Dialog { Title = title, Buttons = [ok, cancel] }; @@ -427,9 +431,9 @@ public class CsvEditor : Scenario private void OnSelectedCellChanged (object sender, SelectedCellChangedEventArgs e) { // only update the text box if the user is not manually editing it - if (!_selectedCellLabel.HasFocus) + if (!_selectedCellTextField.HasFocus) { - _selectedCellLabel.Text = $"{_tableView.SelectedRow},{_tableView.SelectedColumn}"; + _selectedCellTextField.Text = $"{_tableView.SelectedRow},{_tableView.SelectedColumn}"; } if (_tableView.Table == null || _tableView.SelectedColumn == -1) @@ -448,7 +452,7 @@ public class CsvEditor : Scenario { var ofd = new FileDialog { - AllowedTypes = new List { new AllowedType ("Comma Separated Values", ".csv") } + AllowedTypes = new () { new AllowedType ("Comma Separated Values", ".csv") } }; ofd.Style.OkButtonText = "Open"; @@ -458,6 +462,7 @@ public class CsvEditor : Scenario { Open (ofd.Path); } + ofd.Dispose (); } @@ -498,7 +503,8 @@ public class CsvEditor : Scenario // Only set the current filename if we successfully loaded the entire file _currentFile = filename; - Win.Title = $"{GetName ()} - {Path.GetFileName (_currentFile)}"; + _selectedCellTextField.SuperView.Enabled = true; + Application.Top.Title = $"{GetName ()} - {Path.GetFileName (_currentFile)}"; } catch (Exception ex) { @@ -563,13 +569,13 @@ public class CsvEditor : Scenario private void SelectedCellLabel_TextChanged (object sender, StateEventArgs e) { // if user is in the text control and editing the selected cell - if (!_selectedCellLabel.HasFocus) + if (!_selectedCellTextField.HasFocus) { return; } // change selected cell to the one the user has typed into the box - Match match = Regex.Match (_selectedCellLabel.Text, "^(\\d+),(\\d+)$"); + Match match = Regex.Match (_selectedCellTextField.Text, "^(\\d+),(\\d+)$"); if (match.Success) { diff --git a/UICatalog/Scenarios/Editor.cs b/UICatalog/Scenarios/Editor.cs index 4d50e5199..73b14ffd0 100644 --- a/UICatalog/Scenarios/Editor.cs +++ b/UICatalog/Scenarios/Editor.cs @@ -237,29 +237,23 @@ public class Editor : Scenario }; _appWindow.Add (menu); -#if V2_STATUSBAR - var siCursorPosition = new StatusItem (KeyCode.Null, "", null); + var siCursorPosition = new Shortcut(KeyCode.Null, "", null); var statusBar = new StatusBar ( new [] { + new (Application.QuitKey, $"Quit", Quit), + new (Key.F2, "Open", Open), + new (Key.F3, "Save", () => Save ()), + new (Key.F4, "Save As", () => SaveAs ()), + new (Key.Empty, $"OS Clipboard IsSupported : {Clipboard.IsSupported}", null), siCursorPosition, - new (KeyCode.F2, "~F2~ Open", () => Open ()), - new (KeyCode.F3, "~F3~ Save", () => Save ()), - new (KeyCode.F4, "~F4~ Save As", () => SaveAs ()), - new ( - Application.QuitKey, - $"{Application.QuitKey} to Quit", - () => Quit () - ), - new ( - KeyCode.Null, - $"OS Clipboard IsSupported : {Clipboard.IsSupported}", - null - ) } - ); + ) + { + AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.IgnoreFirstOrLast + }; _textView.UnwrappedCursorPosition += (s, e) => { @@ -267,7 +261,6 @@ public class Editor : Scenario }; _appWindow.Add (statusBar); -#endif _scrollBar = new (_textView, true); diff --git a/UICatalog/Scenarios/Shortcuts.cs b/UICatalog/Scenarios/Shortcuts.cs index 2c63d3d8c..26292b76d 100644 --- a/UICatalog/Scenarios/Shortcuts.cs +++ b/UICatalog/Scenarios/Shortcuts.cs @@ -261,6 +261,8 @@ public class Shortcuts : Scenario hShortcut1.CommandView.Width = 10; hShortcut1.CommandView.Height = 1; hShortcut1.CommandView.CanFocus = false; + hShortcut1.AlignmentModes = AlignmentModes.EndToStart | AlignmentModes.IgnoreFirstOrLast; + Timer timer = new (10) { AutoReset = true, @@ -297,11 +299,12 @@ public class Shortcuts : Scenario X = Pos.Align (Alignment.Start, AlignmentModes.IgnoreFirstOrLast, 1), Y = Pos.Top (hShortcut1), Key = Key.F8, - HelpText = "Edit", + HelpText = "TextField", CanFocus = true, - BorderStyle = LineStyle.Dashed, CommandView = textField, + BorderStyle = LineStyle.Dashed, }; + hShortcut2.AlignmentModes = AlignmentModes.EndToStart | AlignmentModes.IgnoreFirstOrLast; hShortcut2.Border.Thickness = new (0, 0, 1, 0); Application.Top.Add (hShortcut2); @@ -331,6 +334,7 @@ public class Shortcuts : Scenario }; hShortcutBG.CommandView = bgColor; hShortcutBG.Border.Thickness = new (1, 0, 1, 0); + hShortcutBG.AlignmentModes = AlignmentModes.EndToStart | AlignmentModes.IgnoreFirstOrLast; Application.Top.Add (hShortcutBG); @@ -365,6 +369,9 @@ public class Shortcuts : Scenario }; } } + + ((CheckBox)vShortcut5.CommandView).OnToggled (); + ((CheckBox)vShortcut5.CommandView).OnToggled (); } private void Button_Clicked (object sender, EventArgs e) { MessageBox.Query ("Hi", $"You clicked {sender}"); } diff --git a/UICatalog/UICatalog.cs b/UICatalog/UICatalog.cs index 5c227c43a..ee9ab8fbc 100644 --- a/UICatalog/UICatalog.cs +++ b/UICatalog/UICatalog.cs @@ -347,6 +347,7 @@ internal class UICatalogApp // 'app' closed cleanly. foreach (Responder? inst in Responder.Instances) { + Debug.Assert (inst.WasDisposed); } @@ -457,14 +458,13 @@ internal class UICatalogApp StatusBar = new () { Visible = ShowStatusBar, + AlignmentModes = AlignmentModes.StartToEnd | AlignmentModes.IgnoreFirstOrLast }; Shortcut statusBarShortcut = new Shortcut () { Key = Key.F10, - KeyBindingScope = KeyBindingScope.Application, - Title = "Status Bar", - CanFocus = false, + Title = "Show/Hide Status Bar", }; statusBarShortcut.Accept += (sender, args) => { @@ -473,15 +473,13 @@ internal class UICatalogApp ShForce16Colors = new Shortcut () { - Key = Key.F6, - KeyBindingScope = KeyBindingScope.Application, - CommandView = new CheckBox() + CommandView = new CheckBox () { - Title ="16 Colors", + Title = "16 color mode", Checked = Application.Force16Colors, CanFocus = false, - }, - CanFocus = false, + }, HelpText = "", + Key = Key.F6, }; ShForce16Colors.Accept += (sender, args) => { @@ -508,8 +506,6 @@ internal class UICatalogApp { Title = "Quit", Key = Application.QuitKey, - KeyBindingScope = KeyBindingScope.Application, - CanFocus = false, }, statusBarShortcut, ShForce16Colors, @@ -542,7 +538,7 @@ internal class UICatalogApp X = Pos.Right (CategoryList) - 1, Y = 1, Width = Dim.Fill (), - Height = Dim.Height(CategoryList), + Height = Dim.Height (CategoryList), //AllowsMarking = false, CanFocus = true,