From dae009ca010b81ac6ffbe5363e8002b60000b3f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 27 Apr 2020 17:36:17 +0200 Subject: [PATCH] GUI: Try to improve usability for function contracts --- gui/functioncontractdialog.cpp | 31 +++++++++++++ gui/functioncontractdialog.h | 21 +++++++++ gui/functioncontractdialog.ui | 83 ++++++++++++++++++++++++++++++++++ gui/gui.pro | 3 ++ gui/mainwindow.cpp | 26 ++++++----- gui/mainwindow.h | 4 +- gui/resultstree.cpp | 10 ++-- gui/resultstree.h | 8 ++-- gui/resultsview.cpp | 2 +- gui/resultsview.h | 4 +- 10 files changed, 167 insertions(+), 25 deletions(-) create mode 100644 gui/functioncontractdialog.cpp create mode 100644 gui/functioncontractdialog.h create mode 100644 gui/functioncontractdialog.ui diff --git a/gui/functioncontractdialog.cpp b/gui/functioncontractdialog.cpp new file mode 100644 index 000000000..c536398e0 --- /dev/null +++ b/gui/functioncontractdialog.cpp @@ -0,0 +1,31 @@ +#include "functioncontractdialog.h" +#include "ui_functioncontractdialog.h" + +static QString formatFunctionName(QString f) +{ + if (f.endsWith("()")) + return f; + f.replace("(", "(\n "); + f.replace(",", ",\n "); + return f; +} + +FunctionContractDialog::FunctionContractDialog(QWidget *parent, QString name, QString expects) : + QDialog(parent), + ui(new Ui::FunctionContractDialog) +{ + ui->setupUi(this); + ui->functionName->setText(formatFunctionName(name)); + ui->expects->setPlainText(expects); +} + +FunctionContractDialog::~FunctionContractDialog() +{ + delete ui; +} + +QString FunctionContractDialog::getExpects() const +{ + return ui->expects->toPlainText(); +} + diff --git a/gui/functioncontractdialog.h b/gui/functioncontractdialog.h new file mode 100644 index 000000000..dcd2612cd --- /dev/null +++ b/gui/functioncontractdialog.h @@ -0,0 +1,21 @@ +#ifndef FUNCTIONCONTRACTDIALOG_H +#define FUNCTIONCONTRACTDIALOG_H + +#include + +namespace Ui { + class FunctionContractDialog; +} + +class FunctionContractDialog : public QDialog { + Q_OBJECT + +public: + explicit FunctionContractDialog(QWidget *parent, QString name, QString expects); + ~FunctionContractDialog(); + QString getExpects() const; +private: + Ui::FunctionContractDialog *ui; +}; + +#endif // FUNCTIONCONTRACTDIALOG_H diff --git a/gui/functioncontractdialog.ui b/gui/functioncontractdialog.ui new file mode 100644 index 000000000..dac6a14d0 --- /dev/null +++ b/gui/functioncontractdialog.ui @@ -0,0 +1,83 @@ + + + FunctionContractDialog + + + + 0 + 0 + 640 + 401 + + + + Function contract + + + + + + Name + + + + + + + Requirements for parameters + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + FunctionContractDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + FunctionContractDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/gui/gui.pro b/gui/gui.pro index 14691544c..7052e4b90 100644 --- a/gui/gui.pro +++ b/gui/gui.pro @@ -60,6 +60,7 @@ RESOURCES = gui.qrc FORMS = about.ui \ application.ui \ file.ui \ + functioncontractdialog.ui \ mainwindow.ui \ projectfiledialog.ui \ resultsview.ui \ @@ -108,6 +109,7 @@ HEADERS += aboutdialog.h \ erroritem.h \ filelist.h \ fileviewdialog.h \ + functioncontractdialog.h \ mainwindow.h \ platforms.h \ printablereport.h \ @@ -147,6 +149,7 @@ SOURCES += aboutdialog.cpp \ erroritem.cpp \ filelist.cpp \ fileviewdialog.cpp \ + functioncontractdialog.cpp \ main.cpp \ mainwindow.cpp\ platforms.cpp \ diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 45e360903..7479fa8d5 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -36,6 +36,7 @@ #include "common.h" #include "threadhandler.h" #include "fileviewdialog.h" +#include "functioncontractdialog.h" #include "projectfile.h" #include "projectfiledialog.h" #include "report.h" @@ -142,7 +143,7 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) : connect(mUI.mResults, &ResultsView::checkSelected, this, &MainWindow::performSelectedFilesCheck); connect(mUI.mResults, &ResultsView::tagged, this, &MainWindow::tagged); connect(mUI.mResults, &ResultsView::suppressIds, this, &MainWindow::suppressIds); - connect(mUI.mResults, &ResultsView::addFunctionContract, this, &MainWindow::addFunctionContract); + connect(mUI.mResults, &ResultsView::editFunctionContract, this, &MainWindow::editFunctionContract); connect(mUI.mMenuView, &QMenu::aboutToShow, this, &MainWindow::aboutToShowViewMenu); // File menu @@ -1794,19 +1795,22 @@ void MainWindow::suppressIds(QStringList ids) mProjectFile->write(); } -void MainWindow::addFunctionContract(QString function) +void MainWindow::editFunctionContract(QString function) { if (!mProjectFile) return; - bool ok; - const QString expects = QInputDialog::getText(this, - tr("Add contract"), - "Function:" + function + "\nExpects:", - QLineEdit::Normal, - QString(), - &ok); - if (ok) { - mProjectFile->setFunctionContract(function, expects); + + QString expects; + const auto it = mProjectFile->getFunctionContracts().find(function.toStdString()); + if (it != mProjectFile->getFunctionContracts().end()) + expects = QString::fromStdString(it->second); + + FunctionContractDialog dlg(nullptr, + function, + expects); + + if (dlg.exec() == QDialog::Accepted) { + mProjectFile->setFunctionContract(function, dlg.getExpects()); mProjectFile->write(); } } diff --git a/gui/mainwindow.h b/gui/mainwindow.h index e281597e4..f2736bde9 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -225,8 +225,8 @@ protected slots: /** Suppress error ids */ void suppressIds(QStringList ids); - /** Add contract for function */ - void addFunctionContract(QString function); + /** Edit contract for function */ + void editFunctionContract(QString function); private: /** Get filename for last results */ diff --git a/gui/resultstree.cpp b/gui/resultstree.cpp index 616e3fa3a..46aec191c 100644 --- a/gui/resultstree.cpp +++ b/gui/resultstree.cpp @@ -614,9 +614,9 @@ void ResultsTree::contextMenuEvent(QContextMenuEvent * e) const bool bughunting = !multipleSelection && mContextItem->data().toMap().value("id").toString().startsWith("bughunting"); if (bughunting) { - QAction *addContract = new QAction(tr("Add contract.."), &menu); - connect(addContract, SIGNAL(triggered()), this, SLOT(addContract())); - menu.addAction(addContract); + QAction *editContract = new QAction(tr("Edit contract.."), &menu); + connect(editContract, &QAction::triggered, this, &ResultsTree::editContract); + menu.addAction(editContract); menu.addSeparator(); } @@ -1033,10 +1033,10 @@ void ResultsTree::openContainingFolder() } } -void ResultsTree::addContract() +void ResultsTree::editContract() { QString function = mContextItem->data().toMap().value("function").toString(); - emit addFunctionContract(function); + emit editFunctionContract(function); } void ResultsTree::tagSelectedItems(const QString &tag) diff --git a/gui/resultstree.h b/gui/resultstree.h index 805119297..0b7ce8e4b 100644 --- a/gui/resultstree.h +++ b/gui/resultstree.h @@ -208,8 +208,8 @@ signals: /** Suppress Ids */ void suppressIds(QStringList ids); - /** Add contract for function */ - void addFunctionContract(QString function); + /** Edit contract for function */ + void editFunctionContract(QString function); public slots: /** @@ -285,9 +285,9 @@ protected slots: void openContainingFolder(); /** - * @brief Allow user to add contract to fix bughunting warning + * @brief Allow user to edit contract to fix bughunting warning */ - void addContract(); + void editContract(); /** * @brief Slot for selection change in the results tree. diff --git a/gui/resultsview.cpp b/gui/resultsview.cpp index 155d1077d..a44cd47b0 100644 --- a/gui/resultsview.cpp +++ b/gui/resultsview.cpp @@ -55,7 +55,7 @@ ResultsView::ResultsView(QWidget * parent) : connect(mUI.mTree, &ResultsTree::treeSelectionChanged, this, &ResultsView::updateDetails); connect(mUI.mTree, &ResultsTree::tagged, this, &ResultsView::tagged); connect(mUI.mTree, &ResultsTree::suppressIds, this, &ResultsView::suppressIds); - connect(mUI.mTree, &ResultsTree::addFunctionContract, this, &ResultsView::addFunctionContract); + connect(mUI.mTree, &ResultsTree::editFunctionContract, this, &ResultsView::editFunctionContract); connect(this, &ResultsView::showResults, mUI.mTree, &ResultsTree::showResults); connect(this, &ResultsView::showCppcheckResults, mUI.mTree, &ResultsTree::showCppcheckResults); connect(this, &ResultsView::showClangResults, mUI.mTree, &ResultsTree::showClangResults); diff --git a/gui/resultsview.h b/gui/resultsview.h index 511ad3cc0..32dda3b3b 100644 --- a/gui/resultsview.h +++ b/gui/resultsview.h @@ -228,8 +228,8 @@ signals: /** Suppress Ids */ void suppressIds(QStringList ids); - /** Add contract for function */ - void addFunctionContract(QString function); + /** Edit contract for function */ + void editFunctionContract(QString function); /** * @brief Show/hide certain type of errors