#include "componenttablemodel.h" ComponentTableModel::ComponentTableModel(QObject *parent) : QAbstractTableModel{parent} {} // Методы QAbstractTableModel int ComponentTableModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return m_components.size(); } int ComponentTableModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; // ID + Designator + количество свойств return 2 + m_propertyNames.size(); } QVariant ComponentTableModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= m_components.size()) return QVariant(); ComponentModel *component = m_components.at(index.row()); if (!component) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) { int column = index.column(); if (column == 0) { // ID return component->id(); } else if (column == 1) { // Designator return component->designator(); } else { // Свойства компонента int propertyIndex = column - 2; if (propertyIndex >= 0 && propertyIndex < m_propertyNames.size()) { QString propertyName = m_propertyNames.at(propertyIndex); QString propertyValue = component->properties().value(propertyName); return propertyValue; } } } return QVariant(); } QVariant ComponentTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { if (section == 0) { return tr("ID"); } else if (section == 1) { return tr("Обозначение"); } else { int propertyIndex = section - 2; if (propertyIndex >= 0 && propertyIndex < m_propertyNames.size()) { return m_propertyNames.at(propertyIndex); } } } else { // Вертикальные заголовки - номера строк return section + 1; } return QVariant(); } bool ComponentTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid() || index.row() >= m_components.size() || role != Qt::EditRole) return false; ComponentModel *component = m_components.at(index.row()); if (!component) return false; int column = index.column(); if (column == 0) { // ID bool ok; int id = value.toInt(&ok); if (ok) { component->setId(id); emit dataChanged(index, index); return true; } } else if (column == 1) { // Designator component->setDesignator(value.toString()); emit dataChanged(index, index); return true; } else { // Свойства компонента int propertyIndex = column - 2; if (propertyIndex >= 0 && propertyIndex < m_propertyNames.size()) { QString propertyName = m_propertyNames.at(propertyIndex); QMap properties = component->properties(); properties[propertyName] = value.toString(); component->setProperties(properties); emit dataChanged(index, index); return true; } } return false; } Qt::ItemFlags ComponentTableModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; } // Методы для работы с компонентами void ComponentTableModel::addComponent(ComponentModel *component) { if (!component) return; beginInsertRows(QModelIndex(), m_components.size(), m_components.size()); m_components.append(component); endInsertRows(); } void ComponentTableModel::removeComponent(int row) { if (row < 0 || row >= m_components.size()) return; beginRemoveRows(QModelIndex(), row, row); m_components.removeAt(row); endRemoveRows(); } void ComponentTableModel::clearComponents() { if (m_components.isEmpty()) return; beginRemoveRows(QModelIndex(), 0, m_components.size() - 1); m_components.clear(); endRemoveRows(); } ComponentModel* ComponentTableModel::getComponent(int row) const { if (row < 0 || row >= m_components.size()) return nullptr; return m_components.at(row); } QList ComponentTableModel::getComponents() const { return m_components; } // Методы для работы с вариантами QString ComponentTableModel::currentVariant() const { return m_currentVariant; } void ComponentTableModel::setCurrentVariant(const QString &variant) { qDebug() << "ComponentTableModel: Установка текущего варианта:" << variant << "текущий:" << m_currentVariant; if (m_currentVariant == variant) { qDebug() << "ComponentTableModel: Вариант не изменился, но обновляем свойства"; updateComponentProperties(); return; } m_currentVariant = variant; updateComponentProperties(); emit currentVariantChanged(); qDebug() << "ComponentTableModel: Вариант установлен, испущен сигнал currentVariantChanged"; } // Методы для работы с именами свойств QStringList ComponentTableModel::propertyNames() const { return m_propertyNames; } void ComponentTableModel::setPropertyNames(const QStringList &newPropertyName) { if (m_propertyNames == newPropertyName) return; beginResetModel(); m_propertyNames = newPropertyName; endResetModel(); emit propertyNamesChanged(); } // Приватные методы void ComponentTableModel::updateComponentProperties() { qDebug() << "ComponentTableModel: Обновление свойств компонентов для варианта:" << m_currentVariant; for (ComponentModel *component : m_components) { // Принудительно обновляем свойства компонента для текущего варианта component->setCurrentVariant(m_currentVariant); } // Уведомляем об изменениях if (!m_components.isEmpty()) { emit dataChanged(index(0, 0), index(rowCount()-1, columnCount()-1)); } qDebug() << "ComponentTableModel: Свойства обновлены, испущен сигнал dataChanged"; } QStringList ComponentTableModel::variants() const { return m_variants; } void ComponentTableModel::setVariants(const QStringList &newVariants) { if (m_variants == newVariants) return; m_variants = newVariants; emit variantsChanged(); }