/** * Model for phrase table * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2017-01-19 */ #include "cod_phrase_table_model.h" #include #include #include using namespace CodificationManagement; PhraseTableModel::PhraseTableModel(QWidget *parent) : QAbstractTableModel(parent) , m_dtc(nullptr) , m_codificationDataId(0) , m_isEditMode(false) , m_logger(getLogger("PhraseTableModel")) { DEBUG_LOG(m_logger) << "ctor PhraseTableModel"; } // end of ctor() //----------------------------------------------------------------------------- bool PhraseTableModel::init(const std::shared_ptr &dtc, int codificationDataId, bool isEditMode) { DEBUG_LOG(m_logger) << "PhraseTableModel::init()"; if (!dtc) return false; m_dtc = dtc; m_codificationDataId = codificationDataId; m_isEditMode = isEditMode; // non header values used, header not visible resetMatrix(); if (!isEditMode) { connect(m_dtc.get(), &CodificationManagement::Interface::Dtc::codificationDataChanged, this, &PhraseTableModel::onCodificationDataChanged); } return true; } // end of init() //----------------------------------------------------------------------------- void PhraseTableModel::resetMatrix() { for (int row = 0; row < rowCount(); ++row) { for (int column = 0; column < columnCount(); ++column) { if ((row == 0) && (column == 0)) { m_matrix[row][column] = QLatin1String("A-Warnung "); } if ((row == 1) && (column == 0)) { m_matrix[row][column] = QLatin1String("B-Warnung "); } if ((row == 2) && (column == 0)) { m_matrix[row][column] = QLatin1String("C-Warnung "); } if ((row <= 2 && column > 0) || (row > 2)) m_matrix[row][column] = QLatin1String("--- "); } } emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, columnCount() - 1)); return ; } // end of resetMatrix() //----------------------------------------------------------------------------- bool PhraseTableModel::setMatrixValuesCSV(const QString &csvData) { DEBUG_LOG (m_logger) << "setMatrixValuesCSV() data: " << csvData; const QVector slRows = csvData.splitRef(QLatin1Char('\n')); if (slRows.count() != rowCount()) { ERROR_LOG(m_logger) << "Invalid row data count." << " codificationDataId: " << m_codificationDataId << " Soll/Ist: " << rowCount() << "/" << slRows.size(); return false; } for (int row = 0; row < rowCount(); ++row) { const QStringList slColumns = splitQuotedString(QLatin1Char(';'), slRows[row].toString()); if (slColumns.count() != columnCount()) { ERROR_LOG(m_logger) << "Invalid column data count." << " codificationDataId: " << m_codificationDataId << " Soll/Ist: " << columnCount() << "/" << slColumns.size(); return false; } for (int column = 0; column < columnCount(); ++column) { m_matrix[row][column] = slColumns[column]; } } return true; } // end of setMatrixValuesCSV() //----------------------------------------------------------------------------- QString PhraseTableModel::getMatrixDataCSVString() const { QStringList slColumns; slColumns.reserve(columnCount()); QStringList slRows; slRows.reserve(rowCount() * columnCount()); for (int row = 0; row < rowCount(); ++row) { slColumns.clear(); for (int column = 0; column < columnCount(); ++column) { const QString &cell = m_matrix[row][column]; if (cell.contains(QLatin1Char(';'))) slColumns += QLatin1Char('\"') + cell + QLatin1Char('\"'); else slColumns += cell; } slRows << slColumns.join(QLatin1Char(';')); } return slRows.join(QLatin1Char('\n')); } // end of getMatrixDataCSVString() //----------------------------------------------------------------------------- void PhraseTableModel::setEditMode(bool isEditMode) { m_isEditMode = isEditMode; // DEBUG_LOG(m_logger) << "emit dataChanged() 0/0 up to row: " <(parent()), tr("Inputs with the characters ; \" are not possible."), tr("Input Error")); return false; } QString qs = value.toString(); if (qs.isEmpty()) return false; if (role == Qt::EditRole) { if ((index.row() <= rowCount()-1) && (index.column() <= columnCount() - 1)) { m_matrix[index.row()][index.column()] = qs; emit dataModified(); } } return true; } // end of setData() //----------------------------------------------------------------------------- Qt::ItemFlags PhraseTableModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = QAbstractTableModel::flags(index); if (isEditMode()) { if ((index.row() <= rowCount()-1) && (index.column() <= columnCount() - 1)) flags |= Qt::ItemIsEditable; // Die obersten 3 Felder der ersten Spalte sind nicht editierbar! if ((index.column() == 0) && (index.row() <= 2)) flags &= ~Qt::ItemIsEditable; } else { if ((index.row() <= rowCount()-1) && (index.column() <= columnCount() - 1)) flags &= ~Qt::ItemIsEditable; } return flags; } // end of flags() //----------------------------------------------------------------------------- void PhraseTableModel::onCodificationDataChanged(const CodificationManagement::CodificationData &data, DataModification modType) { const int id = data.id(); DEBUG_LOG(m_logger) << "onCodificationDataChanged for CodificationData id: " << id << " - PhraseTableModel data: " << data.phraseTable().c_str() << " - modType: " << (int)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(); return; } if (modType == DataModification::eModified) { DEBUG_LOG(m_logger) << "CodificationData was modifed. id: " << id << " - " << data.note(); QString qs = QString::fromStdString(data.phraseTable()); setMatrixValuesCSV(qs); } } // end of onCodificationDataChanged() //----------------------------------------------------------------------------- QStringList PhraseTableModel::splitQuotedString(const QChar &sep, const QString &inString) { QString str = inString; QStringList result; while (str.contains(QLatin1Char('\"'))) { int i = str.indexOf(QLatin1Char('\"')); QString part = str.left(i); result += part.split(sep, QString::SkipEmptyParts); str.remove(0, i + 1); i = str.indexOf(QLatin1Char('\"')); result += str.left(i); str.remove(0,i + 1); } result += str.split(sep, QString::SkipEmptyParts); return result; } // end of splitQuotedString() //-----------------------------------------------------------------------------