public static Promise <DialogOption> Pick(ConsoleString message, IEnumerable <DialogOption> options, bool allowEscapeToCancel = true, int maxHeight = 12) { var deferred = Deferred <DialogOption> .Create(); ConsoleApp.AssertAppThread(); ConsolePanel dialogContent = new StackPanel() { }; Dialog dialog = new Dialog(dialogContent); dialog.MaxHeight = maxHeight; dialog.AllowEscapeToCancel = allowEscapeToCancel; Grid optionsGrid = dialogContent.Add(new Grid(options.Select(o => o as object).ToList())).Fill(); optionsGrid.MoreDataMessage = "More options below".ToYellow(); optionsGrid.EndOfDataMessage = "End of menu"; optionsGrid.VisibleColumns.Remove(optionsGrid.VisibleColumns.Where(v => v.ColumnName.ToString() == nameof(DialogOption.Id)).Single()); optionsGrid.VisibleColumns[0].WidthPercentage = 1; optionsGrid.VisibleColumns[0].ColumnDisplayName = message.IsUnstyled ? message.ToYellow() : message; optionsGrid.VisibleColumns[0].OverflowBehavior = new TruncateOverflowBehavior(); (optionsGrid.VisibleColumns[0].OverflowBehavior as TruncateOverflowBehavior).ColumnWidth = 0; DialogOption result = null; optionsGrid.SelectedItemActivated += () => { result = optionsGrid.SelectedItem as DialogOption; ConsoleApp.Current.LayoutRoot.Controls.Remove(dialog); }; dialog.RemovedFromVisualTree.SubscribeForLifetime(() => { deferred.Resolve(result); }, dialog); ConsoleApp.Current.LayoutRoot.Controls.Add(dialog); return(deferred.Promise); }
internal override ConsoleControl GetContent() { if (Options == null) { throw new ArgumentException("Options cannot be null"); } if (Mode == DialogButtonsPresentationMode.Grid && Options.Count == 0) { throw new ArgumentException("You need to specify at least one button for grid mode"); } if (Mode == DialogButtonsPresentationMode.Buttons) { ConsolePanel dialogContent = new ConsolePanel(); ScrollablePanel messagePanel = dialogContent.Add(new ScrollablePanel()).Fill(padding: new Thickness(0, 0, 1, 3)); Label messageLabel = messagePanel.ScrollableContent.Add(new Label() { Mode = LabelRenderMode.MultiLineSmartWrap, Text = Message }).FillHorizontally(padding: new Thickness(3, 3, 0, 0)); if (Options.Count > 0) { StackPanel buttonPanel = dialogContent.Add(new StackPanel() { Margin = 1, Height = 1, Orientation = Orientation.Horizontal }).FillHorizontally(padding: new Thickness(1, 0, 0, 0)).DockToBottom(padding: 1); foreach (var option in Options) { var myOption = option; Button b = new Button() { Text = option.DisplayText }; b.Pressed.SubscribeOnce(() => { SelectedOption = myOption; Dialog.Dismiss(); }); buttonPanel.Controls.Add(b); } buttonPanel.Controls.Last().AddedToVisualTree.SubscribeOnce(() => buttonPanel.Application.InvokeNextCycle(() => { buttonPanel.Controls.Last().TryFocus(); })); } return(dialogContent); } else { Grid optionsGrid = new Grid(Options.Select(o => o as object).ToList()); optionsGrid.MoreDataMessage = "More options below".ToYellow(); optionsGrid.EndOfDataMessage = "End of menu"; optionsGrid.VisibleColumns.Remove(optionsGrid.VisibleColumns.Where(v => v.ColumnName.ToString() == nameof(DialogOption.Id)).Single()); optionsGrid.VisibleColumns[0].WidthPercentage = 1; optionsGrid.VisibleColumns[0].ColumnDisplayName = Message.IsUnstyled ? Message.ToYellow() : Message; optionsGrid.VisibleColumns[0].OverflowBehavior = new TruncateOverflowBehavior(); (optionsGrid.VisibleColumns[0].OverflowBehavior as TruncateOverflowBehavior).ColumnWidth = 0; optionsGrid.SelectedItemActivated += () => { this.SelectedOption = optionsGrid.SelectedItem as DialogOption; Dialog.Dismiss(); }; optionsGrid.AddedToVisualTree.SubscribeOnce(() => optionsGrid.Application.InvokeNextCycle(() => { optionsGrid.TryFocus(); })); return(optionsGrid); } }