From 91a4bcd71ec87d53d3331d66c550be0ee2b6ef2c Mon Sep 17 00:00:00 2001 From: Maksim Derbasov Date: Fri, 1 Nov 2019 11:29:00 +0300 Subject: [PATCH] Triage tool usability improvement (#2319) * gitignore for triage tool * window header * Search filename / in files functionallity for triage tool * small codeclean --- tools/triage/.gitignore | 6 ++ tools/triage/mainwindow.cpp | 68 +++++++++++++++ tools/triage/mainwindow.h | 9 +- tools/triage/mainwindow.ui | 170 +++++++++++++++++++++++++++++++++++- 4 files changed, 250 insertions(+), 3 deletions(-) create mode 100644 tools/triage/.gitignore diff --git a/tools/triage/.gitignore b/tools/triage/.gitignore new file mode 100644 index 000000000..c26029fd7 --- /dev/null +++ b/tools/triage/.gitignore @@ -0,0 +1,6 @@ +moc_*.cpp +moc_*.h +ui_*.h +.qmake.stash +Makefile +triage diff --git a/tools/triage/mainwindow.cpp b/tools/triage/mainwindow.cpp index 944a274ce..e1f169658 100644 --- a/tools/triage/mainwindow.cpp +++ b/tools/triage/mainwindow.cpp @@ -5,8 +5,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -25,6 +27,14 @@ MainWindow::MainWindow(QWidget *parent) : if (!workFolder.exists()) { workFolder.mkdir(WORK_FOLDER); } + fsmodel.setRootPath(WORK_FOLDER); + fsmodel.setReadOnly(true); + fsmodel.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + ui->directoryTree->setModel(&fsmodel); + QHeaderView * header = ui->directoryTree->header(); + for(int i = 1; i < header->length(); ++i) + header->hideSection(i); + ui->directoryTree->setRootIndex(fsmodel.index(WORK_FOLDER)); } MainWindow::~MainWindow() @@ -220,7 +230,11 @@ void MainWindow::showResult(QListWidgetItem *item) return; } } + showSrcFile(fileName, url, lineNumber); +} +void MainWindow::showSrcFile(const QString &fileName, const QString &url, const int lineNumber) +{ // Open file ui->code->setFocus(); QFile f(fileName); @@ -236,5 +250,59 @@ void MainWindow::showResult(QListWidgetItem *item) ui->edit1->setText(url); ui->edit2->setText(fileName); f.close(); + ui->directoryTree->setCurrentIndex(fsmodel.index(fileName)); } } + +void MainWindow::fileTreeFilter(QString str) { + fsmodel.setNameFilters(QStringList{"*" + str + "*"}); + fsmodel.setNameFilterDisables(false); +} + +void MainWindow::findInFilesClicked() { + ui->tabWidget->setCurrentIndex(1); + ui->inFilesResult->clear(); + const QString text = ui->lineEdit->text(); + + const QStringList filter { + "*.cpp","*.cxx","*.cc","*.c++","*.hpp","*.h","*.hxx","*.hh","*.tpp","*.txx","*.C","*.c","*.cl" + }; + + QMimeDatabase mimeDatabase; + QDirIterator it(WORK_FOLDER, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + + while (it.hasNext()) { + const QString fileName = it.next(); + const QMimeType mimeType = mimeDatabase.mimeTypeForFile(fileName); + + if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) { + continue; + } + + QFile file(fileName); + if (file.open(QIODevice::ReadOnly)) { + QString line; + int lineN = 0; + QTextStream in(&file); + while (!in.atEnd()) { + ++lineN; + line = in.readLine(); + if (line.contains(text, Qt::CaseInsensitive)) { + ui->inFilesResult->addItem(fileName + ":" + QString::number(lineN)); + break; + } + } + } + } +} + +void MainWindow::directorytreeDoubleClick() { + showSrcFile(fsmodel.filePath(ui->directoryTree->currentIndex()), "", 1); +} + +void MainWindow::searchResultsDoubleClick() { + QString filename = ui->inFilesResult->currentItem()->text(); + const auto idx = filename.lastIndexOf(':'); + const int line = filename.midRef(idx + 1).toInt(); + showSrcFile(filename.left(idx), "", line); +} diff --git a/tools/triage/mainwindow.h b/tools/triage/mainwindow.h index e5209fc55..32ed901d8 100644 --- a/tools/triage/mainwindow.h +++ b/tools/triage/mainwindow.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace Ui { class MainWindow; @@ -16,8 +17,8 @@ class MainWindow : public QMainWindow { public: explicit MainWindow(QWidget *parent = Q_NULLPTR); MainWindow(const MainWindow &) = delete; - ~MainWindow(); MainWindow &operator=(const MainWindow &) = delete; + ~MainWindow(); public slots: void loadFile(); @@ -25,6 +26,10 @@ public slots: void filter(QString filter); void showResult(QListWidgetItem *item); void refreshResults(); + void fileTreeFilter(QString str); + void findInFilesClicked(); + void directorytreeDoubleClick(); + void searchResultsDoubleClick(); private: Ui::MainWindow *ui; @@ -33,8 +38,10 @@ private: bool runProcess(const QString &programName, const QStringList & arguments); bool wget(const QString &url); bool unpackArchive(const QString &archiveName); + void showSrcFile(const QString &fileName, const QString &url, const int lineNumber); QStringList mAllErrors; + QFileSystemModel fsmodel; }; #endif // MAINWINDOW_H diff --git a/tools/triage/mainwindow.ui b/tools/triage/mainwindow.ui index d3bf5ff52..c4ec8b886 100644 --- a/tools/triage/mainwindow.ui +++ b/tools/triage/mainwindow.ui @@ -11,7 +11,7 @@ - MainWindow + daca triage tool @@ -122,6 +122,104 @@ + + + + + + + + + 16777215 + 16777215 + + + + filter + + + true + + + + + + + In files + + + + + + + + + + 16777215 + 16777215 + + + + 0 + + + + Filesystem + + + + + 0 + 0 + 341 + 381 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + true + + + false + + + + + + In Files Result + + + + + 0 + 0 + 341 + 381 + + + + + 0 + 0 + + + + + + + + @@ -130,7 +228,7 @@ 0 0 1057 - 25 + 30 @@ -234,6 +332,70 @@ + + lineEdit + textChanged(QString) + MainWindow + fileTreeFilter(QString) + + + 940 + 275 + + + 528 + 268 + + + + + inFilesButton + clicked() + MainWindow + findInFilesClicked() + + + 776 + 68 + + + 413 + 268 + + + + + directoryTree + doubleClicked(QModelIndex) + MainWindow + directorytreeDoubleClick() + + + 780 + 314 + + + 454 + 268 + + + + + inFilesResult + doubleClicked(QModelIndex) + MainWindow + searchResultsDoubleClick() + + + 755 + 314 + + + 454 + 268 + + + loadFile() @@ -241,5 +403,9 @@ loadFromClipboard() filter(QString) refreshResults() + fileTreeFilter(QString) + findInFilesClicked() + directorytreeDoubleClick() + searchResultsDoubleClick()