1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 15:15:08 +00:00
serenity/DevTools/ProfileViewer/main.cpp
Andreas Kling fe421bd7b4 ProfileViewer: Add the ability to invert the profile tree
Inverting the tree turns all of the innermost stack frames into roots,
allowing them to accumulate their total sample counts with other
instances of the same frame being innermost. This is an essential
feature of any cool profiler, and now we have it. :^)
2019-12-16 18:26:24 +01:00

66 lines
1.9 KiB
C++

#include "Profile.h"
#include "ProfileTimelineWidget.h"
#include <LibGUI/GAction.h>
#include <LibGUI/GApplication.h>
#include <LibGUI/GBoxLayout.h>
#include <LibGUI/GMenu.h>
#include <LibGUI/GMenuBar.h>
#include <LibGUI/GTreeView.h>
#include <LibGUI/GWindow.h>
#include <stdio.h>
int main(int argc, char** argv)
{
if (argc != 2) {
printf("usage: %s <profile-file>\n", argv[0]);
return 0;
}
const char* path = argv[1];
auto profile = Profile::load_from_file(path);
if (!profile) {
fprintf(stderr, "Unable to load profile '%s'\n", path);
return 1;
}
GApplication app(argc, argv);
auto window = GWindow::construct();
window->set_title("ProfileViewer");
window->set_rect(100, 100, 800, 600);
auto main_widget = GWidget::construct();
window->set_main_widget(main_widget);
main_widget->set_fill_with_background_color(true);
main_widget->set_layout(make<GBoxLayout>(Orientation::Vertical));
auto timeline_widget = ProfileTimelineWidget::construct(*profile, main_widget);
auto tree_view = GTreeView::construct(main_widget);
tree_view->set_headers_visible(true);
tree_view->set_size_columns_to_fit_content(true);
tree_view->set_model(profile->model());
auto menubar = make<GMenuBar>();
auto app_menu = GMenu::construct("ProfileViewer");
app_menu->add_action(GCommonActions::make_quit_action([&](auto&) { app.quit(); }));
menubar->add_menu(move(app_menu));
auto view_menu = GMenu::construct("View");
auto invert_action = GAction::create("Invert tree", { Mod_Ctrl, Key_I }, [&](auto& action) {
action.set_checked(!action.is_checked());
profile->set_inverted(action.is_checked());
});
invert_action->set_checkable(true);
invert_action->set_checked(true);
view_menu->add_action(invert_action);
menubar->add_menu(move(view_menu));
app.set_menubar(move(menubar));
window->show();
return app.exec();
}