GUI: Separate tool statistics
This commit is contained in:
parent
1c71c789d6
commit
e675ede07d
|
@ -25,26 +25,34 @@ CheckStatistics::CheckStatistics(QObject *parent)
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckStatistics::addItem(ShowTypes::ShowType type)
|
static void addItem(QMap<QString,unsigned> &m, const QString &key) {
|
||||||
|
if (m.contains(key))
|
||||||
|
m[key]++;
|
||||||
|
else
|
||||||
|
m[key] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckStatistics::addItem(const QString &tool, ShowTypes::ShowType type)
|
||||||
{
|
{
|
||||||
|
const QString lower = tool.toLower();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ShowTypes::ShowStyle:
|
case ShowTypes::ShowStyle:
|
||||||
mStyle++;
|
::addItem(mStyle, tool);
|
||||||
break;
|
break;
|
||||||
case ShowTypes::ShowWarnings:
|
case ShowTypes::ShowWarnings:
|
||||||
mWarning++;
|
::addItem(mWarning, tool);
|
||||||
break;
|
break;
|
||||||
case ShowTypes::ShowPerformance:
|
case ShowTypes::ShowPerformance:
|
||||||
mPerformance++;
|
::addItem(mPerformance, tool);
|
||||||
break;
|
break;
|
||||||
case ShowTypes::ShowPortability:
|
case ShowTypes::ShowPortability:
|
||||||
mPortability++;
|
::addItem(mPortability, tool);
|
||||||
break;
|
break;
|
||||||
case ShowTypes::ShowErrors:
|
case ShowTypes::ShowErrors:
|
||||||
mError++;
|
::addItem(mError, tool);
|
||||||
break;
|
break;
|
||||||
case ShowTypes::ShowInformation:
|
case ShowTypes::ShowInformation:
|
||||||
mInformation++;
|
::addItem(mInformation, tool);
|
||||||
break;
|
break;
|
||||||
case ShowTypes::ShowNone:
|
case ShowTypes::ShowNone:
|
||||||
default:
|
default:
|
||||||
|
@ -55,32 +63,44 @@ void CheckStatistics::addItem(ShowTypes::ShowType type)
|
||||||
|
|
||||||
void CheckStatistics::clear()
|
void CheckStatistics::clear()
|
||||||
{
|
{
|
||||||
mStyle = 0;
|
mStyle.clear();
|
||||||
mWarning = 0;
|
mWarning.clear();
|
||||||
mPerformance = 0;
|
mPerformance.clear();
|
||||||
mPortability = 0;
|
mPortability.clear();
|
||||||
mInformation = 0;
|
mInformation.clear();
|
||||||
mError = 0;
|
mError.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned CheckStatistics::getCount(ShowTypes::ShowType type) const
|
unsigned CheckStatistics::getCount(const QString &tool, ShowTypes::ShowType type) const
|
||||||
{
|
{
|
||||||
|
const QString lower = tool.toLower();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ShowTypes::ShowStyle:
|
case ShowTypes::ShowStyle:
|
||||||
return mStyle;
|
return mStyle.value(lower,0);
|
||||||
case ShowTypes::ShowWarnings:
|
case ShowTypes::ShowWarnings:
|
||||||
return mWarning;
|
return mWarning.value(lower,0);
|
||||||
case ShowTypes::ShowPerformance:
|
case ShowTypes::ShowPerformance:
|
||||||
return mPerformance;
|
return mPerformance.value(lower,0);
|
||||||
case ShowTypes::ShowPortability:
|
case ShowTypes::ShowPortability:
|
||||||
return mPortability;
|
return mPortability.value(lower,0);
|
||||||
case ShowTypes::ShowErrors:
|
case ShowTypes::ShowErrors:
|
||||||
return mError;
|
return mError.value(lower,0);
|
||||||
case ShowTypes::ShowInformation:
|
case ShowTypes::ShowInformation:
|
||||||
return mInformation;
|
return mInformation.value(lower,0);
|
||||||
case ShowTypes::ShowNone:
|
case ShowTypes::ShowNone:
|
||||||
default:
|
default:
|
||||||
qDebug() << "Unknown error type - returning zero statistics.";
|
qDebug() << "Unknown error type - returning zero statistics.";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList CheckStatistics::getTools() const
|
||||||
|
{
|
||||||
|
QSet<QString> ret;
|
||||||
|
foreach (QString tool, mStyle.keys()) ret.insert(tool);
|
||||||
|
foreach (QString tool, mWarning.keys()) ret.insert(tool);
|
||||||
|
foreach (QString tool, mPerformance.keys()) ret.insert(tool);
|
||||||
|
foreach (QString tool, mPortability.keys()) ret.insert(tool);
|
||||||
|
foreach (QString tool, mError.keys()) ret.insert(tool);
|
||||||
|
return QStringList(ret.toList());
|
||||||
|
}
|
||||||
|
|
|
@ -35,9 +35,10 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief Add new checked item to statistics.
|
* @brief Add new checked item to statistics.
|
||||||
*
|
*
|
||||||
|
* @param tool Tool.
|
||||||
* @param type Type of the item to add.
|
* @param type Type of the item to add.
|
||||||
*/
|
*/
|
||||||
void addItem(ShowTypes::ShowType type);
|
void addItem(const QString &tool, ShowTypes::ShowType type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Clear the statistics.
|
* @brief Clear the statistics.
|
||||||
|
@ -48,18 +49,22 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief Return statistics for given type.
|
* @brief Return statistics for given type.
|
||||||
*
|
*
|
||||||
|
* @param tool Tool.
|
||||||
* @param type Type for which the statistics are returned.
|
* @param type Type for which the statistics are returned.
|
||||||
* @return Number of items of given type.
|
* @return Number of items of given type.
|
||||||
*/
|
*/
|
||||||
unsigned getCount(ShowTypes::ShowType type) const;
|
unsigned getCount(const QString &tool, ShowTypes::ShowType type) const;
|
||||||
|
|
||||||
|
/** Get tools with results */
|
||||||
|
QStringList getTools() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned mStyle;
|
QMap<QString, unsigned> mStyle;
|
||||||
unsigned mWarning;
|
QMap<QString, unsigned> mWarning;
|
||||||
unsigned mPerformance;
|
QMap<QString, unsigned> mPerformance;
|
||||||
unsigned mPortability;
|
QMap<QString, unsigned> mPortability;
|
||||||
unsigned mInformation;
|
QMap<QString, unsigned> mInformation;
|
||||||
unsigned mError;
|
QMap<QString, unsigned> mError;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
|
@ -184,7 +184,7 @@ void CheckThread::runAddons(const QString &addonPath, const ImportProject::FileS
|
||||||
QFile f2(analyzerInfoFile + '.' + addon + "-results");
|
QFile f2(analyzerInfoFile + '.' + addon + "-results");
|
||||||
if (f2.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (f2.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
QTextStream in2(&f2);
|
QTextStream in2(&f2);
|
||||||
parseClangErrors(fileName, in2.readAll());
|
parseClangErrors(addon, fileName, in2.readAll());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ void CheckThread::runAddons(const QString &addonPath, const ImportProject::FileS
|
||||||
out << errout;
|
out << errout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parseClangErrors(fileName, errout);
|
parseClangErrors(addon, fileName, errout);
|
||||||
} else {
|
} else {
|
||||||
QString a;
|
QString a;
|
||||||
if (QFileInfo(addonPath + '/' + addon + ".py").exists())
|
if (QFileInfo(addonPath + '/' + addon + ".py").exists())
|
||||||
|
@ -324,7 +324,7 @@ void CheckThread::parseAddonErrors(QString err, QString tool)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckThread::parseClangErrors(const QString &file0, QString err)
|
void CheckThread::parseClangErrors(const QString &tool, const QString &file0, QString err)
|
||||||
{
|
{
|
||||||
QList<ErrorItem> errorItems;
|
QList<ErrorItem> errorItems;
|
||||||
ErrorItem errorItem;
|
ErrorItem errorItem;
|
||||||
|
@ -351,7 +351,7 @@ void CheckThread::parseClangErrors(const QString &file0, QString err)
|
||||||
QString message,id;
|
QString message,id;
|
||||||
if (r2.exactMatch(r1.cap(4))) {
|
if (r2.exactMatch(r1.cap(4))) {
|
||||||
message = r2.cap(1);
|
message = r2.cap(1);
|
||||||
id = r2.cap(2);
|
id = tool + '-' + r2.cap(2);
|
||||||
} else {
|
} else {
|
||||||
message = r1.cap(4);
|
message = r1.cap(4);
|
||||||
id = CLANG;
|
id = CLANG;
|
||||||
|
|
|
@ -119,7 +119,7 @@ private:
|
||||||
void runAddons(const QString &addonPath, const ImportProject::FileSettings *fileSettings, const QString &fileName);
|
void runAddons(const QString &addonPath, const ImportProject::FileSettings *fileSettings, const QString &fileName);
|
||||||
|
|
||||||
void parseAddonErrors(QString err, QString tool);
|
void parseAddonErrors(QString err, QString tool);
|
||||||
void parseClangErrors(const QString &file0, QString err);
|
void parseClangErrors(const QString &tool, const QString &file0, QString err);
|
||||||
|
|
||||||
QStringList mFiles;
|
QStringList mFiles;
|
||||||
bool mAnalyseWholeProgram;
|
bool mAnalyseWholeProgram;
|
||||||
|
|
|
@ -55,6 +55,16 @@ ErrorItem::ErrorItem(const ErrorLogger::ErrorMessage &errmsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString ErrorItem::tool() const
|
||||||
|
{
|
||||||
|
if (errorId == "clang")
|
||||||
|
return "clang";
|
||||||
|
if (errorId.startsWith("clang-tidy"))
|
||||||
|
return "clang-tidy";
|
||||||
|
if (errorId.startsWith("clang-"))
|
||||||
|
return "clang";
|
||||||
|
return "cppcheck";
|
||||||
|
}
|
||||||
|
|
||||||
QString ErrorItem::ToString() const
|
QString ErrorItem::ToString() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -79,6 +79,7 @@ public:
|
||||||
* @return Error item as string.
|
* @return Error item as string.
|
||||||
*/
|
*/
|
||||||
QString ToString() const;
|
QString ToString() const;
|
||||||
|
QString tool() const;
|
||||||
|
|
||||||
QString file0;
|
QString file0;
|
||||||
QString errorId;
|
QString errorId;
|
||||||
|
|
|
@ -107,7 +107,7 @@ void ResultsView::error(const ErrorItem &item)
|
||||||
{
|
{
|
||||||
if (mUI.mTree->addErrorItem(item)) {
|
if (mUI.mTree->addErrorItem(item)) {
|
||||||
emit gotResults();
|
emit gotResults();
|
||||||
mStatistics->addItem(ShowTypes::SeverityToShowType(item.severity));
|
mStatistics->addItem(item.tool(), ShowTypes::SeverityToShowType(item.severity));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,12 +142,15 @@ void ResultsView::saveStatistics(const QString &filename) const
|
||||||
if (!f.open(QIODevice::Text | QIODevice::Append))
|
if (!f.open(QIODevice::Text | QIODevice::Append))
|
||||||
return;
|
return;
|
||||||
QTextStream ts(&f);
|
QTextStream ts(&f);
|
||||||
ts << '[' << QDate::currentDate().toString("dd.MM.yyyy") << "]\n";
|
ts << '[' << QDate::currentDate().toString("dd.MM.yyyy") << "]\n";
|
||||||
ts << "error:" << mStatistics->getCount(ShowTypes::ShowErrors) << '\n';
|
ts << QDateTime::currentMSecsSinceEpoch() + '\n';
|
||||||
ts << "warning:" << mStatistics->getCount(ShowTypes::ShowWarnings) << '\n';
|
foreach (QString tool, mStatistics->getTools()) {
|
||||||
ts << "style:" << mStatistics->getCount(ShowTypes::ShowStyle) << '\n';
|
ts << tool << "-error:" << mStatistics->getCount(tool, ShowTypes::ShowErrors) << '\n';
|
||||||
ts << "performance:" << mStatistics->getCount(ShowTypes::ShowPerformance) << '\n';
|
ts << tool << "-warning:" << mStatistics->getCount(tool, ShowTypes::ShowWarnings) << '\n';
|
||||||
ts << "portability:" << mStatistics->getCount(ShowTypes::ShowPortability) << '\n';
|
ts << tool << "-style:" << mStatistics->getCount(tool, ShowTypes::ShowStyle) << '\n';
|
||||||
|
ts << tool << "-performance:" << mStatistics->getCount(tool, ShowTypes::ShowPerformance) << '\n';
|
||||||
|
ts << tool << "-portability:" << mStatistics->getCount(tool, ShowTypes::ShowPortability) << '\n';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResultsView::updateFromOldReport(const QString &filename) const
|
void ResultsView::updateFromOldReport(const QString &filename) const
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
#include "statsdialog.h"
|
#include "statsdialog.h"
|
||||||
#include "checkstatistics.h"
|
#include "checkstatistics.h"
|
||||||
|
|
||||||
|
static const QString CPPCHECK("cppcheck");
|
||||||
|
|
||||||
StatsDialog::StatsDialog(QWidget *parent)
|
StatsDialog::StatsDialog(QWidget *parent)
|
||||||
: QDialog(parent),
|
: QDialog(parent),
|
||||||
mStatistics(nullptr)
|
mStatistics(nullptr)
|
||||||
|
@ -54,11 +56,11 @@ void StatsDialog::setProject(const ProjectFile* projectFile)
|
||||||
const QString buildDir = prjpath + '/' + projectFile->getBuildDir();
|
const QString buildDir = prjpath + '/' + projectFile->getBuildDir();
|
||||||
if (QDir(buildDir).exists()) {
|
if (QDir(buildDir).exists()) {
|
||||||
QChart *chart = new QChart();
|
QChart *chart = new QChart();
|
||||||
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "error"));
|
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "cppcheck-error"));
|
||||||
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "warning"));
|
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "cppcheck-warning"));
|
||||||
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "style"));
|
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "cppcheck-style"));
|
||||||
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "performance"));
|
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "cppcheck-performance"));
|
||||||
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "portability"));
|
chart->addSeries(numberOfReports(buildDir + "/statistics.txt", "cppcheck-portability"));
|
||||||
|
|
||||||
QDateTimeAxis *axisX = new QDateTimeAxis;
|
QDateTimeAxis *axisX = new QDateTimeAxis;
|
||||||
axisX->setFormat("MMM yyyy");
|
axisX->setFormat("MMM yyyy");
|
||||||
|
@ -154,17 +156,17 @@ void StatsDialog::pdfExport()
|
||||||
.arg(tr("Statistics"))
|
.arg(tr("Statistics"))
|
||||||
.arg(QDate::currentDate().toString("dd.MM.yyyy"))
|
.arg(QDate::currentDate().toString("dd.MM.yyyy"))
|
||||||
.arg(tr("Errors"))
|
.arg(tr("Errors"))
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowErrors))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowErrors))
|
||||||
.arg(tr("Warnings"))
|
.arg(tr("Warnings"))
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowWarnings))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowWarnings))
|
||||||
.arg(tr("Style warnings"))
|
.arg(tr("Style warnings"))
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowStyle))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowStyle))
|
||||||
.arg(tr("Portability warnings"))
|
.arg(tr("Portability warnings"))
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowPortability))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowPortability))
|
||||||
.arg(tr("Performance warnings"))
|
.arg(tr("Performance warnings"))
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowPerformance))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowPerformance))
|
||||||
.arg(tr("Information messages"))
|
.arg(tr("Information messages"))
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowInformation));
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowInformation));
|
||||||
|
|
||||||
QString fileName = QFileDialog::getSaveFileName((QWidget*)0, tr("Export PDF"), QString(), "*.pdf");
|
QString fileName = QFileDialog::getSaveFileName((QWidget*)0, tr("Export PDF"), QString(), "*.pdf");
|
||||||
if (QFileInfo(fileName).suffix().isEmpty()) {
|
if (QFileInfo(fileName).suffix().isEmpty()) {
|
||||||
|
@ -248,17 +250,17 @@ void StatsDialog::copyToClipboard()
|
||||||
)
|
)
|
||||||
.arg(stats)
|
.arg(stats)
|
||||||
.arg(errors)
|
.arg(errors)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowErrors))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowErrors))
|
||||||
.arg(warnings)
|
.arg(warnings)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowWarnings))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowWarnings))
|
||||||
.arg(style)
|
.arg(style)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowStyle))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowStyle))
|
||||||
.arg(portability)
|
.arg(portability)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowPortability))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowPortability))
|
||||||
.arg(performance)
|
.arg(performance)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowPerformance))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowPerformance))
|
||||||
.arg(information)
|
.arg(information)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowInformation));
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowInformation));
|
||||||
|
|
||||||
const QString textSummary = settings + previous + statistics;
|
const QString textSummary = settings + previous + statistics;
|
||||||
|
|
||||||
|
@ -310,17 +312,17 @@ void StatsDialog::copyToClipboard()
|
||||||
)
|
)
|
||||||
.arg(stats)
|
.arg(stats)
|
||||||
.arg(errors)
|
.arg(errors)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowErrors))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowErrors))
|
||||||
.arg(warnings)
|
.arg(warnings)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowWarnings))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowWarnings))
|
||||||
.arg(style)
|
.arg(style)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowStyle))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowStyle))
|
||||||
.arg(portability)
|
.arg(portability)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowPortability))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowPortability))
|
||||||
.arg(performance)
|
.arg(performance)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowPerformance))
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowPerformance))
|
||||||
.arg(information)
|
.arg(information)
|
||||||
.arg(mStatistics->getCount(ShowTypes::ShowInformation));
|
.arg(mStatistics->getCount(CPPCHECK,ShowTypes::ShowInformation));
|
||||||
|
|
||||||
const QString htmlSummary = htmlSettings + htmlPrevious + htmlStatistics;
|
const QString htmlSummary = htmlSettings + htmlPrevious + htmlStatistics;
|
||||||
|
|
||||||
|
@ -333,12 +335,12 @@ void StatsDialog::copyToClipboard()
|
||||||
void StatsDialog::setStatistics(const CheckStatistics *stats)
|
void StatsDialog::setStatistics(const CheckStatistics *stats)
|
||||||
{
|
{
|
||||||
mStatistics = stats;
|
mStatistics = stats;
|
||||||
mUI.mLblErrors->setText(QString("%1").arg(stats->getCount(ShowTypes::ShowErrors)));
|
mUI.mLblErrors->setText(QString("%1").arg(stats->getCount(CPPCHECK,ShowTypes::ShowErrors)));
|
||||||
mUI.mLblWarnings->setText(QString("%1").arg(stats->getCount(ShowTypes::ShowWarnings)));
|
mUI.mLblWarnings->setText(QString("%1").arg(stats->getCount(CPPCHECK,ShowTypes::ShowWarnings)));
|
||||||
mUI.mLblStyle->setText(QString("%1").arg(stats->getCount(ShowTypes::ShowStyle)));
|
mUI.mLblStyle->setText(QString("%1").arg(stats->getCount(CPPCHECK,ShowTypes::ShowStyle)));
|
||||||
mUI.mLblPortability->setText(QString("%1").arg(stats->getCount(ShowTypes::ShowPortability)));
|
mUI.mLblPortability->setText(QString("%1").arg(stats->getCount(CPPCHECK,ShowTypes::ShowPortability)));
|
||||||
mUI.mLblPerformance->setText(QString("%1").arg(stats->getCount(ShowTypes::ShowPerformance)));
|
mUI.mLblPerformance->setText(QString("%1").arg(stats->getCount(CPPCHECK,ShowTypes::ShowPerformance)));
|
||||||
mUI.mLblInformation->setText(QString("%1").arg(stats->getCount(ShowTypes::ShowInformation)));
|
mUI.mLblInformation->setText(QString("%1").arg(stats->getCount(CPPCHECK,ShowTypes::ShowInformation)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_QCHART
|
#ifdef HAVE_QCHART
|
||||||
|
|
Loading…
Reference in New Issue