|
256 | 256 | function move_down!(m::AbstractMenu, cursor::Int, lastoption::Int=numoptions(m)) |
257 | 257 | if cursor < lastoption |
258 | 258 | cursor += 1 # move selection down |
259 | | - if m.pagesize + m.pageoffset <= cursor < lastoption |
| 259 | + pagepos = m.pagesize + m.pageoffset |
| 260 | + if pagepos <= cursor && pagepos < lastoption |
260 | 261 | m.pageoffset += 1 # scroll page down |
261 | 262 | end |
262 | 263 | elseif scroll_wrap(m) |
@@ -315,17 +316,23 @@ function printmenu(out, m::AbstractMenu, cursoridx::Int; oldstate=nothing, init: |
315 | 316 | # clearline |
316 | 317 | print(buf, "\x1b[2K") |
317 | 318 |
|
318 | | - if i == firstline && m.pageoffset > 0 |
319 | | - print_arrow(buf, m, up_arrow(m)) |
320 | | - elseif i == lastline && i != lastoption |
321 | | - print_arrow(buf, m, down_arrow(m)) |
| 319 | + upscrollable = i == firstline && m.pageoffset > 0 |
| 320 | + downscrollable = i == lastline && i != lastoption |
| 321 | + |
| 322 | + if upscrollable && downscrollable |
| 323 | + print(buf, updown_arrow(m)) |
| 324 | + elseif upscrollable |
| 325 | + print(buf, up_arrow(m)) |
| 326 | + elseif downscrollable |
| 327 | + print(buf, down_arrow(m)) |
322 | 328 | else |
323 | | - printcursor(buf, m, i == cursoridx) |
| 329 | + print(buf, ' ') |
324 | 330 | end |
325 | 331 |
|
| 332 | + printcursor(buf, m, i == cursoridx) |
326 | 333 | writeline(buf, m, i, i == cursoridx) |
327 | 334 |
|
328 | | - i != lastline && print(buf, "\r\n") |
| 335 | + (firstline == lastline || i != lastline) && print(buf, "\r\n") |
329 | 336 | end |
330 | 337 |
|
331 | 338 | newstate = lastline-firstline # final line doesn't have `\n` |
@@ -362,10 +369,12 @@ down_arrow(c::AbstractConfig) = down_arrow(c.config) |
362 | 369 | down_arrow(c::Config) = c.down_arrow |
363 | 370 | down_arrow(::AbstractMenu) = CONFIG[:down_arrow] |
364 | 371 |
|
365 | | -print_arrow(buf, ::ConfiguredMenu, c::Char) = print(buf, c, " ") |
366 | | -print_arrow(buf, ::AbstractMenu, c::Char) = print(buf, c) |
| 372 | +updown_arrow(m::ConfiguredMenu) = updown_arrow(m.config) |
| 373 | +updown_arrow(c::AbstractConfig) = updown_arrow(c.config) |
| 374 | +updown_arrow(c::Config) = c.updown_arrow |
| 375 | +updown_arrow(::AbstractMenu) = CONFIG[:updown_arrow] |
367 | 376 |
|
368 | | -printcursor(buf, m::ConfiguredMenu, iscursor::Bool) = print(buf, ' ', iscursor ? cursor(m.config) : ' ', ' ') |
| 377 | +printcursor(buf, m::ConfiguredMenu, iscursor::Bool) = print(buf, iscursor ? cursor(m.config) : ' ', ' ') |
369 | 378 | cursor(c::AbstractConfig) = cursor(c.config) |
370 | 379 | cursor(c::Config) = c.cursor |
371 | | -printcursor(buf, ::AbstractMenu, ::Bool) = print(buf, ' ') # `writeLine` is expected to do the printing (get from CONFIG[:cursor]) |
| 380 | +printcursor(buf, ::AbstractMenu, ::Bool) = nothing # `writeLine` is expected to do the printing (get from CONFIG[:cursor]) |
0 commit comments