BornAgain  1.19.79
Simulate and fit neutron and x-ray scattering at grazing incidence
AbstractDataLoaderResultModel Class Referenceabstract

Description

Base class for result tables of data loaders. Derive from this class and return an instance in YourDataLoader::createResultModel(). The result table is the one on the right side when importing CSV files.

Definition at line 24 of file AbstractDataLoaderResultModel.h.

Inheritance diagram for AbstractDataLoaderResultModel:
[legend]
Collaboration diagram for AbstractDataLoaderResultModel:
[legend]

Public Types

enum class  ColumnType {
  none , line , fileContent , raw ,
  processed , error
}
 

Public Member Functions

 AbstractDataLoaderResultModel ()
 
int columnCount (const QModelIndex &parent=QModelIndex()) const override
 
QVariant data (const QModelIndex &index, int role=Qt::DisplayRole) const override
 
QVariant headerData (int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
 
int rowCount (const QModelIndex &parent) const override
 
QVector< int > sectionsOfColumnType (ColumnType type) const
 The table header sections which belong to the given column type. Empty if this column type is not present at all. More...
 

Protected Member Functions

virtual QString cellText (ColumnType type, int row, int column) const =0
 The text of the given cell. For convenience, column starts at 0 for the given column type, therefore it is not the same as the "real" section in the table header. This method will not be called for every row/column present in the table. Instead, optimizations will be done before calling it. E.g. the calculated values for lines which contain errors will never be called. Also raw or calculated contents will not be queried if a line is skipped. More...
 
virtual int columnCount (ColumnType type) const =0
 The number of existing columns related to the given column type. 0 if the type is not present at all. More...
 
virtual QString headerTextOfCalculatedColumn (int column) const =0
 Return the table header text for the given column. For convenience, column starts at 0 for first calculated column, therefore it is not the same as the "real" section in the table header. More...
 
virtual int rowCount () const =0
 The row count of the result table. More...
 
virtual bool rowHasError (const QModelIndex &index) const
 Returns whether the row given in the index contains errors. Only override this for performance reasons. More...
 
virtual bool rowHasError (int row) const =0
 Returns whether the row given in the index contains errors. Row counting starts with 0. More...
 
virtual bool rowIsSkipped (const QModelIndex &index) const
 Returns whether the row given in the index is a skipped row. Only override this for performance reasons. More...
 
virtual bool rowIsSkipped (int row) const =0
 Returns whether the row given in the index is a skipped row. Row counting starts with 0. More...
 

Private Member Functions

ColumnType columnType (const QModelIndex &index) const
 Calculates the column type of the given index. More...
 
ColumnType columnType (int section) const
 Calculates the column type of the real header view section. More...
 
int firstSectionOfColumnType (ColumnType type) const
 Calculates the first real header view section of the given column type. Returns -1 if the column type does not exist. More...
 
int lastSectionOfColumnType (ColumnType type) const
 Calculates the last real header view section of the given column type. Returns -1 if the column type does not exist. More...
 

Private Attributes

QIcon m_warningIcon
 

Member Enumeration Documentation

◆ ColumnType

Enumerator
none 
line 
fileContent 
raw 
processed 
error 

Definition at line 26 of file AbstractDataLoaderResultModel.h.

26 { none, line, fileContent, raw, processed, error };

Constructor & Destructor Documentation

◆ AbstractDataLoaderResultModel()

AbstractDataLoaderResultModel::AbstractDataLoaderResultModel ( )

Definition at line 38 of file AbstractDataLoaderResultModel.cpp.

39 {
40  m_warningIcon = QIcon(":/images/warning_16x16.png");
41 }

References m_warningIcon.

Member Function Documentation

◆ cellText()

virtual QString AbstractDataLoaderResultModel::cellText ( ColumnType  type,
int  row,
int  column 
) const
protectedpure virtual

The text of the given cell. For convenience, column starts at 0 for the given column type, therefore it is not the same as the "real" section in the table header. This method will not be called for every row/column present in the table. Instead, optimizations will be done before calling it. E.g. the calculated values for lines which contain errors will never be called. Also raw or calculated contents will not be queried if a line is skipped.

Implemented in QREDataLoaderResultModel, and AutomaticDataLoader1DResultModel.

Referenced by data().

◆ columnCount() [1/2]

virtual int AbstractDataLoaderResultModel::columnCount ( ColumnType  type) const
protectedpure virtual

The number of existing columns related to the given column type. 0 if the type is not present at all.

Implemented in QREDataLoaderResultModel, and AutomaticDataLoader1DResultModel.

◆ columnCount() [2/2]

int AbstractDataLoaderResultModel::columnCount ( const QModelIndex &  parent = QModelIndex()) const
override

Definition at line 43 of file AbstractDataLoaderResultModel.cpp.

44 {
45  if (parent.isValid())
46  return 0;
47 
50 
51  int cols = 0;
52  for (ColumnType type : colTypes)
53  cols += columnCount(type);
54 
55  return cols;
56 }
int columnCount(const QModelIndex &parent=QModelIndex()) const override

Referenced by firstSectionOfColumnType(), and lastSectionOfColumnType().

◆ columnType() [1/2]

AbstractDataLoaderResultModel::ColumnType AbstractDataLoaderResultModel::columnType ( const QModelIndex &  index) const
private

Calculates the column type of the given index.

Definition at line 195 of file AbstractDataLoaderResultModel.cpp.

196 {
197  return columnType(index.column());
198 }
ColumnType columnType(const QModelIndex &index) const
Calculates the column type of the given index.

Referenced by data(), and headerData().

◆ columnType() [2/2]

AbstractDataLoaderResultModel::ColumnType AbstractDataLoaderResultModel::columnType ( int  section) const
private

Calculates the column type of the real header view section.

Definition at line 177 of file AbstractDataLoaderResultModel.cpp.

178 {
181 
182  for (ColumnType type : colTypes) {
183  const int firstSection = firstSectionOfColumnType(type);
184  if (firstSection < 0)
185  continue;
186 
187  if (section >= firstSection && section <= lastSectionOfColumnType(type))
188  return type;
189  }
190 
191  return ColumnType::none;
192 }
int firstSectionOfColumnType(ColumnType type) const
Calculates the first real header view section of the given column type. Returns -1 if the column type...
int lastSectionOfColumnType(ColumnType type) const
Calculates the last real header view section of the given column type. Returns -1 if the column type ...

References error, fileContent, firstSectionOfColumnType(), lastSectionOfColumnType(), line, none, processed, and raw.

Here is the call graph for this function:

◆ data()

QVariant AbstractDataLoaderResultModel::data ( const QModelIndex &  index,
int  role = Qt::DisplayRole 
) const
override

Definition at line 63 of file AbstractDataLoaderResultModel.cpp.

65 {
66  if (!index.isValid())
67  return QVariant();
68 
69  const auto colType = columnType(index);
70 
71  if (role == Qt::BackgroundRole) {
72  switch (colType) {
73  case ColumnType::line:
75  return Palette::backgroundColorFileContent;
76  case ColumnType::raw:
77  return rowIsSkipped(index) ? QVariant() : Palette::backgroundColorRawContent;
79  return rowIsSkipped(index) || rowHasError(index)
80  ? QVariant()
81  : Palette::backgroundColorProcessedContent;
82  case ColumnType::error:
83  return rowIsSkipped(index) || !rowHasError(index) ? QVariant()
84  : Palette::backgroundColorErrors;
85  default:
86  return QVariant();
87  }
88  }
89 
90  if (role == Qt::ForegroundRole) {
91  if (colType == ColumnType::fileContent && rowIsSkipped(index))
92  return Palette::skippedLineTextColor;
93  return QVariant();
94  }
95 
96  if (role == Qt::DisplayRole) {
97  switch (colType) {
98  case ColumnType::line:
99  return QString::number(index.row() + 1);
100 
102  QString lineContent =
103  cellText(colType, index.row(), index.column() - firstSectionOfColumnType(colType));
104  lineContent.replace("\t", " --> ");
105  return lineContent;
106  }
107 
108  case ColumnType::raw:
109  case ColumnType::error: {
110  if (!rowIsSkipped(index))
111  return cellText(colType, index.row(),
112  index.column() - firstSectionOfColumnType(colType));
113  } break;
114 
115  case ColumnType::processed: {
116  if (!rowIsSkipped(index) && !rowHasError(index))
117  return cellText(colType, index.row(),
118  index.column() - firstSectionOfColumnType(colType));
119  } break;
120  default:
121  break;
122  }
123 
124  return QVariant();
125  }
126 
127  if (role == Qt::DecorationRole && (colType == ColumnType::line || colType == ColumnType::error)
128  && rowHasError(index))
129  return m_warningIcon;
130 
131  if (role == Qt::TextAlignmentRole && colType == ColumnType::line)
132  return QVariant(Qt::AlignRight | Qt::AlignVCenter);
133 
134  if (role == Qt::ToolTipRole && colType == ColumnType::line && rowHasError(index))
135  return cellText(ColumnType::error, index.row(), 0);
136 
137  return QVariant();
138 }
virtual bool rowIsSkipped(const QModelIndex &index) const
Returns whether the row given in the index is a skipped row. Only override this for performance reaso...
virtual QString cellText(ColumnType type, int row, int column) const =0
The text of the given cell. For convenience, column starts at 0 for the given column type,...
virtual bool rowHasError(const QModelIndex &index) const
Returns whether the row given in the index contains errors. Only override this for performance reason...

