diff --git a/DevTools/ProfileViewer/ProfileModel.cpp b/DevTools/ProfileViewer/ProfileModel.cpp index 7390e5aa6d..f2caf8362d 100644 --- a/DevTools/ProfileViewer/ProfileModel.cpp +++ b/DevTools/ProfileViewer/ProfileModel.cpp @@ -63,17 +63,43 @@ int ProfileModel::row_count(const GModelIndex& index) const int ProfileModel::column_count(const GModelIndex&) const { - return 1; + return Column::__Count; +} + +String ProfileModel::column_name(int column) const +{ + switch (column) { + case Column::SampleCount: + return "# Samples"; + case Column::StackFrame: + return "Stack Frame"; + default: + ASSERT_NOT_REACHED(); + return {}; + } +} + +GModel::ColumnMetadata ProfileModel::column_metadata(int column) const +{ + if (column == Column::SampleCount) + return ColumnMetadata { 0, TextAlignment::CenterRight }; + return {}; } GVariant ProfileModel::data(const GModelIndex& index, Role role) const { auto* node = static_cast(index.internal_data()); if (role == Role::Icon) { - return m_frame_icon; + if (index.column() == Column::StackFrame) + return m_frame_icon; + return {}; } if (role == Role::Display) { - return String::format("%s (%u)", node->symbol().characters(), node->sample_count()); + if (index.column() == Column::SampleCount) + return node->sample_count(); + if (index.column() == Column::StackFrame) + return node->symbol(); + return {}; } return {}; } diff --git a/DevTools/ProfileViewer/ProfileModel.h b/DevTools/ProfileViewer/ProfileModel.h index c3312b61ea..cb64d1bdb8 100644 --- a/DevTools/ProfileViewer/ProfileModel.h +++ b/DevTools/ProfileViewer/ProfileModel.h @@ -11,14 +11,23 @@ public: return adopt(*new ProfileModel(profile)); } + enum Column { + SampleCount, + StackFrame, + __Count + }; + virtual ~ProfileModel() override; virtual int row_count(const GModelIndex& = GModelIndex()) const override; virtual int column_count(const GModelIndex& = GModelIndex()) const override; + virtual String column_name(int) const override; + virtual ColumnMetadata column_metadata(int) const override; virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; virtual GModelIndex index(int row, int column, const GModelIndex& parent = GModelIndex()) const override; virtual GModelIndex parent_index(const GModelIndex&) const override; virtual void update() override; + virtual int tree_column() const override { return Column::StackFrame; } private: explicit ProfileModel(Profile&); diff --git a/DevTools/ProfileViewer/main.cpp b/DevTools/ProfileViewer/main.cpp index 0ceca5bf68..0a4185bbe5 100644 --- a/DevTools/ProfileViewer/main.cpp +++ b/DevTools/ProfileViewer/main.cpp @@ -11,9 +11,11 @@ int main(int argc, char** argv) return 0; } - auto profile = Profile::load_from_file(argv[1]); + const char* path = argv[1]; + + auto profile = Profile::load_from_file(path); if (!profile) { - fprintf(stderr, "Unable to load profile '%s'\n", argv[1]); + fprintf(stderr, "Unable to load profile '%s'\n", path); return 1; } @@ -24,6 +26,8 @@ int main(int argc, char** argv) window->set_rect(100, 100, 800, 600); auto tree_view = GTreeView::construct(nullptr); + tree_view->set_headers_visible(true); + tree_view->set_size_columns_to_fit_content(true); tree_view->set_model(profile->model()); window->set_main_widget(tree_view);