21 QWidget* parent =
nullptr)
24 result->setValue(value);
25 result->setEnabled(enabled);
31 : QObject(parent), m_data(new
csv::
DataArray), m_n_header(0), m_n_footer(0)
49 const int prev_assigned =
column.columnNumber();
50 if (prev_assigned == col && type ==
column.name())
54 if (iter->second.columnNumber() == col && iter->first != role)
83 if (row + 1 >=
nRows())
94 for (
auto row : rows) {
116 return iter ==
m_selected_cols.end() ? -1 : iter->second.columnNumber();
121 if (col < 0 || col >=
static_cast<int>(
nCols()))
124 const size_t size =
m_data->size();
126 for (
size_t i = 0; i < size; ++i)
127 result[i] = (*
m_data)[i][
static_cast<size_t>(col)];
134 const int col =
column(type);
135 if (col < 0 || col >=
static_cast<int>(
nCols()))
140 result.resize(col_values.size());
143 for (
size_t i = 0; i < col_values.size(); i++) {
144 auto currentText = QString::fromStdString(col_values[i]);
145 double number = mult_value * currentText.toDouble();
147 QString textToWrite = 0.0 == number ? currentText : QString::number(number);
148 result[i] = textToWrite.toStdString();
184 return (*
m_data)[0].size();
189 return (*m_data).size();
203 std::set<std::pair<int, int>> result;
206 std::for_each(col_result.begin(), col_result.end(), [col =
column(type), &result](
int row) {
207 result.insert({row, col});
223 std::set<int> result;
227 bool has_prev_value =
false;
228 double prev_value = 0.0;
233 auto cellText = QString::fromStdString(
values[i]);
235 double number = cellText.toDouble(&is_double);
236 if (!is_double || number <= 0.0) {
237 result.insert(
static_cast<int>(i));
244 if (has_prev_value && prev_value >= number) {
245 result.insert(
static_cast<int>(i));
249 has_prev_value =
true;
255 : QTableWidget(parent), m_import_data(new
CsvImportData(this)), m_data_is_suitable(true)
261 auto selectedRanges = this->selectedRanges();
262 if (selectedRanges.empty())
264 auto front = selectedRanges.front();
265 auto row = front.topRow();
271 std::set<int> accumulator;
273 auto selection = selectedRanges();
274 if (selection.empty())
277 int size = selection.size();
278 for (
int rangenumber = 0; rangenumber < size; ++rangenumber) {
279 int row0 = selectedRanges()[rangenumber].topRow() -
rowOffset();
280 int rowN = selectedRanges()[rangenumber].bottomRow() -
rowOffset();
281 for (
int r = row0; r <= rowN; ++r) {
282 accumulator.insert(r);
290 auto selectedRanges = this->selectedRanges();
291 if (selectedRanges.empty())
293 auto front = selectedRanges.front();
294 auto col = front.leftColumn();
307 size_t nRows = data.size();
308 size_t nCols = data[0].size();
310 setColumnCount(
int(nCols));
313 insertRow(rowCount());
315 for (
size_t i = 0; i < nRows; i++) {
316 insertRow(rowCount());
317 size_t I = size_t(rowCount()) - 1;
318 for (
size_t j = 0; j < data[i].size(); j++) {
319 setItem(
int(
I),
int(j),
new QTableWidgetItem(QString::fromStdString(data[i][j])));
396 for (
int j = 0; j < this->columnCount(); j++)
397 headers.append(QString::number(j + 1));
398 setHorizontalHeaderLabels(headers);
416 for (
size_t i = 0; i < values.size(); ++i)
417 setItem(
static_cast<int>(i) +
rowOffset(), col,
418 new QTableWidgetItem(QString::fromStdString(values[i])));
426 for (
int n = 0; n < n_cols; ++n)
427 setCellWidget(0, n, createMultiplierBox());
430 for (
auto type : types)
434 spin_box->setEnabled(
true);
436 connect(spin_box, &ScientificSpinBox::editingFinished,
this, [
this, spin_box, type]() {
443 int nRows = this->rowCount();
445 QStringList vhlabels;
446 vhlabels <<
"Multiplier: ";
447 for (
int i =
rowOffset(); i < nRows; i++)
448 vhlabels << QString::number(i);
450 this->setVerticalHeaderLabels(vhlabels);
455 int nRows = this->rowCount();
456 int nCols = this->columnCount();
458 for (
int i =
rowOffset(); i < nRows; i++) {
460 for (
int j = 0; j < nCols; j++)
468 for (
auto index : to_highlight)
470 return to_highlight.empty();
475 if (columnCount() >= col || col < 0)
479 for (
size_t i = 0; i < data.size(); i++) {
480 QString originalText = QString::fromStdString(data[i]);
481 setItem(
static_cast<int>(i) +
rowOffset(),
int(col),
new QTableWidgetItem(originalText));
487 item(i, j)->setBackground(color);
Defines class CsvImportTable.
const std::map< Axes::Units, const char * > axisUnitLabel
Defines class ScientificSpinBox.
void setLastRow(size_t row)
CsvImportData(QObject *parent=nullptr)
bool rowExcluded(int row)
std::set< int > m_discarded_rows
const csv::DataArray & data() const
std::set< std::pair< int, int > > checkData()
size_t m_n_footer
number of footer rows
void toggleDiscardRows(std::set< int > rows)
double multiplier(DATA_TYPE type) const
int column(DATA_TYPE type) const
int setColumnAs(int col, csv::ColumnType type)
sets type to a column col.
size_t m_n_header
number of header rows
std::set< int > checkFormat(const csv::DataColumn &values, bool check_ordering)
Checks if selected data is suitable for import.
void setMultiplier(DATA_TYPE type, double value)
void setData(csv::DataArray data)
std::map< DATA_TYPE, CsvCoordinateColumn > m_selected_cols
QString columnLabel(DATA_TYPE type) const
csv::DataColumn multipliedValues(DATA_TYPE type) const
std::unique_ptr< const csv::DataArray > m_data
QList< QString > availableCoordinateUnits() const
csv::DataColumn values(int col) const
void setFirstRow(size_t row)
static std::vector< DATA_TYPE > availableTypes()
CsvImportTable(QWidget *parent=nullptr)
void setMultiplierFields()
void markCell(int i, int j, Qt::GlobalColor color)
void resetColumn(int col)
CsvImportData * m_import_data
void updateSelectedCols()
std::set< int > selectedRows() const
double coordinateMultiplier() const
void setLastRow(size_t row)
void greyoutDiscardedRows()
void discardRows(std::set< int > rows)
void setData(csv::DataArray data)
int selectedColumn() const
double intensityMultiplier() const
void setColumnAs(int col, csv::ColumnType type)
QList< QString > availableCoordinateUnits() const
void setFirstRow(size_t row)
void setValue(double val)
std::vector< std::string > DataColumn
std::vector< std::vector< std::string > > DataArray
const QStringList HeaderLabels