#ifndef VEDOMOSTTABLEMODEL_H #define VEDOMOSTTABLEMODEL_H #include #include #include #include #include #include #include // Forward declaration class ComponentModel; // Структура для хранения данных ячейки struct VedomostCellData { QString value; // Значение ячейки int rowNumber; // Номер строки в документе int pageNumber; // Номер страницы bool isHeader; // Является ли заголовком bool isAutoGenerated; // Автоматически сгенерированное значение bool isEmpty; // Пустая ячейка int stretch; // Поджим по ширине (100 = нормальный, по умолчанию 100) bool isUnderline; // Подчеркивать ли текст (по умолчанию true для заголовков) VedomostCellData() : rowNumber(0), pageNumber(1), isHeader(false), isAutoGenerated(false), isEmpty(true), stretch(100), isUnderline(false) {} VedomostCellData(const QString &val, int row = 0, int page = 1, bool header = false, bool autoGen = false, bool empty = false, int cellStretch = 100, bool underline = false) : value(val), rowNumber(row), pageNumber(page), isHeader(header), isAutoGenerated(autoGen), isEmpty(empty), stretch(cellStretch), isUnderline(underline) {} }; // Структура для хранения строки таблицы struct VedomostRowData { VedomostCellData name; // Наименование VedomostCellData productCode; // Код продукции VedomostCellData documentCode; // Обозначение документа на поставку VedomostCellData supplier; // Поставщик VedomostCellData whereUsed; // Куда входит (обозначение) VedomostCellData quantityPerItem; // Количество на изделие VedomostCellData quantityInSet; // Количество в комплекте VedomostCellData quantityForReg; // Количество на регулир VedomostCellData totalQuantity; // Количество всего VedomostCellData note; // Примечание bool isHeader; // Является ли заголовком bool isEmpty; // Пустая строка int rowNumber; // Номер строки в документе int pageNumber; // Номер страницы VedomostRowData() : isHeader(false), isEmpty(false), rowNumber(0), pageNumber(1) {} }; class VedomostTableModel : public QAbstractTableModel { Q_OBJECT Q_PROPERTY(QStringList columnMappings READ columnMappings WRITE setColumnMappings NOTIFY columnMappingsChanged FINAL) public: explicit VedomostTableModel(QObject *parent = nullptr); // Константы для разбивки на страницы static const int ROWS_PER_FIRST_PAGE = 24; static const int ROWS_PER_OTHER_PAGE = 29; // Методы QAbstractTableModel int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; Qt::ItemFlags flags(const QModelIndex &index) const override; // Методы для работы с данными void setColumnMappings(const QStringList &mappings); QStringList columnMappings() const; // Методы для работы со строками void addRow(const VedomostRowData &rowData); void insertRow(int position, const VedomostRowData &rowData); void removeRow(int row); void clear(); // Новые методы для управления строками void addEmptyRow(); void addEmptyRowAt(int position); VedomostRowData createEmptyRow() const; bool canEditRow(int row) const; // Методы для работы с компонентами void setComponents(const QList &components); // Методы для работы с настройками void setPropertyNames(const QStringList &propertyNames); QStringList availableProperties() const; // Методы для сохранения/загрузки QByteArray saveToDatabase() const; void loadFromDatabase(const QByteArray &data); // Методы для экспорта QString getDocumentTitle() const; QString getDocumentType() const; // Методы для проверки статуса строки bool isRowHeader(int row) const; // Метод для установки поджима ячейки bool setCellStretch(int row, int column, int stretch); // Метод для установки флага заголовка ячейки bool setCellHeader(int row, int column, bool isHeader); // Метод для установки флага подчеркивания ячейки bool setCellUnderline(int row, int column, bool isUnderline); // Метод для проверки переполнения ячейки (для подсветки в UI) bool isCellOverflow(int row, int column, qreal columnWidth, int fontSize = 12) const; // Метод для пометки ячейки как переполненной (вызывается из PDFController) void setCellOverflow(int row, int column, bool overflow); // Метод для очистки всех пометок о переполнении void clearOverflowMarks(); // Новые методы для работы с разрывами страниц void updatePageNumbers(); int getPageForRow(int rowNumber) const; bool needsPageBreakProtection(int rowIndex) const; void addPageBreakProtection(); void optimizePageBreaks(); // Метод для обновления отображения страниц в UI void updatePageDisplay(); // Метод для автоматического пересчета totalQuantity для строки void updateTotalQuantity(int row); void updateRowNumbers(); signals: void columnMappingsChanged(); void modelDataChanged(); private: void updateRowEmptyStatus(int row); VedomostCellData createCellData(const QString &value, bool isHeader = false, bool isAuto = false, bool isEmpty = false) const; QList m_rows; QStringList m_columnMappings; // Маппинг колонок на свойства компонентов QStringList m_propertyNames; // Доступные свойства компонентов QList m_components; // Компоненты для генерации QSet> m_overflowCells; // Множество переполненных ячеек (row, column) static const int COLUMN_COUNT = 10; static const QStringList DEFAULT_HEADERS; }; #endif // VEDOMOSTTABLEMODEL_H