← Docs Index • Getting Started
Direction: v5.x (source) → v6.x (target) Scope: only changes visible to the end user (public API).
In both v5.x and v6.x, controls are created through the PromptPlus.Controls accessor:
using PromptPlusLibrary;
var result = PromptPlus.Controls.Input("What is your name?").Run();
⚠️ Every code example in this guide uses
PromptPlus.Controls.<Control>(...). There is no directPromptPlus.<Control>(...)shortcut.
Run() returns ResultPrompt<T>, which exposes Content (the value) and IsAborted. It can also be deconstructed:
var result = PromptPlus.Controls.Input("Name").Run();
if (!result.IsAborted)
Console.WriteLine(result.Content);
// or, by deconstruction:
var (name, aborted) = PromptPlus.Controls.Input("Name").Run();
⚠️
ResultPrompt<T>has no.Valuemember — use.Content. (TheTableSelectcontrol wraps its payload inTableSelectResult<T>, which does have.Value; see TableSelect / TableMultiSelect.)
| Control | Link |
|---|---|
| Input / AutoComplete | migration/controls/input.md |
| Select / MultiSelect | migration/controls/select.md |
| KeyPress / Confirm | migration/controls/keypress.md |
| TableSelect / TableMultiSelect | migration/controls/tableselect.md |
| TreeSelect / TreeMultiSelect | migration/controls/treeselect.md |
| File / MultiFile | migration/controls/file.md |
| MultiTasks / Timer / Task | migration/controls/tasks.md |
| MaskEdit (all types) | migration/controls/maskedit.md |
| Slider / Calendar / Switch / ProgressBar / ChartBar | migration/controls/nochanges.md |
| v5.x | v6.x | Notes |
|---|---|---|
TableSelect<T>() |
TableSelect<T>() |
Unchanged; AddColumn reworked |
TableMultiSelect<T>() |
TableMultiSelect<T>() |
Unchanged; AddColumn reworked |
NodeTreeSelect<T>() |
TreeSelect<T>() |
Renamed; tree-building API reworked (AddRootNode/AddChildNode → Root/AddLast/AddFirst) |
NodeTreeMultiSelect<T>() |
TreeMultiSelect<T>() |
Renamed; same tree-building rework |
WaitProcess() |
MultiTasks() |
Renamed; AddTask fully reworked |
WaitTimer() |
Timer() |
Renamed; API fully reworked |
WaitCommand() |
Task() |
Renamed; CommandHandler replaced by a cancellable Action |
FileSelect() |
File() |
Renamed; visibility methods renamed |
FileMultiSelect() |
MultiFile() |
Renamed; new navigation methods added |
AutoComplete() |
Input().SuggestionHandler(func, autocomplete:false) |
Dedicated control removed; folded into Input |
InputEmacs() → IEmacs |
ConsolePlus.ReadLineEmacs(...) (ConsolePlus library) |
Emacs-style line editing moved out of PromptPlus into ConsolePlus |
AutoCompletein v5.x is a non-generic control (AutoComplete()), notAutoComplete<T>(). See Input / AutoComplete.
Emacs / ReadLine. v5.x had
PromptPlus.Controls.InputEmacs(...)(returningIEmacs). It was removed from PromptPlus in v6.x; equivalent Emacs-style line editing now lives in the sibling ConsolePlus library —ConsolePlus.ReadLineEmacs(...)/ReadInlineEmacs(...), theEnabledEmacsKeyBindings()/DisabledEmacsKeyBindings()toggles, and plainConsolePlus.ReadLine().
MaxWidth(byte) removedMaxWidth(byte) was removed from the public API in v6.x. In v5.x it existed on:
Input · AutoComplete · Select<T> · MultiSelect<T> · NodeTreeSelect<T> · NodeTreeMultiSelect<T> · FileSelect · FileMultiSelect · TableSelect<T> · TableMultiSelect<T> · ChartBar
The width is now managed automatically by the prompt’s answer area.
| Control v5.x | Method v5.x | Method v6.x | Detail |
|---|---|---|---|
Select<T> |
EqualItems(Func<T,T,bool>) |
DefaultMatchBy(Func<T,T,bool>) |
Renamed, same signature |
Select<T> / MultiSelect<T> |
OnlyView(bool) |
ViewOnly(bool) |
Renamed, same semantics |
Select<T> / MultiSelect<T> |
DefaultHistory(bool) |
UseDefaultHistory() |
Parameter dropped; always enables the default history |
MultiSelect<T> |
EqualItems(Func<T,T,bool>) |
DefaultMatchBy(Func<T,T,bool>) |
Renamed, same signature |
KeyPress |
AddKeyValid(key, modifiers, showtext) |
AddValidKey(key, modifiers, displayText) |
Method and parameter renamed |
WaitProcess → MultiTasks |
MaxDegreeProcess(byte) |
MaxDegreeOfParallelism(int) |
Renamed and type widened byte → int |
TableSelect / TableMultiSelect |
Layout(TableLayout) |
LayoutMode(TableLayoutMode) |
Renamed; enum renamed too |
TableSelect / TableMultiSelect |
HideHeaders(bool) |
HideElements(HideTable) |
Replaced by a flags enum that hides several regions |
FileSelect → File |
AcceptHiddenAttributes(bool) |
ShowHidden(bool) |
Renamed (same effect: true makes hidden entries visible) |
FileSelect → File |
AcceptSystemAttributes(bool) |
ShowSystem(bool) |
Renamed (same effect as above) |
File / MultiFile |
HideSizeInfo(bool) |
HideSize(bool) |
Renamed, same semantics |
WaitTimer → Timer |
IsCountDown(bool) |
DisplayMode(TimerDisplayMode) |
Replaced by an enum (Countdown/Elapsed) |
Slider / ProgressBar |
FracionalDig(byte) |
FractionalDigits(byte) |
Renamed (spelling fix); matches ChartBar.FractionalDigits |
Select / MultiSelect / Input / Slider / Switch / File / MultiFile |
EnabledHistory(string, Action<IHistoryOptions>?) |
EnableHistory(string, Action<IHistoryOptions>?) |
Renamed (grammar fix: enable, not “enabled”). Note: Secret has no history support at all, in either version |
| Enum | v5.x | v6.x | Notes |
|---|---|---|---|
SwitchStyles |
SliderOn / SliderOff |
SwitchOn / SwitchOff |
Style slots renamed to match the control |
ChartBarOrder |
LabelDec |
LabelDesc |
Spelling fix (descending) |
| Method | v5.x parameter | v6.x parameter |
|---|---|---|
Input.Default · Slider.Default · Switch.Default |
usedefaultHistory |
useDefaultHistory |
| Control v5.x | Method v5.x | Method v6.x | Detail |
|---|---|---|---|
Select<T> |
Filter(FilterMode, bool caseinsensitive) |
Filter(FilterMode) |
caseinsensitive parameter removed |
TableSelect / TableMultiSelect |
Filter(FilterMode, bool caseinsensitive) |
Filter(FilterMode, FilterTableMode) |
Second parameter changed from bool to enum FilterTableMode |
TableSelect / TableMultiSelect |
AddColumn(string title, int width, Func<T,string> rowvalue, TextAlignment rowAlignment, TextAlignment titleAlignment, bool titlereplaceswidth, int maxslidinglines) |
AddColumn(string header, Func<T,object> selector, Func<object,string>? formatter, int? width, ColumnAlignment alignment, bool isFilterable) |
Full rework — object selector, optional formatter, TextAlignment → ColumnAlignment, new isFilterable |
TableSelect / TableMultiSelect |
ChangeDescription(Func<T,int,int,string>) |
ChangeDescription(Func<T,string>) |
Row/column indices dropped |
WaitProcess → MultiTasks |
AddTask(TaskMode mode, string id, Action<object?,ExtraInfoProcess,CancellationToken> process, string? label, object? parameter) |
AddTask(string title, Func<IReadOnlyDictionary<string,object?>, CancellationToken, IDictionary<string,object?>?> handler, IDictionary<string,object?>? context, MultiTasksMode? mode) |
Full rework — ExtraInfoProcess removed, context as a dictionary, TaskMode → MultiTasksMode |
WaitProcess → MultiTasks |
Run() → ResultPrompt<StateProcess[]> |
Run() → ResultPrompt<StateMultiTasks> |
Return type changed |
WaitTimer → Timer |
duration passed to the factory: WaitTimer(int ms, …) / WaitTimer(TimeSpan, …) |
Timer().Duration(TimeSpan) / Duration(int seconds) |
Duration is now a fluent method |
WaitTimer → Timer |
ShowElapsedTime(int milliseconds, bool value) |
Removed | Time is displayed automatically; use Format(...) |
WaitTimer → Timer |
Run() → ResultPrompt<TimeSpan?> |
Run() → ResultPrompt<TimeSpan> |
No longer nullable |
WaitCommand → Task |
CommandHandler(Action commandaction) |
Action(Action<CancellationToken> handler) |
Renamed; handler now receives a CancellationToken |
WaitCommand → Task |
ShowElapsedTime(int milliseconds, bool value) |
ShowElapsedTime(bool value, string? format) |
Interval removed; optional display format added |
WaitCommand → Task |
Finish(string text) |
Finish(string finishtext, string? errortext) |
Optional error text added |
WaitCommand → Task |
Run() → ResultPrompt<Exception?> |
Run() → ResultPrompt<StateTask> |
Return type changed |
ProgressBar |
UpdateHandler(Action<HandlerProgressBar, CancellationToken>, KeyValuePair<string,object?>[]?) |
UpdateHandler(Action<ProgressBarEvent, CancellationToken>, IDictionary<string,object?>?) |
Event type HandlerProgressBar → ProgressBarEvent; context type changed |
| Control v5.x | Removed method | Impact |
|---|---|---|
Input / AutoComplete |
MaxWidth(byte) |
Width is now automatic |
KeyPress |
Timeout(TimeSpan/int, ConsoleKey, ConsoleModifiers?) |
No built-in timeout with a default key |
KeyPress |
ShowCountDown(bool) |
Countdown display not available |
KeyPress |
ShowInvalidKey(bool) |
Invalid-key display toggle not available |
KeyPress |
Spinner(SpinnersType) |
Spinner on KeyPress not available |
MultiSelect<T> |
HideCountSelected(bool) |
Selected-count is always shown |
WaitProcess → MultiTasks |
Finish(Func<IEnumerable<StateProcess>,string>) |
Dynamic finish text removed; see StopOnError(bool) |
WaitProcess → MultiTasks |
ChangeDescription(Func<IEnumerable<StateProcess>,string>) |
Dynamic aggregate description not available |
WaitProcess → MultiTasks |
IntervalUpdate(int) |
UI update interval not configurable |
WaitTimer → Timer |
ShowElapsedTime(int, bool) |
Elapsed display managed automatically |
ProgressBar |
IntervalUpdate(int) |
UI update interval not configurable |
FileSelect → File |
HideZeroEntries(bool) |
Empty folders are always shown |
FileSelect → File |
HideFilesBySize(long, long) |
Size filter not available (use PredicateChecked on MultiFile) |
FileSelect / FileMultiSelect |
EnabledSearchFilter(FilterMode) |
Built-in search filter not available (use SearchPattern) |
FileMultiSelect → MultiFile |
PredicateDisabled(Func<ItemFile,bool>) |
Per-item disable predicate not available |
NodeTree* |
DisableRecursiveCount(bool) |
Recursive child-count toggle not available |
NodeTree* |
HideCount(bool) / HideCountSelected(bool) |
Node-count display toggles not available |
NodeTree* |
PredicateDisabled(Func<T,bool>) |
Per-node disable predicate not available |
TableSelect / TableMultiSelect |
SeparatorRows(bool) |
Row separators not available |
ChartBar |
MaxWidth(byte) |
Width is now automatic |
| Control v5.x | Description | Status |
|---|---|---|
RemoteSelect<T1,T2>() |
Select with remote/paged loading | ❌ Removed — no replacement |
RemoteMultiSelect<T1,T2>() |
MultiSelect with remote/paged loading | ❌ Removed — no replacement |
NodeTreeRemoteSelect<T1,T2>() |
TreeSelect with remote node loading | ❌ Removed — no replacement |
NodeTreeRemoteMultiSelect<T1,T2>() |
TreeMultiSelect with remote node loading | ❌ Removed — no replacement |
⚠️ Applications that relied on remote/paged loading must load the data themselves and feed the
Select,MultiSelect,TreeSelectorTreeMultiSelectcontrols.
| Item | Description |
|---|---|
History(string filename) |
Direct management of persisted history — read, write and remove entries without needing an input control |
Timer()is not a new control — it is the renamedWaitTimer()with a reworked API.
| Control | New v6.x methods |
|---|---|
KeyPress |
ShowMessage(Func<ConsoleKeyInfo,string>) · ShowMessageAsync(...) |
Select<T> |
DefaultMatchBy · ViewOnly · UseDefaultHistory · ChangeDescriptionAsync · InteractionAsync · TextSelectorAsync · ExtraInfoAsync · PredicateSelectedAsync (x2) |
MultiSelect<T> |
DefaultMatchBy · ViewOnly · UseDefaultHistory · TextSelectorAsync · ExtraInfoAsync · ChangeDescriptionAsync · InteractionAsync · PredicateCheckedAsync (x2) |
Input |
SuggestionHandler(..., bool autocomplete) · SuggestionHandlerAsync(..., bool autocomplete) · MinimumSuggestionLength(byte) · PredicateValidAsync (x2) · ChangeDescriptionAsync |
TableSelect / TableMultiSelect |
DefaultMatchBy · ViewOnly · HorizontalScroll · ChangeDescriptionAsync · TextSelectorAsync · InteractionAsync · PredicateSelectedAsync (TableSelect) / PredicateCheckedAsync (TableMultiSelect) (x2) · (TableMultiSelect) EnableHistory · UseDefaultHistory |
TreeSelect / TreeMultiSelect |
ViewOnly · Filter · SelectLeafOnly/CheckLeafOnly · ShowFullPath · CascadeCheck (TreeMultiSelect) · ChangeDescriptionAsync · ExtraInfoAsync · InteractionAsync · PredicateSelectedAsync (TreeSelect) / PredicateCheckedAsync (TreeMultiSelect) (x2) |
MultiTasks |
AddTaskAsync · Interaction<T> · StopOnError(bool) · Mode(MultiTasksMode) |
Task |
ChangeDescription · ChangeDescriptionAsync · Context(IDictionary) · Culture(CultureInfo) · multiple Action/ActionAsync overloads |
Timer |
Duration(TimeSpan/int) · Format(string) · Culture(CultureInfo) · ChangeDescription · ChangeDescriptionAsync · DisplayMode(TimerDisplayMode) |
File / MultiFile |
SelectFilesOnly(bool) · ShowFullPath(bool) · (MultiFile) CascadeCheck · RecursiveMarkWithCtrlSpace · PredicateCheckedAsync (x2, MultiFile) |
Switch |
ChangeDescriptionAsync · OffValue(EmojiName, string) · OnValue(EmojiName, string) |
ProgressBar |
ChangeDescriptionAsync · UpdateHandlerAsync |
ChartBar |
PredicateSelectedAsync (x2) · ChangeDescriptionAsync |
Calendar |
PredicateSelectedAsync (x2) · ChangeDescriptionAsync · InteractionAsync · AddNotes |
| MaskEdit family | PredicateSelectedAsync (x2) on every type |
The MaskEdit factory methods (
MaskInteger,MaskLong,MaskDecimal,MaskDecimalCurrency,MaskDouble,MaskDoubleCurrency,MaskTime,MaskTimeOnly,MaskDate,MaskDateTime,MaskDateOnly,MaskEdit) already existed in v5.x — they are not new. See MaskEdit.