#ifndef DOCUMENTPROCESSOR_H #define DOCUMENTPROCESSOR_H #include #include #include #include #include #include #include #include #include #include #include "../model/componenttablemodel.h" #include "../model/projectparamtablemodel.h" #include "../model/perechentablemodel.h" #include "../controller/perechentablecontroller.h" #include "../model/specificationpcbtablemodel.h" #include "../model/specificationtablemodel.h" #include "../model/vedomosttablemodel.h" #include "../controller/specificationpcbcontroller.h" #include "../controller/specificationcontroller.h" #include "../controller/vedomostcontroller.h" #include "documentsettingsdialog.h" #include "../model/titleinscriptionsmodel.h" class MainController; // Абстрактный класс для обработки документов class DocumentProcessor : public QObject { Q_OBJECT public: explicit DocumentProcessor(QObject *parent = nullptr); virtual ~DocumentProcessor() = default; // Виртуальные методы для обработки данных virtual void processComponents(const QList &components) = 0; virtual void processProjectParams(const QMap ¶ms) = 0; virtual QTableView* createTableView() = 0; protected: QList m_processedComponents; QMap m_processedParams; }; // Конкретные процессоры для каждого типа документа class PerechenProcessor : public DocumentProcessor { Q_OBJECT public: explicit PerechenProcessor(QObject *parent = nullptr); ~PerechenProcessor(); void processComponents(const QList &components) override; void processProjectParams(const QMap ¶ms) override; QTableView* createTableView() override; // Методы для работы с настройками колонок void setColumnMappings(const QStringList &mappings); QStringList getColumnMappings() const; QStringList getAvailableProperties() const; // Метод для обновления таблицы по кнопке void updateTable(); // Метод для получения контроллера PerechenTableController* getController() const { return m_controller; } // Метод для установки контроллера (для интеграции с MainController) void setController(PerechenTableController *controller); // Метод для установки модели (для интеграции с MainController) void setModel(PerechenTableModel *model); private: PerechenTableController *m_controller; }; class SpecificationPCBProcessor : public DocumentProcessor { Q_OBJECT public: explicit SpecificationPCBProcessor(QObject *parent = nullptr); ~SpecificationPCBProcessor(); void processComponents(const QList &components) override; void processProjectParams(const QMap ¶ms) override; QTableView* createTableView() override; // Методы для работы с настройками колонок void setColumnMappings(const QStringList &mappings); QStringList getColumnMappings() const; QStringList getAvailableProperties() const; // Метод для обновления таблицы по кнопке void updateTable(); // Метод для получения контроллера SpecificationPCBController* getController() const { return m_controller; } // Метод для установки контроллера (для интеграции с MainController) void setController(SpecificationPCBController *controller); // Метод для установки модели (для интеграции с MainController) void setModel(SpecificationPCBTableModel *model); private: SpecificationPCBController *m_controller; }; class SpecificationProcessor : public DocumentProcessor { Q_OBJECT public: explicit SpecificationProcessor(QObject *parent = nullptr); void processComponents(const QList &components) override; void processProjectParams(const QMap ¶ms) override; QTableView* createTableView() override; // Методы для работы с настройками колонок void setColumnMappings(const QStringList &mappings); QStringList getColumnMappings() const; QStringList getAvailableProperties() const; // Метод для обновления таблицы по кнопке void updateTable(); // Метод для получения контроллера SpecificationController* getController() const { return m_controller; } // Метод для установки контроллера (для интеграции с MainController) void setController(SpecificationController *controller); // Метод для установки модели (для интеграции с MainController) void setModel(SpecificationTableModel *model); private: SpecificationController *m_controller; }; class VedomostProcessor : public DocumentProcessor { Q_OBJECT public: explicit VedomostProcessor(QObject *parent = nullptr); ~VedomostProcessor(); void processComponents(const QList &components) override; void processProjectParams(const QMap ¶ms) override; QTableView* createTableView() override; // Методы для работы с настройками колонок void setColumnMappings(const QStringList &mappings); QStringList getColumnMappings() const; QStringList getAvailableProperties() const; // Метод для обновления таблицы по кнопке void updateTable(); // Метод для получения контроллера VedomostController* getController() const { return m_controller; } // Метод для установки контроллера (для интеграции с MainController) void setController(VedomostController *controller); // Метод для установки модели (для интеграции с MainController) void setModel(VedomostTableModel *model); private: VedomostController *m_controller; }; // Универсальный виджет для работы с документами class DocumentEditWidget : public QWidget { Q_OBJECT public: explicit DocumentEditWidget(DocumentProcessor *processor, QWidget *parent = nullptr); explicit DocumentEditWidget(DocumentProcessor *processor, MainController *controller, QWidget *parent = nullptr); void setData(ComponentTableModel *componentModel, ProjectParamTableModel *projectParamModel); void updateView(); // Методы для работы с надписями титульного листа TitleInscriptionsModel* getTitleInscriptionsModel() const; // Методы для работы с таблицами документов PerechenTableModel* getPerechenTableModel() const; SpecificationPCBTableModel* getSpecificationPCBTableModel() const; SpecificationTableModel* getSpecificationTableModel() const; VedomostTableModel* getVedomostTableModel() const; private slots: void onOpenColumnSettings(); void onGenerateTable(); void onRecalculateTable(); // Новые слоты для управления строками void onAddRow(); void onInsertRow(); // Слот для вставки строки в середину void onRemoveRow(); // Слот для обновления состояния кнопок void onSelectionChanged(); // Слот для контекстного меню void onContextMenuRequested(const QPoint &pos); // Слоты для контекстного меню void onContextMenuAddRow(); void onContextMenuRemoveRow(); void onContextMenuRemoveSelectedRows(); // Удаление нескольких выделенных строк void onContextMenuMergeRows(); // Объединение нескольких выделенных строк (все столбцы) void onContextMenuMergeColumn(); // Объединение только определенного столбца void onContextMenuCellSettings(); // Слоты для копирования/вставки/вырезания void onContextMenuCopyRows(); // Копирование строк void onContextMenuCutRows(); // Вырезание строк void onContextMenuPasteRows(); // Вставка строк void onContextMenuCopyCells(); // Копирование ячеек void onContextMenuCutCells(); // Вырезание ячеек void onContextMenuPasteCells(); // Вставка ячеек private: void setUp(); void setWidgets(); void setUpLayout(); void setUpConnections(); void setupSelectionConnection(); // Новый метод для установки соединения selectionChanged // Вспомогательные методы int getCurrentSelectedRow() const; void applyColumnStretching(); // Метод для применения настроек растягивания столбцов // Вспомогательные методы для копирования/вставки void copyRowsToClipboard(const QModelIndexList &rows); void pasteRowsFromClipboard(int insertPosition); void cutRows(int insertPosition); // Вырезает строки (копирует и удаляет) void copyCellsToClipboard(const QItemSelection &selection); void pasteCellsFromClipboard(const QModelIndex &topLeft); void cutCells(const QModelIndex &topLeft); // Вырезает ячейки (копирует и очищает) DocumentProcessor *m_processor; ComponentTableModel *m_componentModel; ProjectParamTableModel *m_projectParamModel; MainController *m_controller; TitleInscriptionsModel *m_titleInscriptionsModel; QPushButton* m_openSettingsButton; QPushButton* m_generateTableButton; QPushButton* m_recalculateTableButton; // Новые кнопки для управления строками QPushButton* m_addRowButton; QPushButton* m_insertRowButton; // Кнопка для вставки строки в середину QPushButton* m_removeRowButton; QTableView* m_tableView; QGroupBox* m_settingsGroupBox; }; #endif // DOCUMENTPROCESSOR_H