Unit container model. More...
#include <unitmodel.h>


Public Types | |
| enum | Fields { UnitToId = Qt::UserRole + 900, UnitToSymbol, UnitFromId, UnitFromSymbol } |
| enum | ConstraintKind { ConstraintKindTreeId } |
Public Member Functions | |
| ConvertableUnitModel (QObject *parent=0) | |
| QVariant | data (const QModelIndex &index, int role) const |
| QVariant | currentConstraintUnitId () const |
| void | setConstraint (const int &id, const ConvertableUnitModel::ConstraintKind &kind, const bool &constrainUnitTo=true, const bool &showUnitFrom=true, const bool &calibrationUnit=false) |
| void | unconstrain () |
| bool | isUnitToConstrained () |
| bool | isUnitFromConstrained () |
Unit container model.
By default it only shows the units for which a conversion function exists in the database for existing sensors.
What I tried to do was to split prefix and units in tbl_units and tbl_unit_prefixes like this:
CREATE TABLE tbl_unit_prefixes(
unit_prefix_symbol character varying NOT NULL PRIMARY KEY,
unit_prefix_name character varying NOT NULL UNIQUE,
unit_prefix_factor double precision NOT NULL
);
tbl_units can also have a unit_isprefixable bool column.
Then we use the query:
SELECT unit_prefix_symbol || unit_symbol
FROM tbl_units u, tbl_unit_prefixes p
WHERE u.unit_isprefixable;
which gives nice results.
Unfortunately, the problem of id's and uniqye names remains here too. Materializing them is a possible solution.
{ //moet eenduiding een sens_id specifieren!!
ConstraintKindTreeId
};
{
UnitToId = Qt::UserRole + 900,
UnitToSymbol,
UnitFromId,
UnitFromSymbol
};
| ConvertableUnitModel::ConvertableUnitModel | ( | QObject * | parent = 0 |
) |
: SqlQueryModel(parent) { setDependency("tbl_units"); setDependency("tbl_sensors"); setDependency("tbl_sensor_channels"); // defaultQuery shows all convertable units defaultQuery = QString("SELECT DISTINCT \"%1\".unit_symbol AS unit_symbol_%1, \"%1\".unit_id AS unit_id_%1, " "\"%2\".unit_symbol AS unit_symbol_%2, \"%2\".unit_id AS unit_id_%2 " "FROM vew_unit_conversions AS c " "INNER JOIN tbl_units AS \"%1\" ON (c.unit_id_%1 = \"%1\".unit_id) " "INNER JOIN tbl_units AS \"%2\" ON (c.unit_id_%2 = \"%2\".unit_id) "); unconstrain(); }
| QVariant ConvertableUnitModel::currentConstraintUnitId | ( | ) | const |
Referenced by DataHeaderSection::getSqlForColumn().
{
// als constrained = true, dan doet het er neit toe welke index we nemen, zolang em een valid row heeft.
if (constrained) return data(index(0,0), constrainedUnitTo ? ConvertableUnitModel::UnitToId : ConvertableUnitModel::UnitFromId);
else return QVariant();
}
| QVariant ConvertableUnitModel::data | ( | const QModelIndex & | index, | |
| int | role | |||
| ) | const |
Referenced by currentConstraintUnitId().
{
//Q_ASSERT(index.isValid());
if (role == UnitFromSymbol) return this->index(index.row(), record().indexOf("unit_symbol_from")).data(Qt::DisplayRole);
if (role == UnitFromId) return this->index(index.row(), record().indexOf("unit_id_from")).data(Qt::DisplayRole);
if (role == UnitToSymbol) return this->index(index.row(), record().indexOf("unit_symbol_to"), index.parent()).data(Qt::DisplayRole);
if (role == UnitToId) return this->index(index.row(), record().indexOf("unit_id_to"), index.parent()).data(Qt::DisplayRole);
return QSqlQueryModel::data(index, role);
}
| bool ConvertableUnitModel::isUnitFromConstrained | ( | ) |
Referenced by DataHeaderSection::getSqlForColumn().
{
return constrained && !constrainedUnitTo;
}
| bool ConvertableUnitModel::isUnitToConstrained | ( | ) |
{
return constrained && constrainedUnitTo;
}
| void ConvertableUnitModel::setConstraint | ( | const int & | id, | |
| const ConvertableUnitModel::ConstraintKind & | kind, | |||
| const bool & | constrainUnitTo = true, |
|||
| const bool & | showUnitFrom = true, |
|||
| const bool & | calibrationUnit = false | |||
| ) |
Referenced by UnitComboBox::setTreeIdConstraint().
{
constrainedUnitTo = constrainUnitTo;
if (kind == ConvertableUnitModel::ConstraintKindTreeId) {
QString extra;
if (calibrationUnit) {
extra.append("INNER JOIN tbl_sensor_channels AS sc ON (sc.sens_chan_cali_unit_id = c.unit_id_%2) ");
extra.append("INNER JOIN tbl_trees AS t USING (sens_id, sens_chan_nr) ");
} else {
extra.append("INNER JOIN tbl_sensors AS s ON (s.unit_id = c.unit_id_%2) ");
extra.append("INNER JOIN tbl_trees AS t USING (sens_id) ");
}
QString query = (defaultQuery + extra).arg(showUnitFrom ? "from" : "to", constrainUnitTo ? "to" : "from");
qDebug() << "Treeconstraint set in ConvertableUnitModel: " << id;
if (id == 0 || id == -1 ){
unconstrain();
qWarning() << "ConvertableUnitModel got an invalid tree_id. Contact the administrator.";
return;
}
setQuery(Database::execStatic(query + QString(" WHERE tree_id = ") + QString::number(id)));
constrained = true;
}
}
| void ConvertableUnitModel::unconstrain | ( | ) |
Referenced by ConvertableUnitModel(), UnitComboBox::reset(), and setConstraint().
{
// Laat alle convertable units zien
setQuery(Database::execStatic(defaultQuery.arg("from", "to")));
constrained = false;
}
1.7.1