Class: RSpecTelemetry::Trace::Viewer::App
- Inherits:
-
Object
- Object
- RSpecTelemetry::Trace::Viewer::App
- 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
-
#detail_scroll ⇒ Object
readonly
Returns the value of attribute detail_scroll.
Instance Method Summary collapse
- #cursor ⇒ Object
- #focus ⇒ Object
- #follow ⇒ Object
- #go_to(index) ⇒ Object
-
#initialize(document, depth: TuiTui::ColorDepth.detect, source: nil, follow: false, base_dir: nil, source_root: Dir.pwd) ⇒ App
constructor
A new instance of App.
- #layout(size) ⇒ Object
- #open_modal(widget, &on_result) ⇒ Object
- #redraw?(event) ⇒ Boolean
- #update(event) ⇒ Object
- #view(ctx) ⇒ Object
- #wants_tick? ⇒ Boolean
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_scroll ⇒ Object (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
#cursor ⇒ Object
75 |
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 75 def cursor = @list.cursor |
#focus ⇒ Object
46 |
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 46 def focus = @focus_ring.current |
#follow ⇒ Object
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. && !@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(, &on_result) @modal = @on_result = on_result end |
#redraw?(event) ⇒ 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
77 |
# File 'lib/rspec_telemetry/trace/viewer/app.rb', line 77 def wants_tick? = @follow_ctl.wants_tick? |