1
0
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:
m_thread 2014-10-15 00:42:23 +02:00
parent 2d17d64406
commit f687a6d01c
7 changed files with 207 additions and 86 deletions

View File

@ -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}}:&nbsp;</b>{{OBJECT_NAME}}</td>
</tr>
<tr>
<td colspan='1'><b>{{CATEGORY_TITLE}}:&nbsp;</b>{{CATEGORY}}</td>
<td colspan='1'><b>{{TYPE_TITLE}}:&nbsp;</b>{{TYPE}}</td>
<td colspan='1'><b>{{SIZE_TITLE}}:&nbsp;</b>{{SIZE}}&nbsp;bytes</td>
<td colspan='1'><b>{{MULTI_INSTANCE_TITLE}}:&nbsp;</b>{{MULTI_INSTANCE}}</td>
</tr>
<tr>
<td colspan='4' rowspan='1' valign='top'><b>{{DESCRIPTION_TITLE}}:&nbsp;</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}}:&nbsp;</b>{{FIELD_NAME}}</td>
</tr>
<tr>
<td rowspan='1' colspan='1'><b>{{FIELD_TYPE_TITLE}}:&nbsp;</b>{{FIELD_TYPE}}</td>
{{#FIELD_UNIT_TITLE}}
<td rowspan='1' colspan='2'><b>{{FIELD_UNIT_TITLE}}:&nbsp;</b>{{FIELD_UNIT}}</td>
{{/FIELD_UNIT_TITLE}}
</tr>
{{#FIELD_OPTIONS_TITLE}}
<tr>
<td rowspan='1' colspan='2'><b>{{FIELD_OPTIONS_TITLE}}:&nbsp;
</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}}:&nbsp;
</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}}:&nbsp;</b>{{FIELD_LIMIT}}</td>
</tr>
{{/FIELD_LIMIT_TITLE}}
{{/FIELD_ELEMENTS_TITLE}}
{{#FIELD_DESCRIPTION_TITLE}}
<tr>
<td rowspan='1' colspan='2'><b>{{FIELD_DESCRIPTION_TITLE}}:&nbsp;</b>{{FIELD_DESCRIPTION}}</td>
</tr>
{{/FIELD_DESCRIPTION_TITLE}}
</table>
</td>
</tr>
{{/FIELDS}}
</table>
</body>
</html>

View File

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

View File

@ -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)),
@ -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>");
int fields = 0;
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()) {
fields++;
QString bgColor = fields & 1 ? "bgcolor='#76A9F3'" : "bgcolor='#98BDF3'";
QVariantHash fieldHash;
description.append("<tr>");
description.append("<td nowrap='nowrap' ").append(bgColor).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("<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:&nbsp;")).append("</b>").append(field->getTypeAsString());
int elements = field->getNumElements();
if (elements > 1) {
description.append("[").append(QString("%1").arg(field->getNumElements())).append("]");
optionHash["FIELD_OPTION"] = option;
if (!options.isEmpty()) {
optionHash["FIELD_OPTION_DELIM"] = ", ";
}
options.append(optionHash);
}
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("</td>");
description.append("<td").append(bgColor).append(">");
if (field->getUnits() != "") {
description.append("<b>").append(tr("Unit:&nbsp;")).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:&nbsp;")).append("</b>").append(field->getDescription());
description.append("</td></tr>");
if (!field->getDescription().isEmpty()) {
fieldHash["FIELD_DESCRIPTION_TITLE"] = tr("Description");
fieldHash["FIELD_DESCRIPTION"] = field->getDescription();
}
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:&nbsp;</b>") : "&nbsp;|&nbsp;").append(names.at(i));
if (field->getMinLimit(i).toString() != "" && field->getMaxLimit(i).toString() != "") {
description.append(QString("%1&nbsp;-&nbsp;%2").arg(field->getMinLimit(i).toString(), field->getMaxLimit(i).toString()));
fields.append(fieldHash);
}
}
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:&nbsp;</b>")).append(" </b>")
.append(QString("%1&nbsp;-&nbsp;%2").arg(field->getMinLimit(0).toString(), field->getMaxLimit(0).toString()));
description.append("</td></tr>");
}
}
}
description.append("</tbody></table></body></html>");
return description;
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) {

View File

@ -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_ */

View File

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

View File

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