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; }