Class: RSpecTelemetry::Trace::Viewer::App

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec_telemetry/trace/viewer/app.rb

Overview

Hosts shared TUI state; per-screen row behavior lives in Screen strategies.

Constant Summary collapse

WHEEL_ROWS =
3
REDRAW =
"\f"
HELP =
[
  ["1 / 2 / 3", "timeline / slowest examples / factories"],
  ["j / k   ↑ / ↓", "move"],
  ["Space / b", "page down / up"],
  ["g / G", "top / bottom"],
  ["n / N", "next / prev failure (timeline)"],
  ["Tab", "switch pane"],
  ["J / K", "scroll detail"],
  ["Enter", "fold / unfold this example"],
  ["z", "collapse to examples / expand"],
  ["f", "toggle follow"],
  ["/", "filter timeline"],
  ["a", "jump to example"],
  ["s", "toggle source pane"],
  ["S", "view full source"],
  ["mouse", "drag the divider / source header; wheel scrolls; click to focus"],
  ["Ctrl-L", "redraw the screen"],
  ["?", "this help"],
  ["q", "quit"]
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(document, depth: TuiTui::ColorDepth.detect, source: nil, follow: false, base_dir: nil, source_root: Dir.pwd) ⇒ App

Returns a new instance of App.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 49

def initialize(
  document,
  depth: TuiTui::ColorDepth.detect,
  source: nil,
  follow: false,
  base_dir: nil,
  source_root: Dir.pwd
)
  @document = document
  @follow_ctl = FollowController.new(source: source, active: follow)
  @source_view = SourceView.new(source_root: source_root, base_dir: base_dir)
  @renderer = AppRenderer.new
  @list = TuiTui::ScrollList.new
  @detail_scroll = 0
  @focus_ring = TuiTui::FocusRing.new(:timeline, :detail)
  @modal = nil
  @on_result = nil
  @quit_armed = false
  @resizer = PaneResizer.new
  @size = nil
  @source_visible = true
  @view = :timeline
  @timeline_screen = Screen::TimelineScreen.new(@document, @list)
  @screen = @timeline_screen
end

Instance Attribute Details

#detail_scrollObject (readonly)

Returns the value of attribute detail_scroll.



44
45
46
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 44

def detail_scroll
  @detail_scroll
end

Instance Method Details

#cursorObject



75
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 75

def cursor = @list.cursor

#focusObject



46
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 46

def focus = @focus_ring.current

#followObject



47
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 47

def follow = @follow_ctl.active?

#go_to(index) ⇒ Object



122
123
124
125
126
127
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 122

def go_to(index)
  @list.go_to(index)
  @detail_scroll = 0
  # Follow resumes only when the cursor is still parked at the tail.
  @follow_ctl.reset_stick(at_end: @list.at_end?)
end

#layout(size) ⇒ Object



106
107
108
109
110
111
112
113
114
115
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 106

def layout(size)
  # Draw and hit-testing both use this geometry to keep mouse handles aligned.
  Layout.compute(
    size: size,
    want_time_bar: @screen.time_bar? && !@document.end_wall_ms.nil?,
    want_source: @screen.source? && @source_visible,
    split_ratio: @resizer.split_ratio,
    source_rows: @resizer.source_rows
  )
end

#open_modal(widget, &on_result) ⇒ Object



117
118
119
120
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 117

def open_modal(widget, &on_result)
  @modal = widget
  @on_result = on_result
end

#redraw?(event) ⇒ Boolean

Returns:

  • (Boolean)


79
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 79

def redraw?(event) = event.is_a?(TuiTui::KeyEvent) && event.key == REDRAW

#update(event) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 81

def update(event)
  case event
  when TuiTui::KeyEvent
    @modal ? route_modal(event) : handle_key_event(event)
  when TuiTui::MouseEvent
    @modal ? route_modal(event) : handle_mouse(event)
  when TuiTui::ResizeEvent
    (@size = event.size) && self
  when TuiTui::TickEvent
    poll
  else
    self
  end
end

#view(ctx) ⇒ Object



96
97
98
99
100
101
102
103
104
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 96

def view(ctx)
  size = ctx.size
  chrome = ctx.chrome
  @size = size
  r = layout(size)
  result = @renderer.render(render_state(size, r, chrome))
  @detail_scroll = result.detail_scroll
  result.canvas
end

#wants_tick?Boolean

Returns:

  • (Boolean)


77
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 77

def wants_tick? = @follow_ctl.wants_tick?