#include "designatormappingtablemodel.h" #include #include DesignatorMappingTableModel::DesignatorMappingTableModel(DesignatorMappingModel *mappingModel, QObject *parent) : QAbstractTableModel(parent) , m_mappingModel(mappingModel) , m_showOnlyCustom(false) { if (m_mappingModel) { connect(m_mappingModel, &DesignatorMappingModel::mappingsChanged, this, &DesignatorMappingTableModel::onMappingsChanged); updateFilteredMappings(); } } int DesignatorMappingTableModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) { return 0; } return m_filteredMappings.size(); } int DesignatorMappingTableModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) { return 0; } return ColumnCount; } QVariant DesignatorMappingTableModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= m_filteredMappings.size()) { return QVariant(); } const DesignatorMappingItem &item = m_filteredMappings[index.row()]; switch (role) { case Qt::DisplayRole: case Qt::EditRole: switch (index.column()) { case Designator: return item.designator; case SingularName: return item.singularName; case PluralName: return item.pluralName; case IsCustom: return item.isCustom ? tr("Да") : tr("Нет"); } break; case Qt::BackgroundRole: if (item.isCustom) { return QColor(255, 255, 200); // Светло-желтый для пользовательских } break; case Qt::FontRole: if (item.isCustom) { QFont font; font.setBold(true); return font; } break; case Qt::ToolTipRole: if (item.isCustom) { return tr("Пользовательское определение"); } break; } return QVariant(); } QVariant DesignatorMappingTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { switch (section) { case Designator: return tr("Дезигнатор"); case SingularName: return tr("Единственное число"); case PluralName: return tr("Множественное число"); case IsCustom: return tr("Пользовательское"); } } return QVariant(); } bool DesignatorMappingTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid() || index.row() >= m_filteredMappings.size() || role != Qt::EditRole) { return false; } DesignatorMappingItem item = m_filteredMappings[index.row()]; bool changed = false; switch (index.column()) { case Designator: if (value.toString() != item.designator) { item.designator = value.toString().toUpper(); changed = true; } break; case SingularName: if (value.toString() != item.singularName) { item.singularName = value.toString(); changed = true; } break; case PluralName: if (value.toString() != item.pluralName) { item.pluralName = value.toString(); changed = true; } break; case IsCustom: // Нельзя редактировать флаг пользовательского определения через таблицу return false; } if (changed) { // Помечаем как пользовательское, если редактируется item.isCustom = true; // Обновляем в основной модели if (m_mappingModel) { m_mappingModel->updateMapping(item.designator, item); } // Обновляем отфильтрованные данные updateFilteredMappings(); return true; } return false; } Qt::ItemFlags DesignatorMappingTableModel::flags(const QModelIndex &index) const { if (!index.isValid()) { return Qt::NoItemFlags; } Qt::ItemFlags flags = QAbstractTableModel::flags(index); // Разрешаем редактирование всех колонок, кроме флага пользовательского определения if (index.column() != IsCustom) { flags |= Qt::ItemIsEditable; } return flags; } void DesignatorMappingTableModel::addMapping(const DesignatorMappingItem &item) { if (m_mappingModel) { m_mappingModel->addMapping(item); } } void DesignatorMappingTableModel::removeMapping(int row) { if (row >= 0 && row < m_filteredMappings.size()) { const DesignatorMappingItem &item = m_filteredMappings[row]; if (m_mappingModel) { m_mappingModel->removeMapping(item.designator); } } } void DesignatorMappingTableModel::updateMapping(int row, const DesignatorMappingItem &item) { if (row >= 0 && row < m_filteredMappings.size()) { const DesignatorMappingItem &oldItem = m_filteredMappings[row]; if (m_mappingModel) { m_mappingModel->updateMapping(oldItem.designator, item); } } } DesignatorMappingItem DesignatorMappingTableModel::getMapping(int row) const { if (row >= 0 && row < m_filteredMappings.size()) { return m_filteredMappings[row]; } return DesignatorMappingItem(); } void DesignatorMappingTableModel::refreshData() { updateFilteredMappings(); } void DesignatorMappingTableModel::setShowOnlyCustom(bool showOnly) { if (m_showOnlyCustom != showOnly) { m_showOnlyCustom = showOnly; updateFilteredMappings(); } } void DesignatorMappingTableModel::setFilterText(const QString &text) { if (m_filterText != text) { m_filterText = text; updateFilteredMappings(); } } void DesignatorMappingTableModel::onMappingsChanged() { updateFilteredMappings(); } void DesignatorMappingTableModel::updateFilteredMappings() { beginResetModel(); m_filteredMappings.clear(); if (m_mappingModel) { QList allMappings = m_mappingModel->mappings(); for (const auto &item : allMappings) { if (matchesFilter(item)) { m_filteredMappings.append(item); } } } endResetModel(); } bool DesignatorMappingTableModel::matchesFilter(const DesignatorMappingItem &item) const { // Фильтр по пользовательским определениям if (m_showOnlyCustom && !item.isCustom) { return false; } // Фильтр по тексту if (!m_filterText.isEmpty()) { QString filterText = m_filterText.toLower(); return item.designator.toLower().contains(filterText) || item.singularName.toLower().contains(filterText) || item.pluralName.toLower().contains(filterText); } return true; }