-
Notifications
You must be signed in to change notification settings - Fork 59
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fixes #547
- Loading branch information
Showing
18 changed files
with
759 additions
and
377 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,262 @@ | ||
#include <QIcon> | ||
#include <QFont> | ||
#include "AbstractModelVariablesModel.h" | ||
|
||
|
||
AbstractModelVariablesModel::AbstractModelVariablesModel(QObject *parent) | ||
: QAbstractItemModel{parent} | ||
{ | ||
} | ||
|
||
void AbstractModelVariablesModel::setModelDescription(const FMIModelDescription* modelDescription) { | ||
beginResetModel(); | ||
this->modelDescription = modelDescription; | ||
endResetModel(); | ||
} | ||
|
||
void AbstractModelVariablesModel::setStartValues(QMap<const FMIModelVariable*, QString> *startValues) { | ||
beginResetModel(); | ||
this->startValues = startValues; | ||
endResetModel(); | ||
} | ||
|
||
void AbstractModelVariablesModel::setPlotVariables(QList<const FMIModelVariable*> *plotVariables) { | ||
beginResetModel(); | ||
this->plotVariables = plotVariables; | ||
endResetModel(); | ||
} | ||
|
||
int AbstractModelVariablesModel::columnCount(const QModelIndex &parent) const { | ||
return NumberOfColumns; | ||
} | ||
|
||
QVariant AbstractModelVariablesModel::headerData(int section, Qt::Orientation orientation, int role) const { | ||
|
||
Q_ASSERT(section < NumberOfColumns); | ||
|
||
if (role == Qt::DisplayRole) { | ||
|
||
switch (section) { | ||
case NameColumn: | ||
return "Name"; | ||
case TypeColumn: | ||
return "Type"; | ||
case DimensionColumn: | ||
return "Dimensions"; | ||
case ValueReferenceColumn: | ||
return "Value Reference"; | ||
case InitialColumn: | ||
return "Initial"; | ||
case CausalityColumn: | ||
return "Causality"; | ||
case VariabilityColumn: | ||
return "Variabitliy"; | ||
case StartColumn: | ||
return "Start"; | ||
case NominalColumn: | ||
return "Nominal"; | ||
case MinColumn: | ||
return "Min"; | ||
case MaxColumn: | ||
return "Max"; | ||
case UnitColumn: | ||
return "Unit"; | ||
case PlotColumn: | ||
return "Plot"; | ||
case DescriptionColumn: | ||
return "Description"; | ||
default: | ||
break; | ||
} | ||
} | ||
|
||
return QVariant(); | ||
} | ||
|
||
bool AbstractModelVariablesModel::setData(const QModelIndex &index, const QVariant &value, int role) { | ||
|
||
if (!index.isValid()) { | ||
return false; | ||
} | ||
|
||
const FMIModelVariable* variable = variableForIndex(index); | ||
|
||
if (index.column() == StartColumn) { | ||
|
||
if (value.toString().isEmpty()) { | ||
startValues->remove(variable); | ||
} else { | ||
startValues->insert(variable, value.toString()); | ||
} | ||
|
||
return true; | ||
|
||
} else if (index.column() == PlotColumn && role == Qt::CheckStateRole) { | ||
|
||
if (value == Qt::Checked) { | ||
emit plotVariableSelected(variable); | ||
} else { | ||
emit plotVariableDeselected(variable); | ||
} | ||
|
||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
Qt::ItemFlags AbstractModelVariablesModel::flags(const QModelIndex &index) const { | ||
|
||
if (!index.isValid()) { | ||
return Qt::NoItemFlags; | ||
} | ||
|
||
if (index.column() == StartColumn && startValues) { | ||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; | ||
} else if (index.column() == PlotColumn) { | ||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; | ||
} else { | ||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable; | ||
} | ||
} | ||
|
||
QVariant AbstractModelVariablesModel::columnData(const FMIModelVariable *variable, int column, int role) const { | ||
|
||
switch (role) { | ||
case Qt::DecorationRole: | ||
switch (column) { | ||
case NameColumn: | ||
switch (variable->causality) { | ||
case FMIParameter: | ||
case FMIStructuralParameter: | ||
case FMICalculatedParameter: | ||
return QIcon(":/variables/dark/float-parameter.svg"); | ||
case FMIInput: | ||
return QIcon(":/variables/dark/float-input.svg"); | ||
case FMIOutput: | ||
return QIcon(":/variables/dark/float-output.svg"); | ||
default: | ||
return QIcon(":/variables/dark/float-variable.svg"); | ||
} | ||
default: | ||
return QVariant(); | ||
} | ||
case Qt::DisplayRole: | ||
case Qt::EditRole: | ||
switch (column) { | ||
case NameColumn: | ||
return variable->name; | ||
case TypeColumn: | ||
switch (variable->type) { | ||
case FMIFloat32Type: | ||
case FMIDiscreteFloat32Type: return "Float32"; | ||
case FMIFloat64Type: | ||
case FMIDiscreteFloat64Type: return "Float64"; | ||
case FMIInt8Type: return "Int8"; | ||
case FMIUInt8Type: return "UInt8"; | ||
case FMIInt16Type: return "Int16"; | ||
case FMIUInt16Type: return "UInt16"; | ||
case FMIInt32Type: return "Int32"; | ||
case FMIUInt32Type: return "UInt32"; | ||
case FMIInt64Type: return "Int64"; | ||
case FMIUInt64Type: return "UInt64"; | ||
case FMIBooleanType: return "Boolean"; | ||
case FMIStringType: return "String"; | ||
case FMIBinaryType: return "Binary"; | ||
case FMIClockType: return "Clock"; | ||
} | ||
case DimensionColumn: | ||
if (variable->nDimensions > 0) { | ||
|
||
QString dimensions; | ||
|
||
for (size_t i = 0; i < variable->nDimensions; i++) { | ||
|
||
FMIDimension* dimension = &variable->dimensions[i]; | ||
|
||
if (i > 0) { | ||
dimensions += ", "; | ||
} | ||
|
||
if (dimension->start) { | ||
dimensions += QString::number(dimension->start); | ||
} else { | ||
dimensions += dimension->variable->name; | ||
} | ||
} | ||
return dimensions; | ||
} | ||
break; | ||
case ValueReferenceColumn: | ||
return variable->valueReference; | ||
case InitialColumn: | ||
switch(variable->initial) { | ||
case FMIUndefined: return "undefined"; | ||
case FMIExact: return "exact"; | ||
case FMIApprox: return "approx"; | ||
case FMICalculated: return "calculated"; | ||
} | ||
case CausalityColumn: | ||
switch(variable->causality) { | ||
case FMIParameter: return "parameter"; | ||
case FMICalculatedParameter: return "calculatedParameter"; | ||
case FMIStructuralParameter: return "structuralParameter"; | ||
case FMIInput: return "input"; | ||
case FMIOutput: return "output"; | ||
case FMILocal: return "local"; | ||
case FMIIndependent: return "independent"; | ||
} | ||
case VariabilityColumn: | ||
switch(variable->variability) { | ||
case FMIConstant: return "constant"; | ||
case FMIFixed: return "fixed"; | ||
case FMITunable: return "tunable"; | ||
case FMIDiscrete: return "discrete"; | ||
case FMIContinuous: return "continuous"; | ||
} | ||
case StartColumn: | ||
if (startValues && startValues->contains(variable)) { | ||
return startValues->value(variable); | ||
} else { | ||
return variable->start; | ||
} | ||
case NominalColumn: | ||
return variable->nominal; | ||
case MinColumn: | ||
return variable->min; | ||
case MaxColumn: | ||
return variable->max; | ||
case UnitColumn: | ||
if (variable->declaredType && variable->declaredType->unit) { | ||
return variable->declaredType->unit->name; | ||
} | ||
break; | ||
case DescriptionColumn: | ||
return variable->description; | ||
default: break; | ||
} | ||
case Qt::TextAlignmentRole: | ||
switch (column) { | ||
case StartColumn: | ||
case ValueReferenceColumn: | ||
return int(Qt::AlignRight | Qt::AlignVCenter); | ||
default: break; | ||
} | ||
case Qt::FontRole: | ||
if (column == StartColumn && startValues && startValues->contains(variable)) { | ||
QFont font; | ||
font.setBold(true); | ||
return font; | ||
} | ||
break; | ||
case Qt::CheckStateRole: | ||
if (column == PlotColumn) { | ||
return (plotVariables && plotVariables->contains(variable)) ? Qt::Checked : Qt::Unchecked; | ||
} | ||
break; | ||
default: | ||
break; | ||
} | ||
|
||
return QVariant(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
#ifndef ABSTRACTMODELVARIABLESMODEL_H | ||
#define ABSTRACTMODELVARIABLESMODEL_H | ||
|
||
#include <QAbstractItemModel> | ||
#include "FMIModelDescription.h" | ||
|
||
class AbstractModelVariablesModel : public QAbstractItemModel { | ||
|
||
Q_OBJECT | ||
|
||
public: | ||
|
||
enum ColumnIndex { | ||
NameColumn, | ||
TypeColumn, | ||
DimensionColumn, | ||
ValueReferenceColumn, | ||
InitialColumn, | ||
CausalityColumn, | ||
VariabilityColumn, | ||
StartColumn, | ||
NominalColumn, | ||
MinColumn, | ||
MaxColumn, | ||
UnitColumn, | ||
PlotColumn, | ||
DescriptionColumn, | ||
NumberOfColumns | ||
}; | ||
|
||
explicit AbstractModelVariablesModel(QObject *parent = nullptr); | ||
|
||
void setModelDescription(const FMIModelDescription* modelDescription); | ||
|
||
void setStartValues(QMap<const FMIModelVariable*, QString> *startValues); | ||
|
||
void setPlotVariables(QList<const FMIModelVariable*> *plotVariables); | ||
|
||
signals: | ||
void plotVariableSelected(const FMIModelVariable* variable); | ||
void plotVariableDeselected(const FMIModelVariable* variable); | ||
|
||
protected: | ||
const FMIModelDescription* modelDescription = nullptr; | ||
QMap<const FMIModelVariable*, QString> *startValues = nullptr; | ||
QList<const FMIModelVariable*> *plotVariables = nullptr; | ||
|
||
int columnCount(const QModelIndex &parent = QModelIndex()) const override; | ||
|
||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; | ||
|
||
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; | ||
|
||
Qt::ItemFlags flags(const QModelIndex &index) const override; | ||
|
||
QVariant columnData(const FMIModelVariable* variable, int column, int role) const; | ||
|
||
virtual const FMIModelVariable* variableForIndex(const QModelIndex &index) const = 0; | ||
|
||
}; | ||
|
||
#endif // ABSTRACTMODELVARIABLESMODEL_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.