From dd7c0b353db143555aaf30c3c8c7138e18653028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 30 Aug 2015 13:33:43 +0200 Subject: [PATCH] GUI: Added a dedicated dialog for LibraryDialog for configuration of function arguments --- gui/gui.pro | 9 ++- gui/libraryaddfunctiondialog.ui | 81 ++++++++------------ gui/librarydata.cpp | 24 +++--- gui/librarydata.h | 5 +- gui/librarydialog.cpp | 128 ++++++++++++-------------------- gui/librarydialog.h | 4 +- gui/librarydialog.ui | 66 +++++++++------- 7 files changed, 143 insertions(+), 174 deletions(-) diff --git a/gui/gui.pro b/gui/gui.pro index a7dd50826..e190c51b9 100644 --- a/gui/gui.pro +++ b/gui/gui.pro @@ -52,7 +52,8 @@ FORMS = about.ui \ settings.ui \ stats.ui \ librarydialog.ui \ - libraryaddfunctiondialog.ui + libraryaddfunctiondialog.ui \ + libraryeditargdialog.ui TRANSLATIONS = cppcheck_de.ts \ cppcheck_es.ts \ @@ -110,7 +111,8 @@ HEADERS += aboutdialog.h \ xmlreportv2.h \ librarydialog.h \ librarydata.h \ - libraryaddfunctiondialog.h + libraryaddfunctiondialog.h \ + libraryeditargdialog.h SOURCES += aboutdialog.cpp \ application.cpp \ @@ -147,7 +149,8 @@ SOURCES += aboutdialog.cpp \ xmlreportv2.cpp \ librarydialog.cpp \ librarydata.cpp \ - libraryaddfunctiondialog.cpp + libraryaddfunctiondialog.cpp \ + libraryeditargdialog.cpp win32 { DEFINES += _CRT_SECURE_NO_WARNINGS diff --git a/gui/libraryaddfunctiondialog.ui b/gui/libraryaddfunctiondialog.ui index 4ca68e3bd..e6c5e2c4b 100644 --- a/gui/libraryaddfunctiondialog.ui +++ b/gui/libraryaddfunctiondialog.ui @@ -9,7 +9,7 @@ 0 0 - 386 + 353 89 @@ -68,68 +68,47 @@ - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Cancel - - - - - - - Add function - - - - + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + - cancelButton - clicked() - LibraryAddFunctionDialog - reject() - - - 210 - 72 - - - 201 - 85 - - - - - addFunctionButton - clicked() + buttonBox + accepted() LibraryAddFunctionDialog accept() - 330 - 77 + 57 + 71 - 342 + 71 + 87 + + + + + buttonBox + rejected() + LibraryAddFunctionDialog + reject() + + + 132 + 69 + + + 156 87 diff --git a/gui/librarydata.cpp b/gui/librarydata.cpp index 7bf1d6329..00b05e284 100644 --- a/gui/librarydata.cpp +++ b/gui/librarydata.cpp @@ -58,9 +58,11 @@ static LibraryData::Function::Arg loadFunctionArg(const QDomElement &functionArg else if (childElement.tagName() == "valid") arg.valid = childElement.text(); else if (childElement.tagName() == "minsize") { - arg.minsize.type = childElement.attribute("type"); - arg.minsize.arg = childElement.attribute("arg"); - arg.minsize.arg2 = childElement.attribute("arg2"); + LibraryData::Function::Arg::MinSize minsize; + minsize.type = childElement.attribute("type"); + minsize.arg = childElement.attribute("arg"); + minsize.arg2 = childElement.attribute("arg2"); + arg.minsizes.append(minsize); } } return arg; @@ -210,13 +212,15 @@ static QDomElement FunctionElement(QDomDocument &doc, const LibraryData::Functio argElement.appendChild(e); } - if (!arg.minsize.type.isEmpty()) { - QDomElement e = doc.createElement("minsize"); - e.setAttribute("type", arg.minsize.type); - e.setAttribute("arg", arg.minsize.arg); - if (!arg.minsize.arg2.isEmpty()) - e.setAttribute("arg2", arg.minsize.arg2); - argElement.appendChild(e); + if (!arg.minsizes.isEmpty()) { + foreach(const LibraryData::Function::Arg::MinSize &minsize, arg.minsizes) { + QDomElement e = doc.createElement("minsize"); + e.setAttribute("type", minsize.type); + e.setAttribute("arg", minsize.arg); + if (!minsize.arg2.isEmpty()) + e.setAttribute("arg2", minsize.arg2); + argElement.appendChild(e); + } } } diff --git a/gui/librarydata.h b/gui/librarydata.h index fe57b456d..f165c1ece 100644 --- a/gui/librarydata.h +++ b/gui/librarydata.h @@ -63,11 +63,12 @@ public: bool formatstr; bool strz; QString valid; - struct { + struct MinSize { QString type; QString arg; QString arg2; - } minsize; + }; + QList minsizes; }; QList args; }; diff --git a/gui/librarydialog.cpp b/gui/librarydialog.cpp index 148eb7d37..122e9e04f 100644 --- a/gui/librarydialog.cpp +++ b/gui/librarydialog.cpp @@ -19,6 +19,7 @@ #include "librarydialog.h" #include "ui_librarydialog.h" #include "libraryaddfunctiondialog.h" +#include "libraryeditargdialog.h" #include #include @@ -87,22 +88,22 @@ void LibraryDialog::saveCfg() void LibraryDialog::addFunction() { LibraryAddFunctionDialog *d = new LibraryAddFunctionDialog; - if (d->exec() != QDialog::Accepted) { - delete d; - return; - } + if (d->exec() == QDialog::Accepted && !d->functionName().isEmpty()) { - LibraryData::Function f; - f.name = d->functionName(); - int args = d->numberOfArguments(); + LibraryData::Function f; + f.name = d->functionName(); + int args = d->numberOfArguments(); - for (int i = 1; i <= args; i++) { - LibraryData::Function::Arg arg; - arg.nr = i; - f.args.append(arg); + for (int i = 1; i <= args; i++) { + LibraryData::Function::Arg arg; + arg.nr = i; + f.args.append(arg); + } + data.functions.append(f); + ui->functions->addItem(f.name); + ui->buttonSave->setEnabled(true); } - data.functions.append(f); - ui->functions->addItem(f.name); + delete d; } void LibraryDialog::selectFunction(int row) @@ -120,40 +121,7 @@ void LibraryDialog::selectFunction(int row) ui->functionreturn->setChecked(!function.noreturn); ui->useretval->setChecked(function.useretval); ui->leakignore->setChecked(function.leakignore); - ui->arguments->clear(); - foreach(const LibraryData::Function::Arg &arg, function.args) { - QString s("arg"); - if (arg.nr != LibraryData::Function::Arg::ANY) - s += QString::number(arg.nr); - ui->arguments->addItem(s); - - QListWidgetItem *item = new QListWidgetItem(tr("Not bool"), ui->arguments); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(arg.notbool ? Qt::Checked : Qt::Unchecked); - ui->arguments->addItem(item); - - item = new QListWidgetItem(tr("Not null"), ui->arguments); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(arg.notnull ? Qt::Checked : Qt::Unchecked); - ui->arguments->addItem(item); - - item = new QListWidgetItem(tr("Not uninit"), ui->arguments); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(arg.notuninit ? Qt::Checked : Qt::Unchecked); - ui->arguments->addItem(item); - - item = new QListWidgetItem(tr("Format string"), ui->arguments); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(arg.formatstr ? Qt::Checked : Qt::Unchecked); - ui->arguments->addItem(item); - - item = new QListWidgetItem(tr("Zero-terminated string"), ui->arguments); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(arg.strz ? Qt::Checked : Qt::Unchecked); - ui->arguments->addItem(item); - - ui->arguments->addItem("valid: " + ((!arg.valid.isNull()) ? arg.valid : "*")); - } + updateArguments(function); ignoreChanges = false; } @@ -170,44 +138,44 @@ void LibraryDialog::changeFunction() ui->buttonSave->setEnabled(true); } - -void LibraryDialog::argumentChanged(QListWidgetItem *changedItem) +void LibraryDialog::editArg() { - if (ignoreChanges) + if (ui->functions->selectedItems().count() != 1) return; - unsigned argnr = 0; - for (int row = 0; row < ui->arguments->count(); row++) { - const QListWidgetItem *argItem = ui->arguments->item(row); - if (argItem == changedItem) - break; - if (argItem->text() == "arg") - argnr = LibraryData::Function::Arg::ANY; - else if (argItem->text().startsWith("arg")) - argnr = argItem->text().mid(3).toInt(); - } - - foreach(const QListWidgetItem *functionItem, ui->functions->selectedItems()) { - LibraryData::Function &function = data.functions[ui->functions->row(functionItem)]; - - for (LibraryData::Function::Arg &arg : function.args) { - if (arg.nr == argnr) { - // TODO: Don't use a stringbased lookup - if (changedItem->text() == "Not bool") - arg.notbool = (changedItem->checkState() != Qt::Unchecked); - else if (changedItem->text() == "Not null") - arg.notnull = (changedItem->checkState() != Qt::Unchecked); - else if (changedItem->text() == "Not uninit") - arg.notuninit = (changedItem->checkState() != Qt::Unchecked); - else if (changedItem->text() == "Format string") - arg.formatstr = (changedItem->checkState() != Qt::Unchecked); - else if (changedItem->text() == "Zero-terminated string") - arg.strz = (changedItem->checkState() != Qt::Unchecked); - break; - } - } + if (ui->arguments->selectedItems().count() != 1) + return; + + LibraryData::Function &function = data.functions[ui->functions->row(ui->functions->selectedItems().first())]; + LibraryData::Function::Arg &arg = function.args[ui->arguments->row(ui->arguments->selectedItems().first())]; + + LibraryEditArgDialog *d = new LibraryEditArgDialog(0, arg); + if (d->exec() == QDialog::Accepted) { + arg = d->getArg(); + updateArguments(function); } + delete d; ui->buttonSave->setEnabled(true); } +void LibraryDialog::updateArguments(const LibraryData::Function &function) +{ + ui->arguments->clear(); + foreach(const LibraryData::Function::Arg &arg, function.args) { + QString s("arg"); + if (arg.nr != LibraryData::Function::Arg::ANY) + s += QString::number(arg.nr); + s += "\n not bool: " + QString(arg.notbool ? "true" : "false"); + s += "\n not null: " + QString(arg.notnull ? "true" : "false"); + s += "\n not uninit: " + QString(arg.notuninit ? "true" : "false"); + s += "\n format string: " + QString(arg.formatstr ? "true" : "false"); + s += "\n strz: " + QString(arg.strz ? "true" : "false"); + s += "\n valid: " + QString(arg.valid.isEmpty() ? "any" : arg.valid); + foreach(const LibraryData::Function::Arg::MinSize &minsize, arg.minsizes) { + s += "\n minsize: " + minsize.type + " " + minsize.arg + " " + minsize.arg2; + } + + ui->arguments->addItem(s); + } +} diff --git a/gui/librarydialog.h b/gui/librarydialog.h index 9250e68c2..af3cf333b 100644 --- a/gui/librarydialog.h +++ b/gui/librarydialog.h @@ -43,13 +43,15 @@ private slots: void addFunction(); void selectFunction(int row); void changeFunction(); - void argumentChanged(QListWidgetItem *); + void editArg(); private: Ui::LibraryDialog *ui; LibraryData data; QString mFileName; bool ignoreChanges; + + void updateArguments(const LibraryData::Function &function); }; #endif // LIBRARYDIALOG_H diff --git a/gui/librarydialog.ui b/gui/librarydialog.ui index a6ac8a5d1..bd1973c23 100644 --- a/gui/librarydialog.ui +++ b/gui/librarydialog.ui @@ -126,17 +126,28 @@ - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + Edit + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + @@ -242,22 +253,6 @@ - - arguments - itemChanged(QListWidgetItem*) - LibraryDialog - argumentChanged(QListWidgetItem*) - - - 517 - 140 - - - 542 - 117 - - - addFunction clicked() @@ -274,6 +269,22 @@ + + editArgButton + clicked() + LibraryDialog + editArg() + + + 317 + 278 + + + 349 + 281 + + + selectFunction(int) @@ -282,5 +293,6 @@ saveCfg() argumentChanged(QListWidgetItem*) addFunction() + editArg()