mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-18 08:54:15 +01:00
OP-1538 Added mustache template and rendering code.
This commit is contained in:
parent
2d17d64406
commit
f687a6d01c
@ -0,0 +1,62 @@
|
||||
<html>
|
||||
<head></head>
|
||||
<body style="font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<table width='100%' cellpadding="5">
|
||||
<tr bgcolor='#308BC6'>
|
||||
<td rowspan='1' colspan='4'><b>{{OBJECT_NAME_TITLE}}: </b>{{OBJECT_NAME}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='1'><b>{{CATEGORY_TITLE}}: </b>{{CATEGORY}}</td>
|
||||
<td colspan='1'><b>{{TYPE_TITLE}}: </b>{{TYPE}}</td>
|
||||
<td colspan='1'><b>{{SIZE_TITLE}}: </b>{{SIZE}} bytes</td>
|
||||
<td colspan='1'><b>{{MULTI_INSTANCE_TITLE}}: </b>{{MULTI_INSTANCE}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='4' rowspan='1' valign='top'><b>{{DESCRIPTION_TITLE}}: </b>{{DESCRIPTION}}</td>
|
||||
<tr bgcolor='#51A0D3'>
|
||||
<td rowspan='1' colspan='4'><b>{{FIELDS_NAME_TITLE}}</td>
|
||||
</tr>
|
||||
{{#FIELDS}}
|
||||
<tr>
|
||||
<td colspan='4'>
|
||||
<table width='100%' cellpadding="5">
|
||||
<tr bgcolor='#7DBAE2'>
|
||||
<td rowspan='1' colspan='4'><b>{{FIELD_NAME_TITLE}}: </b>{{FIELD_NAME}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan='1' colspan='1'><b>{{FIELD_TYPE_TITLE}}: </b>{{FIELD_TYPE}}</td>
|
||||
{{#FIELD_UNIT_TITLE}}
|
||||
<td rowspan='1' colspan='2'><b>{{FIELD_UNIT_TITLE}}: </b>{{FIELD_UNIT}}</td>
|
||||
{{/FIELD_UNIT_TITLE}}
|
||||
</tr>
|
||||
{{#FIELD_OPTIONS_TITLE}}
|
||||
<tr>
|
||||
<td rowspan='1' colspan='2'><b>{{FIELD_OPTIONS_TITLE}}:
|
||||
</b>{{#FIELD_OPTIONS}}{{FIELD_OPTION_DELIM}}{{FIELD_OPTION}}{{/FIELD_OPTIONS}}</td>
|
||||
</tr>
|
||||
{{/FIELD_OPTIONS_TITLE}}
|
||||
{{#FIELD_ELEMENTS_TITLE}}
|
||||
<tr>
|
||||
<td rowspan='1' colspan='2'><b>{{FIELD_ELEMENTS_TITLE}}:
|
||||
</b>{{#FIELD_ELEMENTS}}{{FIELD_ELEMENT_DELIM}}{{FIELD_ELEMENT}}{{FIELD_ELEMENT_LIMIT}}{{/FIELD_ELEMENTS}}</td>
|
||||
</tr>
|
||||
{{/FIELD_ELEMENTS_TITLE}}
|
||||
{{^FIELD_ELEMENTS_TITLE}}
|
||||
{{#FIELD_LIMIT_TITLE}}
|
||||
<tr>
|
||||
<td rowspan='1' colspan='2'><b>{{FIELD_LIMIT_TITLE}}: </b>{{FIELD_LIMIT}}</td>
|
||||
</tr>
|
||||
{{/FIELD_LIMIT_TITLE}}
|
||||
{{/FIELD_ELEMENTS_TITLE}}
|
||||
{{#FIELD_DESCRIPTION_TITLE}}
|
||||
<tr>
|
||||
<td rowspan='1' colspan='2'><b>{{FIELD_DESCRIPTION_TITLE}}: </b>{{FIELD_DESCRIPTION}}</td>
|
||||
</tr>
|
||||
{{/FIELD_DESCRIPTION_TITLE}}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{{/FIELDS}}
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
@ -6,5 +6,6 @@
|
||||
<file>images/up_alt.png</file>
|
||||
<file>images/trash.png</file>
|
||||
<file>images/1343241276_eye.png</file>
|
||||
<file>resources/uavodescription.mustache</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -43,7 +43,7 @@ UAVObjectBrowserConfiguration::UAVObjectBrowserConfiguration(QString classId, QS
|
||||
m_useCategorizedView = qSettings->value("CategorizedView").toBool();
|
||||
m_useScientificView = qSettings->value("ScientificView").toBool();
|
||||
m_showMetaData = qSettings->value("showMetaData").toBool();
|
||||
m_showDescription = qSettings->value("showDescription").toBool();
|
||||
m_showDescription = qSettings->value("showDescription").toBool();
|
||||
m_splitterState = qSettings->value("splitterState").toByteArray();
|
||||
m_recentlyUpdatedColor = qSettings->value("recentlyUpdatedColor").value<QColor>();
|
||||
m_manuallyChangedColor = qSettings->value("manuallyChangedColor").value<QColor>();
|
||||
@ -64,7 +64,7 @@ IUAVGadgetConfiguration *UAVObjectBrowserConfiguration::clone()
|
||||
m->m_useScientificView = m_useScientificView;
|
||||
m->m_splitterState = m_splitterState;
|
||||
m->m_showMetaData = m_showMetaData;
|
||||
m->m_showDescription = m_showDescription;
|
||||
m->m_showDescription = m_showDescription;
|
||||
return m;
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <QtCore/QDebug>
|
||||
#include <QItemEditorFactory>
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "utils/mustache.h"
|
||||
|
||||
UAVObjectBrowserWidget::UAVObjectBrowserWidget(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
@ -55,6 +56,7 @@ UAVObjectBrowserWidget::UAVObjectBrowserWidget(QWidget *parent) : QWidget(parent
|
||||
m_browser->treeView->setEditTriggers(QAbstractItemView::AllEditTriggers);
|
||||
m_browser->treeView->setSelectionBehavior(QAbstractItemView::SelectItems);
|
||||
m_browser->splitter->setChildrenCollapsible(false);
|
||||
m_mustacheTemplate = loadFileIntoString(QString(":/uavobjectbrowser/resources/uavodescription.mustache"));
|
||||
showMetaData(m_viewoptions->cbMetaData->isChecked());
|
||||
showDescription(m_viewoptions->cbDescription->isChecked());
|
||||
connect(m_browser->treeView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)),
|
||||
@ -73,7 +75,7 @@ UAVObjectBrowserWidget::UAVObjectBrowserWidget(QWidget *parent) : QWidget(parent
|
||||
connect(m_viewoptions->cbMetaData, SIGNAL(toggled(bool)), this, SLOT(viewOptionsChangedSlot()));
|
||||
connect(m_viewoptions->cbCategorized, SIGNAL(toggled(bool)), this, SLOT(viewOptionsChangedSlot()));
|
||||
connect(m_viewoptions->cbDescription, SIGNAL(toggled(bool)), this, SLOT(viewOptionsChangedSlot()));
|
||||
connect(m_browser->splitter, SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved()));
|
||||
connect(m_browser->splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved()));
|
||||
enableSendRequest(false);
|
||||
}
|
||||
|
||||
@ -176,6 +178,17 @@ ObjectTreeItem *UAVObjectBrowserWidget::findCurrentObjectTreeItem()
|
||||
return objItem;
|
||||
}
|
||||
|
||||
QString UAVObjectBrowserWidget::loadFileIntoString(QString fileName)
|
||||
{
|
||||
QFile file(fileName);
|
||||
|
||||
file.open(QIODevice::ReadOnly);
|
||||
QTextStream stream(&file);
|
||||
QString line = stream.readAll();
|
||||
file.close();
|
||||
return line;
|
||||
}
|
||||
|
||||
void UAVObjectBrowserWidget::saveObject()
|
||||
{
|
||||
this->setFocus();
|
||||
@ -272,84 +285,83 @@ void UAVObjectBrowserWidget::splitterMoved()
|
||||
|
||||
QString UAVObjectBrowserWidget::createObjectDescription(UAVObject *object)
|
||||
{
|
||||
QString description;
|
||||
description.append("<html><head></head><body style=\" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;\">");
|
||||
description.append("<table border='0' width='99%' cellpadding='5' cellspacing='0'><tbody><tr bgcolor='#498ae8'>");
|
||||
QString mustache(m_mustacheTemplate);
|
||||
|
||||
description.append("<td nowrap='nowrap'>");
|
||||
description.append("<b>").append(tr("Name:")).append(" </b>").append(object->getName());
|
||||
description.append("<br><b>").append(tr("Type:")).append(" </b>")
|
||||
.append(object->isSettingsObject() ? tr("Settings") : object->isMetaDataObject() ? tr("Metadata") : tr("Data"));
|
||||
description.append("<br><b>").append(tr("Category:")).append(" </b>").append(object->getCategory());
|
||||
description.append("</td><td colspan='3' rowspan='1' valign='middle'><b>");
|
||||
description.append(tr("Description:")).append(" </b>").append(object->getDescription().replace("@ref", ""))
|
||||
.append("</td></tr><tr><td colspan='4' rowspan='1' valign='middle'><hr></td></tr>");
|
||||
QVariantHash uavoHash;
|
||||
|
||||
description.append("<tr><td><b>").append(tr("Fields:")).append(" </b></td></tr>");
|
||||
uavoHash["OBJECT_NAME_TITLE"] = tr("Name");
|
||||
uavoHash["OBJECT_NAME"] = object->getName();
|
||||
uavoHash["CATEGORY_TITLE"] = tr("Category");
|
||||
uavoHash["CATEGORY"] = object->getCategory();
|
||||
uavoHash["TYPE_TITLE"] = tr("Type");
|
||||
uavoHash["TYPE"] = object->isMetaDataObject() ? tr("Metadata") : object->isSettingsObject() ? tr("Setting") : tr("Data");
|
||||
uavoHash["SIZE_TITLE"] = tr("Size");
|
||||
uavoHash["SIZE"] = object->getNumBytes();
|
||||
uavoHash["DESCRIPTION_TITLE"] = tr("Description");
|
||||
uavoHash["DESCRIPTION"] = object->getDescription().replace("@ref", "");
|
||||
uavoHash["MULTI_INSTANCE_TITLE"] = tr("Multi");
|
||||
uavoHash["MULTI_INSTANCE"] = object->isSingleInstance() ? tr("No") : tr("Yes");
|
||||
uavoHash["FIELDS_NAME_TITLE"] = tr("Fields");
|
||||
QVariantList fields;
|
||||
foreach(UAVObjectField * field, object->getFields()) {
|
||||
QVariantHash fieldHash;
|
||||
|
||||
int fields = 0;
|
||||
foreach (UAVObjectField *field, object->getFields()) {
|
||||
fields++;
|
||||
QString bgColor = fields & 1 ? "bgcolor='#76A9F3'" : "bgcolor='#98BDF3'";
|
||||
|
||||
description.append("<tr>");
|
||||
description.append("<td nowrap='nowrap' ").append(bgColor).append(">");
|
||||
|
||||
description.append("<b>").append(tr("Name:")).append(" </b>").append(field->getName());
|
||||
description.append("</td><td").append(bgColor);
|
||||
|
||||
description.append("<b>").append(tr("Size:")).append(" </b>").append(tr("%1 bytes").arg(field->getNumBytes()));
|
||||
|
||||
description.append("</td>");
|
||||
|
||||
description.append("<td").append(bgColor);
|
||||
description.append(tr("<b>Type: ")).append("</b>").append(field->getTypeAsString());
|
||||
int elements = field->getNumElements();
|
||||
if (elements > 1) {
|
||||
description.append("[").append(QString("%1").arg(field->getNumElements())).append("]");
|
||||
fieldHash["FIELD_NAME_TITLE"] = tr("Name");
|
||||
fieldHash["FIELD_NAME"] = field->getName();
|
||||
fieldHash["FIELD_TYPE_TITLE"] = tr("Type");
|
||||
fieldHash["FIELD_TYPE"] = QString("%1%2").arg(field->getTypeAsString(),
|
||||
(field->getNumElements() > 1 ? QString("[%1]").arg(field->getNumElements()) : QString()));
|
||||
if (!field->getUnits().isEmpty()) {
|
||||
fieldHash["FIELD_UNIT_TITLE"] = tr("Unit");
|
||||
fieldHash["FIELD_UNIT"] = field->getUnits();
|
||||
}
|
||||
if (!field->getOptions().isEmpty()) {
|
||||
fieldHash["FIELD_OPTIONS_TITLE"] = tr("Options");
|
||||
QVariantList options;
|
||||
foreach(QString option, field->getOptions()) {
|
||||
QVariantHash optionHash;
|
||||
|
||||
description.append("</td>");
|
||||
description.append("<td").append(bgColor).append(">");
|
||||
if (field->getUnits() != "") {
|
||||
description.append("<b>").append(tr("Unit: ")).append("</b>").append(field->getUnits());
|
||||
}
|
||||
description.append("</td>");
|
||||
|
||||
description.append("</tr>");
|
||||
|
||||
if (field->getDescription() != "") {
|
||||
description.append("<tr><td").append(bgColor);
|
||||
description.append("<b>").append(tr("Description: ")).append("</b>").append(field->getDescription());
|
||||
description.append("</td></tr>");
|
||||
}
|
||||
|
||||
if (elements > 1) {
|
||||
description.append("<tr><td").append(bgColor);
|
||||
description.append("</td><td").append(bgColor);
|
||||
description.append("<b>").append(tr("Elements:")).append(" </b>");
|
||||
description.append("</td><td").append(bgColor);
|
||||
QStringList names = field->getElementNames();
|
||||
for (uint i = 0; i < field->getNumElements(); i++) {
|
||||
description.append( i == 0 ? tr("<b>Name: </b>") : " | ").append(names.at(i));
|
||||
if (field->getMinLimit(i).toString() != "" && field->getMaxLimit(i).toString() != "") {
|
||||
description.append(QString("%1 - %2").arg(field->getMinLimit(i).toString(), field->getMaxLimit(i).toString()));
|
||||
optionHash["FIELD_OPTION"] = option;
|
||||
if (!options.isEmpty()) {
|
||||
optionHash["FIELD_OPTION_DELIM"] = ", ";
|
||||
}
|
||||
options.append(optionHash);
|
||||
}
|
||||
description.append("<td").append(bgColor);
|
||||
description.append("</td></tr>");
|
||||
} else {
|
||||
if (field->getMinLimit(0).toString() != "" && field->getMaxLimit(0).toString() != "") {
|
||||
description.append("<tr><td").append(bgColor);
|
||||
description.append(tr("<b> Limits: </b>")).append(" </b>")
|
||||
.append(QString("%1 - %2").arg(field->getMinLimit(0).toString(), field->getMaxLimit(0).toString()));
|
||||
description.append("</td></tr>");
|
||||
}
|
||||
fieldHash["FIELD_OPTIONS"] = options;
|
||||
}
|
||||
if (field->getElementNames().count() > 1) {
|
||||
fieldHash["FIELD_ELEMENTS_TITLE"] = tr("Elements");
|
||||
QVariantList elements;
|
||||
for (int i = 0; i < field->getElementNames().count(); i++) {
|
||||
QString element = field->getElementNames().at(i);
|
||||
QVariantHash elementHash;
|
||||
elementHash["FIELD_ELEMENT"] = element;
|
||||
QString limitsString = field->getLimitsAsString(i);
|
||||
if (!limitsString.isEmpty()) {
|
||||
elementHash["FIELD_ELEMENT_LIMIT"] = limitsString.prepend(" (").append(")");
|
||||
}
|
||||
if (!elements.isEmpty()) {
|
||||
elementHash["FIELD_ELEMENT_DELIM"] = ", ";
|
||||
}
|
||||
elements.append(elementHash);
|
||||
}
|
||||
fieldHash["FIELD_ELEMENTS"] = elements;
|
||||
} else if (!field->getLimitsAsString(0).isEmpty()) {
|
||||
fieldHash["FIELD_LIMIT_TITLE"] = tr("Limits");
|
||||
fieldHash["FIELD_LIMIT"] = field->getLimitsAsString(0);
|
||||
}
|
||||
}
|
||||
|
||||
description.append("</tbody></table></body></html>");
|
||||
return description;
|
||||
if (!field->getDescription().isEmpty()) {
|
||||
fieldHash["FIELD_DESCRIPTION_TITLE"] = tr("Description");
|
||||
fieldHash["FIELD_DESCRIPTION"] = field->getDescription();
|
||||
}
|
||||
|
||||
fields.append(fieldHash);
|
||||
}
|
||||
uavoHash["FIELDS"] = fields;
|
||||
Mustache::QtVariantContext context(uavoHash);
|
||||
Mustache::Renderer renderer;
|
||||
return renderer.render(mustache, &context);
|
||||
}
|
||||
|
||||
void UAVObjectBrowserWidget::enableSendRequest(bool enable)
|
||||
@ -364,6 +376,7 @@ void UAVObjectBrowserWidget::enableSendRequest(bool enable)
|
||||
void UAVObjectBrowserWidget::updateDescription()
|
||||
{
|
||||
ObjectTreeItem *objItem = findCurrentObjectTreeItem();
|
||||
|
||||
if (objItem) {
|
||||
UAVObject *obj = objItem->object();
|
||||
if (obj) {
|
||||
|
@ -78,7 +78,7 @@ private slots:
|
||||
void viewSlot();
|
||||
void viewOptionsChangedSlot();
|
||||
void splitterMoved();
|
||||
QString createObjectDescription(UAVObject* object);
|
||||
QString createObjectDescription(UAVObject *object);
|
||||
signals:
|
||||
void viewOptionsChanged(bool categorized, bool scientific, bool metadata, bool description);
|
||||
void splitterChanged(QByteArray state);
|
||||
@ -94,11 +94,13 @@ private:
|
||||
QColor m_recentlyUpdatedColor;
|
||||
QColor m_manuallyChangedColor;
|
||||
bool m_onlyHilightChangedValues;
|
||||
QString m_mustacheTemplate;
|
||||
|
||||
void updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj);
|
||||
void enableSendRequest(bool enable);
|
||||
void updateDescription();
|
||||
ObjectTreeItem *findCurrentObjectTreeItem();
|
||||
QString loadFileIntoString(QString fileName);
|
||||
};
|
||||
|
||||
#endif /* UAVOBJECTBROWSERWIDGET_H_ */
|
||||
|
@ -459,11 +459,65 @@ bool UAVObjectField::isWithinLimits(QVariant var, quint32 index, int board)
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
QString UAVObjectField::getLimitsAsString(quint32 index, int board)
|
||||
{
|
||||
QString limitString;
|
||||
|
||||
if (elementLimits.keys().contains(index)) {
|
||||
foreach(LimitStruct struc, elementLimits.value(index)) {
|
||||
if ((struc.board != board) && board != 0 && struc.board != 0) {
|
||||
continue;
|
||||
}
|
||||
switch (struc.type) {
|
||||
case EQUAL:
|
||||
{
|
||||
limitString.append(tr("one of")).append(" [");
|
||||
bool first = true;
|
||||
foreach(QVariant var, struc.values) {
|
||||
if (!first) {
|
||||
limitString.append(", ");
|
||||
}
|
||||
limitString.append(var.toString());
|
||||
first = false;
|
||||
}
|
||||
return limitString.append("]");
|
||||
}
|
||||
case NOT_EQUAL:
|
||||
{
|
||||
limitString.append(tr("none of")).append(" [");
|
||||
bool first = true;
|
||||
foreach(QVariant var, struc.values) {
|
||||
if (!first) {
|
||||
limitString.append(", ");
|
||||
}
|
||||
limitString.append(var.toString());
|
||||
first = false;
|
||||
}
|
||||
return limitString.append("]");
|
||||
}
|
||||
case BIGGER: return limitString.append(QString("%1 %2").arg(tr("more than"), struc.values.at(0).toString()));
|
||||
|
||||
case BETWEEN: return limitString.append(QString("%1 %2 %3 %4")
|
||||
.arg(tr("between"), struc.values.at(0).toString(),
|
||||
tr(" and "), struc.values.at(1).toString()));
|
||||
|
||||
case SMALLER: return limitString.append(QString("%1 %2").arg(tr("less than"), struc.values.at(0).toString()));
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return limitString;
|
||||
}
|
||||
|
||||
QVariant UAVObjectField::getMaxLimit(quint32 index, int board)
|
||||
{
|
||||
if (!elementLimits.keys().contains(index)) {
|
||||
@ -479,20 +533,14 @@ QVariant UAVObjectField::getMaxLimit(quint32 index, int board)
|
||||
case BIGGER:
|
||||
return QVariant();
|
||||
|
||||
break;
|
||||
break;
|
||||
case BETWEEN:
|
||||
return struc.values.at(1);
|
||||
|
||||
break;
|
||||
case SMALLER:
|
||||
return struc.values.at(0);
|
||||
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
@ -512,20 +560,14 @@ QVariant UAVObjectField::getMinLimit(quint32 index, int board)
|
||||
case SMALLER:
|
||||
return QVariant();
|
||||
|
||||
break;
|
||||
break;
|
||||
case BETWEEN:
|
||||
return struc.values.at(0);
|
||||
|
||||
break;
|
||||
case BIGGER:
|
||||
return struc.values.at(0);
|
||||
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
|
@ -45,7 +45,7 @@ class UAVOBJECTS_EXPORT UAVObjectField : public QObject {
|
||||
|
||||
public:
|
||||
typedef enum { INT8 = 0, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, BITFIELD, STRING } FieldType;
|
||||
typedef enum { EQUAL, NOT_EQUAL, BETWEEN, BIGGER, SMALLER } LimitType;
|
||||
typedef enum { EQUAL, NOT_EQUAL, BETWEEN, BIGGER, SMALLER, UNDEFINED } LimitType;
|
||||
typedef struct {
|
||||
LimitType type;
|
||||
QList<QVariant> values;
|
||||
@ -85,6 +85,7 @@ public:
|
||||
void fromJson(const QJsonObject &jsonObject);
|
||||
|
||||
bool isWithinLimits(QVariant var, quint32 index, int board = 0);
|
||||
QString getLimitsAsString(quint32 index, int board = 0);
|
||||
QVariant getMaxLimit(quint32 index, int board = 0);
|
||||
QVariant getMinLimit(quint32 index, int board = 0);
|
||||
signals:
|
||||
|
Loading…
x
Reference in New Issue
Block a user