(&mut self, ui: &mut Ui, cfg: &DevfilerConfig, root: &FlameGraphNode)
| 180 | |
| 181 | impl FlameGraphWidget { |
| 182 | pub fn draw(&mut self, ui: &mut Ui, cfg: &DevfilerConfig, root: &FlameGraphNode) { |
| 183 | egui::Frame::canvas(ui.style()).show(ui, |ui| { |
| 184 | let size = ui.available_size_before_wrap(); |
| 185 | let (response, painter) = ui.allocate_painter(size, Sense::click_and_drag()); |
| 186 | |
| 187 | self.process_inputs(ui, size, &response, root); |
| 188 | |
| 189 | if self.filter != self.cached_filter { |
| 190 | self.matching_frames.clear(); |
| 191 | self.match_count = 0; |
| 192 | self.cached_filter = self.filter.clone(); |
| 193 | self.rebuild_matches = true; |
| 194 | } |
| 195 | |
| 196 | let to_screen = RectTransform::from_to( |
| 197 | Rect::from_min_size(self.origin, response.rect.size()), |
| 198 | response.rect, |
| 199 | ); |
| 200 | |
| 201 | let visible_x_range = Rangef::new(self.origin.x, self.origin.x + size.x); |
| 202 | let clicked = response.clicked() && !response.double_clicked(); |
| 203 | let ctrl_held = ui.input(|i| i.modifiers.ctrl); |
| 204 | let hover_pos = response.hover_pos(); |
| 205 | |
| 206 | // Check if we're in sandwich view mode |
| 207 | let is_sandwich_view = self.sandwich_view.is_some(); |
| 208 | if is_sandwich_view { |
| 209 | // Draw sandwich view: callers on top, selected in middle, callees on bottom |
| 210 | self.draw_sandwich_view( |
| 211 | ui.ctx(), |
| 212 | cfg, |
| 213 | &painter, |
| 214 | &to_screen, |
| 215 | visible_x_range, |
| 216 | hover_pos, |
| 217 | size, |
| 218 | ); |
| 219 | } else { |
| 220 | // Normal flamegraph view |
| 221 | self.draw_level( |
| 222 | ui.ctx(), |
| 223 | cfg, |
| 224 | &painter, |
| 225 | &to_screen, |
| 226 | visible_x_range, |
| 227 | hover_pos, |
| 228 | clicked, |
| 229 | ctrl_held, |
| 230 | Pos2::ZERO, |
| 231 | size.x * self.x_zoom, |
| 232 | root, |
| 233 | root, |
| 234 | ); |
| 235 | } |
| 236 | |
| 237 | self.rebuild_matches = false; |
| 238 | }); |
| 239 | } |
no test coverage detected