Skip to content

Commit 85893b2

Browse files
committed
Increase input performance on long menus
Optimize long menu rendering while navigating While there is input available, we don't need to re-render. Only re-render after the input buffer is empty
1 parent a6a233a commit 85893b2

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

PSMenu/Public/Show-Menu.ps1

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,34 +122,44 @@ function Show-Menu {
122122
$MenuHeight = 0
123123

124124
& $WriteMenu
125+
$NeedRendering = $false
126+
125127
While ($True) {
126128
If (Test-KeyEscape $VKeyCode) {
127129
Return $null
128130
}
129131

130-
if (Test-KeyEnter $VKeyCode) {
132+
If (Test-KeyEnter $VKeyCode) {
131133
Break
132134
}
133135

134-
# Read key when callback and available key, or no callback at all
135-
$VKeyCode = $null
136-
if ($null -eq $Callback -or [Console]::KeyAvailable) {
137-
$CurrentPress = Read-VKey
138-
$VKeyCode = $CurrentPress.VirtualKeyCode
139-
}
136+
# While there are
137+
Do {
138+
# Read key when callback and available key, or no callback at all
139+
$VKeyCode = $null
140+
if ($null -eq $Callback -or [Console]::KeyAvailable) {
141+
$CurrentPress = Read-VKey
142+
$VKeyCode = $CurrentPress.VirtualKeyCode
143+
}
140144

141-
If (Test-KeySpace $VKeyCode) {
142-
$CurrentSelection = Toggle-Selection $Position $CurrentSelection
143-
}
145+
If (Test-KeySpace $VKeyCode) {
146+
$CurrentSelection = Toggle-Selection $Position $CurrentSelection
147+
}
148+
149+
$Position = Get-PositionWithVKey -MenuItems $MenuItems -Position $Position -VKeyCode $VKeyCode
144150

145-
$Position = Get-PositionWithVKey -MenuItems $MenuItems -Position $Position -VKeyCode $VKeyCode
151+
If (!$(Test-KeyEscape $VKeyCode)) {
152+
[System.Console]::SetCursorPosition(0, [Math]::Max(0, [Console]::CursorTop - $MenuHeight))
153+
$NeedRendering = $true
154+
}
155+
} While ($null -eq $Callback -and [Console]::KeyAvailable);
146156

147-
If (!$(Test-KeyEscape $VKeyCode)) {
148-
[System.Console]::SetCursorPosition(0, [Math]::Max(0, [Console]::CursorTop - $MenuHeight))
157+
If ($NeedRendering) {
149158
& $WriteMenu
159+
$NeedRendering = $false
150160
}
151161

152-
if ($Callback) {
162+
If ($Callback) {
153163
& $Callback
154164

155165
Start-Sleep -Milliseconds 10

0 commit comments

Comments
 (0)