diff --git a/Userland/DevTools/Profiler/TimelineTrack.cpp b/Userland/DevTools/Profiler/TimelineTrack.cpp index b1b8f39c3f..96d7b181ae 100644 --- a/Userland/DevTools/Profiler/TimelineTrack.cpp +++ b/Userland/DevTools/Profiler/TimelineTrack.cpp @@ -75,26 +75,14 @@ void TimelineTrack::paint_event(GUI::PaintEvent& event) painter.fill_rect({ select_start_x, frame_thickness(), select_end_x - select_start_x, height() - frame_thickness() * 2 }, Color(0, 0, 0, 60)); painter.fill_rect({ select_hover_x, frame_thickness(), 1, height() - frame_thickness() * 2 }, Color::NamedColor::Black); - { - StringBuilder timeline_desc_builder; - - timeline_desc_builder.appendff("{} ({}), ", m_process.executable, m_process.pid); - - timeline_desc_builder.appendff("Time: {} ms", normalized_hover_time - start_of_trace); - if (normalized_start_time != normalized_end_time) { - auto start = normalized_start_time - start_of_trace; - auto end = normalized_end_time - start_of_trace; - timeline_desc_builder.appendff(", Selection: {} - {} ms", start, end); - } - const auto text = timeline_desc_builder.build(); - Gfx::IntRect rect { - frame_thickness() + 3, - frame_thickness() + 3, - font().width(text), - font().glyph_height() - }; - painter.draw_text(rect, text, font()); - } + auto text = String::formatted("{} ({})", m_process.executable, m_process.pid); + Gfx::IntRect text_rect { + frame_thickness() + 3, + frame_thickness() + 3, + font().width(text), + font().glyph_height() + }; + painter.draw_text(text_rect, text, font()); } u64 TimelineTrack::timestamp_at_x(int x) const diff --git a/Userland/DevTools/Profiler/TimelineView.h b/Userland/DevTools/Profiler/TimelineView.h index 11f3ba4529..b276ab950c 100644 --- a/Userland/DevTools/Profiler/TimelineView.h +++ b/Userland/DevTools/Profiler/TimelineView.h @@ -18,6 +18,8 @@ class TimelineView final : public GUI::Widget { public: virtual ~TimelineView() override; + Function on_selection_change; + bool is_selecting() const { return m_selecting; } u64 select_start_time() const { return m_select_start_time; } u64 select_end_time() const { return m_select_end_time; } @@ -25,23 +27,37 @@ public: void set_selecting(Badge, bool value) { + if (m_selecting == value) + return; m_selecting = value; - update(); } + void set_select_start_time(Badge, u64 value) { + if (m_select_start_time == value) + return; m_select_start_time = value; update(); + if (on_selection_change) + on_selection_change(); } void set_select_end_time(Badge, u64 value) { + if (m_select_end_time == value) + return; m_select_end_time = value; update(); + if (on_selection_change) + on_selection_change(); } void set_hover_time(Badge, u64 value) { + if (m_hover_time == value) + return; m_hover_time = value; update(); + if (on_selection_change) + on_selection_change(); } private: diff --git a/Userland/DevTools/Profiler/main.cpp b/Userland/DevTools/Profiler/main.cpp index b3c8aee35c..b908c9175b 100644 --- a/Userland/DevTools/Profiler/main.cpp +++ b/Userland/DevTools/Profiler/main.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -140,6 +141,28 @@ int main(int argc, char** argv) individual_sample_view.set_model(move(model)); }; + const u64 start_of_trace = profile->first_timestamp(); + const u64 end_of_trace = start_of_trace + profile->length_in_ms(); + const auto clamp_timestamp = [start_of_trace, end_of_trace](u64 timestamp) -> u64 { + return min(end_of_trace, max(timestamp, start_of_trace)); + }; + + auto& statusbar = main_widget.add(); + timeline_view->on_selection_change = [&] { + auto& view = *timeline_view; + StringBuilder builder; + u64 normalized_start_time = clamp_timestamp(min(view.select_start_time(), view.select_end_time())); + u64 normalized_end_time = clamp_timestamp(max(view.select_start_time(), view.select_end_time())); + u64 normalized_hover_time = clamp_timestamp(view.hover_time()); + builder.appendff("Time: {} ms", normalized_hover_time - start_of_trace); + if (normalized_start_time != normalized_end_time) { + auto start = normalized_start_time - start_of_trace; + auto end = normalized_end_time - start_of_trace; + builder.appendff(", Selection: {} - {} ms", start, end); + } + statusbar.set_text(builder.to_string()); + }; + auto menubar = GUI::Menubar::construct(); auto& file_menu = menubar->add_menu("&File"); file_menu.add_action(GUI::CommonActions::make_quit_action([&](auto&) { app->quit(); }));