Files
GostGenerator/model/vedomosttablemodel.h
T

162 lines
7.5 KiB
C++

#ifndef VEDOMOSTTABLEMODEL_H
#define VEDOMOSTTABLEMODEL_H
#include <QAbstractTableModel>
#include <QObject>
#include <QString>
#include <QList>
#include <QMap>
#include <QSet>
#include <QPair>
// 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<ComponentModel*> &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<VedomostRowData> m_rows;
QStringList m_columnMappings; // Маппинг колонок на свойства компонентов
QStringList m_propertyNames; // Доступные свойства компонентов
QList<ComponentModel*> m_components; // Компоненты для генерации
QSet<QPair<int, int>> m_overflowCells; // Множество переполненных ячеек (row, column)
static const int COLUMN_COUNT = 10;
static const QStringList DEFAULT_HEADERS;
};
#endif // VEDOMOSTTABLEMODEL_H