Add initial project structure with essential files including .gitignore, application resources, and various model and view components for the application. Implemented asynchronous parsing support and database structure checks.

This commit is contained in:
2025-12-08 15:21:18 +03:00
parent 4f8c90c15b
commit 3467003721
110 changed files with 35406 additions and 0 deletions
+157
View File
@@ -0,0 +1,157 @@
#ifndef PERECHENTABLEMODEL_H
#define PERECHENTABLEMODEL_H
#include <QAbstractTableModel>
#include <QObject>
#include <QString>
#include <QList>
#include <QMap>
#include <QSet>
#include <QPair>
// Forward declaration
class ComponentModel;
// Forward declaration структуры для информации о переносе заголовков
struct PageBreakInfo;
// Структура для хранения данных ячейки
struct PerechenCellData
{
QString value; // Значение ячейки
int rowNumber; // Номер строки в документе
int pageNumber; // Номер страницы
bool isHeader; // Является ли заголовком
bool isAutoGenerated; // Автоматически сгенерированное значение
bool isEmpty; // Пустая ячейка
int stretch; // Поджим по ширине (100 = нормальный, по умолчанию 100)
bool isUnderline; // Подчеркивать ли текст (по умолчанию true для заголовков)
PerechenCellData() : rowNumber(0), pageNumber(1), isHeader(false),
isAutoGenerated(false), isEmpty(true), stretch(100), isUnderline(false) {}
PerechenCellData(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 PerechenRowData
{
PerechenCellData position; // Поз.обозначение
PerechenCellData designation; // Наименование
PerechenCellData quantity; // Кол.
PerechenCellData note; // Примечание
bool isHeader; // Является ли заголовком
bool isEmpty; // Пустая строка
int rowNumber; // Номер строки в документе
int pageNumber; // Номер страницы
PerechenRowData() : isHeader(false), isEmpty(false), rowNumber(0), pageNumber(1) {}
};
class PerechenTableModel : public QAbstractTableModel
{
Q_OBJECT
Q_PROPERTY(QStringList columnMappings READ columnMappings WRITE setColumnMappings NOTIFY columnMappingsChanged FINAL)
public:
explicit PerechenTableModel(QObject *parent = nullptr);
// Константы для разбивки на страницы
static const int ROWS_PER_FIRST_PAGE = 27;
static const int ROWS_PER_OTHER_PAGE = 33;
// Методы 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 PerechenRowData &rowData);
void insertRow(int position, const PerechenRowData &rowData);
void removeRow(int row);
void clear();
// Новые методы для управления строками
void addEmptyRow();
void addEmptyRowAt(int position);
PerechenRowData 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();
// Методы для работы с переносом страниц
bool needsPageBreakProtection(int rowIndex) const;
void addPageBreakProtection();
void optimizePageBreaks();
void updatePageDisplay();
// Новые методы для работы с разрывами страниц
void updatePageNumbers();
void updateRowNumbers();
int getPageForRow(int rowNumber) const;
signals:
void columnMappingsChanged();
void modelDataChanged();
void requestPageBreakConfirmation(const QList<PageBreakInfo> &pageBreakInfos);
private:
void updateRowEmptyStatus(int row);
PerechenCellData createCellData(const QString &value, bool isHeader = false,
bool isAuto = false, bool isEmpty = false);
QList<PerechenRowData> 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 = 4;
static const QStringList DEFAULT_HEADERS;
};
#endif // PERECHENTABLEMODEL_H