فهرست منبع

ProfileViewer: Use the new multi-column tree model support in GTreeView

Put the sample count into a separate column. This is so neat :^)
Andreas Kling 5 سال پیش
والد
کامیت
5cd4fb4db2
3فایلهای تغییر یافته به همراه44 افزوده شده و 5 حذف شده
  1. 29 3
      DevTools/ProfileViewer/ProfileModel.cpp
  2. 9 0
      DevTools/ProfileViewer/ProfileModel.h
  3. 6 2
      DevTools/ProfileViewer/main.cpp

+ 29 - 3
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<ProfileNode*>(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 {};
 }

+ 9 - 0
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&);

+ 6 - 2
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);