内联视口标准 TUI 在退出时会擦除自身。你精心格式化的 CLI 输出会消失。用户会丢失他们的滚动历史。内联视口解决了这个问题。它们占据固定数量的行,渲染丰富的 UI,然后在完成时将输出保留在原位。非常适合微调器、菜单、进度指示器——任何短暂的丰富时刻。
class Spinner
def main
RatatuiRuby.run(viewport: :inline, height: 1) do |tui|
until connected?
status = tui.paragraph(text: "#{spin} 连接中...")
tui.draw { |frame| frame.render_widget(status, frame.area) }
return ending(tui, "已取消!", :red) if tui.poll_event.ctrl_c?
end
ending(tui, "已连接!", :green)
end
end
def ending(tui, message, color) = tui.draw do |frame| frame.render_widget(tui.paragraph(text: message, fg: color), frame.area) end
def initialize = (@frame, @finish = 0, Time.now + 2)
def connected? = Time.now >= @finish
def spin = SPINNER[(@frame += 1) % SPINNER.length]
SPINNER = %w[⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏]
end
Spinner.new.main; puts