References cellText(), columnType(), error, fileContent, firstSectionOfColumnType(), line, m_warningIcon, processed, raw, rowHasError(), and rowIsSkipped().

Referenced by AutomaticDataLoader1DResultModel::cellText(), and AutomaticDataLoader1DResultModel::rowCount().

Here is the call graph for this function:

◆ firstSectionOfColumnType()

int AbstractDataLoaderResultModel::firstSectionOfColumnType ( ColumnType  type) const
private

Calculates the first real header view section of the given column type. Returns -1 if the column type does not exist.

Definition at line 200 of file AbstractDataLoaderResultModel.cpp.

201 {
202  const int lineColumnCount = columnCount(ColumnType::line);
203  const int fileContentColumnCount = columnCount(ColumnType::fileContent);
204 
205  if (type == ColumnType::line)
206  return lineColumnCount > 0 ? 0 : -1;
207 
208  if (type == ColumnType::fileContent)
209  return columnCount(ColumnType::fileContent) > 0 ? lineColumnCount : -1;
210 
211  if (type == ColumnType::raw) {
212  const bool hasRawContent = columnCount(ColumnType::raw) > 0;
213  return hasRawContent ? lineColumnCount + fileContentColumnCount : -1;
214  }
215 
216  if (type == ColumnType::processed) {
217  const bool hasProcessedContent = columnCount(ColumnType::processed) > 0;
218  return hasProcessedContent
219  ? (lineColumnCount + fileContentColumnCount + columnCount(ColumnType::raw))
220  : -1;
221  }
222 
223  if (type == ColumnType::error) {
224  const bool hasParsingErrors = columnCount(ColumnType::error) > 0;
225  return hasParsingErrors
226  ? (lineColumnCount + fileContentColumnCount + columnCount(ColumnType::raw)
228  : -1;
229  }
230 
231  return -1;
232 }

References columnCount(), error, fileContent, line, processed, and raw.

Referenced by columnType(), data(), headerData(), lastSectionOfColumnType(), and sectionsOfColumnType().

Here is the call graph for this function:

◆ headerData()

QVariant AbstractDataLoaderResultModel::headerData ( int  section,
Qt::Orientation  orientation,
int  role = Qt::DisplayRole 
) const
override

Definition at line 140 of file AbstractDataLoaderResultModel.cpp.

142 {
143  if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
144  switch (columnType(section)) {
145  case ColumnType::line:
146  return "Line";
148  return "File content (text)";
149  case ColumnType::raw:
150  return QString("Column %1 raw")
151  .arg(section - firstSectionOfColumnType(ColumnType::raw) + 1);
153  return headerTextOfCalculatedColumn(section
155  case ColumnType::error:
156  return "Parser warnings";
157  default:
158  return QVariant();
159  }
160  }
161 
162  return QAbstractTableModel::headerData(section, orientation, role);
163 }
virtual QString headerTextOfCalculatedColumn(int column) const =0
Return the table header text for the given column. For convenience, column starts at 0 for first calc...

References columnType(), error, fileContent, firstSectionOfColumnType(), headerTextOfCalculatedColumn(), line, processed, and raw.

Here is the call graph for this function:

◆ headerTextOfCalculatedColumn()

virtual QString AbstractDataLoaderResultModel::headerTextOfCalculatedColumn ( int  column) const
protectedpure virtual

Return the table header text for the given column. For convenience, column starts at 0 for first calculated column, therefore it is not the same as the "real" section in the table header.

Implemented in QREDataLoaderResultModel, and AutomaticDataLoader1DResultModel.

Referenced by headerData().

◆ lastSectionOfColumnType()

int AbstractDataLoaderResultModel::lastSectionOfColumnType ( ColumnType  type) const
private

Calculates the last real header view section of the given column type. Returns -1 if the column type does not exist.

Definition at line 234 of file AbstractDataLoaderResultModel.cpp.

235 {
236  const int firstSection = firstSectionOfColumnType(type);
237  if (firstSection == -1)
238  return -1;
239 
240  return firstSection + columnCount(type) - 1;
241 }

References columnCount(), and firstSectionOfColumnType().

Referenced by columnType(), and sectionsOfColumnType().

Here is the call graph for this function:

◆ rowCount() [1/2]

virtual int AbstractDataLoaderResultModel::rowCount ( ) const
protectedpure virtual

The row count of the result table.

Implemented in QREDataLoaderResultModel, and AutomaticDataLoader1DResultModel.

Referenced by rowCount().

◆ rowCount() [2/2]

int AbstractDataLoaderResultModel::rowCount ( const QModelIndex &  parent) const
override

Definition at line 58 of file AbstractDataLoaderResultModel.cpp.

59 {
60  return parent.isValid() ? 0 : rowCount();
61 }
virtual int rowCount() const =0
The row count of the result table.

References rowCount().

Here is the call graph for this function:

◆ rowHasError() [1/2]

bool AbstractDataLoaderResultModel::rowHasError ( const QModelIndex &  index) const
protectedvirtual

Returns whether the row given in the index contains errors. Only override this for performance reasons.

Definition at line 248 of file AbstractDataLoaderResultModel.cpp.

249 {
250  return rowHasError(index.row());
251 }

Referenced by data().

◆ rowHasError() [2/2]

virtual bool AbstractDataLoaderResultModel::rowHasError ( int  row) const
protectedpure virtual

Returns whether the row given in the index contains errors. Row counting starts with 0.

Implemented in QREDataLoaderResultModel, and AutomaticDataLoader1DResultModel.

◆ rowIsSkipped() [1/2]

bool AbstractDataLoaderResultModel::rowIsSkipped ( const QModelIndex &  index) const
protectedvirtual

Returns whether the row given in the index is a skipped row. Only override this for performance reasons.

Definition at line 243 of file AbstractDataLoaderResultModel.cpp.

244 {
245  return rowIsSkipped(index.row());
246 }

Referenced by data().

◆ rowIsSkipped() [2/2]

virtual bool AbstractDataLoaderResultModel::rowIsSkipped ( int  row) const
protectedpure virtual

Returns whether the row given in the index is a skipped row. Row counting starts with 0.

Implemented in QREDataLoaderResultModel, and AutomaticDataLoader1DResultModel.

◆ sectionsOfColumnType()

QVector< int > AbstractDataLoaderResultModel::sectionsOfColumnType ( ColumnType  type) const

The table header sections which belong to the given column type. Empty if this column type is not present at all.

Definition at line 165 of file AbstractDataLoaderResultModel.cpp.

166 {
167  QVector<int> sections;
168  for (int section = firstSectionOfColumnType(type); section <= lastSectionOfColumnType(type);
169  section++)
170  if (section >= 0)
171  sections << section;
172 
173  return sections;
174 }

References firstSectionOfColumnType(), and lastSectionOfColumnType().

Referenced by SpecularDataImportWidget::updatePreview().

Here is the call graph for this function:

Member Data Documentation

◆ m_warningIcon

QIcon AbstractDataLoaderResultModel::m_warningIcon
private

Definition at line 93 of file AbstractDataLoaderResultModel.h.

Referenced by AbstractDataLoaderResultModel(), and data().


The documentation for this class was generated from the following files: