GUI: Added a dedicated dialog for LibraryDialog for configuration of function arguments

This commit is contained in:
Daniel Marjamäki 2015-08-30 13:33:43 +02:00
parent 5e9325b4f4
commit dd7c0b353d
7 changed files with 143 additions and 174 deletions

View File

@ -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

View File

@ -9,7 +9,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>386</width>
<width>353</width>
<height>89</height>
</rect>
</property>
@ -68,68 +68,47 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cancelButton">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addFunctionButton">
<property name="text">
<string>Add function</string>
</property>
</widget>
</item>
</layout>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>cancelButton</sender>
<signal>clicked()</signal>
<receiver>LibraryAddFunctionDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>210</x>
<y>72</y>
</hint>
<hint type="destinationlabel">
<x>201</x>
<y>85</y>
</hint>
</hints>
</connection>
<connection>
<sender>addFunctionButton</sender>
<signal>clicked()</signal>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>LibraryAddFunctionDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>330</x>
<y>77</y>
<x>57</x>
<y>71</y>
</hint>
<hint type="destinationlabel">
<x>342</x>
<x>71</x>
<y>87</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>LibraryAddFunctionDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>132</x>
<y>69</y>
</hint>
<hint type="destinationlabel">
<x>156</x>
<y>87</y>
</hint>
</hints>

View File

@ -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);
}
}
}

View File

@ -63,11 +63,12 @@ public:
bool formatstr;
bool strz;
QString valid;
struct {
struct MinSize {
QString type;
QString arg;
QString arg2;
} minsize;
};
QList<struct MinSize> minsizes;
};
QList<struct Arg> args;
};

View File

@ -19,6 +19,7 @@
#include "librarydialog.h"
#include "ui_librarydialog.h"
#include "libraryaddfunctiondialog.h"
#include "libraryeditargdialog.h"
#include <QFile>
#include <QSettings>
@ -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);
}
}

View File

@ -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

View File

@ -126,17 +126,28 @@
<widget class="QListWidget" name="arguments"/>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="editArgButton">
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
@ -242,22 +253,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>arguments</sender>
<signal>itemChanged(QListWidgetItem*)</signal>
<receiver>LibraryDialog</receiver>
<slot>argumentChanged(QListWidgetItem*)</slot>
<hints>
<hint type="sourcelabel">
<x>517</x>
<y>140</y>
</hint>
<hint type="destinationlabel">
<x>542</x>
<y>117</y>
</hint>
</hints>
</connection>
<connection>
<sender>addFunction</sender>
<signal>clicked()</signal>
@ -274,6 +269,22 @@
</hint>
</hints>
</connection>
<connection>
<sender>editArgButton</sender>
<signal>clicked()</signal>
<receiver>LibraryDialog</receiver>
<slot>editArg()</slot>
<hints>
<hint type="sourcelabel">
<x>317</x>
<y>278</y>
</hint>
<hint type="destinationlabel">
<x>349</x>
<y>281</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>selectFunction(int)</slot>
@ -282,5 +293,6 @@
<slot>saveCfg()</slot>
<slot>argumentChanged(QListWidgetItem*)</slot>
<slot>addFunction()</slot>
<slot>editArg()</slot>
</slots>
</ui>