/** * Model for logistical terms table * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2017-01-13 */ #include "cod_logistical_terms_model.h" #include #include #include using namespace CodificationManagement; static const int s_matrixCount = 5; LogisticalTermsModel::LogisticalTermsModel(QWidget *parent) : QAbstractTableModel(parent) , m_dtc(nullptr) , m_codificationDataId(0) , m_isEditMode(false) , m_logger(getLogger("LogisticalTermsModel")) { DEBUG_LOG(m_logger) << "ctor LogisticalTermsModel"; m_matrix.resize(s_matrixCount); for (int i = 0; i < s_matrixCount; ++i) m_matrix[i].resize(s_matrixCount); } // end of ctor() //----------------------------------------------------------------------------- bool LogisticalTermsModel::init(const std::shared_ptr &dtc, int codificationDataId, bool isEditMode) { DEBUG_LOG(m_logger) << "LogisticalTerms::init()"; if (!dtc) return false; DEBUG_LOG(m_logger) << "LogisticalTermsModel::init()..."; m_dtc = dtc; m_codificationDataId = codificationDataId; m_isEditMode = isEditMode; resetHeader(); resetMatrix(); if (!isEditMode) { connect(m_dtc.get(), &CodificationManagement::Interface::Dtc::codificationDataChanged, this, &LogisticalTermsModel::onCodificationDataChanged); } return true; } // end of init() //----------------------------------------------------------------------------- void LogisticalTermsModel::resetHeader() { // non constant Header values available... werden spaeter mit den Werten aus csv-Datei oder DB gesetzt. m_ColumnSelectionValues = QVector(s_matrixCount, QLatin1Char('?')); m_RowSelectionValues = QVector(s_matrixCount, QLatin1Char('?')); } // end of resetHeader() //----------------------------------------------------------------------------- void LogisticalTermsModel::resetMatrix() { beginResetModel(); for (auto &colData : m_matrix) { for (auto &cell : colData) cell = QLatin1String("---"); } endResetModel(); } // end of resetMatrix() //----------------------------------------------------------------------------- bool LogisticalTermsModel::setColumnSelectionValuesCSV(const QString &csvData) { m_ColumnSelectionValues.clear(); m_ColumnSelectionValues.resize(s_matrixCount); const QVector slColumns = csvData.splitRef(QLatin1Char(';')); if (slColumns.size() != m_ColumnSelectionValues.size()) { ERROR_LOG(m_logger) << "Invalid column data count." << " codificationDataId: " << m_codificationDataId << " Soll/Ist: " << m_ColumnSelectionValues.size() << "/" << slColumns.size(); m_ColumnSelectionValues.fill(QLatin1Char(' ')); return false; } for (int i = 0; i < m_ColumnSelectionValues.size(); ++i) { const QStringRef &qs = slColumns.at(i); if (qs.size() != 1) { ERROR_LOG(m_logger) << "Invalid column data value at id: " << i << " codificationDataId: " << m_codificationDataId; return false; } m_ColumnSelectionValues[i] = qs.at(0); } emit dataChanged(index(0, 0), index(0, m_ColumnSelectionValues.size() - 1)); return true; } // end of setColumnSelectionValuesCSV() //----------------------------------------------------------------------------- bool LogisticalTermsModel::setRowSelectionValuesCSV(const QString &csvData) { m_RowSelectionValues.clear(); m_RowSelectionValues.resize(s_matrixCount); const QVector slRows = csvData.splitRef(QStringLiteral("\n")); if (slRows.size() != m_RowSelectionValues.size()) { ERROR_LOG(m_logger) << "Invalid row data count." << " codificationDataId: " << m_codificationDataId << " Soll/Ist: " << m_RowSelectionValues.size() << "/" << slRows.size() << " Default values will be used. "; m_RowSelectionValues.fill(QLatin1Char(' ')); return false; } for (int i = 0; i < m_RowSelectionValues.size(); ++i) { const QStringRef &qs = slRows.at(i); if (qs.size() != 1) { ERROR_LOG(m_logger) << "Invalid row data value at id: " << i << " codificationDataId: " << m_codificationDataId; return false; } m_RowSelectionValues[i] = qs.at(0); } emit dataChanged(index(0, 0), index(0, m_RowSelectionValues.size() - 1)); return true; } // end of setRowSelectionValuesCSV() //----------------------------------------------------------------------------- bool LogisticalTermsModel::setMatrixValuesCSV(const QString &csvData) { DEBUG_LOG(m_logger) << "setMatrixValuesCSV: " << csvData; const QStringList slRows = splitQuotedStringToRows(csvData); if (slRows.isEmpty()) { ERROR_LOG(m_logger) << "split quoted csv data failed! " << " codificationDataId: " << m_codificationDataId << " csvData: " << csvData; return false; } if (slRows.size() != m_matrix.size()) { ERROR_LOG(m_logger) << "Invalid row data count." << " codificationDataId: " << m_codificationDataId << " Soll/Ist: " << m_matrix.size() << "/" << slRows.size(); return false; } for (int row = 0; row < slRows.size(); ++row) { const QVector slColumns = slRows[row].splitRef(QLatin1Char(';')); if (slColumns.size() != m_matrix.size()) { ERROR_LOG(m_logger) << "Invalid column data count." << " codificationDataId: " << m_codificationDataId << " Soll/Ist: " << m_matrix.size() << "/" << slColumns.size(); return false; } for (int column = 0; column < m_matrix.size(); ++column) m_matrix[row][column] = slColumns.at(column).toString(); } return true; } // end of setMatrixValuesCSV() //----------------------------------------------------------------------------- QString LogisticalTermsModel::getHorizontalHeaderCSVString() const { QStringList slColumns; slColumns.reserve(m_ColumnSelectionValues.size()); for (const QChar &c : m_ColumnSelectionValues) slColumns += QString(c); return slColumns.join(QLatin1Char(';')); } // end of getHorizontalHeaderCSVString() //----------------------------------------------------------------------------- QString LogisticalTermsModel::getVerticalHeaderCSVString() const { QStringList slRows; slRows.reserve(m_RowSelectionValues.size()); for (const QChar &c : m_RowSelectionValues) slRows += QString(c); return slRows.join(QLatin1Char('\n')); } // end of getVerticalHeaderCSVString() //----------------------------------------------------------------------------- QString LogisticalTermsModel::getMatrixDataCSVString() const { QStringList slColumns; slColumns.reserve(m_matrix.size()); QStringList slRows; slRows.reserve(m_matrix.size()); for (const auto &colData : m_matrix) { slColumns.clear(); for (const auto &cell : colData) { if (cell.contains(QLatin1Char('\n'))) slColumns += QLatin1Char('\"') + cell + QLatin1Char('\"'); else slColumns += cell; } slRows += slColumns.join(QLatin1Char(';')); } const QString qs(slRows.join(QLatin1Char('\n'))); DEBUG_LOG(m_logger) << "getMatrixDataCSVString() : " << qs; return qs; } // end of getMatrixDataCSVString() //----------------------------------------------------------------------------- void LogisticalTermsModel::setEditMode(bool isEditMode) { m_isEditMode = isEditMode; // DEBUG_LOG(m_logger) << "emit dataChanged() 0/0 up to row: " < column index values if (index.row() == 0 && index.column() <= m_ColumnSelectionValues.size()) { // DEBUG_LOG(m_logger) << "data() editMode row: " < row index values if (index.column() == 0 && index.row() <= m_RowSelectionValues.size()) { // DEBUG_LOG(m_logger) << "data() editMode row: " < 0 && index.row() > 0) { // DEBUG_LOG(m_logger) << "data() editMode row: " <(parent()), tr("Inputs with the characters ; \" are not possible."), tr("Input Error")); return false; } if (role == Qt::EditRole) { // Input for ColumnSelectionValues if (index.row() == 0) { m_ColumnSelectionValues[index.column() - 1] = qs.at(0); // DEBUG_LOG(m_logger) << "setData() row: " < 0)) m_RowSelectionValues[index.row() - 1] = qs.at(0); // Matrix else if ((index.column() > 0) && (index.row() > 0)) m_matrix[index.row() - 1][index.column() - 1] = qs; emit dataModified(); } return true; } // end of setData() //----------------------------------------------------------------------------- Qt::ItemFlags LogisticalTermsModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = QAbstractTableModel::flags(index); if (((index.row() <= rowCount() - 1) && (index.column() <= columnCount() - 1)) && !((index.row() == 0) && (index.column() == 0))) { if (isEditMode()) flags |= Qt::ItemIsEditable; else flags &= ~Qt::ItemIsEditable; } return flags; } // end of flags() //----------------------------------------------------------------------------- void LogisticalTermsModel::onCodificationDataChanged(const CodificationManagement::CodificationData &data, DataModification modType) { const int id = data.id(); DEBUG_LOG(m_logger) << "onCodificationDataChanged for CodificationData id: " << id << " - NumCodeColumnIdx data: " << data.numeralCodeTableColumnIndex().c_str() << " - NumCodeRowIdx data: " << data.numeralCodeTableRowIndex().c_str() << " - modType: " << modType; if (m_codificationDataId != data.id()) return; if (modType == DataModification::eRemoved) { WARNING_LOG(m_logger) << "CodificationData was removed. id: " << id << " ToDo: 'ShowCodificationData' Tab loeschen !?"; // set matrix to default values resetMatrix(); setColumnSelectionValuesCSV(QString()); setRowSelectionValuesCSV(QString()); return; } if (modType == DataModification::eModified) { DEBUG_LOG(m_logger) << "CodificationData was modifed. id: " << id << " - " << data.note(); QString qs = QString::fromStdString(data.logisticalTermTableColumnIndex()); setColumnSelectionValuesCSV(qs); qs = QString::fromStdString(data.logisticalTermTableRowIndex()); setRowSelectionValuesCSV(qs); qs = QString::fromStdString(data.logisticalTermTableMatrix()); setMatrixValuesCSV(qs); } } // end of onCodificationDataChanged() //----------------------------------------------------------------------------- QStringList LogisticalTermsModel::splitQuotedStringToRows(const QString &str) { QStringList slRows; QString row; row.reserve(str.size()); for (int i = 0; i < str.size(); ++i) { if (str.at(i) != QLatin1Char('\"') && str.at(i) != QLatin1Char('\n')) { row.append(str.at(i)); continue; } if (str.at(i) == QLatin1Char('\"')) { ++i; // oeffnedes " nicht ausgeben while (str.at(i) != QLatin1Char('\"')) { row.append(str.at(i)); ++i; if (i > str.size()) return QStringList(); } continue; } if (str.at(i) == QLatin1Char('\n')) { slRows += row; row.clear(); } } // wenn die letzte row in String nicht mit \n endet muss sie hier noch angefuegt werden if (!row.isEmpty()) slRows += row; return slRows; } // end of splitQuotedStringToRows() //-----------------------------------------------------------------------------