From 6ca8301329ef2b65e50d04ad368712748b1cc86f Mon Sep 17 00:00:00 2001 From: Karl-Heinz Reichel Date: Sun, 15 Aug 2021 19:33:48 +0200 Subject: [PATCH] Bug 379660 Remove template parameters from flamegraph view Added a textfilter which removes the long template parameters as described in the Bug ticket Bug 379660. Added unit-tests for filtering the entries and removing the template parameters --- src/analyze/gui/CMakeLists.txt | 3 + src/analyze/gui/flamegraph.cpp | 5 +- src/analyze/gui/middleelide.cpp | 42 ++++++++++++++ src/analyze/gui/middleelide.h | 17 ++++++ src/analyze/gui/tests/CMakeLists.txt | 21 +++++++ src/analyze/gui/tests/tst_middle_elide.cpp | 64 ++++++++++++++++++++++ 6 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/analyze/gui/middleelide.cpp create mode 100644 src/analyze/gui/middleelide.h create mode 100644 src/analyze/gui/tests/CMakeLists.txt create mode 100644 src/analyze/gui/tests/tst_middle_elide.cpp diff --git a/src/analyze/gui/CMakeLists.txt b/src/analyze/gui/CMakeLists.txt index ce7f1f71..95ce0d15 100644 --- a/src/analyze/gui/CMakeLists.txt +++ b/src/analyze/gui/CMakeLists.txt @@ -29,6 +29,7 @@ add_definitions(-Wall add_library(heaptrack_gui_private STATIC util.cpp parser.cpp + middleelide.cpp ) target_link_libraries(heaptrack_gui_private PUBLIC KF5::I18n @@ -76,6 +77,8 @@ set(LIBRARIES heaptrack_gui_private ) +add_subdirectory(tests) + if (KChart_FOUND) list(APPEND SRCFILES chartwidget.cpp diff --git a/src/analyze/gui/flamegraph.cpp b/src/analyze/gui/flamegraph.cpp index d90394f5..1c62b924 100644 --- a/src/analyze/gui/flamegraph.cpp +++ b/src/analyze/gui/flamegraph.cpp @@ -45,6 +45,7 @@ #include "resultdata.h" #include "util.h" +#include "middleelide.h" enum CostType { @@ -192,10 +193,12 @@ void FrameGraphicsItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* Q_UNREACHABLE(); }(); + QString middleElidedLabel = MiddleElide::elideAngleBracket(label); + const int height = rect().height(); painter->drawText(margin + rect().x(), rect().y(), width, height, Qt::AlignVCenter | Qt::AlignLeft | Qt::TextSingleLine, - option->fontMetrics.elidedText(label, Qt::ElideRight, width)); + option->fontMetrics.elidedText(middleElidedLabel, Qt::ElideRight, width)); if (m_searchMatch == NoMatch) { painter->setPen(oldPen); diff --git a/src/analyze/gui/middleelide.cpp b/src/analyze/gui/middleelide.cpp new file mode 100644 index 00000000..5665d2dc --- /dev/null +++ b/src/analyze/gui/middleelide.cpp @@ -0,0 +1,42 @@ +#include "middleelide.h" +#include + +MiddleElide::MiddleElide() +{ + +} + +QString MiddleElide::elideAngleBracket(const QString& s) +{ + return substituteAngleBrackets(s); +} + +QString MiddleElide::substituteAngleBrackets(const QString& s) +{ + static QChar startBracket = QChar(u'<'); + static QChar stopBracket = QChar(u'>'); + + int level = 0; + QString result; + for (int i=0, n = s.length(); i < n; i++) { + QChar currentChar = s[i]; + if (currentChar == QChar(startBracket) && level == 0) { + result += QChar(startBracket); + level++; + } + else if (currentChar == QChar(startBracket) && level > 0) { + level++; + } + else if (currentChar == QChar(stopBracket) && level == 1) { + result += QString::fromUtf8("...>"); + level--; + } + else if (currentChar == QChar(stopBracket) && level > 1) { + level--; + } + else if (level == 0) { + result += currentChar; + } + } + return result; +} diff --git a/src/analyze/gui/middleelide.h b/src/analyze/gui/middleelide.h new file mode 100644 index 00000000..42053676 --- /dev/null +++ b/src/analyze/gui/middleelide.h @@ -0,0 +1,17 @@ +#ifndef MIDDLEELIDE_H +#define MIDDLEELIDE_H + +#include + +class MiddleElide +{ +public: + MiddleElide(); + + static QString elideAngleBracket(const QString& s); + +private: + static QString substituteAngleBrackets(const QString& s); +}; + +#endif // MIDDLEELIDE_H diff --git a/src/analyze/gui/tests/CMakeLists.txt b/src/analyze/gui/tests/CMakeLists.txt new file mode 100644 index 00000000..c5265bc1 --- /dev/null +++ b/src/analyze/gui/tests/CMakeLists.txt @@ -0,0 +1,21 @@ +project(test_middle_elide LANGUAGES CXX) + +find_package(QT NAMES Qt5 Qt6 COMPONENTS Test REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Test REQUIRED) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +enable_testing() + +add_executable(test_middle_elide + tst_middle_elide.cpp +) + +add_test(NAME test_middle_elide COMMAND test_middle_elide) + +target_link_libraries(test_middle_elide PRIVATE + heaptrack_gui_private + Qt${QT_VERSION_MAJOR}::Test) + diff --git a/src/analyze/gui/tests/tst_middle_elide.cpp b/src/analyze/gui/tests/tst_middle_elide.cpp new file mode 100644 index 00000000..e896b339 --- /dev/null +++ b/src/analyze/gui/tests/tst_middle_elide.cpp @@ -0,0 +1,64 @@ +#include +#include +#include "analyze/gui/middleelide.h" + +// add necessary includes here + +const char* simple_case = "MainWindow::onLoadingFinish(unsigned int&)"; +const char* one_bracket = "std::vector MainWindow::onLoadingFinish(unsigned int&)"; +const char* one_bracket_fixed = "std::vector<...> MainWindow::onLoadingFinish(unsigned int&)"; +const char* two_brackets = "std::vector MainWindow::onLoadingFinish(unsigned int&)"; +const char* two_brackets_fixed = "std::vector<...> MainWindow<...>::onLoadingFinish(unsigned int&)"; +const char* nested_brackets = "std::vector in bracket> MainWindow::onLoadingFinish(unsigned int&)"; +const char* nested_brackets_fixed = "std::vector<...> MainWindow::onLoadingFinish(unsigned int&)"; + + +class test_initilaize : public QObject +{ + Q_OBJECT + +public: + test_initilaize() = default; + ~test_initilaize() = default; + +private slots: + void test_simple_case(); + void test_single_bracket(); + void test_multiple_brackets(); + void test_nested_brackets(); +}; + +void test_initilaize::test_simple_case() +{ + QString testString = QString::fromUtf8(simple_case); + QString result = MiddleElide::elideAngleBracket(testString); + QVERIFY(result == testString); +} + +void test_initilaize::test_single_bracket() +{ + QString testString = QString::fromUtf8(one_bracket); + QString testStringFixed = QString::fromUtf8(one_bracket_fixed); + QString result = MiddleElide::elideAngleBracket(testString); + QVERIFY(result == testStringFixed); +} + +void test_initilaize::test_multiple_brackets() +{ + QString testString = QString::fromUtf8(two_brackets); + QString testStringFixed = QString::fromUtf8(two_brackets_fixed); + QString result = MiddleElide::elideAngleBracket(testString); + QVERIFY(result == testStringFixed); +} + +void test_initilaize::test_nested_brackets() +{ + QString testString = QString::fromUtf8(nested_brackets); + QString testStringFixed = QString::fromUtf8(nested_brackets_fixed); + QString result = MiddleElide::elideAngleBracket(testString); + QVERIFY(result == testStringFixed); +} + +QTEST_APPLESS_MAIN(test_initilaize) + +#include "tst_middle_elide.moc"