|
Packit |
1c1d7e |
#include "expert.h"
|
|
Packit |
1c1d7e |
#include "inputbool.h"
|
|
Packit |
1c1d7e |
#include "inputstring.h"
|
|
Packit |
1c1d7e |
#include "inputint.h"
|
|
Packit |
1c1d7e |
#include "inputstring.h"
|
|
Packit |
1c1d7e |
#include "inputstrlist.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "version.h"
|
|
Packit |
1c1d7e |
#include "configdoc.h"
|
|
Packit |
1c1d7e |
#include "settings.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <QTreeWidget>
|
|
Packit |
1c1d7e |
#include <QStackedWidget>
|
|
Packit |
1c1d7e |
#include <QTextBrowser>
|
|
Packit |
1c1d7e |
#include <QSplitter>
|
|
Packit |
1c1d7e |
#include <QGridLayout>
|
|
Packit |
1c1d7e |
#include <QPushButton>
|
|
Packit |
1c1d7e |
#include <QScrollArea>
|
|
Packit |
1c1d7e |
#include <QFile>
|
|
Packit |
1c1d7e |
#include <QMessageBox>
|
|
Packit |
1c1d7e |
#include <QSettings>
|
|
Packit |
1c1d7e |
#include <QTextStream>
|
|
Packit |
1c1d7e |
#include <QTextCodec>
|
|
Packit |
1c1d7e |
#include <QFileInfo>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define SA(x) QString::fromLatin1(x)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QString convertToComment(const QString &s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (s.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return QString();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return SA("# ")+
|
|
Packit |
1c1d7e |
s.trimmed().replace(SA("\n"),SA("\n# ")).replace(SA("# \n"), SA("#\n"))+
|
|
Packit |
1c1d7e |
SA("\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::setHeader(const char *header)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_header = SA(header);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::add(const char *name,const char *docs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Input *opt = m_options[SA(name)];
|
|
Packit |
1c1d7e |
if (opt)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
opt->setTemplateDocs(SA(docs));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//------------------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Expert::Expert()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_treeWidget = new QTreeWidget;
|
|
Packit |
1c1d7e |
m_treeWidget->setColumnCount(1);
|
|
Packit |
1c1d7e |
m_topicStack = new QStackedWidget;
|
|
Packit |
1c1d7e |
m_inShowHelp = false;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QFile file(SA(":/config.xml"));
|
|
Packit |
1c1d7e |
QString err;
|
|
Packit |
1c1d7e |
int errLine,errCol;
|
|
Packit |
1c1d7e |
QDomDocument configXml;
|
|
Packit |
1c1d7e |
if (file.open(QIODevice::ReadOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!configXml.setContent(&file,false,&err,&errLine,&errCol))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString msg = tr("Error parsing internal config.xml at line %1 column %2.\n%3").
|
|
Packit |
1c1d7e |
arg(errLine).arg(errCol).arg(err);
|
|
Packit |
1c1d7e |
QMessageBox::warning(this, tr("Error"), msg);
|
|
Packit |
1c1d7e |
exit(1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_rootElement = configXml.documentElement();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
createTopics(m_rootElement);
|
|
Packit |
1c1d7e |
m_helper = new QTextBrowser;
|
|
Packit |
1c1d7e |
m_helper->setReadOnly(true);
|
|
Packit |
1c1d7e |
m_helper->setOpenExternalLinks(true);
|
|
Packit |
1c1d7e |
m_splitter = new QSplitter(Qt::Vertical);
|
|
Packit |
1c1d7e |
m_splitter->addWidget(m_treeWidget);
|
|
Packit |
1c1d7e |
m_splitter->addWidget(m_helper);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QWidget *rightSide = new QWidget;
|
|
Packit |
1c1d7e |
QGridLayout *grid = new QGridLayout(rightSide);
|
|
Packit |
1c1d7e |
m_prev = new QPushButton(tr("Previous"));
|
|
Packit |
1c1d7e |
m_prev->setEnabled(false);
|
|
Packit |
1c1d7e |
m_next = new QPushButton(tr("Next"));
|
|
Packit |
1c1d7e |
grid->addWidget(m_topicStack,0,0,1,2);
|
|
Packit |
1c1d7e |
grid->addWidget(m_prev,1,0,Qt::AlignLeft);
|
|
Packit |
1c1d7e |
grid->addWidget(m_next,1,1,Qt::AlignRight);
|
|
Packit |
1c1d7e |
grid->setColumnStretch(0,1);
|
|
Packit |
1c1d7e |
grid->setRowStretch(0,1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
addWidget(m_splitter);
|
|
Packit |
1c1d7e |
addWidget(rightSide);
|
|
Packit |
1c1d7e |
connect(m_next,SIGNAL(clicked()),SLOT(nextTopic()));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
connect(m_prev,SIGNAL(clicked()),SLOT(prevTopic()));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
addConfigDocs(this);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Expert::~Expert()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QHashIterator<QString,Input*> i(m_options);
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
delete i.value();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::createTopics(const QDomElement &rootElem)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QList<QTreeWidgetItem*> items;
|
|
Packit |
1c1d7e |
QDomElement childElem = rootElem.firstChildElement();
|
|
Packit |
1c1d7e |
while (!childElem.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (childElem.tagName()==SA("group"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// Remove _ from a group name like: Source_Browser
|
|
Packit |
1c1d7e |
QString name = childElem.attribute(SA("name")).replace(SA("_"),SA(" "));
|
|
Packit |
1c1d7e |
items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(name)));
|
|
Packit |
1c1d7e |
QWidget *widget = createTopicWidget(childElem);
|
|
Packit |
1c1d7e |
m_topics[name] = widget;
|
|
Packit |
1c1d7e |
m_topicStack->addWidget(widget);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
childElem = childElem.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_treeWidget->setHeaderLabels(QStringList() << SA("Topics"));
|
|
Packit |
1c1d7e |
m_treeWidget->insertTopLevelItems(0,items);
|
|
Packit |
1c1d7e |
connect(m_treeWidget,
|
|
Packit |
1c1d7e |
SIGNAL(currentItemChanged(QTreeWidgetItem *,QTreeWidgetItem *)),
|
|
Packit |
1c1d7e |
this,
|
|
Packit |
1c1d7e |
SLOT(activateTopic(QTreeWidgetItem *,QTreeWidgetItem *)));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QString getDocsForNode(const QDomElement &child)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString type = child.attribute(SA("type"));
|
|
Packit |
1c1d7e |
QString docs = SA("");
|
|
Packit |
1c1d7e |
// read documentation text
|
|
Packit |
1c1d7e |
QDomElement docsVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!docsVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (docsVal.tagName()==SA("docs") &&
|
|
Packit |
1c1d7e |
docsVal.attribute(SA("doxywizard")) != SA("0"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for (QDomNode n = docsVal.firstChild(); !n.isNull(); n = n.nextSibling())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QDomText t = n.toText();
|
|
Packit |
1c1d7e |
if (!t.isNull()) docs+=t.data();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docsVal = docsVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// for an enum we list the values
|
|
Packit |
1c1d7e |
if (type==SA("enum"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
docs += SA("Possible values are: ");
|
|
Packit |
1c1d7e |
int numValues=0;
|
|
Packit |
1c1d7e |
docsVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!docsVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (docsVal.tagName()==SA("value"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
numValues++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docsVal = docsVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int i=0;
|
|
Packit |
1c1d7e |
docsVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!docsVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (docsVal.tagName()==SA("value"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
docs += SA("") + docsVal.attribute(SA("name")) + SA(" ");
|
|
Packit |
1c1d7e |
QString desc = docsVal.attribute(SA("desc"));
|
|
Packit |
1c1d7e |
if (!desc.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+= SA(" ")+desc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (i==numValues-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" and ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (i==numValues)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(".");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(", ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docsVal = docsVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs+=SA(" The default value is: ")+
|
|
Packit |
1c1d7e |
child.attribute(SA("defval"))+
|
|
Packit |
1c1d7e |
SA(".");
|
|
Packit |
1c1d7e |
docs+= SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("int"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs+=SA("Minimum value: ")+child.attribute(SA("minval"))+SA(", ");
|
|
Packit |
1c1d7e |
docs+=SA("maximum value: ")+child.attribute(SA("maxval"))+SA(", ");
|
|
Packit |
1c1d7e |
docs+=SA("default value: ")+child.attribute(SA("defval"))+SA(".");
|
|
Packit |
1c1d7e |
docs+= SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("bool"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
if (child.hasAttribute(SA("altdefval")))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" The default value is: system dependent.");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString defval = child.attribute(SA("defval"));
|
|
Packit |
1c1d7e |
docs+=SA(" The default value is: ")+
|
|
Packit |
1c1d7e |
(defval==SA("1")?SA("YES"):SA("NO"))+
|
|
Packit |
1c1d7e |
SA(".");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docs+= SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("list"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (child.attribute(SA("format"))==SA("string"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int numValues = 0;
|
|
Packit |
1c1d7e |
docsVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!docsVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (docsVal.tagName()==SA("value"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString showDocu = SA("");
|
|
Packit |
1c1d7e |
if (docsVal.hasAttribute(SA("show_docu")))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
showDocu = docsVal.attribute(SA("show_docu")).toLower();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ((showDocu != SA("no")) && (docsVal.attribute(SA("name"))!=SA(""))) numValues++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docsVal = docsVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (numValues>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int i = 0;
|
|
Packit |
1c1d7e |
docsVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!docsVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (docsVal.tagName()==SA("value"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString showDocu = SA("");
|
|
Packit |
1c1d7e |
if (docsVal.hasAttribute(SA("show_docu")))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
showDocu = docsVal.attribute(SA("show_docu")).toLower();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ((showDocu != SA("no")) && (docsVal.attribute(SA("name"))!=SA("")))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
docs += SA("") + docsVal.attribute(SA("name")) + SA(" ");
|
|
Packit |
1c1d7e |
QString desc = docsVal.attribute(SA("desc"));
|
|
Packit |
1c1d7e |
if (desc != SA(""))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" ") + desc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (i==numValues-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" and ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (i==numValues)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(".");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(", ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docsVal = docsVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// docs+= SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("string"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString defval = child.attribute(SA("defval"));
|
|
Packit |
1c1d7e |
if (child.attribute(SA("format")) == SA("dir"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (defval != SA(""))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs += SA(" The default directory is: ") + defval + SA(" .");
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (child.attribute(SA("format")) == SA("file"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString abspath = child.attribute(SA("abspath"));
|
|
Packit |
1c1d7e |
if (defval != SA(""))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
if (abspath != SA("1"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" The default file is: ") + defval + SA(" .");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" The default file (with absolute path) is: ") + defval + SA(" .");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (abspath == SA("1"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs += SA(" The file has to be specified with full path.");
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (child.attribute(SA("format")) == SA("image"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString abspath = child.attribute(SA("abspath"));
|
|
Packit |
1c1d7e |
if (defval != SA(""))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
if (abspath != SA("1"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" The default image is: ") + defval + SA(" .");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs += SA(" The default image (with absolute path) is: ") + defval + SA(" .");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (abspath == SA("1"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs += SA(" The image has to be specified with full path.");
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // if (child.attribute(SA("format")) == SA("string"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (defval != SA(""))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs += SA(" The default value is: ") + defval + SA(" .");
|
|
Packit |
1c1d7e |
docs += SA(" ");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (child.hasAttribute(SA("depends")))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString dependsOn = child.attribute(SA("depends"));
|
|
Packit |
1c1d7e |
docs+=SA(" ");
|
|
Packit |
1c1d7e |
docs+= SA(" This tag requires that the tag \\ref cfg_");
|
|
Packit |
1c1d7e |
docs+= dependsOn.toLower();
|
|
Packit |
1c1d7e |
docs+= SA(" \"");
|
|
Packit |
1c1d7e |
docs+= dependsOn.toUpper();
|
|
Packit |
1c1d7e |
docs+= SA("\" is set to YES .");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Remove / replace doxygen markup strings
|
|
Packit |
1c1d7e |
// the regular expressions are hard to read so the intention will be given
|
|
Packit |
1c1d7e |
QRegExp regexp;
|
|
Packit |
1c1d7e |
// remove \n at end and replace by a space
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\n$"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA(" "));
|
|
Packit |
1c1d7e |
// remove at end
|
|
Packit |
1c1d7e |
regexp.setPattern(SA(" *$"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA(" "));
|
|
Packit |
1c1d7e |
// \c word -> word ; word ends with ')', ',', '.' or ' '
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\c[ ]+([^ \\)]+)\\)"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 )"));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\c[ ]+([^ ,]+),"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 ,"));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\c[ ]+([^ \\.]+)\\."));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 ."));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\c[ ]+([^ ]+) "));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 "));
|
|
Packit |
1c1d7e |
// `word` -> word
|
|
Packit |
1c1d7e |
docs.replace(SA("``"),SA(""));
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("`([^`]+)`"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 "));
|
|
Packit |
1c1d7e |
// \ref key "desc" -> desc
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\ref[ ]+[^ ]+[ ]+\"([^ ]+)\""));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 "));
|
|
Packit |
1c1d7e |
//\ref specials
|
|
Packit |
1c1d7e |
// \ref <key> -> description
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\ref[ ]+doxygen_usage"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\"Doxygen usage\""));
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\ref[ ]+extsearch"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\"External Indexing and Searching\""));
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\ref[ ]+external"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\"Linking to external documentation\""));
|
|
Packit |
1c1d7e |
// fallback for not handled
|
|
Packit |
1c1d7e |
docs.replace(SA("\\\\ref"),SA(""));
|
|
Packit |
1c1d7e |
// \b word -> word<\b>
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\b[ ]+([^ ]+) "));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 "));
|
|
Packit |
1c1d7e |
// \e word -> word<\em>
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\e[ ]+([^ ]+) "));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("\\1 "));
|
|
Packit |
1c1d7e |
// \note -> Note:
|
|
Packit |
1c1d7e |
// @note -> Note:
|
|
Packit |
1c1d7e |
docs.replace(SA("\\note"),SA(" Note:"));
|
|
Packit |
1c1d7e |
docs.replace(SA("@note"),SA(" Note:"));
|
|
Packit |
1c1d7e |
// \#include -> #include
|
|
Packit |
1c1d7e |
// \#undef -> #undef
|
|
Packit |
1c1d7e |
docs.replace(SA("\\#include"),SA("#include"));
|
|
Packit |
1c1d7e |
docs.replace(SA("\\#undef"),SA("#undef"));
|
|
Packit |
1c1d7e |
// -# -> -
|
|
Packit |
1c1d7e |
// " - " -> -
|
|
Packit |
1c1d7e |
docs.replace(SA("-#"),SA(" -"));
|
|
Packit |
1c1d7e |
docs.replace(SA(" - "),SA(" -"));
|
|
Packit |
1c1d7e |
// \verbatim ->
|
|
Packit |
1c1d7e |
// \endverbatim ->
|
|
Packit |
1c1d7e |
docs.replace(SA("\\verbatim"),SA(""));
|
|
Packit |
1c1d7e |
docs.replace(SA("\\endverbatim"),SA(""));
|
|
Packit |
1c1d7e |
// \sa -> See also:
|
|
Packit |
1c1d7e |
// \par ->
|
|
Packit |
1c1d7e |
docs.replace(SA("\\sa"),SA(" See also:"));
|
|
Packit |
1c1d7e |
docs.replace(SA("\\par"),SA(" "));
|
|
Packit |
1c1d7e |
// 2xbackslash -> backslash
|
|
Packit |
1c1d7e |
// \@ -> @
|
|
Packit |
1c1d7e |
docs.replace(SA("\\\\"),SA("\\"));
|
|
Packit |
1c1d7e |
docs.replace(SA("\\@"),SA("@"));
|
|
Packit |
1c1d7e |
// \& -> &
|
|
Packit |
1c1d7e |
// \$ -> $
|
|
Packit |
1c1d7e |
docs.replace(SA("\\&"),SA("&"));
|
|
Packit |
1c1d7e |
docs.replace(SA("\\$"),SA("$"));
|
|
Packit |
1c1d7e |
// \< -> <
|
|
Packit |
1c1d7e |
// \> -> >
|
|
Packit |
1c1d7e |
docs.replace(SA("\\<"),SA("<"));
|
|
Packit |
1c1d7e |
docs.replace(SA("\\>"),SA(">"));
|
|
Packit |
1c1d7e |
regexp.setPattern(SA(" (http:[^ \\)]*)([ \\)])"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA(" \\1\\2"));
|
|
Packit |
1c1d7e |
// LaTeX name as formula -> LaTeX
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\f\\$\\\\mbox\\{\\\\LaTeX\\}\\\\f\\$"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("LaTeX"));
|
|
Packit |
1c1d7e |
// Other formula's (now just 2) so explicitly mentioned.
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\f\\$2\\^\\{\\(16\\+\\\\mbox\\{LOOKUP\\\\_CACHE\\\\_SIZE\\}\\)\\}\\\\f\\$"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("2^(16+LOOKUP_CACHE_SIZE)"));
|
|
Packit |
1c1d7e |
regexp.setPattern(SA("\\\\f\\$2\\^\\{16\\} = 65536\\\\f\\$"));
|
|
Packit |
1c1d7e |
docs.replace(regexp,SA("2^16=65536"));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
return docs.trimmed();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QWidget *Expert::createTopicWidget(QDomElement &elem)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QScrollArea *area = new QScrollArea;
|
|
Packit |
1c1d7e |
QWidget *topic = new QWidget;
|
|
Packit |
1c1d7e |
QGridLayout *layout = new QGridLayout(topic);
|
|
Packit |
1c1d7e |
QDomElement child = elem.firstChildElement();
|
|
Packit |
1c1d7e |
int row=0;
|
|
Packit |
1c1d7e |
while (!child.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString setting = child.attribute(SA("setting"));
|
|
Packit |
1c1d7e |
if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString type = child.attribute(SA("type"));
|
|
Packit |
1c1d7e |
QString docs = getDocsForNode(child);
|
|
Packit |
1c1d7e |
if (type==SA("bool"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
InputBool *boolOption =
|
|
Packit |
1c1d7e |
new InputBool(
|
|
Packit |
1c1d7e |
layout,row,
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
child.attribute(SA("defval"))==SA("1"),
|
|
Packit |
1c1d7e |
docs
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_options.insert(
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
boolOption
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
connect(boolOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
|
|
Packit |
1c1d7e |
connect(boolOption,SIGNAL(changed()),SIGNAL(changed()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("string"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
InputString::StringMode mode;
|
|
Packit |
1c1d7e |
QString format = child.attribute(SA("format"));
|
|
Packit |
1c1d7e |
if (format==SA("dir"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputString::StringDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (format==SA("file"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputString::StringFile;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (format==SA("image"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputString::StringImage;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // format=="string"
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputString::StringFree;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
InputString *stringOption =
|
|
Packit |
1c1d7e |
new InputString(
|
|
Packit |
1c1d7e |
layout,row,
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
child.attribute(SA("defval")),
|
|
Packit |
1c1d7e |
mode,
|
|
Packit |
1c1d7e |
docs,
|
|
Packit |
1c1d7e |
child.attribute(SA("abspath"))
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_options.insert(
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
stringOption
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
connect(stringOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
|
|
Packit |
1c1d7e |
connect(stringOption,SIGNAL(changed()),SIGNAL(changed()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("enum"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
InputString *enumList = new InputString(
|
|
Packit |
1c1d7e |
layout,row,
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
child.attribute(SA("defval")),
|
|
Packit |
1c1d7e |
InputString::StringFixed,
|
|
Packit |
1c1d7e |
docs
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
QDomElement enumVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!enumVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (enumVal.tagName()==SA("value"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
enumList->addValue(enumVal.attribute(SA("name")));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
enumVal = enumVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
enumList->setDefault();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_options.insert(child.attribute(SA("id")),enumList);
|
|
Packit |
1c1d7e |
connect(enumList,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
|
|
Packit |
1c1d7e |
connect(enumList,SIGNAL(changed()),SIGNAL(changed()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("int"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
InputInt *intOption =
|
|
Packit |
1c1d7e |
new InputInt(
|
|
Packit |
1c1d7e |
layout,row,
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
child.attribute(SA("defval")).toInt(),
|
|
Packit |
1c1d7e |
child.attribute(SA("minval")).toInt(),
|
|
Packit |
1c1d7e |
child.attribute(SA("maxval")).toInt(),
|
|
Packit |
1c1d7e |
docs
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_options.insert(
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
intOption
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
connect(intOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
|
|
Packit |
1c1d7e |
connect(intOption,SIGNAL(changed()),SIGNAL(changed()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("list"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
InputStrList::ListMode mode;
|
|
Packit |
1c1d7e |
QString format = child.attribute(SA("format"));
|
|
Packit |
1c1d7e |
if (format==SA("dir"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputStrList::ListDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (format==SA("file"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputStrList::ListFile;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (format==SA("filedir"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputStrList::ListFileDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // format=="string"
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
mode = InputStrList::ListString;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QStringList sl;
|
|
Packit |
1c1d7e |
QDomElement listVal = child.firstChildElement();
|
|
Packit |
1c1d7e |
while (!listVal.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (listVal.tagName()==SA("value"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sl.append(listVal.attribute(SA("name")));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
listVal = listVal.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
InputStrList *listOption =
|
|
Packit |
1c1d7e |
new InputStrList(
|
|
Packit |
1c1d7e |
layout,row,
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
sl,
|
|
Packit |
1c1d7e |
mode,
|
|
Packit |
1c1d7e |
docs
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_options.insert(
|
|
Packit |
1c1d7e |
child.attribute(SA("id")),
|
|
Packit |
1c1d7e |
listOption
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
connect(listOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
|
|
Packit |
1c1d7e |
connect(listOption,SIGNAL(changed()),SIGNAL(changed()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type==SA("obsolete"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// ignore
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // should not happen
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
printf("Unsupported type %s\n",qPrintable(child.attribute(SA("type"))));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} // IS_SUPPORTED
|
|
Packit |
1c1d7e |
child = child.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// compute dependencies between options
|
|
Packit |
1c1d7e |
child = elem.firstChildElement();
|
|
Packit |
1c1d7e |
while (!child.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString setting = child.attribute(SA("setting"));
|
|
Packit |
1c1d7e |
QString dependsOn = child.attribute(SA("depends"));
|
|
Packit |
1c1d7e |
QString id = child.attribute(SA("id"));
|
|
Packit |
1c1d7e |
if (!dependsOn.isEmpty() &&
|
|
Packit |
1c1d7e |
(setting.isEmpty() || IS_SUPPORTED(setting.toLatin1())))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Input *parentOption = m_options[dependsOn];
|
|
Packit |
1c1d7e |
if (parentOption==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
printf("%s has depends=%s that is not valid\n",
|
|
Packit |
1c1d7e |
qPrintable(id),qPrintable(dependsOn));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
Input *thisOption = m_options[id];
|
|
Packit |
1c1d7e |
Q_ASSERT(parentOption);
|
|
Packit |
1c1d7e |
Q_ASSERT(thisOption);
|
|
Packit |
1c1d7e |
if (parentOption && thisOption)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Adding dependency '%s' (%p)->'%s' (%p)\n",
|
|
Packit |
1c1d7e |
// qPrintable(dependsOn),parentOption,
|
|
Packit |
1c1d7e |
// qPrintable(id),thisOption);
|
|
Packit |
1c1d7e |
parentOption->addDependency(thisOption);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
child = child.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// set initial dependencies
|
|
Packit |
1c1d7e |
QHashIterator<QString,Input*> i(m_options);
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
if (i.value())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.value()->updateDependencies();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
layout->setRowStretch(row,1);
|
|
Packit |
1c1d7e |
layout->setColumnStretch(1,2);
|
|
Packit |
1c1d7e |
layout->setSpacing(5);
|
|
Packit |
1c1d7e |
topic->setLayout(layout);
|
|
Packit |
1c1d7e |
area->setWidget(topic);
|
|
Packit |
1c1d7e |
area->setWidgetResizable(true);
|
|
Packit |
1c1d7e |
return area;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (item)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QWidget *w = m_topics[item->text(0)];
|
|
Packit |
1c1d7e |
m_topicStack->setCurrentWidget(w);
|
|
Packit |
1c1d7e |
m_prev->setEnabled(m_topicStack->currentIndex()!=0);
|
|
Packit |
1c1d7e |
m_next->setEnabled(true);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::loadSettings(QSettings *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QHashIterator<QString,Input*> i(m_options);
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
QVariant var = s->value(SA("config/")+i.key());
|
|
Packit |
1c1d7e |
if (i.value())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Loading key %s: type=%d value='%s'\n",qPrintable(i.key()),var.type(),qPrintable(var.toString()));
|
|
Packit |
1c1d7e |
i.value()->value() = var;
|
|
Packit |
1c1d7e |
i.value()->update();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::saveSettings(QSettings *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QHashIterator<QString,Input*> i(m_options);
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
//printf("Saving key %s: type=%d value='%s'\n",qPrintable(i.key()),i.value()->value().type(),qPrintable(i.value()->value().toString()));
|
|
Packit |
1c1d7e |
if (i.value())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
s->setValue(SA("config/")+i.key(),i.value()->value());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::loadConfig(const QString &fileName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Expert::loadConfig(%s)\n",qPrintable(fileName));
|
|
Packit |
1c1d7e |
parseConfig(fileName,m_options);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
|
|
Packit |
1c1d7e |
bool brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "#---------------------------------------------------------------------------" << endl;
|
|
Packit |
1c1d7e |
t << "# " << elem.attribute(SA("docs")) << endl;
|
|
Packit |
1c1d7e |
t << "#---------------------------------------------------------------------------" << endl;
|
|
Packit |
1c1d7e |
// write options...
|
|
Packit |
1c1d7e |
QDomElement childElem = elem.firstChildElement();
|
|
Packit |
1c1d7e |
while (!childElem.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString setting = childElem.attribute(SA("setting"));
|
|
Packit |
1c1d7e |
QString type = childElem.attribute(SA("type"));
|
|
Packit |
1c1d7e |
QString name = childElem.attribute(SA("id"));
|
|
Packit |
1c1d7e |
if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QHash<QString,Input*>::const_iterator i = m_options.find(name);
|
|
Packit |
1c1d7e |
if (i!=m_options.end())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Input *option = i.value();
|
|
Packit |
1c1d7e |
if (option && !brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << endl;
|
|
Packit |
1c1d7e |
t << convertToComment(option->templateDocs());
|
|
Packit |
1c1d7e |
t << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << name.leftJustified(MAX_OPTION_LENGTH) << "= ";
|
|
Packit |
1c1d7e |
if (option)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
option->writeValue(t,codec);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
childElem = childElem.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Expert::writeConfig(QTextStream &t,bool brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// write global header
|
|
Packit |
1c1d7e |
t << "# Doxyfile " << versionString << endl << endl;
|
|
Packit |
1c1d7e |
if (!brief)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << convertToComment(m_header);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QTextCodec *codec = 0;
|
|
Packit |
1c1d7e |
Input *option = m_options[QString::fromLatin1("DOXYFILE_ENCODING")];
|
|
Packit |
1c1d7e |
if (option)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codec = QTextCodec::codecForName(option->value().toString().toLatin1());
|
|
Packit |
1c1d7e |
if (codec==0) // fallback: use UTF-8
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codec = QTextCodec::codecForName("UTF-8");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QDomElement childElem = m_rootElement.firstChildElement();
|
|
Packit |
1c1d7e |
while (!childElem.isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (childElem.tagName()==SA("group"))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
saveTopic(t,childElem,codec,brief);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
childElem = childElem.nextSiblingElement();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QByteArray Expert::saveInnerState () const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_splitter->saveState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Expert::restoreInnerState ( const QByteArray & state )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_splitter->restoreState(state);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::showHelp(Input *option)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!m_inShowHelp)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_inShowHelp = true;
|
|
Packit |
1c1d7e |
m_helper->setText(
|
|
Packit |
1c1d7e |
QString::fromLatin1("<qt>")+option->id()+
|
|
Packit |
1c1d7e |
QString::fromLatin1(" ")+
|
|
Packit |
1c1d7e |
QString::fromLatin1(" ")+
|
|
Packit |
1c1d7e |
option->docs().
|
|
Packit |
1c1d7e |
replace(QChar::fromLatin1('\n'),QChar::fromLatin1(' '))+
|
|
Packit |
1c1d7e |
QString::fromLatin1("</qt>")
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_inShowHelp = false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::nextTopic()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_topicStack->currentIndex()+1==m_topicStack->count()) // last topic
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
done();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1);
|
|
Packit |
1c1d7e |
m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
|
|
Packit |
1c1d7e |
m_prev->setEnabled(m_topicStack->currentIndex()!=0);
|
|
Packit |
1c1d7e |
m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::prevTopic()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_topicStack->setCurrentIndex(m_topicStack->currentIndex()-1);
|
|
Packit |
1c1d7e |
m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
|
|
Packit |
1c1d7e |
m_prev->setEnabled(m_topicStack->currentIndex()!=0);
|
|
Packit |
1c1d7e |
m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::resetToDefaults()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Expert::makeDefaults()\n");
|
|
Packit |
1c1d7e |
QHashIterator<QString,Input*> i(m_options);
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
if (i.value())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.value()->reset();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool stringVariantToBool(const QVariant &v)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString s = v.toString().toLower();
|
|
Packit |
1c1d7e |
return s==QString::fromLatin1("yes") || s==QString::fromLatin1("true") || s==QString::fromLatin1("1");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool getBoolOption(
|
|
Packit |
1c1d7e |
const QHash<QString,Input*>&model,const QString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Input *option = model[name];
|
|
Packit |
1c1d7e |
Q_ASSERT(option!=0);
|
|
Packit |
1c1d7e |
return stringVariantToBool(option->value());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QString getStringOption(
|
|
Packit |
1c1d7e |
const QHash<QString,Input*>&model,const QString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Input *option = model[name];
|
|
Packit |
1c1d7e |
Q_ASSERT(option!=0);
|
|
Packit |
1c1d7e |
return option->value().toString();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Expert::htmlOutputPresent(const QString &workingDir) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool generateHtml = getBoolOption(m_options,QString::fromLatin1("GENERATE_HTML"));
|
|
Packit |
1c1d7e |
if (!generateHtml || workingDir.isEmpty()) return false;
|
|
Packit |
1c1d7e |
QString indexFile = getHtmlOutputIndex(workingDir);
|
|
Packit |
1c1d7e |
QFileInfo fi(indexFile);
|
|
Packit |
1c1d7e |
return fi.exists() && fi.isFile();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString Expert::getHtmlOutputIndex(const QString &workingDir) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString outputDir = getStringOption(m_options,QString::fromLatin1("OUTPUT_DIRECTORY"));
|
|
Packit |
1c1d7e |
QString htmlOutputDir = getStringOption(m_options,QString::fromLatin1("HTML_OUTPUT"));
|
|
Packit |
1c1d7e |
//printf("outputDir=%s\n",qPrintable(outputDir));
|
|
Packit |
1c1d7e |
//printf("htmlOutputDir=%s\n",qPrintable(htmlOutputDir));
|
|
Packit |
1c1d7e |
QString indexFile = workingDir;
|
|
Packit |
1c1d7e |
if (QFileInfo(outputDir).isAbsolute()) // override
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
indexFile = outputDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // append
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
indexFile += QString::fromLatin1("/")+outputDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (QFileInfo(htmlOutputDir).isAbsolute()) // override
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
indexFile = htmlOutputDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // append
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
indexFile += QString::fromLatin1("/")+htmlOutputDir;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
indexFile+=QString::fromLatin1("/index.html");
|
|
Packit |
1c1d7e |
return indexFile;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool Expert::pdfOutputPresent(const QString &workingDir) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool generateLatex = getBoolOption(m_options,QString::fromLatin1("GENERATE_LATEX"));
|
|
Packit |
1c1d7e |
bool pdfLatex = getBoolOption(m_options,QString::fromLatin1("USE_PDFLATEX"));
|
|
Packit |
1c1d7e |
if (!generateLatex || !pdfLatex) return false;
|
|
Packit |
1c1d7e |
QString latexOutput = getStringOption(m_options,QString::fromLatin1("LATEX_OUTPUT"));
|
|
Packit |
1c1d7e |
QString indexFile;
|
|
Packit |
1c1d7e |
if (QFileInfo(latexOutput).isAbsolute())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
indexFile = latexOutput+QString::fromLatin1("/refman.pdf");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
indexFile = workingDir+QString::fromLatin1("/")+
|
|
Packit |
1c1d7e |
latexOutput+QString::fromLatin1("/refman.pdf");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QFileInfo fi(indexFile);
|
|
Packit |
1c1d7e |
return fi.exists() && fi.isFile();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void Expert::refresh()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(0));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|